diff --git a/TestON/core/teston.py b/TestON/core/teston.py
index ff973ed..8eea845 100644
--- a/TestON/core/teston.py
+++ b/TestON/core/teston.py
@@ -165,21 +165,6 @@
         driverClass = getattr(driverModule, driverName)
         driverObject = driverClass()
 
-        if "OC" in self.componentDictionary[component]['host']:
-            try:
-                self.componentDictionary[component]['host'] = os.environ[str( self.componentDictionary[component]['host'])]
-            except KeyError:
-                self.log.info("Missing OC environment variable! Using stored IPs")
-                f = open("myIps","r")
-                ips = f.readlines()
-                for line in ips: 
-                    if self.componentDictionary[component]['host'] in line: 
-                        line = line.split("=")
-                        myIp = line[1]
-                self.componentDictionary[component]['host'] = myIp
-            except Exception as inst:
-                self.log.error("Uncaught exception: " + str(inst))
-
         connect_result = driverObject.connect(user_name = self.componentDictionary[component]['user'] if ('user' in self.componentDictionary[component].keys()) else getpass.getuser(),
                                               ip_address= self.componentDictionary[component]['host'] if ('host' in self.componentDictionary[component].keys()) else 'localhost',
                                               pwd = self.componentDictionary[component]['password'] if ('password' in self.componentDictionary[component].keys()) else 'changeme',
diff --git a/TestON/dependencies/Jenkins_getresult_HA.py b/TestON/dependencies/Jenkins_getresult_HA.py
deleted file mode 100755
index 181e1a9..0000000
--- a/TestON/dependencies/Jenkins_getresult_HA.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import os
-import re
-import datetime
-import time
-import argparse
-import glob
-import shutil
-
-parser = argparse.ArgumentParser()
-parser.add_argument("-n", "--name", help="Comma Separated string of test names. Ex: --name='test1, test2, test3'")
-parser.add_argument("-w", "--workspace", help="The name of the Jenkin's job/workspace where csv files will be saved'")
-args = parser.parse_args()
-
-#Pass in test names as a comma separated string argument. 
-#Example: ./Jenkins_getresult.py "Test1,Test2,Test3,Test4"
-name_list = args.name.split(",")
-result_list = map(lambda x: x.strip(), name_list)
-job = args.workspace
-if job is None:
-    job = ""
-print job
-
-#NOTE: testnames list should be in order in which it is run
-testnames = result_list
-output = ''
-header = ''
-graphs = ''
-testdate = datetime.datetime.now()
-#workspace = "/var/lib/jenkins/workspace/ONOS-HA"
-workspace = "/var/lib/jenkins/workspace/"
-workspace = workspace + job
-
-header +="<p>**************************************</p>"
-header +=testdate.strftime('Jenkins test result for %H:%M on %b %d, %Y. %Z')
-
-
-#NOTE: CASE SPECIFIC THINGS
-
-#THIS LINE IS LOUSY FIXME
-if any("HA" in s for s in testnames):
-    ##Graphs
-    graphs += '<ac:structured-macro ac:name="html">\n'
-    graphs += '<ac:plain-text-body><![CDATA[\n'
-    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/Plot-HA/getPlot?index=2&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
-    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/Plot-HA/getPlot?index=1&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
-    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/Plot-HA/getPlot?index=0&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
-    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/Plot-HA/getPlot?index=3&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
-    graphs += ']]></ac:plain-text-body>\n'
-    graphs += '</ac:structured-macro>\n'
-    header +="<p> <a href='https://wiki.onosproject.org/display/OST/Test+Plan+-+HA'>Test Plan for HA Test Cases</a></p>"
-
-
-# ***
-
-
-#TestON reporting
-for test in testnames:
-    passes = 0
-    fails = 0
-    name = os.popen("ls /home/admin/ONLabTest/TestON/logs/ -rt | grep %s_ | tail -1" % test).read().split()[0]
-    path = "/home/admin/ONLabTest/TestON/logs/" + name + "/"
-    try:
-        #IF exists, move the csv file to the workspace
-        for csvFile in glob.glob( path + '*.csv' ):
-            shutil.copy( csvFile, workspace )
-    except IOError:
-        #File probably doesn't exist
-        pass
-
-    output +="<p></p>"
-    #output +="   Date: %s, %s %s" % (name.split("_")[2], name.split("_")[1], name.split("_")[3]) + "<p>*******************<p>"
-    #Open the latest log folder
-    output += "<h2>Test "+str(test)+"</h2><p>************************************</p>"
-
-    f = open(path + name + ".rpt")
-
-    #Parse through each line of logs and look for specific strings to output to wiki.
-    #NOTE: with current implementation, you must specify which output to output to wiki by using
-    #main.log.report("") since it is looking for the [REPORT] tag in the logs
-    for line in f:
-        if re.search("Result summary for Testcase", line):
-            output += "<h3>"+str(line)+"</h3>"
-            #output += "<br>"
-        if re.search("\[REPORT\]", line): 
-            line_split = line.split("] ")
-            #line string is split by bracket, and first two items (log tags) in list are omitted from output
-            #join is used to convert list to string
-            line_str = ''.join(line_split[2:])
-            output += "<p>"
-            output += line_str
-            output += "</p>"
-        if re.search("Result:", line):
-            output += "<p>"
-            output += line
-            output += "</p>"
-            if re.search("Pass", line):
-                passes = passes + 1
-            elif re.search("Fail", line):
-                fails = fails + 1
-    f.close()
-    #https://wiki.onosproject.org/display/OST/Test+Results+-+HA#Test+Results+-+HA
-    #Example anchor on new wiki:        #TestResults-HA-TestHATestSanity
-    page_name = "Master-HA"
-    if "ONOS-HA-1.1.X" in job:
-        page_name = "Blackbird-HA"
-    elif "ONOS-HA-Maint" in job:
-        # NOTE if page name starts with number confluence prepends 'id-'
-        #      to anchor links
-        page_name = "id-1.0-HA"
-
-    header += "<li><a href=\'#" + str(page_name) + "-Test" + str(test) + "\'> " + str(test) + " - Results: " + str(passes) + " Passed, " + str(fails) + " Failed</a></li>"
-
-    #*********************
-    #include any other phrase specific to case you would like to include in wiki here
-    if test == "IntentPerf":
-        output += "URL to Historical Performance results data: <a href='http://10.128.5.54perf.html'>Perf Graph</a>"
-    #*********************
-
-#header_file = open("/tmp/header_ha.txt",'w')
-#header_file.write(header)
-output = header + graphs + output
-print output
diff --git a/TestON/dependencies/Jenkins_getresult_andrew.py b/TestON/dependencies/Jenkins_getresult_andrew.py
deleted file mode 100755
index 0e7ef8d..0000000
--- a/TestON/dependencies/Jenkins_getresult_andrew.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import os
-import re
-import datetime
-import time
-import argparse
-
-parser = argparse.ArgumentParser()
-parser.add_argument("-n", "--name", help="Comma Separated string of test names. Ex: --name='test1, test2, test3'")
-args = parser.parse_args()
-
-#Pass in test names as a comma separated string argument. 
-#Example: ./Jenkins_getresult.py "Test1,Test2,Test3,Test4"
-name_list = args.name.split(",")
-result_list = map(lambda x: x.strip(), name_list)
-
-#NOTE: testnames list should be in order in which it is run
-testnames = result_list
-output = ''
-testdate = datetime.datetime.now()
-
-output +="<p>**************************************</p>"
-output +=testdate.strftime('Jenkins test result for %H:%M on %b %d, %Y. %Z')
-
-#TestON reporting
-for test in testnames:
-    name = os.popen("ls /home/admin/ONLabTest/TestON/logs/ -rt | grep %s | tail -1" % test).read().split()[0]
-    path = "/home/admin/ONLabTest/TestON/logs/" + name + "/"
-    output +="<p></p>"
-    #output +="   Date: %s, %s %s" % (name.split("_")[2], name.split("_")[1], name.split("_")[3]) + "<br>*******************<br>"
-    #Open the latest log folder 
-    output += "<h2>Test "+str(test)+"</h2><p>************************************</p>"
-
-    f = open(path + name + ".rpt")
-
-    #Parse through each line of logs and look for specific strings to output to wiki.
-    #NOTE: with current implementation, you must specify which output to output to wiki by using
-    #main.log.report("") since it is looking for the [REPORT] tag in the logs
-    for line in f:
-        if re.search("Result summary for Testcase", line):
-            output += "<h3>"+str(line)+"</h3>"
-            #output += "<br>"
-        if re.search("\[REPORT\]", line): 
-            line_split = line.split("] ")
-            #line string is split by bracket, and first two items (log tags) in list are omitted from output
-            #join is used to convert list to string
-            line_str = ''.join(line_split[2:])
-            output += "<p>"
-            output += line_str
-            output += "</p>"
-        if re.search("Result:", line):
-            output += "<p>"
-            output += line
-            output += "</p>"
-    f.close()
-
-    #*********************
-    #include any other phrase specific to case you would like to include in wiki here
-    if test == "IntentPerf":
-        output += "URL to Historical Performance results data: <a href='http://10.128.5.54/perf.html'>Perf Graph</a>"
-    #*********************
-print output
diff --git a/TestON/dependencies/loadgen_NB.py b/TestON/dependencies/loadgen_NB.py
deleted file mode 100755
index 78d18b9..0000000
--- a/TestON/dependencies/loadgen_NB.py
+++ /dev/null
@@ -1,225 +0,0 @@
-#! /usr/bin/env python
-from time import time, sleep
-import time
-import json
-import requests
-import urllib2
-from urllib2 import URLError, HTTPError
-
-'''
-    This script is for Intent Throughput testing. Use linear 7-switch topo. Intents are from S1P1 to/from S7/P1, with incrementing src/dst Mac addresses.
-'''
-
-def setIntentJSN(node_id, intPerGroup, group_id, intent_id):
-    intents = [None for i in range(intPerGroup)]
-    oper = {}
-    index = 0
-    for i in range(intPerGroup / 2):
-        smac = str("%x" %(node_id * 0x100000000000 + 0x010000000000 + (group_id * 0x000001000000) +i + 1))
-        dmac = str("%x" %(node_id * 0x100000000000 + 0x070000000000 + (group_id * 0x000001000000) +i + 1))
-        srcMac = ':'.join(smac[i:i+2] for i in range(0, len(smac), 2))
-        dstMac = ':'.join(dmac[i:i+2] for i in range(0, len(dmac), 2))
-        srcSwitch = "00:00:00:00:00:00:00:01"
-        dstSwitch = "00:00:00:00:00:00:00:07"
-        srcPort = 1
-        dstPort = 1
-
-        oper['intentId'] = intent_id
-        oper['intentType'] = 'SHORTEST_PATH'    # XXX: Hardcode
-        oper['staticPath'] = False              # XXX: Hardcoded
-        oper['srcSwitchDpid'] = srcSwitch
-        oper['srcSwitchPort'] = srcPort
-        oper['dstSwitchDpid'] = dstSwitch
-        oper['dstSwitchPort'] = dstPort
-        oper['matchSrcMac'] = srcMac
-        oper['matchDstMac'] = dstMac
-        intents[index] = oper
-        #print ("perGroup Intents-0 are: " + json.dumps(intents) + "\n\n\n" )
-        index += 1
-        intent_id += 1
-        oper = {}
-        #print ("ID:" + str(id))
-
-        oper['intentId'] = intent_id
-        oper['intentType'] = 'SHORTEST_PATH'    # XXX: Hardcoded
-        oper['staticPath'] = False              # XXX: Hardcoded
-        oper['srcSwitchDpid'] = dstSwitch
-        oper['srcSwitchPort'] = dstPort
-        oper['dstSwitchDpid'] = srcSwitch
-        oper['dstSwitchPort'] = srcPort
-        oper['matchSrcMac'] = dstMac
-        oper['matchDstMac'] = srcMac
-        intents[index] = oper
-        index += 1 
-        intent_id += 1
-        oper = {}
-        #print ("ID: " + str(id))
-        #print ("perGroup Intents-1 are: " + json.dumps(intents) + "\n\n\n" )
-    #print ("contructed intents are: " + json.dumps(intents) + "\n\n\n")
-    return intents, intent_id
-
-def post_json(url, data):
-    """Make a REST POST call and return the JSON result
-           url: the URL to call
-           data: the data to POST"""
-    posturl = "http://%s/wm/onos/intent/high" %(url)
-    #print ("\nPost url is : " + posturl + "\n")
-    parsed_result = []
-    data_json = json.dumps(data)
-    try:
-        request = urllib2.Request(posturl, data_json)
-        request.add_header("Content-Type", "application/json")
-        response = urllib2.urlopen(request)
-        result = response.read()
-        response.close()
-        if len(result) != 0:
-            parsed_result = json.loads(result)
-    except HTTPError as exc:
-        print "ERROR:"
-        print "  REST POST URL: %s" % posturl
-        # NOTE: exc.fp contains the object with the response payload
-        error_payload = json.loads(exc.fp.read())
-        print "  REST Error Code: %s" % (error_payload['code'])
-        print "  REST Error Summary: %s" % (error_payload['summary'])
-        print "  REST Error Description: %s" % (error_payload['formattedDescription'])
-        print "  HTTP Error Code: %s" % exc.code
-        print "  HTTP Error Reason: %s" % exc.reason
-    except URLError as exc:
-        print "ERROR:"
-        print "  REST POST URL: %s" % posturl
-        print "  URL Error Reason: %s" % exc.reason
-    return parsed_result
-
-def delete_json(self, url, intPerGroup, startID):
-    """Make a REST DELETE call and return the JSON result
-           url: the URL to call"""
-    #url = "localhost:8080"
-    for i in range(intPerGroup):
-        posturl = "http://%s/wm/onos/intent/high/%s" %(url, str(i + startID))
-        parsed_result = []
-        try:
-            request = urllib2.Request(posturl)
-            request.get_method = lambda: 'DELETE'
-            response = urllib2.urlopen(request)
-            result = response.read()
-            response.close()
-            #if len(result) != 0:
-            #    parsed_result = json.loads(result)
-        except HTTPError as exc:
-            print "ERROR:"
-            print "  REST DELETE URL: %s" % posturl
-            # NOTE: exc.fp contains the object with the response payload
-            error_payload = json.loads(exc.fp.read())
-            print "  REST Error Code: %s" % (error_payload['code'])
-            print "  REST Error Summary: %s" % (error_payload['summary'])
-            print "  REST Error Description: %s" % (error_payload['formattedDescription'])
-            print "  HTTP Error Code: %s" % exc.code
-            print "  HTTP Error Reason: %s" % exc.reason
-        except URLError as exc:
-            print "ERROR:"
-            print "  REST DELETE URL: %s" % posturl
-            print "  URL Error Reason: %s" % exc.reason
-    return parsed_result
-
-def delete_all_json(url):
-    """Make a REST DELETE call and return the JSON result
-           url: the URL to call"""
-    #url = "localhost:8080"
-    posturl = "http://%s/wm/onos/intent/high" %(url)
-    parsed_result = []
-    try:
-        request = urllib2.Request(posturl)
-        request.get_method = lambda: 'DELETE'
-        response = urllib2.urlopen(request)
-        result = response.read()
-        response.close()
-        if len(result) != 0:
-            parsed_result = json.loads(result)
-    except HTTPError as exc:
-        print "ERROR:"
-        print "  REST DELETE URL: %s" % posturl
-        # NOTE: exc.fp contains the object with the response payload
-        error_payload = json.loads(exc.fp.read())
-        print "  REST Error Code: %s" % (error_payload['code'])
-        print "  REST Error Summary: %s" % (error_payload['summary'])
-        print "  REST Error Description: %s" % (error_payload['formattedDescription'])
-        print "  HTTP Error Code: %s" % exc.code
-        print "  HTTP Error Reason: %s" % exc.reason
-    except URLError as exc:
-        print "ERROR:"
-        print "  REST DELETE URL: %s" % posturl
-        print "  URL Error Reason: %s" % exc.reason
-    return parsed_result
-
-def loadIntents(node_id, urllist, intPerGroup, addrate, duration):
-    urlindex = 0
-    group = 0
-    start_id = 0
-    sleeptimer = (1.000/addrate)
-    tstart = time.time()
-    while ( (time.time() - tstart) <= duration ):
-        if urlindex < len(urllist):
-            realurlind = urlindex
-        else:
-            realurlind = 0
-            urlindex = 0
-
-        u = str(urllist[realurlind])
-        gstart = time.time()
-        intents,start_id = setIntentJSN(node_id, intPerGroup, group, start_id)
-        #print (str(intents))
-        #print ("Starting intent id: " + str(start_id))
-        result = post_json(u, intents)
-        #print json.dumps(intents[group])
-        #print ("post result: " + str(result))
-        gelapse = time.time() - gstart
-        print ("Group: " + str(group) + " with " + str(intPerGroup) + " intents were added in " + str('%.3f' %gelapse) + " seconds.")
-        sleep(sleeptimer)
-        urlindex += 1
-        group += 1
-
-    telapse = time.time() - tstart
-    #print ( "Number of groups: " + str(group) + "; Totoal " + str(args.groups * args.intPerGroup) + " intents were added in " + str(telapse) + " seconds.")
-    return telapse, group
-
-def main():
-    import argparse
-
-    parser = argparse.ArgumentParser(description="less script")
-    parser.add_argument("-n", "--node_id", dest="node_id", default = 1, type=int, help="id of the node generating the intents, this is used to distinguish intents when multiple nodes are use to generate intents")
-    parser.add_argument("-u", "--urls", dest="urls", default="10.128.10.1", type=str, help="a string to show urls to post intents to separated by space, ex. '10.128.10.1:8080 10.128.10.2:80080' ")
-    parser.add_argument("-i", "--intentsPerGroup", dest="intPerGroup", default=100, type=int, help="number of intents in one restcall group")
-    parser.add_argument("-a", "--addrate", dest="addrate", default=10, type=float, help="rate to add intents groups, groups per second")
-    parser.add_argument("-d", "--delrate", dest="delrate", default=100, type=float, help= "### Not Effective -for now intents are delete as bulk #### rate to delete intents, intents/second")
-    parser.add_argument("-l", "--length", dest="duration", default=300, type=int, help="duration/length of time the intents are posted")
-    parser.add_argument("-p", "--pause", dest="pause", default=0, type=int, help= "pausing time between add and delete of intents")
-    args = parser.parse_args()
-
-    node_id = args.node_id
-    urllist = args.urls.split()
-    intPerGroup = args.intPerGroup
-    addrate = args.addrate
-    delrate = args.delrate
-    duration = args.duration    
-    pause = args.pause
-
-    print ("Intent posting urls are: " + str(urllist))
-    print ("Number of Intents per group: " + str(intPerGroup))
-    print ("Intent group add rate: " + str(addrate) )
-    print ("Intent delete rate:" + str(delrate) )
-    print ("Duration: " + str(duration) )
-    print ("Pause between add and delete: " + str(args.pause))
-
-    telapse, group = loadIntents(node_id, urllist, intPerGroup, addrate, duration)
-    print ("\n\n#####################")
-    print ( str(group) + " groups " + " of " + str(intPerGroup) + " Intents per group - Total " + str(group * intPerGroup) + " intents were added in " + str('%.3f' %telapse) + " seconds.")
-    print ( "Effective intents posting rate is: " + str( '%.1f' %( (group * intPerGroup)/telapse ) ) + " Intents/second." )
-    print ("#####################\n\n")
-    print ("Sleep for " + str(pause) + " seconds before deleting all intents...")
-    time.sleep(pause)
-    print ("Cleaning up intents in all nodes...")
-    for url in urllist:
-        delete_all_json(url)
-        
-if __name__ == '__main__':
-    main()
diff --git a/TestON/dependencies/loadgen_SB.py b/TestON/dependencies/loadgen_SB.py
deleted file mode 100755
index cfd2adf..0000000
--- a/TestON/dependencies/loadgen_SB.py
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/usr/bin/python
-
-"""
-This example shows how to create an empty Mininet object
-(without a topology object) and add nodes to it manually.
-"""
-import sys
-import subprocess
-import time
-from mininet.net import Mininet
-from mininet.node import Controller
-from mininet.cli import CLI
-from mininet.log import setLogLevel, info
-
-swlist = []
-hostlist= []
-count = 0 
-
-def createSwPorts(numsw, numport):
-
-    "Create an empty network and add nodes to it."
-
-    net = Mininet()
-    swlist = []
-    hostlist= []
-    print ("Starting Mininet Network....")
-    for i in range(numsw):
-        sw = net.addSwitch( 's' + str(i), dpid = ('00000000000000' + '%0d'%i))
-        print str(sw),
-        for p in range(numport):
-            host = net.addHost("s"+str(i)+"h"+str(p))
-            hostlist.append(host)
-            print str(host),
-            net.addLink(host,sw)
-        swlist.append(sw)
-
-            
-    info( '*** Starting network\n')
-    net.start()
-
-    return swlist
-
-def loadsw(urllist, swlist, addrate, delrate, duration):
-    global numport
-    urlindex = 0
-    count = 0
-    addsleeptimer = 1.000 /addrate
-    delsleeptimer = 1.000/delrate
-    print (" Add sleeptimer: " + str('%.3f' %addsleeptimer) + "; Delete sleeptimer: " + str('%.3f' %delsleeptimer))
-    print str(swlist)
- 
-    tstart = time.time()
-    while ( (time.time() - tstart) <= duration ):
-        #print (time.time() - tstart)
-        astart = time.time()
-        for sw in swlist:
-            if urlindex < len(urllist):
-                i = urlindex
-            else:
-                i = 0
-                urlindex = 0
-        
-            ovscmd = "sudo ovs-vsctl set-controller " + str(sw) + " tcp:" + urllist[i]
-            print ("a"),
-            s = subprocess.Popen(ovscmd, shell=True )
-            time.sleep(addsleeptimer)
-            count += 1
-            urlindex += 1
-        aelapse = time.time() - astart
-        print ("Number of switches connected: " + str(len(swlist)) + " in: " + str('%.3f' %aelapse) + "seconds.")
-
-        dstart = time.time()
-        for sw in swlist:
-            ovscmd = "sudo ovs-vsctl set-controller " + str(sw) + " tcp:127.0.0.1:6633"
-            print ("d"),
-            s = subprocess.Popen(ovscmd, shell=True )
-            time.sleep(delsleeptimer)
-            count += 1
-        delapse = time.time() - dstart
-        print ("Number of switches disconnected: " + str(len(swlist)) + " in: " + str('%.3f' %delapse) + "seconds.")
-    telapse = time.time() - tstart
-    
-    return telapse, count
-def cleanMN():
-    print ("Cleaning MN switches...")
-    s = subprocess.Popen("sudo mn -c > /dev/null 2>&1", shell=True)
-    print ("Done.")
-
-def main():
-    import argparse
-    import threading
-    from threading import Thread
-
-    parser = argparse.ArgumentParser(description="less script")
-    parser.add_argument("-u", "--urls", dest="urls", default="10.128.10.1", type=str, help="a string to show urls to post intents to separated by space, ex. '10.128.10.1:6633 10.128.10.2:6633' ")
-    parser.add_argument("-s", "--switches", dest="numsw", default=100, type=int, help="number of switches use in the load generator; together with the ports per switch config, each switch generates (numport + 2) events")
-    parser.add_argument("-p", "--ports", dest="numport", default=1, type=int, help="number of ports per switches")
-    parser.add_argument("-a", "--addrate", dest="addrate", default=10, type=float, help="rate to add intents groups, groups per second")
-    parser.add_argument("-d", "--delrate", dest="delrate", default=100, type=float, help= "rate to delete intents, intents/second")
-    parser.add_argument("-l", "--testlength", dest="duration", default=0, type=int, help= "pausing time between add and delete of intents")
-    args = parser.parse_args()
-
-    urllist = args.urls.split()
-    numsw = args.numsw
-    numport = args.numport
-    addrate = args.addrate
-    delrate = args.delrate
-    duration = args.duration
-    setLogLevel( 'info' )
-    swlist = createSwPorts(numsw,numport)
-    telapse,count = loadsw(urllist, swlist, addrate, delrate, duration)
-    print ("Total number of switches connected/disconnected: " + str(count) + "; Total events generated: " + str(count * (2 + numport)) + "; Elalpse time: " + str('%.1f' %telapse))
-    print ("Effective aggregated loading is: " + str('%.1f' %((( count * (2+ numport))) / telapse ) ) + "Events/s.")
-    cleanMN()
-
-if __name__ == '__main__':
-    main()
diff --git a/TestON/dependencies/rotate.sh b/TestON/dependencies/rotate.sh
deleted file mode 100755
index 7136ac6..0000000
--- a/TestON/dependencies/rotate.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/bash
-
-
-# NOTE: Taken fnd modified from onos.sh
-# pack-rotate-log [packname] "[log-filenames]" [max rotations]
-# Note: [packname] and all the log-files specified by [log-filenames]
-#       must reside in same dir
-# Example:
-#  pack="/foo/bar/testlogs"
-#  logfiles="/foo/bar/test1.log /foo/bar/test*.log"
-#  pack-rotate-log $pack "$logfiles" 5
-#   => testlogs.tar.bz2 (will contain test1.log test2.log ...)
-#      testlogs.tar.bz2 -> testlogs.1.tar.bz2
-#      testlogs.1.tar.bz2 -> testlogs.2.tar.bz2
-#      ...
-function pack-rotate-log {
-  local packname=$1
-  local logfiles=$2
-  local nr_max=${3:-10}
-  local suffix=".tar.bz2"
-
-  # rotate
-  for i in `seq $(expr $nr_max - 1) -1 1`; do
-    if [ -f ${packname}.${i}${suffix} ]; then
-      mv -f -- ${packname}.${i}${suffix} ${packname}.`expr $i + 1`${suffix}
-    fi
-  done
-  if [ -f ${packname}${suffix} ]; then
-    mv -- ${packname}${suffix} ${packname}.1${suffix}
-  fi
-
-  # pack
-  local existing_logfiles=$( ls -1 $logfiles  2>/dev/null | xargs -n1  basename 2>/dev/null)
-  if [ ! -z "${existing_logfiles}" ]; then
-    tar cjf ${packname}${suffix} -C `dirname ${packname}` -- ${existing_logfiles}
-    for word in ${existing_logfiles}
-    do
-        rm -- `dirname ${packname}`/${word}
-    done
-   fi
-}
-
-
-
-#Begin script
-#NOTE: This seems to break the TestON summary since it mentions the testname
-#echo "Rotating logs for '${1}' test"
-base_name=$1
-root_dir="/home/admin/packet_captures"
-timestamp=`date +%Y_%B_%d_%H_%M_%S`
-#Maybe this should be an argument? pack-and-rotate supports that
-nr_max=10
-
-pack-rotate-log ${root_dir}'/'${base_name} "${root_dir}/${base_name}*.pcap ${root_dir}/${base_name}*.log*" ${nr_max}
diff --git a/TestON/dependencies/topo-100sw.py b/TestON/dependencies/topo-100sw.py
deleted file mode 100644
index 308a3f1..0000000
--- a/TestON/dependencies/topo-100sw.py
+++ /dev/null
@@ -1,31 +0,0 @@
-
-from mininet.topo import Topo
-
-class MyTopo( Topo ):
-        "100 'floating' switch topology"
-
-        def __init__( self ):
-                # Initialize topology
-                Topo.__init__( self )
-
-                sw_list = []
-
-                for i in range(1, 101):
-                        sw_list.append(
-                                self.addSwitch(
-                                        's'+str(i),
-                                        dpid = str(i).zfill(16)))
-
-
-                #Below connections are used for test cases
-                #that need to test link and port events
-                #Add link between switch 1 and switch 2
-                self.addLink(sw_list[0],sw_list[1])
-                
-                #Create hosts and attach to sw 1 and sw 2
-                h1 = self.addHost('h1')
-                h2 = self.addHost('h2')
-                self.addLink(sw_list[0],h1)
-                self.addLink(sw_list[1],h2)
-        
-topos = { 'mytopo': ( lambda: MyTopo() ) }
diff --git a/TestON/dependencies/topo-HA.py b/TestON/dependencies/topo-HA.py
deleted file mode 100644
index 65613d6..0000000
--- a/TestON/dependencies/topo-HA.py
+++ /dev/null
@@ -1,63 +0,0 @@
-from mininet.topo import Topo
-class MyTopo( Topo ):
-    def __init__( self ):
-        Topo.__init__( self )
-        topSwitch = self.addSwitch('s1',dpid='1000'.zfill(16))
-        leftTopSwitch = self.addSwitch('s2',dpid='2000'.zfill(16))
-        rightTopSwitch = self.addSwitch('s5',dpid='5000'.zfill(16))
-        leftBotSwitch = self.addSwitch('s3',dpid='3000'.zfill(16))
-        rightBotSwitch = self.addSwitch('s6',dpid='6000'.zfill(16))	
-        midBotSwitch = self.addSwitch('s28',dpid='2800'.zfill(16))
-        
-        topHost = self.addHost( 'h1' )
-        leftTopHost = self.addHost('h2')
-        rightTopHost = self.addHost('h5')
-        leftBotHost = self.addHost('h3')
-        rightBotHost = self.addHost('h6')
-        midBotHost = self.addHost('h28')
-        self.addLink(topSwitch,topHost)
-        self.addLink(leftTopSwitch,leftTopHost)
-        self.addLink(rightTopSwitch,rightTopHost)
-        self.addLink(leftBotSwitch,leftBotHost)
-        self.addLink(rightBotSwitch,rightBotHost)
-        self.addLink(midBotSwitch,midBotHost)
-        self.addLink(leftTopSwitch,rightTopSwitch)
-        self.addLink(topSwitch,leftTopSwitch)
-        self.addLink(topSwitch,rightTopSwitch)
-        self.addLink(leftTopSwitch,leftBotSwitch)
-        self.addLink(rightTopSwitch,rightBotSwitch)
-        self.addLink(leftBotSwitch,midBotSwitch)
-        self.addLink(midBotSwitch,rightBotSwitch)
-
-        agg1Switch = self.addSwitch('s4',dpid = '3004'.zfill(16))
-        agg2Switch = self.addSwitch('s7',dpid = '6007'.zfill(16))
-        agg1Host = self.addHost('h4')
-        agg2Host = self.addHost('h7')
-        self.addLink(agg1Switch,agg1Host)
-        self.addLink(agg2Switch,agg2Host)
-        self.addLink(agg1Switch, leftBotSwitch)
-        self.addLink(agg2Switch, rightBotSwitch)
-
-        for i in range(10):
-            num = str(i+8)
-            switch = self.addSwitch('s'+num,dpid = ('30'+num.zfill(2)).zfill(16))
-            host = self.addHost('h'+num)
-            self.addLink(switch, host)
-            self.addLink(switch, agg1Switch)
-
-        for i in range(10):
-            num = str(i+18)
-            switch = self.addSwitch('s'+num,dpid = ('60'+num.zfill(2)).zfill(16))
-            host = self.addHost('h'+num)
-            self.addLink(switch, host)
-            self.addLink(switch, agg2Switch)
-
-topos = { 'mytopo': (lambda: MyTopo() ) }
-
-
-
-
-
-
-
-
diff --git a/TestON/dependencies/topo-intentFlower.py b/TestON/dependencies/topo-intentFlower.py
deleted file mode 100644
index 138c291..0000000
--- a/TestON/dependencies/topo-intentFlower.py
+++ /dev/null
@@ -1,80 +0,0 @@
-'''
-Topology with 3 core switches connected linearly.
-
-Each 'core' switch has a 'flower' of 10 switches
-for a total of 33 switches.
-
-Used in conjunction with 'IntentPerfNext' test
-'''
-
-from mininet.topo import Topo
-
-class MyTopo( Topo ):
-
-    def __init__( self ):
-        Topo.__init__( self )
-       
-        #Switches are listed out here for better view
-        #of the topology from this code
-        core_sw_list = ['s1','s2','s3']
-       
-        #Flower switches for core switch 1
-        flower_sw_list_s1 =\
-                ['s10', 's11', 's12', 's13', 's14',
-                 's15', 's16', 's17', 's18', 's19']
-        #Flower switches for core switch 2
-        flower_sw_list_s2 =\
-                ['s20', 's21', 's22', 's23', 's24',
-                 's25', 's26', 's27', 's28', 's29']
-        #Flower switches for core switch 3
-        flower_sw_list_s3 =\
-                ['s30', 's31', 's32', 's33', 's34',
-                 's35', 's36', 's37', 's38', 's39']
-
-        #Store switch objects in these variables
-        core_switches = []
-        flower_switches_1 = []
-        flower_switches_2 = []
-        flower_switches_3 = []
-       
-        #Add switches
-        for sw in core_sw_list:
-            core_switches.append(
-                    self.addSwitch(
-                        sw, 
-                        dpid = sw.replace('s','').zfill(16)
-                    )
-            )
-        for sw in flower_sw_list_s1:
-            flower_switches_1.append(
-                    self.addSwitch(
-                        sw,
-                        dpid = sw.replace('s','').zfill(16)
-                    )
-            )
-        for sw in flower_sw_list_s2:
-            flower_switches_2.append(
-                    self.addSwitch(
-                        sw,
-                        dpid = sw.replace('s','').zfill(16)
-                    )
-            )
-        for sw in flower_sw_list_s3:
-            flower_switches_3.append(
-                    self.addSwitch(
-                        sw,
-                        dpid = sw.replace('s','').zfill(16)
-                    )
-            )
-
-        self.addLink(core_switches[0], core_switches[1])
-        self.addLink(core_switches[1], core_switches[2])
-
-        for x in range(0, len(flower_sw_list_s1)):
-            self.addLink(core_switches[0], flower_switches_1[x]) 
-        for x in range(0, len(flower_sw_list_s2)):
-            self.addLink(core_switches[1], flower_switches_2[x])
-        for x in range(0, len(flower_sw_list_s3)):
-            self.addLink(core_switches[2], flower_switches_3[x])
-
-topos = { 'mytopo': ( lambda: MyTopo() ) }
diff --git a/TestON/dependencies/topo-onos4node.py b/TestON/dependencies/topo-onos4node.py
deleted file mode 100644
index 4fc036c..0000000
--- a/TestON/dependencies/topo-onos4node.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""Custom topology example
-
-Two directly connected switches plus a host for each switch:
-
-   host --- switch --- switch --- host
-
-Adding the 'topos' dict with a key/value pair to generate our newly defined
-topology enables one to pass in '--topo=mytopo' from the command line.
-"""
-
-from mininet.topo import Topo
-
-class MyTopo( Topo ):
-	"Simple topology example."
-
-	def __init__( self ):
-		"Create custom topo."
-		# Initialize topology
-		Topo.__init__( self )
-
-		# Make the middle triangle	
-		leftSwitch = self.addSwitch( 's1' , dpid = '1000'.zfill(16))
-		rightSwitch = self.addSwitch( 's2' , dpid = '2000'.zfill(16))
-		topSwitch = self.addSwitch( 's3' , dpid = '3000'.zfill(16))
-		lefthost = self.addHost( 'h1' )
-		righthost = self.addHost( 'h2' )
-		tophost = self.addHost( 'h3' )
-		self.addLink( leftSwitch, lefthost )
-		self.addLink( rightSwitch, righthost )
-		self.addLink( topSwitch, tophost )
-
-		self.addLink( leftSwitch, rightSwitch )
-		self.addLink( leftSwitch, topSwitch )
-		self.addLink( topSwitch, rightSwitch )
-
-		# Make aggregation switches
-		agg1Switch = self.addSwitch( 's4', dpid = '1004'.zfill(16) ) 
-		agg2Switch = self.addSwitch( 's5', dpid = '2005'.zfill(16) ) 
-		agg1Host = self.addHost( 'h4' ) 
-		agg2Host = self.addHost( 'h5' ) 
-
-		self.addLink( agg1Switch, agg1Host, port1=1, port2=1 )
-		self.addLink( agg2Switch, agg2Host, port1=1, port2=1 )
-
-		self.addLink( agg2Switch, rightSwitch )
-		self.addLink( agg1Switch, leftSwitch )
-
-		# Make two aggregation fans
-		for i in range(10):
-			num=str(i+6)
-			switch = self.addSwitch( 's' + num, dpid = ('10' + num.zfill(2) ).zfill(16))
-			host = self.addHost( 'h' + num ) 
-			self.addLink( switch, host, port1=1, port2=1 ) 
-			self.addLink( switch, agg1Switch ) 
-
-		for i in range(10):
-			num=str(i+31)
-			switch = self.addSwitch( 's' + num, dpid = ('20' + num.zfill(2)).zfill(16) )
-			host = self.addHost( 'h' + num ) 
-			self.addLink( switch, host, port1=1, port2=1 ) 
-			self.addLink( switch, agg2Switch ) 
-
-topos = { 'mytopo': ( lambda: MyTopo() ) }
diff --git a/TestON/dependencies/topo-onos4node.py.old b/TestON/dependencies/topo-onos4node.py.old
deleted file mode 100644
index 3328a5d..0000000
--- a/TestON/dependencies/topo-onos4node.py.old
+++ /dev/null
@@ -1,61 +0,0 @@
-"""Custom topology example
-
-Two directly connected switches plus a host for each switch:
-
-   host --- switch --- switch --- host
-
-Adding the 'topos' dict with a key/value pair to generate our newly defined
-topology enables one to pass in '--topo=mytopo' from the command line.
-"""
-
-from mininet.topo import Topo
-
-class MyTopo( Topo ):
-	"Simple topology example."
-
-	def __init__( self ):
-		"Create custom topo."
-		# Initialize topology
-		Topo.__init__( self )
-
-		# Make the middle triangle	
-		leftSwitch = self.addSwitch( 's1' )
-		rightSwitch = self.addSwitch( 's2' )
-		topSwitch = self.addSwitch( 's3' )
-		lefthost = self.addHost( 'h1' )
-		righthost = self.addHost( 'h2' )
-		tophost = self.addHost( 'h3' )
-		self.addLink( leftSwitch, lefthost )
-		self.addLink( rightSwitch, righthost )
-		self.addLink( topSwitch, tophost )
-
-		self.addLink( leftSwitch, rightSwitch )
-		self.addLink( leftSwitch, topSwitch )
-		self.addLink( topSwitch, rightSwitch )
-
-		# Make aggregation switches
-		agg1Switch = self.addSwitch( 's4' ) 
-		agg2Switch = self.addSwitch( 's5' ) 
-		agg1Host = self.addHost( 'h4' ) 
-		agg2Host = self.addHost( 'h5' ) 
-
-		self.addLink( agg1Switch, agg1Host )
-		self.addLink( agg2Switch, agg2Host )
-
-		self.addLink( agg1Switch, rightSwitch )
-		self.addLink( agg2Switch, leftSwitch )
-
-		# Make two aggregation fans
-		for i in range(10):
-			switch = self.addSwitch( 's%d' % (i+6) )
-			host = self.addHost( 'h%d' % (i+6) ) 
-			self.addLink( switch, host ) 
-			self.addLink( switch, agg1Switch ) 
-
-		for i in range(10):
-			switch = self.addSwitch( 's%d' % (i+31) )
-			host = self.addHost( 'h%d' % (i+31) ) 
-			self.addLink( switch, host ) 
-			self.addLink( switch, agg2Switch ) 
-
-topos = { 'mytopo': ( lambda: MyTopo() ) }
diff --git a/TestON/dependencies/topo-onos4nodeNEW.py b/TestON/dependencies/topo-onos4nodeNEW.py
deleted file mode 100644
index 1824e3b..0000000
--- a/TestON/dependencies/topo-onos4nodeNEW.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""Custom topology example
-
-Two directly connected switches plus a host for each switch:
-
-   host --- switch --- switch --- host
-
-Adding the 'topos' dict with a key/value pair to generate our newly defined
-topology enables one to pass in '--topo=mytopo' from the command line.
-"""
-
-from mininet.topo import Topo
-
-class MyTopo( Topo ):
-	"Simple topology example."
-
-	def __init__( self ):
-		"Create custom topo."
-		# Initialize topology
-		Topo.__init__( self )
-
-		# Make the middle triangle	
-		leftSwitch = self.addSwitch( 's1' , dpid = '1000'.zfill(16))
-		rightSwitch = self.addSwitch( 's2' , dpid = '2000'.zfill(16))
-		topSwitch = self.addSwitch( 's3' , dpid = '3000'.zfill(16))
-		lefthost = self.addHost( 'h1' )
-		righthost = self.addHost( 'h2' )
-		tophost = self.addHost( 'h3' )
-		self.addLink( leftSwitch, lefthost )
-		self.addLink( rightSwitch, righthost )
-		self.addLink( topSwitch, tophost )
-
-		self.addLink( leftSwitch, rightSwitch )
-		self.addLink( leftSwitch, topSwitch )
-		self.addLink( topSwitch, rightSwitch )
-
-		# Make aggregation switches
-		agg1Switch = self.addSwitch( 's4', dpid = '1004'.zfill(16) ) 
-		agg2Switch = self.addSwitch( 's5', dpid = '2005'.zfill(16) ) 
-		agg1Host = self.addHost( 'h4' ) 
-		agg2Host = self.addHost( 'h5' ) 
-
-		self.addLink( agg1Switch, agg1Host )
-		self.addLink( agg2Switch, agg2Host )
-
-		self.addLink( agg2Switch, rightSwitch )
-		self.addLink( agg1Switch, leftSwitch )
-
-		# Make two aggregation fans
-		for i in range(10):
-			num=str(i+6)
-			switch = self.addSwitch( 's' + num, dpid = ('10' + num.zfill(2) ).zfill(16))
-			host = self.addHost( 'h' + num ) 
-			self.addLink( switch, host ) 
-			self.addLink( switch, agg1Switch ) 
-
-		for i in range(10):
-			num=str(i+31)
-			switch = self.addSwitch( 's' + num, dpid = ('20' + num.zfill(2)).zfill(16) )
-			host = self.addHost( 'h' + num ) 
-			self.addLink( switch, host ) 
-			self.addLink( switch, agg2Switch ) 
-
-topos = { 'mytopo': ( lambda: MyTopo() ) }
diff --git a/TestON/drivers/common/cli/emulator/mininetclidriver.py b/TestON/drivers/common/cli/emulator/mininetclidriver.py
index bdc9307..b877d93 100644
--- a/TestON/drivers/common/cli/emulator/mininetclidriver.py
+++ b/TestON/drivers/common/cli/emulator/mininetclidriver.py
@@ -35,6 +35,7 @@
 import re
 import sys
 import types
+import os
 sys.path.append( "../" )
 from math import pow
 from drivers.common.cli.emulatordriver import Emulator
@@ -61,6 +62,22 @@
                 vars( self )[ key ] = connectargs[ key ]
 
             self.name = self.options[ 'name' ]
+
+            try:
+                if os.getenv( str( self.ip_address ) ) != None:
+                    self.ip_address = os.getenv( str( self.ip_address ) )
+                else:
+                    main.log.info( self.name +
+                                   ": Trying to connect to " +
+                                   self.ip_address )
+
+            except KeyError:
+                main.log.info( "Invalid host name," +
+                               " connecting to local host instead" )
+                self.ip_address = 'localhost'
+            except Exception as inst:
+                main.log.error( "Uncaught exception: " + str( inst ) )
+
             self.handle = super(
                 MininetCliDriver,
                 self ).connect(
diff --git a/TestON/drivers/common/cli/emulator/remotemininetdriver.py b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
index c2c011a..cea3eab 100644
--- a/TestON/drivers/common/cli/emulator/remotemininetdriver.py
+++ b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
@@ -24,6 +24,7 @@
 import pexpect
 import re
 import sys
+import os
 sys.path.append( "../" )
 from drivers.common.cli.emulatordriver import Emulator
 
@@ -51,6 +52,22 @@
             vars( self )[ key ] = connectargs[ key ]
 
         self.name = self.options[ 'name' ]
+
+        try:
+            if os.getenv( str( self.ip_address ) ) != None:
+                self.ip_address = os.getenv( str( self.ip_address ) )
+            else:
+                main.log.info( self.name +
+                               ": Trying to connect to " +
+                               self.ip_address )
+
+        except KeyError:
+            main.log.info( "Invalid host name," +
+                           " connecting to local host instead" )
+            self.ip_address = 'localhost'
+        except Exception as inst:
+            main.log.error( "Uncaught exception: " + str( inst ) )
+
         self.handle = super(
             RemoteMininetDriver,
             self ).connect(
diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index fca8f22..870293d 100644
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -22,6 +22,7 @@
 import json
 import types
 import time
+import os
 sys.path.append( "../" )
 from drivers.common.clidriver import CLI
 
@@ -52,7 +53,28 @@
             if self.home is None or self.home == "":
                 self.home = "~/onos"
 
+            for key in self.options:
+                if key == 'onosIp':
+                    self.onosIp = self.options[ 'onosIp' ]
+                    break
+
             self.name = self.options[ 'name' ]
+
+            try:
+                if os.getenv( str( self.ip_address ) ) != None:
+                    self.ip_address = os.getenv( str( self.ip_address ) )
+                else:
+                    main.log.info( self.name +
+                                   ": Trying to connect to " +
+                                   self.ip_address )
+
+            except KeyError:
+                main.log.info( "Invalid host name," +
+                               " connecting to local host instead" )
+                self.ip_address = 'localhost'
+            except Exception as inst:
+                main.log.error( "Uncaught exception: " + str( inst ) )
+
             self.handle = super( OnosCliDriver, self ).connect(
                 user_name=self.user_name,
                 ip_address=self.ip_address,
diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
index 8bc2666..8a87a49 100644
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -19,6 +19,7 @@
 import sys
 import time
 import pexpect
+import os
 import os.path
 from requests.models import Response
 sys.path.append( "../" )
@@ -39,6 +40,10 @@
     def connect( self, **connectargs ):
         """
         Creates ssh handle for ONOS "bench".
+        NOTE:
+        The ip_address would come from the topo file using the host tag, the
+        value can be an environment variable as well as a "localhost" to get
+        the ip address needed to ssh to the "bench"
         """
         try:
             for key in connectargs:
@@ -52,6 +57,57 @@
                 self.home = "~/onos"
 
             self.name = self.options[ 'name' ]
+
+            for key in self.options:
+                if key == "nodes":
+                    # Maximum number of ONOS nodes to run
+                    self.maxNodes = int( self.options[ 'nodes' ] )
+                    break
+                self.maxNodes = None
+
+
+            # Grabs all OC environment variables
+            self.onosIps = {}  # Dictionary of all possible ONOS ip
+
+            try:
+                if self.maxNodes:
+                    main.log.info( self.name + ": Creating cluster data with " +
+                                   str( self.maxNodes ) + " maximum number" +
+                                   " of nodes" )
+
+                    for i in range( self.maxNodes ):
+                        envString = "OC" + str( i + 1 )
+                        self.onosIps[ envString ] = os.getenv( envString )
+
+                    if not self.onosIps:
+                        main.log.info( "Could not read any environment variable"
+                                       + " please load a cell file with all" +
+                                        " onos IP" )
+                    else:
+                        main.log.info( self.name + ": Found " +
+                                       str( self.onosIps.values() ) +
+                                       " ONOS IPs" )
+
+            except KeyError:
+                main.log.info( "Invalid environment variable" )
+            except Exception as inst:
+                main.log.error( "Uncaught exception: " + str( inst ) )
+
+            try:
+                if os.getenv( str( self.ip_address ) ) != None:
+                    self.ip_address = os.getenv( str( self.ip_address ) )
+                else:
+                    main.log.info( self.name +
+                                   ": Trying to connect to " +
+                                   self.ip_address )
+
+            except KeyError:
+                main.log.info( "Invalid host name," +
+                               " connecting to local host instead" )
+                self.ip_address = 'localhost'
+            except Exception as inst:
+                main.log.error( "Uncaught exception: " + str( inst ) )
+
             self.handle = super( OnosDriver, self ).connect(
                 user_name=self.user_name,
                 ip_address=self.ip_address,
@@ -61,11 +117,13 @@
 
             self.handle.sendline( "cd " + self.home )
             self.handle.expect( "\$" )
+
             if self.handle:
                 return self.handle
             else:
                 main.log.info( "NO ONOS HANDLE" )
                 return main.FALSE
+
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":     " + self.handle.before )
@@ -587,7 +645,7 @@
             main.exit()
 
     def createCellFile( self, benchIp, fileName, mnIpAddrs,
-                        appString, *onosIpAddrs ):
+                        appString, onosIpAddrs ):
         """
         Creates a cell file based on arguments
         Required:
@@ -623,7 +681,7 @@
         tempCount = 1
 
         # Create ONOSNIC ip address prefix
-        tempOnosIp = onosIpAddrs[ 0 ]
+        tempOnosIp = str( onosIpAddrs[ 0 ] )
         tempList = []
         tempList = tempOnosIp.split( "." )
         # Omit last element of list to format for NIC
@@ -1984,102 +2042,14 @@
             main.cleanup()
             main.exit()
 
-    def getOnosIps(self):
+    def getOnosIps( self ):
+        """
+            Get all onos IPs stored in
+        """
 
-        import os
-        
-        # reads env for OC variables, also saves file with OC variables. If file and env conflict 
-        # priority goes to env. If file has OCs that are not in the env, the file OCs are used. 
-        # In other words, if the env is set, the test will use those values. 
+        return sorted( self.onosIps.values() )
 
-        # returns a list of ip addresses for the onos nodes, will work with up to 7 nodes + OCN and OCI
-        # returns in format [ OC1 ip, OC2 ...ect. , OCN, OCI ]
-
-        envONOSIps = {}
-
-        x = 1
-        while True:
-            try:
-                temp = os.environ[ 'OC' + str(x) ]
-            except KeyError: 
-                break
-            envONOSIps[ ("OC" + str(x)) ] = temp 
-            x += 1 
-
-        try: 
-            temp = os.environ[ 'OCN' ] 
-            envONOSIps[ "OCN" ] = temp
-        except KeyError: 
-            main.log.info("OCN not set in env")
-
-        try:
-            temp = os.environ[ 'OCI' ]
-            envONOSIps[ "OCI" ] = temp
-        except:
-            main.log.error("OCI not set in env")
-
-        print(str(envONOSIps))
-
-        order = [ "OC1", "OC2", "OC3","OC4","OC5","OC6","OC7","OCN","OCI" ]
-        ONOSIps = []
-
-        try: 
-            if os.path.exists("myIps"):
-                ipFile = open("myIps","r+")
-            else: 
-                ipFile = open("myIps","w+")
-
-            fileONOSIps = ipFile.readlines()
-            ipFile.close()
-
-            print str(fileONOSIps)
-            
-            if str(fileONOSIps) == "[]": 
-                ipFile = open("myIps","w+")
-                for key in envONOSIps:
-                    ipFile.write(key+ "=" + envONOSIps[key] + "\n")
-                ipFile.close()
-                for i in order: 
-                    if i in envONOSIps: 
-                        ONOSIps.append(envONOSIps[i])
-                
-                return ONOSIps 
-
-            else: 
-                fileDict = {}
-                for line in fileONOSIps: 
-                    line = line.replace("\n","")
-                    line = line.split("=") 
-                    key = line[0]
-                    value = line[1]
-                    fileDict[key] = value 
-
-                for x in envONOSIps: 
-                    if x in fileDict: 
-                        if envONOSIps[x] == fileDict[x]: 
-                            continue
-                        else: 
-                            fileDict[x] = envONOSIps[x]
-                    else: 
-                        fileDict[x] = envONOSIps[x]
-
-                ipFile = open("myIps","w+")
-                for key in order: 
-                    if key in fileDict: 
-                        ipFile.write(key + "=" + fileDict[key] + "\n")
-                        ONOSIps.append(fileDict[key]) 
-                ipFile.close()
-
-                return ONOSIps 
-
-        except IOError as a:
-            main.log.error(a) 
-
-        except Exception as a:
-            main.log.error(a) 
-
-
-    def logReport(self, nodeIp, searchTerms, outputMode="s"):
+    def logReport( self, nodeIp, searchTerms, outputMode="s" ):
         '''
             - accepts either a list or a string for "searchTerms" these
               terms will be searched for in the log and have their 
diff --git a/TestON/tests/SAMPstartTemplate/Dependency/newFuncTopo.py b/TestON/tests/SAMPstartTemplate/Dependency/newFuncTopo.py
new file mode 100755
index 0000000..57ad42f
--- /dev/null
+++ b/TestON/tests/SAMPstartTemplate/Dependency/newFuncTopo.py
@@ -0,0 +1,152 @@
+#!/usr/bin/python
+
+"""
+Custom topology for Mininet
+"""
+from mininet.topo import Topo
+from mininet.net import Mininet
+from mininet.node import Host, RemoteController
+from mininet.node import Node
+from mininet.node import CPULimitedHost
+from mininet.link import TCLink
+from mininet.cli import CLI
+from mininet.log import setLogLevel
+from mininet.util import dumpNodeConnections
+from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
+
+class VLANHost( Host ):
+    def config( self, vlan=100, **params ):
+		r = super( Host, self ).config( **params )
+		intf = self.defaultIntf()
+		self.cmd( 'ifconfig %s inet 0' % intf )
+		self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
+		self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+		newName = '%s.%d' % ( intf, vlan )
+		intf.name = newName
+		self.nameToIntf[ newName ] = intf
+		return r
+
+class IPv6Host( Host ):
+    def config( self, v6Addr='1000:1/64', **params ):
+		r = super( Host, self ).config( **params )
+		intf = self.defaultIntf()
+		self.cmd( 'ifconfig %s inet 0' % intf )
+		self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
+		return r
+
+class dualStackHost( Host ):
+    def config( self, v6Addr='2000:1/64', **params ):
+		r = super( Host, self ).config( **params )
+		intf = self.defaultIntf()
+		self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
+		return r
+
+class MyTopo( Topo ):
+
+	def __init__( self ):			 
+		# Initialize topology
+		Topo.__init__( self )
+							  
+		# Switch S5 Hosts
+		host1=self.addHost( 'h1', ip='10.1.0.2/24' )
+		host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+		host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
+		#VLAN hosts
+		host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
+		host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
+		#VPN-1 and VPN-2 Hosts
+		host6=self.addHost( 'h6', ip='11.1.0.2/24' )
+		host7=self.addHost( 'h7', ip='12.1.0.2/24' )
+		#Multicast Sender
+		host8=self.addHost( 'h8', ip='10.1.0.4/24' )
+
+		# Switch S6 Hosts
+		host9=self.addHost( 'h9', ip='10.1.0.5/24' )
+		host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+		host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
+		#VLAN hosts
+		host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
+		host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
+		#VPN-1 and VPN-2 Hosts
+		host14=self.addHost( 'h14', ip='11.1.0.3/24' )
+		host15=self.addHost( 'h15', ip='12.1.0.3/24' )
+		#Multicast Receiver
+		host16=self.addHost( 'h16', ip='10.1.0.7/24' )
+
+		# Switch S7 Hosts
+		host17=self.addHost( 'h17', ip='10.1.0.8/24' )
+		host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+		host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
+		#VLAN hosts
+		host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
+		host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
+		#VPN-1 and VPN-2 Hosts
+		host22=self.addHost( 'h22', ip='11.1.0.4/24' )
+		host23=self.addHost( 'h23', ip='12.1.0.4/24' )
+		#Multicast Receiver
+		host24=self.addHost( 'h24', ip='10.1.0.10/24' )
+
+		s1 = self.addSwitch( 's1' )
+		s2 = self.addSwitch( 's2' )
+		s3 = self.addSwitch( 's3' )
+		s4 = self.addSwitch( 's4' )
+		s5 = self.addSwitch( 's5' )
+		s6 = self.addSwitch( 's6' )
+		s7 = self.addSwitch( 's7' )
+																								    
+		self.addLink(s5,host1)
+		self.addLink(s5,host2)
+		self.addLink(s5,host3)
+		self.addLink(s5,host4)
+		self.addLink(s5,host5)
+		self.addLink(s5,host6)
+		self.addLink(s5,host7)
+		self.addLink(s5,host8)
+
+		self.addLink(s6,host9)
+		self.addLink(s6,host10)
+		self.addLink(s6,host11)
+		self.addLink(s6,host12)
+		self.addLink(s6,host13)
+		self.addLink(s6,host14)
+		self.addLink(s6,host15)
+		self.addLink(s6,host16)
+
+		self.addLink(s7,host17)
+		self.addLink(s7,host18)
+		self.addLink(s7,host19)
+		self.addLink(s7,host20)
+		self.addLink(s7,host21)
+		self.addLink(s7,host22)
+		self.addLink(s7,host23)
+		self.addLink(s7,host24)
+
+		self.addLink(s1,s2)																							 
+		self.addLink(s1,s3)
+		self.addLink(s1,s4)
+		self.addLink(s1,s5)
+		
+		self.addLink(s2,s3)
+		self.addLink(s2,s5)
+		self.addLink(s2,s6)
+
+		self.addLink(s3,s4)
+		self.addLink(s3,s6)
+		
+		self.addLink(s4,s7)
+		topos = { 'mytopo': ( lambda: MyTopo() ) }
+
+# HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
+
+def setupNetwork():
+    "Create network"
+    topo = MyTopo()
+    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network.start()
+    CLI( network )
+    network.stop()
+
+if __name__ == '__main__':
+    setLogLevel('info')
+    #setLogLevel('debug')
+    setupNetwork()
diff --git a/TestON/tests/SAMPstartTemplate/Dependency/startUp.py b/TestON/tests/SAMPstartTemplate/Dependency/startUp.py
new file mode 100644
index 0000000..bf2a2b6
--- /dev/null
+++ b/TestON/tests/SAMPstartTemplate/Dependency/startUp.py
@@ -0,0 +1,38 @@
+"""
+    This wrapper function is use for starting up onos instance
+"""
+
+import time
+import os
+import json
+
+def onosBuild( main, gitBranch ):
+    """
+        This includes pulling ONOS and building it using maven install
+    """
+
+    buildResult = main.FALSE
+
+    # Git checkout a branch of ONOS
+    checkOutResult = main.ONOSbench.gitCheckout( gitBranch )
+    # Does the git pull on the branch that was checked out
+    if not checkOutResult:
+        main.log.warn( "Failed to checked out " + gitBranch +
+                                           " branch")
+    else:
+        main.log.info( "Successfully checked out " + gitBranch +
+                                           " branch")
+    gitPullResult = main.ONOSbench.gitPull()
+    if gitPullResult == main.ERROR:
+        main.log.error( "Error pulling git branch" )
+    else:
+        main.log.info( "Successfully pulled " + gitBranch + " branch" )
+
+    # Maven clean install
+    buildResult = main.ONOSbench.cleanInstall()
+
+    return buildResult
+
+
+
+
diff --git a/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.params b/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.params
index 04f6110..1fa6036 100755
--- a/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.params
+++ b/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.params
@@ -1,33 +1,34 @@
 <PARAMS>
-    <testcases>10,9,10,9</testcases>
 
-    <SCALE>1,3</SCALE>
-    <availableNodes>3</availableNodes>
+    <testcases>1,2,2,2</testcases>
+
+    <SCALE>
+        <size>1,2,3</size>
+        <max>3</max>
+    </SCALE>
+
+    <DEPENDENCY>
+        <path>/tests/SAMPstartTemplate/Dependency/</path>
+        <wrapper1>startUp</wrapper1>
+        <topology>newFuncTopo.py</topology>
+    </DEPENDENCY>
+
     <ENV>
-        <cellName>functionality</cellName>
+        <cellName>productionCell</cellName>
         <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
     </ENV>
+
     <GIT>
         <pull>False</pull>
         <branch>master</branch>
     </GIT>
+
     <CTRL>
-        <num>3</num>
-        <ip1>OC1</ip1>
-        <port1>6633</port1>
-        <ip2>OC2</ip2>
-        <port2>6633</port2>
-        <ip3>OC3</ip3>
-        <port3>6633</port3>
+        <port>6633</port>
     </CTRL>
-    <BENCH>
-        <user>admin</user>
-        <ip1>OCN</ip1>
-    </BENCH>
-    <MININET>
-        <switch>7</switch>
-        <links>20</links>
-        <topo>~/mininet/custom/newFuncTopo.py</topo>
-    </MININET>
+
+    <SLEEP>
+        <startup>15</startup>
+    </SLEEP>
 
 </PARAMS>
diff --git a/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.py b/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.py
index 9df58af..acd899d 100644
--- a/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.py
+++ b/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.py
@@ -7,104 +7,122 @@
     def __init__( self ):
         self.default = ''
 
-    def CASE10( self, main ):
+    def CASE1( self, main ):
         import time
         import os
         import imp
-        """
-        Startup sequence:
-        git pull
-        cell <name>
-        onos-verify-cell
-        onos-remove-raft-log
-        mvn clean install
-        onos-package
-        onos-install -f
-        onos-wait-for-start
-        """
-        global init
-        global globalONOSip
-        try:
-            if type(init) is not bool:
-                init = False
-        except NameError:
-            init = False
 
-        #Local variables
-        cellName = main.params[ 'ENV' ][ 'cellName' ]
-        apps = main.params[ 'ENV' ][ 'cellApps' ]
+        """
+        - Construct tests variables
+        - GIT ( optional )
+            - Checkout ONOS master branch
+            - Pull latest ONOS code
+        - Building ONOS ( optional )
+            - Install ONOS package
+            - Build ONOS package
+        """
+
+        main.case( "Constructing test variables and building ONOS package" )
+        main.step( "Constructing test variables" )
+        stepResult = main.FALSE
+
+        # Test variables
+        main.testOnDirectory = os.path.dirname( os.getcwd ( ) )
+        main.cellName = main.params[ 'ENV' ][ 'cellName' ]
+        main.apps = main.params[ 'ENV' ][ 'cellApps' ]
         gitBranch = main.params[ 'GIT' ][ 'branch' ]
-        benchIp = os.environ[ 'OCN' ]
-        benchUser = main.params[ 'BENCH' ][ 'user' ]
-        topology = main.params[ 'MININET' ][ 'topo' ]
-        main.numSwitch = int( main.params[ 'MININET' ][ 'switch' ] )
-        main.numLinks = int( main.params[ 'MININET' ][ 'links' ] )
-        main.numCtrls = main.params[ 'CTRL' ][ 'num' ]
-        main.ONOSport = []
-        main.hostsData = {}
-        PULLCODE = False
-        if main.params[ 'GIT' ][ 'pull' ] == 'True':
-            PULLCODE = True
-        main.case( "Setting up test environment" )
+        main.dependencyPath = main.testOnDirectory + \
+                              main.params[ 'DEPENDENCY' ][ 'path' ]
+        main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
+        main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
+        main.maxNodes = int( main.params[ 'SCALE' ][ 'max' ] )
+        main.ONOSport = main.params[ 'CTRL' ][ 'port' ]
+        wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+        main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+        gitPull = main.params[ 'GIT' ][ 'pull' ]
+        main.cellData = {} # for creating cell file
         main.CLIs = []
-        for i in range( 1, int( main.numCtrls ) + 1 ):
+        main.ONOSip = []
+
+        main.ONOSip = main.ONOSbench.getOnosIps()
+        print main.ONOSip
+
+        # Assigning ONOS cli handles to a list
+        for i in range( 1,  main.maxNodes + 1 ):
             main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
-            main.ONOSport.append( main.params[ 'CTRL' ][ 'port' + str( i ) ] )
 
         # -- INIT SECTION, ONLY RUNS ONCE -- #
-        if init == False:
-            init = True
+        main.startUp = imp.load_source( wrapperFile1,
+                                        main.dependencyPath +
+                                        wrapperFile1 +
+                                        ".py" )
 
-            main.scale = ( main.params[ 'SCALE' ] ).split( "," )
-            main.numCtrls = int( main.scale[ 0 ] )
+        copyResult = main.ONOSbench.copyMininetFile( main.topology,
+                                                     main.dependencyPath,
+                                                     main.Mininet1.user_name,
+                                                     main.Mininet1.ip_address )
+        if main.CLIs:
+            stepResult = main.TRUE
+        else:
+            main.log.error( "Did not properly created list of ONOS CLI handle" )
+            stepResult = main.FALSE
 
-            if PULLCODE:
-                main.step( "Git checkout and pull " + gitBranch )
-                main.ONOSbench.gitCheckout( gitBranch )
-                gitPullResult = main.ONOSbench.gitPull()
-                if gitPullResult == main.ERROR:
-                    main.log.error( "Error pulling git branch" )
-                main.step( "Using mvn clean & install" )
-                cleanInstallResult = main.ONOSbench.cleanInstall()
-                stepResult = cleanInstallResult
-                utilities.assert_equals( expect=main.TRUE,
-                                         actual=stepResult,
-                                         onpass="Successfully compiled " +
-                                                "latest ONOS",
-                                         onfail="Failed to compile " +
-                                                "latest ONOS" )
-            else:
-                main.log.warn( "Did not pull new code so skipping mvn " +
-                               "clean install" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully construct " +
+                                        "test variables ",
+                                 onfail="Failed to construct test variables" )
 
-            globalONOSip = main.ONOSbench.getOnosIps()
+        if gitPull == 'True':
+            main.step( "Building ONOS in " + gitBranch + " branch" )
+            onosBuildResult = main.startUp.onosBuild( main, gitBranch )
+            stepResult = onosBuildResult
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=stepResult,
+                                     onpass="Successfully compiled " +
+                                            "latest ONOS",
+                                     onfail="Failed to compile " +
+                                            "latest ONOS" )
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
 
-        maxNodes = ( len( globalONOSip ) - 2 )
+    def CASE2( self, main ):
+        """
+        - Set up cell
+            - Create cell file
+            - Set cell file
+            - Verify cell file
+        - Kill ONOS process
+        - Uninstall ONOS cluster
+        - Verify ONOS start up
+        - Install ONOS cluster
+        - Connect to cli
+        """
 
+        # main.scale[ 0 ] determines the current number of ONOS controller
         main.numCtrls = int( main.scale[ 0 ] )
-        main.scale.remove( main.scale[ 0 ] )
 
-        main.ONOSip = []
-        for i in range( maxNodes ):
-            main.ONOSip.append( globalONOSip[ i ] )
+        main.case( "Starting up " + str( main.numCtrls ) +
+                   " node(s) ONOS cluster" )
 
         #kill off all onos processes
         main.log.info( "Safety check, killing all ONOS processes" +
                        " before initiating enviornment setup" )
-        for i in range( maxNodes ):
-            main.ONOSbench.onosDie( globalONOSip[ i ] )
+
+        for i in range( main.maxNodes ):
+            main.ONOSbench.onosDie( main.ONOSip[ i ] )
 
         print "NODE COUNT = ", main.numCtrls
-        main.log.info( "Creating cell file" )
-        cellIp = []
+
+        tempOnosIp = []
         for i in range( main.numCtrls ):
-            cellIp.append( str( main.ONOSip[ i ] ) )
-        print cellIp
-        main.ONOSbench.createCellFile( benchIp, cellName, "",
-                                       str( apps ), *cellIp )
+            tempOnosIp.append( main.ONOSip[i] )
+
+        main.ONOSbench.createCellFile( main.ONOSbench.ip_address, "temp", main.Mininet1.ip_address, main.apps, tempOnosIp )
 
         main.step( "Apply cell to environment" )
-        cellResult = main.ONOSbench.setCell( cellName )
+        cellResult = main.ONOSbench.setCell( "temp" )
         verifyResult = main.ONOSbench.verifyCell()
         stepResult = cellResult and verifyResult
         utilities.assert_equals( expect=main.TRUE,
@@ -121,6 +139,7 @@
                                  onpass="Successfully created ONOS package",
                                  onfail="Failed to create ONOS package" )
 
+        time.sleep( main.startUpSleep )
         main.step( "Uninstalling ONOS package" )
         onosUninstallResult = main.TRUE
         for i in range( main.numCtrls ):
@@ -131,7 +150,8 @@
                                  actual=stepResult,
                                  onpass="Successfully uninstalled ONOS package",
                                  onfail="Failed to uninstall ONOS package" )
-        time.sleep( 5 )
+
+        time.sleep( main.startUpSleep )
         main.step( "Installing ONOS package" )
         onosInstallResult = main.TRUE
         for i in range( main.numCtrls ):
@@ -143,11 +163,12 @@
                                  onpass="Successfully installed ONOS package",
                                  onfail="Failed to install ONOS package" )
 
-        time.sleep( 20 )
+        time.sleep( main.startUpSleep )
         main.step( "Starting ONOS service" )
         stopResult = main.TRUE
         startResult = main.TRUE
         onosIsUp = main.TRUE
+
         for i in range( main.numCtrls ):
             onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
         if onosIsUp == main.TRUE:
@@ -178,12 +199,15 @@
                                  onpass="Successfully start ONOS cli",
                                  onfail="Failed to start ONOS cli" )
 
+        # Remove the first element in main.scale list
+        main.scale.remove( main.scale[ 0 ] )
+
     def CASE9( self, main ):
         '''
             Report errors/warnings/exceptions
         '''
         main.log.info("Error report: \n" )
-        main.ONOSbench.logReport( globalONOSip[ 0 ],
+        main.ONOSbench.logReport( main.ONOSip[ 0 ],
                                   [ "INFO",
                                     "FOLLOWER",
                                     "WARN",
@@ -191,7 +215,6 @@
                                     "ERROR",
                                     "Except" ],
                                   "s" )
-        #main.ONOSbench.logReport( globalONOSip[1], [ "INFO" ], "d" )
 
     def CASE11( self, main ):
         """
@@ -212,3 +235,11 @@
             main.cleanup()
             main.exit()
 
+    def CASE12( self, main ):
+        """
+            Test random ONOS command
+        """
+
+        main.CLIs[ 0 ].startOnosCli( main.ONOSip[ 0 ] )
+        print main.CLIs[ 0 ].leaders()
+
diff --git a/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.topo b/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.topo
index e6613de..4a116c3 100755
--- a/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.topo
+++ b/TestON/tests/SAMPstartTemplate/SAMPstartTemplate.topo
@@ -2,45 +2,48 @@
     <COMPONENT>
 
         <ONOSbench>
-            <host>OCN</host>
+            <host>localhost</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
             <connect_order>1</connect_order>
             <COMPONENTS>
-                <home>~/ONOS</home>
+                <nodes>3</nodes>
             </COMPONENTS>
         </ONOSbench>
 
         <ONOScli1>
-            <host>OCN</host>
+            <host>localhost</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
             <connect_order>2</connect_order>
-            <COMPONENTS> </COMPONENTS>
+            <COMPONENTS>
+            </COMPONENTS>
         </ONOScli1>
 
         <ONOScli2>
-            <host>OCN</host>
+            <host>localhost</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
             <connect_order>3</connect_order>
-            <COMPONENTS> </COMPONENTS>
+            <COMPONENTS>
+            </COMPONENTS>
         </ONOScli2>
 
          <ONOScli3>
-            <host>OCN</host>
+            <host>localhost</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
             <connect_order>4</connect_order>
-            <COMPONENTS> </COMPONENTS>
+            <COMPONENTS>
+            </COMPONENTS>
         </ONOScli3>
 
         <Mininet1>
-            <host>OCN</host>
+            <host>localhost</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>MininetCliDriver</type>
