diff --git a/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py
index 0a67658..5f29037 100644
--- a/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py
+++ b/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py
@@ -101,13 +101,13 @@
         # Adding host intents
         main.log.info( itemName + ": Adding host intents" )
 
-        intent1 = main.RESTs[ onosNode ].addHostIntent( hostIdOne=host1.get( "id" ),
-                                                        hostIdTwo=host2.get( "id" ),
-                                                        vlanId=vlanId )
+        intent1 = main.Cluster.active( onosNode ).REST.addHostIntent( hostIdOne=host1.get( "id" ),
+                                                                      hostIdTwo=host2.get( "id" ),
+                                                                      vlanId=vlanId )
 
         # Get all intents ID in the system, time delay right after intents are added
         time.sleep( main.addIntentSleep )
-        intentsId = main.RESTs[ 0 ].getIntentsId()
+        intentsId = main.Cluster.active( 0 ).REST.getIntentsId()
     except( KeyError, TypeError ):
         errorMsg = "There was a problem loading the hosts data."
         if intentsId:
@@ -405,26 +405,26 @@
         ipSrc = senders[ 0 ].get( "ip" )
         ipDst = recipients[ 0 ].get( "ip" )
 
-        intent1 = main.RESTs[ onosNode ].addPointIntent(
-                                            ingressDevice=ingressDevice,
-                                            egressDevice=egressDevice,
-                                            ingressPort=portIngress,
-                                            egressPort=portEgress,
-                                            ethType=ethType,
-                                            ethSrc=srcMac,
-                                            ethDst=dstMac,
-                                            bandwidth=bandwidth,
-                                            lambdaAlloc=lambdaAlloc,
-                                            protected=protected,
-                                            ipProto=ipProto,
-                                            ipSrc=ipSrc,
-                                            ipDst=ipDst,
-                                            tcpSrc=tcpSrc,
-                                            tcpDst=tcpDst,
-                                            vlanId=vlanId )
+        intent1 = main.Cluster.active( onosNode ).REST.addPointIntent(
+                                                            ingressDevice=ingressDevice,
+                                                            egressDevice=egressDevice,
+                                                            ingressPort=portIngress,
+                                                            egressPort=portEgress,
+                                                            ethType=ethType,
+                                                            ethSrc=srcMac,
+                                                            ethDst=dstMac,
+                                                            bandwidth=bandwidth,
+                                                            lambdaAlloc=lambdaAlloc,
+                                                            protected=protected,
+                                                            ipProto=ipProto,
+                                                            ipSrc=ipSrc,
+                                                            ipDst=ipDst,
+                                                            tcpSrc=tcpSrc,
+                                                            tcpDst=tcpDst,
+                                                            vlanId=vlanId )
 
         time.sleep( main.addIntentSleep )
-        intentsId = main.RESTs[ 0 ].getIntentsId()
+        intentsId = main.Cluster.active( 0 ).REST.getIntentsId()
     except( KeyError, TypeError ):
         errorMsg = "There was a problem loading the hosts data."
         if intentsId:
@@ -782,69 +782,70 @@
 
     # Adding bidirectional point  intents
     main.log.info( itemName + ": Adding point intents" )
-    intent1 = main.RESTs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
-                                                     egressDevice=deviceId2,
-                                                     ingressPort=port1,
-                                                     egressPort=port2,
-                                                     ethType=ethType,
-                                                     ethSrc=mac1,
-                                                     ethDst=mac2,
-                                                     bandwidth=bandwidth,
-                                                     lambdaAlloc=lambdaAlloc,
-                                                     ipProto=ipProto,
-                                                     ipSrc=ip1,
-                                                     ipDst=ip2,
-                                                     tcpSrc=tcp1,
-                                                     tcpDst="" )
+    ctrl = main.Cluster.active( onosNode )
+    intent1 = ctrl.REST.addPointIntent( ingressDevice=deviceId1,
+                                        egressDevice=deviceId2,
+                                        ingressPort=port1,
+                                        egressPort=port2,
+                                        ethType=ethType,
+                                        ethSrc=mac1,
+                                        ethDst=mac2,
+                                        bandwidth=bandwidth,
+                                        lambdaAlloc=lambdaAlloc,
+                                        ipProto=ipProto,
+                                        ipSrc=ip1,
+                                        ipDst=ip2,
+                                        tcpSrc=tcp1,
+                                        tcpDst="" )
 
-    intent2 = main.RESTs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
-                                                     egressDevice=deviceId1,
-                                                     ingressPort=port2,
-                                                     egressPort=port1,
-                                                     ethType=ethType,
-                                                     ethSrc=mac2,
-                                                     ethDst=mac1,
-                                                     bandwidth=bandwidth,
-                                                     lambdaAlloc=lambdaAlloc,
-                                                     ipProto=ipProto,
-                                                     ipSrc=ip2,
-                                                     ipDst=ip1,
-                                                     tcpSrc=tcp2,
-                                                     tcpDst="" )
+    intent2 = ctrl.REST.addPointIntent( ingressDevice=deviceId2,
+                                        egressDevice=deviceId1,
+                                        ingressPort=port2,
+                                        egressPort=port1,
+                                        ethType=ethType,
+                                        ethSrc=mac2,
+                                        ethDst=mac1,
+                                        bandwidth=bandwidth,
+                                        lambdaAlloc=lambdaAlloc,
+                                        ipProto=ipProto,
+                                        ipSrc=ip2,
+                                        ipDst=ip1,
+                                        tcpSrc=tcp2,
+                                        tcpDst="" )
 
-    intent3 = main.RESTs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
-                                                     egressDevice=deviceId2,
-                                                     ingressPort=port1,
-                                                     egressPort=port2,
-                                                     ethType=ethType,
-                                                     ethSrc=mac1,
-                                                     ethDst=mac2,
-                                                     bandwidth=bandwidth,
-                                                     lambdaAlloc=lambdaAlloc,
-                                                     ipProto=ipProto,
-                                                     ipSrc=ip1,
-                                                     ipDst=ip2,
-                                                     tcpSrc="",
-                                                     tcpDst=tcp2 )
+    intent3 = ctrl.REST.addPointIntent( ingressDevice=deviceId1,
+                                        egressDevice=deviceId2,
+                                        ingressPort=port1,
+                                        egressPort=port2,
+                                        ethType=ethType,
+                                        ethSrc=mac1,
+                                        ethDst=mac2,
+                                        bandwidth=bandwidth,
+                                        lambdaAlloc=lambdaAlloc,
+                                        ipProto=ipProto,
+                                        ipSrc=ip1,
+                                        ipDst=ip2,
+                                        tcpSrc="",
+                                        tcpDst=tcp2 )
 
-    intent4 = main.RESTs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
-                                                     egressDevice=deviceId1,
-                                                     ingressPort=port2,
-                                                     egressPort=port1,
-                                                     ethType=ethType,
-                                                     ethSrc=mac2,
-                                                     ethDst=mac1,
-                                                     bandwidth=bandwidth,
-                                                     lambdaAlloc=lambdaAlloc,
-                                                     ipProto=ipProto,
-                                                     ipSrc=ip2,
-                                                     ipDst=ip1,
-                                                     tcpSrc="",
-                                                     tcpDst=tcp1 )
+    intent4 = ctrl.REST.addPointIntent( ingressDevice=deviceId2,
+                                        egressDevice=deviceId1,
+                                        ingressPort=port2,
+                                        egressPort=port1,
+                                        ethType=ethType,
+                                        ethSrc=mac2,
+                                        ethDst=mac1,
+                                        bandwidth=bandwidth,
+                                        lambdaAlloc=lambdaAlloc,
+                                        ipProto=ipProto,
+                                        ipSrc=ip2,
+                                        ipDst=ip1,
+                                        tcpSrc="",
+                                        tcpDst=tcp1 )
 
     # Get all intents ID in the system, time delay right after intents are added
     time.sleep( main.addIntentSleep )
-    intentsId = main.RESTs[ 0 ].getIntentsId()
+    intentsId = main.Cluster.active( 0 ).REST.getIntentsId()
     # Check intents state
     time.sleep( main.checkIntentSleep )
     intentResult = checkIntentState( main, intentsId )
@@ -1039,26 +1040,26 @@
             ipDst.append( ip )
 
         # Adding point intent
-        intentId = main.RESTs[ onosNode ].addSinglepointToMultipointIntent(
-                                            ingressDevice=ingressDevice,
-                                            egressDeviceList=egressDeviceList,
-                                            portIngress=portIngress,
-                                            portEgressList=portEgressList,
-                                            ethType=ethType,
-                                            ethSrc=srcMac,
-                                            #ethDst=dstMac, #Isn't working because of ONOS itself
-                                            bandwidth=bandwidth,
-                                            lambdaAlloc=lambdaAlloc,
-                                            ipProto=ipProto,
-                                            ipSrc=ipSrc,
-                                            ipDst=ipDst,
-                                            tcpSrc="",
-                                            tcpDst="",
-                                            vlanId=vlanId,
-                                            partial=partial )
+        intentId = main.Cluster.active( onosNode ).REST.addSinglepointToMultipointIntent(
+                                                                ingressDevice=ingressDevice,
+                                                                egressDeviceList=egressDeviceList,
+                                                                portIngress=portIngress,
+                                                                portEgressList=portEgressList,
+                                                                ethType=ethType,
+                                                                ethSrc=srcMac,
+                                                                #ethDst=dstMac, #Isn't working because of ONOS itself
+                                                                bandwidth=bandwidth,
+                                                                lambdaAlloc=lambdaAlloc,
+                                                                ipProto=ipProto,
+                                                                ipSrc=ipSrc,
+                                                                ipDst=ipDst,
+                                                                tcpSrc="",
+                                                                tcpDst="",
+                                                                vlanId=vlanId,
+                                                                partial=partial )
 
         time.sleep( main.addIntentSleep )
-        intentsId = main.RESTs[ 0 ].getIntentsId()
+        intentsId = main.Cluster.active( 0 ).REST.getIntentsId()
     except ( KeyError, TypeError ):
         errorMsg = "There was a problem loading the hosts data."
         if intentId:
@@ -1225,20 +1226,20 @@
                 dstMac = ""
 
         intentsId.append(
-                        main.RESTs[ onosNode ].addMultipointToSinglepointIntent(
-                                            ingressDeviceList=ingressDeviceList,
-                                            egressDevice=egressDevice,
-                                            portIngressList=portIngressList,
-                                            portEgress=portEgress,
-                                            ethType=ethType,
-                                            ethDst=dstMac,
-                                            bandwidth=bandwidth,
-                                            lambdaAlloc=lambdaAlloc,
-                                            ipProto=ipProto,
-                                            ipSrc="",
-                                            ipDst="",
-                                            tcpSrc="",
-                                            tcpDst="" ) )
+                        main.Cluster.active( onosNode ).REST.addMultipointToSinglepointIntent(
+                                                                ingressDeviceList=ingressDeviceList,
+                                                                egressDevice=egressDevice,
+                                                                portIngressList=portIngressList,
+                                                                portEgress=portEgress,
+                                                                ethType=ethType,
+                                                                ethDst=dstMac,
+                                                                bandwidth=bandwidth,
+                                                                lambdaAlloc=lambdaAlloc,
+                                                                ipProto=ipProto,
+                                                                ipSrc="",
+                                                                ipDst="",
+                                                                tcpSrc="",
+                                                                tcpDst="" ) )
 
     pingResult = pingallHosts( main, hostNames )
 
@@ -1333,7 +1334,7 @@
     appCheck = main.TRUE
     getDataResult = main.TRUE
     main.log.info( "Activating reactive forwarding app " )
-    activateResult = main.RESTs[ 0 ].activateApp( "org.onosproject.fwd" )
+    activateResult = main.Cluster.active( 0 ).activateApp( "org.onosproject.fwd" )
     if not activateResult:
         main.log.error( "Something went wrong installing fwd app" )
     time.sleep( main.fwdSleep )
@@ -1343,7 +1344,7 @@
         for i in xrange( len( hostList ) ):
             main.Mininet1.pingallHosts( hostList[ i ] )
 
-    hostsJson = json.loads( main.RESTs[ 0 ].hosts() )
+    hostsJson = json.loads( main.Cluster.active( 0 ).REST.hosts() )
     hosts = main.Mininet1.getHosts().keys()
     # TODO: Make better use of new getHosts function
     for host in hosts:
@@ -1360,7 +1361,7 @@
                 main.hostsData[ host ][ 'ipAddresses' ] = hostj[ 'ipAddresses' ]
 
     main.log.info( "Deactivating reactive forwarding app " )
-    deactivateResult = main.RESTs[ 0 ].deactivateApp( "org.onosproject.fwd" )
+    deactivateResult = main.Cluster.active( 0 ).REST.deactivateApp( "org.onosproject.fwd" )
     if activateResult and deactivateResult and main.hostsData:
         main.log.info( "Successfully used fwd app to discover hosts " )
         getDataResult = main.TRUE
@@ -1374,14 +1375,12 @@
 
 
 def checkTopology( main, expectedLink ):
-    statusResult = main.TRUE
     # Check onos topology
     main.log.info( itemName + ": Checking ONOS topology " )
 
-    for i in range( main.numCtrls ):
-        statusResult = main.RESTs[ i ].checkStatus( main.numSwitch,
-                                                    expectedLink )\
-                       and statusResult
+    statusResult = main.Cluster.command( "checkStatus",
+                                         args=[ main.numSwitch, expectedLink ],
+                                         returnBool=True, specificDriver=3 )
     if not statusResult:
         main.log.error( itemName + ": Topology mismatch" )
     else:
@@ -1399,13 +1398,13 @@
 
     main.log.info( itemName + ": Checking intents state" )
     # First check of intents
-    for i in range( main.numCtrls ):
-        tempResult = main.RESTs[ i ].checkIntentState( intentsId=intentsId )
-        results.append( tempResult )
+    stateCheckResults = main.Cluster.command( "checkIntentState",
+                                         kwargs={ "intentsId":intentsId },
+                                         returnBool=True, specificDriver=3 )
 
     expectedState = [ 'INSTALLED', 'INSTALLING' ]
 
-    if all( result == main.TRUE for result in results ):
+    if stateCheckResults:
         main.log.info( itemName + ": Intents are installed correctly" )
     else:
         # Wait for at least 5 second before checking the intents again
@@ -1414,10 +1413,10 @@
         results = []
         # Second check of intents since some of the intents may be in
         # INSTALLING state, they should be in INSTALLED at this time
-        for i in range( main.numCtrls ):
-            tempResult = main.RESTs[ i ].checkIntentState( intentsId=intentsId )
-            results.append( tempResult )
-        if all( result == main.TRUE for result in results ):
+        stateCheckResults = main.Cluster.command( "checkIntentState",
+                                         kwargs={ "intentsId":intentsId },
+                                         returnBool=True, specificDriver=3 )
+        if stateCheckResults:
             main.log.info( itemName + ": Intents are installed correctly" )
             intentResult = main.TRUE
         else:
@@ -1430,7 +1429,7 @@
 def checkFlowsState( main ):
 
     main.log.info( itemName + ": Check flows state" )
-    checkFlowsResult = main.RESTs[ 0 ].checkFlowsState()
+    checkFlowsResult = main.Cluster.active( 0 ).REST.checkFlowsState()
     return checkFlowsResult
 
 
@@ -1450,7 +1449,7 @@
     onosSummary = []
     removeIntentResult = main.TRUE
     # Remove intents
-    removeIntentResult = main.RESTs[ 0 ].removeAllIntents()
+    removeIntentResult = main.Cluster.active( 0 ).REST.removeAllIntents()
 
     if removeIntentResult:
         main.log.info( itemName + ": There are no more intents remaining, " +
@@ -1465,16 +1464,17 @@
     """
     flowsCount = []
     main.log.info( itemName + ": Checking flows count in each ONOS node" )
-    for i in range( main.numCtrls ):
-        flowsCount.append( len( json.loads( main.RESTs[ i ].flows() ) ) )
+    for ctrl in main.Cluster.active():
+        flowsCount.append( len( json.loads( ctrl.REST.flows() ) ) )
+
 
     if flowsCount:
         if all( flows == flowsCount[ 0 ] for flows in flowsCount ):
             main.log.info( itemName + ": There are " + str( flowsCount[ 0 ] ) +
                            " flows in all ONOS node" )
         else:
-            for i in range( main.numCtrls ):
-                main.log.debug( itemName + ": ONOS node " + str( i + 1 ) +
+            for i in range( main.Cluster.numCtrls ):
+                main.log.debug( itemName + ": " + main.Cluster.active( i ).name +
                                 " has " + str( flowsCount[ i ] ) + " flows" )
     else:
         main.log.error( "Checking flows count failed, check summary command" )
@@ -1519,12 +1519,12 @@
         main.topoRelated
     except ( NameError, AttributeError ):
         main.topoRelated = Topology()
-    hosts = main.topoRelated.getAllHosts( main.numCtrls, False )  # Get host data from each ONOS node
+    hosts = main.topoRelated.getAll( "hosts", False )  # Get host data from each ONOS node
     hostFails = []  # Reset for each failed attempt
 
     #  Check for matching hosts on each node
     scapyHostIPs = [ x.hostIp for x in main.scapyHosts if x.hostIp != "0.0.0.0" ]
-    for controller in range( main.numCtrls ):
+    for controller in range( main.Cluster.numCtrls ):
         controllerStr = str( controller + 1 )  # ONOS node number
         # Compare Hosts
         # Load hosts data for controller node
@@ -1566,7 +1566,7 @@
     """
     import json
     try:
-        hostsJson = json.loads( main.RESTs[ 0 ].hosts() )
+        hostsJson = json.loads( main.Cluster.active( 0 ).REST.hosts() )
         hosts = main.Mininet1.getHosts().keys()
         # TODO: Make better use of new getHosts function
         for host in hosts:
@@ -1721,7 +1721,7 @@
     """
         Report errors/warnings/exceptions
     """
-    main.ONOSbench.logReport( main.ONOSip[ 0 ],
+    main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress,
                               [ "INFO",
                                 "FOLLOWER",
                                 "WARN",
@@ -1731,20 +1731,20 @@
                                 "s" )
 
     main.log.info( "ERROR report: \n" )
-    for i in range( main.numCtrls ):
-        main.ONOSbench.logReport( main.ONOSip[ i ],
+    for ctrl in main.Cluster.active():
+        main.ONOSbench.logReport( ctrl.ipAddress,
                                   [ "ERROR" ],
                                   "d" )
 
     main.log.info( "EXCEPTIONS report: \n" )
-    for i in range( main.numCtrls ):
-        main.ONOSbench.logReport( main.ONOSip[ i ],
+    for ctrl in main.Cluster.active():
+        main.ONOSbench.logReport( ctrl.ipAddress,
                                   [ "Except" ],
                                   "d" )
 
     main.log.info( "WARNING report: \n" )
-    for i in range( main.numCtrls ):
-        main.ONOSbench.logReport( main.ONOSip[ i ],
+    for ctrl in main.Cluster.active():
+        main.ONOSbench.logReport( ctrl.ipAddress,
                                   [ "WARN" ],
                                   "d" )
 
@@ -1755,7 +1755,7 @@
     """
     import time
     main.log.info( "Getting current flow durations" )
-    flowsJson1 = main.RESTs[ 0 ].flows()
+    flowsJson1 = main.Cluster.active( 0 ).REST.flows()
     try:
         flowsJson1 = json.loads( flowsJson1 )
     except ValueError:
@@ -1769,7 +1769,7 @@
     main.log.info( "Sleeping for {} seconds".format( main.flowDurationSleep ) )
     time.sleep( main.flowDurationSleep )
     main.log.info( "Getting new flow durations" )
-    flowsJson2 = main.RESTs[ 0 ].flows()
+    flowsJson2 = main.Cluster.active( 0 ).REST.flows()
     try:
         flowsJson2 = json.loads( flowsJson2 )
     except ValueError:
@@ -1789,7 +1789,7 @@
 
 
 def ProtectedIntentCheck( main ):
-    intent = main.RESTs[ 0 ].intents()
+    intent = main.Cluster.active( 0 ).REST.intents()
     main.log.debug( intent )
     main.stop()
     if "Protection" in intent:
