Merge "Revert "Revert "set window size after ssh connection"""
diff --git a/TestON/JenkinsFile/CHO_Graph_Generator b/TestON/JenkinsFile/CHO_Graph_Generator
index 26e7ca2..db65ce7 100644
--- a/TestON/JenkinsFile/CHO_Graph_Generator
+++ b/TestON/JenkinsFile/CHO_Graph_Generator
@@ -24,6 +24,7 @@
 fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
 
 fileRelated.init()
+
 // The way reading the parameters from the Jenkins.
 branches = params.ONOSbranch
 hours = params.hours
@@ -34,10 +35,11 @@
 // initialize the directory.
 
 // Script file is the R script path
-script_file = fileRelated.trendCHO
+script_file = fileRelated.rScriptPaths[ "scripts" ][ "trendCHO" ]
+
 // saving_directory is the directory that save the generate graphs.
-saving_directory = fileRelated.jenkinsWorkspace + "postjob-Fabric5/"
-scriptDir = fileRelated.CHOScriptDir
+saving_directory = fileRelated.workspaces[ "Fabric5" ]
+scriptDir = fileRelated.rScriptPaths[ "directories" ][ "CHO" ]
 
 // create a bash script that will generate the graph
 graphScript = generateGraphScript( branchList )
@@ -54,7 +56,7 @@
     postJob()
 }
 
-saving_directory = fileRelated.jenkinsWorkspace + "postjob-Trellis-POD/"
+saving_directory = fileRelated.workspaces[ "Trellis" ]
 graphScript = generateGraphScript( branchList )
 stage( 'Generating-Graph-POD' ) {
     // This will run on TestStation-Trellis-POD node.
diff --git a/TestON/JenkinsFile/CommonJenkinsFile.groovy b/TestON/JenkinsFile/CommonJenkinsFile.groovy
new file mode 100644
index 0000000..3060f08
--- /dev/null
+++ b/TestON/JenkinsFile/CommonJenkinsFile.groovy
@@ -0,0 +1,442 @@
+#!groovy
+// Copyright 2017 Open Networking Foundation (ONF)
+//
+// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
+// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
+// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
+//
+//     TestON is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 2 of the License, or
+//     (at your option) any later version.
+//
+//     TestON is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+//
+//     You should have received a copy of the GNU General Public License
+//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
+
+import groovy.time.TimeCategory
+import groovy.time.TimeDuration
+
+// read the dependency files
+graphs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsGraphs.groovy' )
+test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
+fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
+SCPFfuncs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/PerformanceFuncs.groovy' )
+
+category = null
+prop = null
+testsToRun = null
+testsToRunStrList = null
+branch = null
+branchWithPrefix = null
+start = null
+nodeLabel = null
+testStation = null
+testsOverride = null
+isGraphOnly = false
+isSCPF = false
+pipelineTimeout = null
+
+testsFromList = [:]
+graphPaths = [:]
+pipeline = [:]
+
+main()
+
+def main(){
+    pipelineTimeout = params.TimeOut.toInteger() // integer minutes until the entire pipeline times out. Usually passed from upstream master-trigger job.
+    timeout( time: pipelineTimeout, unit: "MINUTES" ){
+        init()
+        runTests()
+        generateGraphs()
+        sendToSlack()
+    }
+}
+
+def init(){
+    fileRelated.init()
+    test_list.init()
+    readParams()
+
+    if ( branch == "manually" ){
+        echo '''Warning: entered branch was: "manually". Defaulting to master branch.'''
+        branch = "master"
+        branchWithPrefix = test_list.addPrefixToBranch( branch )
+    }
+
+    if ( category == "SCPF" ){
+        isSCPF = true
+        SCPFfuncs.init()
+        graphs.initialize( SCPFfuncs );
+        prop = getProperties()
+        isOldFlow = ( prop[ "isOldFlow" ] == "true" )
+        SCPFfuncs.oldFlowRuleCheck( isOldFlow, prop[ "ONOSBranch" ] )
+    } else {
+        isSCPF = false
+        graphs.initialize()
+        prop = getProperties()
+    }
+
+    // get the list of the tests from category
+    testsFromList = test_list.getTestsFromCategory( category )
+
+    initGraphPaths()
+    tokenizeTokens = "\n;, "
+
+    if ( testsOverride == "" || testsOverride == null ){
+        testsToRunStrList = prop[ "Tests" ].tokenize( tokenizeTokens )
+    } else {
+        testsToRunStrList = testsOverride.tokenize( tokenizeTokens )
+    }
+    testsToRun = test_list.getTestsFromStringList( testsToRunStrList )
+}
+
+def readParams(){
+    category = params.Category       // "FUNC", "HA", "USECASE", etc.
+    branch = params.Branch           // "1.15", "2.1", "master", etc.
+    branchWithPrefix = test_list.addPrefixToBranch( branch )
+    testStation = params.TestStation // "TestStation-BMs", etc.
+    nodeLabel = params.NodeLabel     // "BM", "VM", "Fabric-1.x", etc.
+    testsOverride = params.TestsOverride // "FUNCflow, FUNCintent, [...]", overrides property file
+    isGraphOnly = params.OnlyRefreshGraphs // true or false
+}
+
+def getProperties(){
+    // get the properties of the test by reading the TestONOS.property
+
+    filePath = '''/var/jenkins/TestONOS-''' + category + '''-''' + branchWithPrefix + '''.property'''
+
+    node( testStation ) {
+        return readProperties( file: filePath )
+    }
+}
+
+def getCurrentTime(){
+    // get time of the PST zone.
+
+    TimeZone.setDefault( TimeZone.getTimeZone( 'PST' ) )
+    return new Date()
+}
+
+def initGraphPaths(){
+    graphPaths.put( "trendIndividual", fileRelated.rScriptPaths[ "scripts" ][ "trendIndividual" ] )
+    if ( category == "SR" ){
+        graphPaths.put( "saveDirectory", fileRelated.workspaces[ "base" ] + "postjob-" + ( testStation - "TestStation-" - "s" ) + "/" )
+    } else if ( category == "SRHA" ) {
+        graphPaths.put( "saveDirectory", fileRelated.workspaces[ "Fabric" ] )
+    } else if ( category == "SCPF" || category == "USECASE" ){
+        graphPaths.put( "saveDirectory", fileRelated.workspaces[ "BM" ] )
+    } else {
+        graphPaths.put( "saveDirectory", fileRelated.workspaces[ "VM" ] )
+    }
+}
+
+def runTests(){
+    // run the test sequentially and save the function into the dictionary.
+    for ( String test : testsFromList.keySet() ){
+        toBeRun = testsToRun.keySet().contains( test )
+        stepName = ( toBeRun ? "" : "Not " ) + "Running $test"
+        pureTestName = test.contains( "WithFlowObj" ) ? test - "WithFlowObj" : test
+        pipeline[ stepName ] = runTest( test,
+                                        toBeRun,
+                                        prop,
+                                        pureTestName,
+                                        isGraphOnly,
+                                        testsToRun,
+                                        graphPaths[ "trendIndividual" ],
+                                        graphPaths[ "saveDirectory" ] )
+    }
+
+    // get the start time of the test.
+    start = getCurrentTime()
+
+    // run the tests sequentially.
+    for ( test in pipeline.keySet() ){
+        pipeline[ test ].call()
+    }
+}
+
+def initTest(){
+    return '''#!/bin/bash -l
+        set -i # interactive
+        set +e
+        shopt -s expand_aliases # expand alias in non-interactive mode
+        export PYTHONUNBUFFERED=1
+        ifconfig
+        echo "ONOS Branch is: $ONOSBranch"
+        echo "TestON Branch is: $TestONBranch"
+        echo "Test date: "
+        date
+        cd ~
+        export PATH=$PATH:onos/tools/test/bin
+        timeout 240 stc shutdown | head -100
+        timeout 240 stc teardown | head -100
+        timeout 240 stc shutdown | head -100
+        cd ~/OnosSystemTest/TestON/bin
+        git log | head
+        ./cleanup.sh -f || true
+        '''
+}
+
+def runTestCli_py( testName, pureTestName, testCategory ){
+    // Bash script that will run the test.
+    // testName : name of the test
+    // testCategory : (SR,FUNC ... )
+    flowObjFlag = false
+
+    if ( isSCPF && testName.contains( "WithFlowObj" ) ){
+        flowObjFlag = true
+    }
+
+    command = '''cd ~/OnosSystemTest/TestON/bin
+                 ./cli.py run ''' + pureTestName + ''' --params''' + ( flowObjFlag ? '''TEST/flowObj=True ''' : ''' ''' ) + '''GRAPH/nodeCluster=''' + graphs.getPostjobType( nodeLabel ) + ''' '''
+    echo command
+
+    return command
+
+
+}
+
+def concludeRunTest(){
+    return '''cd ~/OnosSystemTest/TestON/bin
+              ./cleanup.sh -f || true
+              # cleanup config changes
+              cd ~/onos/tools/package/config
+              git clean -df'''
+}
+
+def copyLogs(){
+    // bash script to copy the logs and other necessary element for SR tests.
+
+    result = ""
+    if ( category == "SR" ){
+        result = '''
+      sudo rm /var/jenkins/workspace/SR-log-${WikiPrefix}/*
+      sudo cp *karaf.log.* /var/jenkins/workspace/SR-log-${WikiPrefix}/
+      sudo cp *Flows* /var/jenkins/workspace/SR-log-${WikiPrefix}/
+      sudo cp *Groups* /var/jenkins/workspace/SR-log-${WikiPrefix}/
+      sudo cp *.tar.gz /var/jenkins/workspace/SR-log-${WikiPrefix}/
+      sudo cp t3-* /var/jenkins/workspace/SR-log-${WikiPrefix}/
+      '''
+    }
+    return result
+}
+
+def cleanAndCopyFiles( testName ){
+    // clean up some files that were in the folder and copy the new files from the log
+    // testName : name of the test
+
+    return '''#!/bin/bash -i
+        set +e
+        echo "ONOS Branch is: ${ONOSBranch}"
+        echo "TestON Branch is: ${TestONBranch}"
+        echo "Job name is: "''' + testName + '''
+        echo "Workspace is: ${WORKSPACE}/"
+        echo "Wiki page to post is: ${WikiPrefix}-"
+        # remove any leftover files from previous tests
+        sudo rm ${WORKSPACE}/*Wiki.txt
+        sudo rm ${WORKSPACE}/*Summary.txt
+        sudo rm ${WORKSPACE}/*Result.txt
+        sudo rm ${WORKSPACE}/*Alarm.txt || true
+        sudo rm ${WORKSPACE}/*.csv
+        #copy files to workspace
+        cd `ls -t ~/OnosSystemTest/TestON/logs/*/ | head -1 | sed 's/://'`
+        ''' + copyLogs() + '''
+        sudo cp *.txt ${WORKSPACE}/
+        sudo cp *.csv ${WORKSPACE}/
+        cd ${WORKSPACE}/
+        for i in *.csv
+            do mv "$i" "$WikiPrefix"-"$i"
+        done
+        ls -al
+        cd '''
+}
+
+def fetchLogs( testName ){
+    // fetch the logs of onos from onos nodes to onos System Test logs
+    // testName: name of the test
+
+    return '''#!/bin/bash
+  set +e
+  cd ~/OnosSystemTest/TestON/logs
+  echo "TestON test name is: "''' + testName + '''
+  TestONlogDir=$(ls -t | grep ${TEST_NAME}_  |head -1)
+  echo "########################################################################################"
+  echo "#####  copying ONOS logs from all nodes to TestON/logs directory: ${TestONlogDir}"
+  echo "########################################################################################"
+  cd $TestONlogDir
+  if [ $? -eq 1 ]
+  then
+      echo "Job name does not match any test suite name to move log!"
+  else
+      pwd
+      for i in $OC{1..7}; do onos-fetch-logs $i || echo log does not exist for onos $i; done
+      for i in $OC{1..7}; do atomix-fetch-logs $i || echo log does not exist for atomix $i; done
+  fi
+  cd'''
+}
+
+def publishToConfluence( isManualRun, isPostResult, wikiLink, file ){
+    // publish HTML script to wiki confluence
+    // isManualRun : string "true" "false"
+    // isPostResult : string "true" "false"
+    // wikiLink : link of the wiki page to publish
+    // file : name of the file to be published
+
+    if ( graphs.isPostingResult( isManualRun, isPostResult ) ){
+        publishConfluence siteName: 'wiki.onosproject.org', pageName: wikiLink, spaceName: 'ONOS',
+                          attachArchivedArtifacts: true, buildIfUnstable: true,
+                          editorList: [ confluenceWritePage( confluenceFile( file ) ) ]
+    }
+}
+
+def postLogs( testName, prefix ){
+    // posting logs of the onos jobs specifically SR tests
+    // testName : name of the test
+    // prefix : branch prefix ( master, 2.1, 1.15 ... )
+
+    resultURL = ""
+    if ( category == "SR" ){
+        def post = build job: "SR-log-" + prefix, propagate: false
+        resultURL = post.getAbsoluteUrl()
+    }
+    return resultURL
+}
+
+def analyzeResult( prop, workSpace, pureTestName, testName, resultURL, wikiLink, isSCPF ){
+    // analyzing the result of the test and send to slack if any abnormal result is logged.
+    // prop : property dictionary
+    // workSpace : workSpace where the result file is saved
+    // pureTestName : TestON name of the test
+    // testName : Jenkins name of the test. Example: SCPFflowTPFobj
+    // resultURL : url for the logs for SR tests. Will not be posted if it is empty
+    // wikiLink : link of the wiki page where the result was posted
+    // isSCPF : Check if it is SCPF. If so, it won't post the wiki link.
+
+    node( testStation ) {
+        def alarmFile = workSpace + "/" + pureTestName + "Alarm.txt"
+        if ( fileExists( alarmFile ) ) {
+            def alarmContents = readFile( alarmFile )
+            slackSend( channel: "#jenkins-related",
+                       color: "FF0000",
+                       message: "[" + prop[ "ONOSBranch" ] + "]" + testName + " : triggered alarms:\n" +
+                                alarmContents + "\n" +
+                                "[TestON log] : \n" +
+                                "https://jenkins.onosproject.org/blue/organizations/jenkins/${ env.JOB_NAME }/detail/${ env.JOB_NAME }/${ env.BUILD_NUMBER }/pipeline" +
+                                ( isSCPF ? "" : ( "\n[Result on Wiki] : \n" +
+                                                  "https://wiki.onosproject.org/display/ONOS/" +
+                                                  wikiLink.replaceAll( "\\s", "+" ) ) ) +
+                                ( resultURL != "" ? ( "\n[Karaf log] : \n" +
+                                                      resultURL + "artifact/" ) : "" ),
+                       teamDomain: 'onosproject' )
+            print "Abnormal test result."
+            throw new Exception( "Abnormal test result." )
+        }
+        else {
+            print "Test results are OK."
+        }
+    }
+}
+
+def runTest( testName, toBeRun, prop, pureTestName, graphOnly, testCategory, graph_generator_file,
+             graph_saved_directory ){
+    // run the test on the machine that contains all the steps : init and run test, copy files, publish result ...
+    // testName : name of the test in Jenkins
+    // toBeRun : boolean value whether the test will be run or not. If not, it won't be run but shows up with empty
+    //           result on pipeline view
+    // prop : dictionary property on the machine
+    // pureTestName : Pure name of the test. ( ex. pureTestName of SCPFflowTpFobj will be SCPFflowTp )
+    // graphOnly : check if it is generating graph job. If so, it will only generate the generating graph part
+    // testCategory : Map for the test suit ( SCPF, SR, FUNC, ... ) which contains information about the tests
+    // graph_generator_file : Rscript file with the full path.
+    // graph_saved_directory : where the generated graph will be saved to.
+
+    return {
+        catchError {
+            stage( testName ) {
+                if ( toBeRun ){
+                    def workSpace = "/var/jenkins/workspace/" + testName
+                    def fileContents = ""
+                    node( testStation ) {
+                        withEnv( [ 'ONOSBranch=' + prop[ "ONOSBranch" ],
+                                   'ONOSJAVAOPTS=' + prop[ "ONOSJAVAOPTS" ],
+                                   'TestONBranch=' + prop[ "TestONBranch" ],
+                                   'ONOSTag=' + prop[ "ONOSTag" ],
+                                   'WikiPrefix=' + prop[ "WikiPrefix" ],
+                                   'WORKSPACE=' + workSpace ] ) {
+                            if ( !graphOnly ){
+                                if ( isSCPF ){
+                                    // Remove the old database file
+                                    sh SCPFfuncs.cleanupDatabaseFile( testName )
+                                }
+                                sh script: initTest(), label: "Test Initialization: stc shutdown; stc teardown; ./cleanup.sh"
+                                catchError{
+                                    sh script: runTestCli_py( testName, pureTestName, testCategory ), label: ( "Run Test: ./cli.py run " + testName )
+                                }
+                                catchError{
+                                    sh script: concludeRunTest(), label: "Conclude Running Test: ./cleanup.sh; git clean -df"
+                                }
+                                catchError{
+                                    // For the Wiki page
+                                    sh script: cleanAndCopyFiles( pureTestName ), label: "Clean and Copy Files"
+                                }
+                            }
+                            graphs.databaseAndGraph( prop, testName, pureTestName, graphOnly,
+                                                    graph_generator_file, graph_saved_directory )
+                            if ( !graphOnly ){
+                                sh script: fetchLogs( pureTestName ), label: "Fetch Logs"
+                                if ( !isSCPF ){
+                                    publishToConfluence( prop[ "manualRun" ], prop[ "postResult" ],
+                                                         prop[ "WikiPrefix" ] + "-" + testCategory[ testName ][ 'wikiName' ],
+                                                         workSpace + "/" + testCategory[ testName ][ 'wikiFile' ] )
+                                }
+                            }
+                        }
+                    }
+                    graphs.postResult( prop, graphOnly, nodeLabel )
+                    if ( !graphOnly ){
+                        def resultURL = postLogs( testName, prop[ "WikiPrefix" ] )
+                        analyzeResult( prop, workSpace, pureTestName, testName, resultURL,
+                                       isSCPF ? "" : testCategory[ testName ][ 'wikiName' ],
+                                       isSCPF )
+                    }
+                } else {
+                    echo testName + " is not being run today. Leaving the rest of stage contents blank."
+                }
+            }
+        }
+    }
+}
+
+def generateGraphs(){
+    if ( category != "SCPF" ){
+        // generate the overall graph of the non SCPF tests.
+        graphs.generateOverallGraph( prop, testsToRun, graphPaths[ "saveDirectory" ], nodeLabel, category )
+    }
+}
+
+def sendToSlack(){
+    // send the result of the test to the slack when it is not manually running.
+    // start : start time of the test
+    // isManualRun : string that is whether "false" or "true"
+    // branch : branch of the onos.
+
+    try {
+        if ( prop[ "manualRun" ] == "false" ){
+            end = getCurrentTime()
+            TimeDuration duration = TimeCategory.minus( end, start )
+            // FIXME: for now we disable notifications of normal test results
+            /*
+            slackSend( color: "#5816EE",
+                       message: category + "-" + prop[ "WikiPrefix" ] + " tests ended at: " + end.toString() +
+                                "\nTime took : " + duration )
+            */
+        }
+    }
+    catch ( all ){
+    }
+}
diff --git a/TestON/JenkinsFile/FUNCJenkinsFile b/TestON/JenkinsFile/FUNCJenkinsFile
deleted file mode 100644
index 6989fd5..0000000
--- a/TestON/JenkinsFile/FUNCJenkinsFile
+++ /dev/null
@@ -1,75 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for FUNC-pipeline-<branch>
-
-// read the dependency files
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
-fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
-
-fileRelated.init()
-test_list.init()
-
-// initialize the funcs with category of FUNC
-funcs.initialize( "FUNC" );
-
-// This is a Jenkinsfile for a scripted pipeline for the FUNC tests
-def prop = null
-
-// Read the TestONOS.property from the VM
-prop = funcs.getProperties()
-
-// get the list of the test and init branch to it.
-FUNC_tests = test_list.getTestsFromCategory( "FUNC" )
-
-// init some directories
-graph_generator_file = fileRelated.trendIndividual
-graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-VM/"
-
-// get the list of the test to run
-echo( "Testcases:" )
-def testsToRun = null
-testsToRun = funcs.getTestsToRun( prop[ "Tests" ] )
-funcs.printTestToRun( testsToRun )
-
-// run the test sequentially and save the function into the dictionary.
-def tests = [ : ]
-for ( String test : FUNC_tests.keySet() ){
-    def toBeRun = testsToRun.contains( test )
-    def stepName = ( toBeRun ? "" : "Not " ) + "Running $test"
-    def pureTestName = ( FUNC_tests[ test ].containsKey( "test" ) ? FUNC_tests[ test ][ "test" ].split().head() : test )
-    tests[ stepName ] = funcs.runTest( test, toBeRun, prop, pureTestName, false,
-                                       FUNC_tests, graph_generator_file, graph_saved_directory )
-}
-
-// get the start time of the test.
-start = funcs.getCurrentTime()
-
-// run the tests sequentially.
-for ( test in tests.keySet() ){
-    tests[ test ].call()
-}
-
-// generate the overall graph of the FUNC tests.
-funcs.generateOverallGraph( prop, FUNC_tests, graph_saved_directory )
-
-// send the notification to Slack that running FUNC tests was ended.
-funcs.sendResultToSlack( start, prop[ "manualRun" ], prop[ "WikiPrefix" ] )
diff --git a/TestON/JenkinsFile/FabricJenkinsfileTrigger b/TestON/JenkinsFile/FabricJenkinsfileTrigger
deleted file mode 100644
index 4c9c822..0000000
--- a/TestON/JenkinsFile/FabricJenkinsfileTrigger
+++ /dev/null
@@ -1,229 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for the fabric-pipeline-trigger
-
-// init dependencies functions
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
-triggerFuncs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/TriggerFuncs.groovy' )
-fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
-
-fileRelated.init()
-test_list.init()
-
-// Function that will initialize the configuration of the Fabric.
-funcs.initializeTrend( "Fabric" )
-funcs.initialize( "Fabric" )
-triggerFuncs.init( funcs )
-
-// Wiki contents is the contents for https://wiki.onosproject.org/display/ONOS/Automated+Test+Schedule
-// It will only be used by the VM_BMJenkinsTrigger not in here.
-wikiContents = ""
-
-all_testcases = [:]
-
-// set some variables from the parameter
-manually_run = params.manual_run
-onos_tag = params.ONOSTag
-isOldFlow = true
-
-// Set tests based on day of week
-def now = funcs.getCurrentTime()
-print now.toString()
-today = now[ Calendar.DAY_OF_WEEK ]
-
-dayMap = [ ( Calendar.MONDAY )    : "mon",
-           ( Calendar.TUESDAY )   : "tue",
-           ( Calendar.WEDNESDAY ) : "wed",
-           ( Calendar.THURSDAY )  : "thu",
-           ( Calendar.FRIDAY )    : "fri",
-           ( Calendar.SATURDAY )  : "sat",
-           ( Calendar.SUNDAY )    : "sun" ]
-fullDayMap = [ ( Calendar.MONDAY )    : "Monday",
-               ( Calendar.TUESDAY )   : "Tuesday",
-               ( Calendar.WEDNESDAY ) : "Wednesday",
-               ( Calendar.THURSDAY )  : "Thursday",
-               ( Calendar.FRIDAY )    : "Friday",
-               ( Calendar.SATURDAY )  : "Saturday",
-               ( Calendar.SUNDAY )    : "Sunday" ]
-
-
-// if it is manually run, it will set the onos version to be what it was passed by.
-// Currently, SR-pipeline-manually is not supported due to the special way of it is executed.
-if ( manually_run ){
-    onos_branches = params.branches.tokenize( "\n;, " )
-} else {
-    onos_branches = test_list.getBranchesFromDay( today )
-}
-
-testcases_template = [
-        "FUNC": [ tests: "", nodeName: "VM", wikiContent: "" ],
-        "HA": [ tests: "", nodeName: "VM", wikiContent: "" ],
-        "SCPF": [ tests: "", nodeName: "BM", wikiContent: "" ],
-        "SR": [ tests: "", nodeName: "Fabric", wikiContent: "" ],
-        "SRHA": [ tests: "", nodeName: "Fabric", wikiContent: "" ],
-        "USECASE": [ tests: "", nodeName: "BM", wikiContent: "" ]
-]
-
-for ( String b in onos_branches ){
-    all_testcases.put( b, testcases_template )
-}
-
-day = ""
-
-// initialize the graph generating files.
-stat_graph_generator_file = fileRelated.histogramMultiple
-pie_graph_generator_file = fileRelated.pieMultiple
-graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-Fabric/"
-
-// get the post_result. This will be affected only for the manual runs.
-post_result = params.PostResult
-
-if ( manually_run ){
-    for ( String b in onos_branches ){
-        all_testcases[ b ] = triggerFuncs.organize_tests( params.Tests, all_testcases[ b ] )
-    }
-    isOldFlow = params.isOldFlow
-    println "Tests to be run manually : "
-} else {
-    for ( String b in onos_branches ){
-        // set the list of the tests to run.
-        all_testcases[ b ][ "SR" ][ "tests" ] += adder( "SR", dayMap[ today ], true, b )
-        all_testcases[ b ][ "SRHA" ][ "tests" ] += adder( "SRHA", dayMap[ today ], true, b )
-    }
-    println "Defaulting to " + day + " tests:"
-}
-
-// print out the list of the test to run on Jenkins
-for ( String b in onos_branches ){
-    triggerFuncs.print_tests( all_testcases[ b ] )
-}
-
-// This will hold the block of code to be run.
-def runTest = [
-
-]
-for ( String b in onos_branches ){
-    if ( manually_run ){
-        // for manual run situation.
-        for ( String test in all_testcases[ b ].keySet() ){
-            println test
-            // Unless the list of the tests on the test category is empty, it will save the block of code to run in dictionary.
-            if ( all_testcases[ b ][ test ][ "tests" ] != "" ){
-                runTest[ all_testcases[ b ][ test ][ "nodeName" ][ nodeOn( b ) ] ][ test ] = triggerFuncs.
-                        trigger_pipeline( b,
-                                          all_testcases[ b ][ test ][ "tests" ],
-                                          all_testcases[ b ][ test ][ "nodeName" ][ nodeOn( b ) ],
-                                          test,
-                                          manually_run,
-                                          onos_tag )
-            }
-        }
-    }
-    else {
-        // for automated situation, it will save current version to Fabric4, previous version to Fabric2 and before_previous_version to Fabric3.
-        runTest[ "Fabric4" ][ "SR" ] = triggerFuncs.trigger_pipeline( "master",
-                                                                      all_testcases[ b ][ "SR" ][ "tests" ],
-                                                                      all_testcases[ b ][ "SR" ][ "nodeName" ][ 2 ],
-                                                                      "SR",
-                                                                      manually_run, onos_tag )
-        runTest[ "Fabric2" ][ "SR" ] = triggerFuncs.trigger_pipeline( test_list.convertBranchCodeToBranch( "onos-2.x" ),
-                                                                      all_testcases[ b ][ "SR" ][ "tests" ],
-                                                                      all_testcases[ b ][ "SR" ][ "nodeName" ][ 0 ],
-                                                                      "SR",
-                                                                      manually_run, onos_tag )
-        runTest[ "Fabric3" ][ "SR" ] = triggerFuncs.trigger_pipeline( test_list.convertBranchCodeToBranch( "onos-1.x" ),
-                                                                      all_testcases[ b ][ "SR" ][ "tests" ],
-                                                                      all_testcases[ b ][ "SR" ][ "nodeName" ][ 1 ],
-                                                                      "SR",
-                                                                      manually_run, onos_tag )
-        runTest[ "Fabric" ][ "SRHA" ] = triggerFuncs.trigger_pipeline( "master",
-                                                                       all_testcases[ b ][ "SRHA" ][ "tests" ],
-                                                                       all_testcases[ b ][ "SRHA" ][ "nodeName" ],
-                                                                       "SRHA",
-                                                                       manually_run, onos_tag )
-    }
-}
-
-def finalList = [ : ]
-
-// It will run each category of test to run sequentially on each branch.
-finalList[ "Fabric" ] = triggerFuncs.runTestSeq( runTest[ "Fabric" ] )
-finalList[ "Fabric2" ] = triggerFuncs.runTestSeq( runTest[ "Fabric2" ] )
-finalList[ "Fabric3" ] = triggerFuncs.runTestSeq( runTest[ "Fabric3" ] )
-finalList[ "Fabric4" ] = triggerFuncs.runTestSeq( runTest[ "Fabric4" ] )
-
-// It will then run Fabric2, Fabric3 and Fabric4 concurrently.
-// In our case,
-//                      ----> Fabric4 : current_version
-// This pipeline -----> ----> Fabric2 : previous_version
-//                      ----> Fabric3 : before_previous_version
-parallel finalList
-
-// Way we are generating pie graphs. not supported in SegmentRouting yet.
-/*
-if ( !manually_run ){
-    funcs.generateStatGraph( "TestStation-Fabric4s",
-                             funcs.branchWithPrefix( current_version ),
-                             AllTheTests,
-                             stat_graph_generator_file,
-                             pie_graph_generator_file,
-                             graph_saved_directory )
-    funcs.generateStatGraph( "TestStation-Fabric2s",
-                             funcs.branchWithPrefix( previous_version ),
-                             AllTheTests,
-                             stat_graph_generator_file,
-                             pie_graph_generator_file,
-                             graph_saved_directory )
-    funcs.generateStatGraph( "TestStation-Fabric3s",
-                             funcs.branchWithPrefix( before_previous_version ),
-                             AllTheTests,
-                             stat_graph_generator_file,
-                             pie_graph_generator_file,
-                             graph_saved_directory )
-}*/
-
-// Way to add list of the tests with specific category to the result
-def adder( category, day, getResult, branch ){
-    // category : the category of the test which will be either FUNC,HA,SR...
-    // day : the day you are trying to add (m,t,w,th... )
-    // getResult : if want to get the list of the test to be run. False will return empty list.
-    //             And once the list is empty, it will not be run.
-    def result = ""
-    selectedTests = test_list.getTestsFromCategory( category, test_list.getTestsFromDay( day, branch ) )
-
-    for ( String test in selectedTests.keySet() ){
-        if ( getResult ){
-            result += test + ","
-        }
-    }
-    return result
-}
-
-// check which node is on.
-def nodeOn( branch ){
-    switch ( branch ){
-        case "master": return 2
-        case convertBranchCodeToBranch( "onos-2.x" ): return 0
-        case convertBranchCodeToBranch( "onos-1.x" ): return 1
-        default: return 3
-    }
-}
diff --git a/TestON/JenkinsFile/HAJenkinsFile b/TestON/JenkinsFile/HAJenkinsFile
deleted file mode 100644
index 9eee0f9..0000000
--- a/TestON/JenkinsFile/HAJenkinsFile
+++ /dev/null
@@ -1,74 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for HA-pipeline-<branch>
-
-// read the dependency files
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-test_lists = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
-fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
-
-fileRelated.init()
-test_list.init()
-
-// initialize the funcs with category of HA
-funcs.initialize( "HA" );
-
-// This is a Jenkinsfile for a scripted pipeline for the FUNC tests
-def prop = null
-
-// Read the TestONOS.property from the VM
-prop = funcs.getProperties()
-
-// get the list of the test and init branch to it.
-HA_tests = test_list.getTestsFromCategory( "HA" )
-
-// init some directories
-graph_generator_file = fileRelated.trendIndividual
-graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-VM/"
-
-// get the list of the test to run
-echo( "Testcases:" )
-def testsToRun = null
-testsToRun = funcs.getTestsToRun( prop[ "Tests" ] )
-funcs.printTestToRun( testsToRun )
-
-// run the test sequentially and save the function into the dictionary.
-def tests = [ : ]
-for ( String test : HA_tests.keySet() ){
-    toBeRun = testsToRun.contains( test )
-    def stepName = ( toBeRun ? "" : "Not " ) + "Running $test"
-    def pureTestName = ( HA_tests[ test ].containsKey( "test" ) ? HA_tests[ test ][ "test" ].split().head() : test )
-    tests[ stepName ] = funcs.runTest( test, toBeRun, prop, pureTestName, false,
-                                       HA_tests, graph_generator_file, graph_saved_directory )
-}
-
-// get the start time of the test.
-start = funcs.getCurrentTime()
-// run the tests sequentially.
-for ( test in tests.keySet() ){
-    tests[ test ].call()
-}
-
-// generate the overall graph of the HA tests.
-funcs.generateOverallGraph( prop, HA_tests, graph_saved_directory )
-
-// send the notification to Slack that running HA tests was ended.
-funcs.sendResultToSlack( start, prop[ "manualRun" ], prop[ "WikiPrefix" ] )
diff --git a/TestON/JenkinsFile/JenkinsfileTrigger b/TestON/JenkinsFile/JenkinsfileTrigger
deleted file mode 100644
index 28d6940..0000000
--- a/TestON/JenkinsFile/JenkinsfileTrigger
+++ /dev/null
@@ -1,62 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for all-pipeline-trigger
-
-// read the dependency functions
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-
-// get current time and send the notification of starting the test.
-def now = funcs.getCurrentTime()
-print now.toString()
-
-// read the passed parameters from the Jenkins.
-machines = params.machines
-manually_run = params.manual_run
-// FIXME: for now we disable any other slack notifications excpet alarms
-/*
-if ( !manually_run ){
-    slackSend( color: '#03CD9F',
-               message: ":sparkles:" * 16 + "\n" +
-                        "Starting tests on : " + now.toString() +
-                        "\n" + ":sparkles:" * 16 )
-}
-*/
-
-// store the list of the machines into the dictionary.
-machineList = machines.tokenize( "\n;, " )
-machineOn = [ : ]
-
-// save the triggering job function as a dictionary.
-for ( machine in machineList ){
-    print( machine )
-    machineOn[ machine ] = triggerJob( machine )
-}
-
-// run the triggering jobs concurrently.
-parallel machineOn
-
-// function that will trigger the specific jobs from current pipeline.
-def triggerJob( on ){
-    return {
-        jobToRun = on + "-pipeline-trigger"
-        build job: jobToRun, propagate: false
-    }
-}
diff --git a/TestON/JenkinsFile/MasterTrigger.groovy b/TestON/JenkinsFile/MasterTrigger.groovy
new file mode 100644
index 0000000..c94aecb
--- /dev/null
+++ b/TestON/JenkinsFile/MasterTrigger.groovy
@@ -0,0 +1,455 @@
+#!groovy
+// Copyright 2019 Open Networking Foundation (ONF)
+//
+// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
+// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
+// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
+//
+//     TestON is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 2 of the License, or
+//     (at your option) any later version.
+//
+//     TestON is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+//
+//     You should have received a copy of the GNU General Public License
+//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
+
+// This is the Jenkins script for master-trigger
+
+import groovy.time.TimeCategory
+import groovy.time.TimeDuration
+
+// set the functions of the dependencies.
+graphs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsGraphs.groovy' )
+fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
+test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
+
+INITIALIZATION_TIMEOUT_MINUTES = 10 // timeout init() function if it takes too long.
+
+onos_tag = null
+manually_run = null
+now = null
+today = null
+onos_branches = null
+day = null
+post_result = null
+branchesParam = null
+isFabric = null
+testsParam = null
+simulateDay = null
+pipelineTimeOut = null
+
+dayMap = [:]
+fullDayMap = [:]
+all_testcases = [:]
+runTest = [:]
+selectedTests = [:]
+graphPaths = [:]
+
+main()
+
+def main() {
+    timeout( time: INITIALIZATION_TIMEOUT_MINUTES, unit: "MINUTES" ){
+        init()
+    }
+    timeout( time: pipelineTimeOut, unit: "MINUTES" ){
+        runTests()
+        generateGraphs()
+    }
+}
+
+// **************
+// Initialization
+// **************
+
+// initialize file scope vars
+def init(){
+    // get the name of the job.
+    jobName = env.JOB_NAME
+
+    // set the versions of the onos
+    fileRelated.init()
+    test_list.init()
+    readParams()
+
+    // list of the tests to be run will be saved in each choices.
+    day = ""
+
+    initDates()
+    onos_branches = getONOSBranches()
+    selectedTests = getONOSTests()
+
+    initGraphPaths()
+
+    echo "selectedTests: " + selectedTests
+    echo "onos_branches: " + onos_branches
+}
+
+def readParams(){
+    // get post result from the params for manually run.
+    post_result = params.PostResult
+    manually_run = params.manual_run
+    onos_tag = params.ONOSTag
+    branchesParam = params.branches
+    isOldFlow = true // hardcoding to true since we are always using oldFlow.
+    testsParam = params.Tests
+    isFabric = params.isFabric
+    simulateDay = params.simulate_day
+    pipelineTimeOut = params.TimeOut.toInteger()
+}
+
+// Set tests based on day of week
+def initDates(){
+    echo "-> initDates()"
+    now = getCurrentTime()
+    dayMap = [ ( Calendar.MONDAY )    : "mon",
+               ( Calendar.TUESDAY )   : "tue",
+               ( Calendar.WEDNESDAY ) : "wed",
+               ( Calendar.THURSDAY )  : "thu",
+               ( Calendar.FRIDAY )    : "fri",
+               ( Calendar.SATURDAY )  : "sat",
+               ( Calendar.SUNDAY )    : "sun" ]
+    fullDayMap = [ ( Calendar.MONDAY )    : "Monday",
+                   ( Calendar.TUESDAY )   : "Tuesday",
+                   ( Calendar.WEDNESDAY ) : "Wednesday",
+                   ( Calendar.THURSDAY )  : "Thursday",
+                   ( Calendar.FRIDAY )    : "Friday",
+                   ( Calendar.SATURDAY )  : "Saturday",
+                   ( Calendar.SUNDAY )    : "Sunday" ]
+    if ( simulateDay == "" ){
+        today = now[ Calendar.DAY_OF_WEEK ]
+        day = dayMap[ today ]
+        print now.toString()
+    } else {
+        day = simulateDay
+    }
+}
+
+def getCurrentTime(){
+    // get time of the PST zone.
+
+    TimeZone.setDefault( TimeZone.getTimeZone( 'PST' ) )
+    return new Date()
+}
+
+// gets ONOS branches from params or string parameter
+def getONOSBranches(){
+    echo "-> getONOSBranches()"
+    if ( manually_run ){
+        return branchesParam.tokenize( "\n;, " )
+    } else {
+        return test_list.getBranchesFromDay( day )
+    }
+}
+
+def getONOSTests(){
+    echo "-> getONOSTests()"
+    if ( manually_run ){
+        return test_list.getTestsFromStringList( testsParam.tokenize( "\n;, " ) )
+    } else {
+
+        return test_list.getTestsFromDay( day )
+    }
+}
+
+// init paths for the files and directories.
+def initGraphPaths(){
+    graphPaths.put( "histogramMultiple", fileRelated.rScriptPaths[ "scripts" ][ "histogramMultiple" ] )
+    graphPaths.put( "pieMultiple", fileRelated.rScriptPaths[ "scripts" ][ "pieMultiple" ] )
+    graphPaths.put( "saveDirectory", fileRelated.workspaces[ "VM" ] )
+}
+
+// **********************
+// Determine Tests to Run
+// **********************
+
+def printTestsToRun( runList ){
+    if ( manually_run ){
+        println "Tests to be run manually:"
+    } else {
+        if ( isFabric ){
+            postToSlackSR()
+        }
+        if ( today == Calendar.MONDAY ){
+            postToSlackTestsToRun()
+        }
+        println "Defaulting to " + day + " tests:"
+    }
+    for ( list in runList ){
+        echo "" + list
+    }
+}
+
+def postToSlackSR(){
+    // If it is automated running, it will post the beginning message to the channel.
+    slackSend( channel: 'sr-failures', color: '#03CD9F',
+               message: ":sparkles:" * 16 + "\n" +
+                        "Starting tests on : " + now.toString() +
+                        "\n" + ":sparkles:" * 16 )
+}
+
+def postToSlackTestsToRun(){
+    slackSend( color: '#FFD988',
+               message: "Tests to be run this weekdays : \n" +
+                        printDaysForTest() )
+}
+
+def printDaysForTest(){
+    // Print the days for what test has.
+    AllTheTests = test_list.getAllTests()
+
+    result = ""
+    for ( String test in AllTheTests.keySet() ){
+        result += test + ": ["
+        test_schedule = AllTheTests[ test ][ "schedules" ]
+        for ( String sch_dict in test_schedule ){
+            for ( String day in test_list.convertScheduleKeyToDays( sch_dict[ "branch" ] ) ){
+                result += day + " "
+            }
+        }
+        result += "]\n"
+    }
+    return result
+}
+
+// *********
+// Run Tests
+// *********
+
+def tagCheck( onos_tag, onos_branch ){
+    // check the tag for onos if it is not empty
+
+    result = "git checkout "
+    if ( onos_tag == "" ){
+        //create new local branch
+        result += onos_branch
+    }
+    else {
+        //checkout the tag
+        result += onos_tag
+    }
+    return result
+}
+
+def preSetup( onos_branch, test_branch, onos_tag, isManual ){
+    // pre setup part which will clean up and checkout to corresponding branch.
+
+    result = ""
+    if ( !isManual ){
+        result = '''echo -e "\n#####  Set TestON Branch #####"
+        echo "TestON Branch is set on: ''' + test_branch + '''"
+        cd ~/OnosSystemTest/
+        git checkout HEAD~1      # Make sure you aren't pn a branch
+        git branch | grep -v "detached from" | xargs git branch -d # delete all local branches merged with remote
+        git branch -D ''' + test_branch + ''' # just in case there are local changes. This will normally result in a branch not found error
+        git clean -df # clean any local files
+        git fetch --all # update all caches from remotes
+        git reset --hard origin/''' + test_branch + '''  # force local index to match remote branch
+        git clean -df # clean any local files
+        git checkout ''' + test_branch + ''' #create new local branch
+        git branch
+        git log -1 --decorate
+        echo -e "\n#####  Set ONOS Branch #####"
+        echo "ONOS Branch is set on: ''' + onos_branch + '''"
+        echo -e "\n #### check karaf version ######"
+        env |grep karaf
+        cd ~/onos
+        git checkout HEAD~1      # Make sure you aren't pn a branch
+        git branch | grep -v "detached from" | xargs git branch -d # delete all local branches merged with remote
+        git branch -D ''' + onos_branch + ''' # just incase there are local changes. This will normally result in a branch not found error
+        git clean -df # clean any local files
+        git fetch --all # update all caches from remotes
+        git reset --hard origin/''' + onos_branch + '''  # force local index to match remote branch
+        git clean -df # clean any local files
+        rm -rf buck-out
+        rm -rf bazel-*
+        ''' + tagCheck( onos_tag, onos_branch ) + '''
+        git branch
+        git log -1 --decorate
+        echo -e "\n##### set jvm heap size to 8G #####"
+        echo ${ONOSJAVAOPTS}
+        inserted_line="export JAVA_OPTS=\"\${ONOSJAVAOPTS}\""
+        sed -i "s/bash/bash\\n$inserted_line/" ~/onos/tools/package/bin/onos-service
+        echo "##### Check onos-service setting..... #####"
+        cat ~/onos/tools/package/bin/onos-service
+        export JAVA_HOME=/usr/lib/jvm/java-8-oracle'''
+    } else {
+        result = '''echo "Since this is a manual run, we'll use the current ONOS and TestON branch:"
+                    echo "ONOS branch:"
+                    cd ~/OnosSystemTest/
+                    git branch
+                    echo "TestON branch:"
+                    cd ~/TestON/
+                    git branch'''
+    }
+    return result
+}
+
+def postSetup( onos_branch, test_branch, onos_tag, isManual ){
+    // setup that will build ONOS
+
+    result = ""
+    if ( !isManual ){
+        result = '''echo -e "Installing bazel"
+        cd ~
+        rm -rf ci-management
+        git clone https://gerrit.onosproject.org/ci-management
+        cd ci-management/jjb/onos/
+        export GERRIT_BRANCH="''' + onos_branch + '''"
+        chmod +x install-bazel.sh
+        ./install-bazel.sh
+        '''
+    } else {
+        result = '''echo -e "Since this is a manual run, we will not install Bazel."'''
+    }
+    return result
+}
+
+def generateKey(){
+    // generate cluster-key of the onos
+
+    try {
+        sh script: '''
+        #!/bin/bash -l
+        set +e
+        . ~/.bashrc
+        env
+        onos-push-bits-through-proxy
+        onos-gen-cluster-key -f
+        ''', label: "Generate Cluster Key", returnStdout: false
+    } catch ( all ){
+    }
+}
+
+// Initialize the environment Setup for the onos and OnosSystemTest
+def envSetup( onos_branch, test_branch, onos_tag, jobOn, manuallyRun, nodeLabel ){
+    // to setup the environment using the bash script
+    stage( "Environment Setup: " + onos_branch + "-" + nodeLabel + "-" + jobOn ) {
+        // after env: ''' + borrow_mn( jobOn ) + '''
+        sh script: '''#!/bin/bash -l
+        set +e
+        . ~/.bashrc
+        env
+        ''' + preSetup( onos_branch, test_branch, onos_tag, manuallyRun ), label: "Repo Setup", returnStdout: false
+        sh script: postSetup( onos_branch, test_branch, onos_tag, manuallyRun ), label: "Install Bazel", returnStdout: false
+        generateKey()
+    }
+}
+
+// export Environment properties.
+def exportEnvProperty( onos_branch, test_branch, jobOn, wiki, tests, postResult, manually_run, onosTag, isOldFlow, nodeLabel ){
+    // export environment properties to the machine.
+
+    filePath = "/var/jenkins/TestONOS-" + jobOn + "-" + onos_branch + ".property"
+
+    stage( "Property Export: " + onos_branch + "-" + nodeLabel + "-" + jobOn ) {
+        sh script: '''
+            echo "ONOSBranch=''' + onos_branch + '''" > ''' + filePath + '''
+            echo "TestONBranch=''' + test_branch + '''" >> ''' + filePath + '''
+            echo "ONOSTag=''' + onosTag + '''" >> ''' + filePath + '''
+            echo "WikiPrefix=''' + wiki + '''" >> ''' + filePath + '''
+            echo "ONOSJAVAOPTS=''' + env.ONOSJAVAOPTS + '''" >> ''' + filePath + '''
+            echo "Tests=''' + tests + '''" >> ''' + filePath + '''
+            echo "postResult=''' + postResult + '''" >> ''' + filePath + '''
+            echo "manualRun=''' + manually_run + '''" >> ''' + filePath + '''
+            echo "isOldFlow=''' + isOldFlow + '''" >> ''' + filePath + '''
+        ''', label: "Exporting Property File: " + filePath
+    }
+}
+
+def trigger( branch, tests, nodeLabel, jobOn, manuallyRun, onosTag ){
+    // triggering function that will setup the environment and determine which pipeline to trigger
+
+    println "Job name: " + jobOn + "-pipeline-" + ( manuallyRun ? "manually" : branch )
+    def wiki = branch
+    def onos_branch = test_list.addPrefixToBranch( branch )
+    def test_branch = test_list.addPrefixToBranch( branch )
+    assignedNode = null
+    node( label: nodeLabel ) {
+        envSetup( onos_branch, test_branch, onosTag, jobOn, manuallyRun, nodeLabel )
+        exportEnvProperty( onos_branch, test_branch, jobOn, wiki, tests, post_result, manuallyRun, onosTag, isOldFlow, nodeLabel )
+        assignedNode = env.NODE_NAME
+    }
+
+    jobToRun = jobOn + "-pipeline-" + ( manuallyRun ? "manually" : wiki )
+    build job: jobToRun, propagate: false, parameters: [ [ $class: 'StringParameterValue', name: 'Category', value: jobOn ],
+                                                         [ $class: 'StringParameterValue', name: 'Branch', value: branch ],
+                                                         [ $class: 'StringParameterValue', name: 'TestStation', value: assignedNode ],
+                                                         [ $class: 'StringParameterValue', name: 'NodeLabel', value: nodeLabel ],
+                                                         [ $class: 'StringParameterValue', name: 'TimeOut', value: pipelineTimeOut.toString() ] ]
+}
+
+def trigger_pipeline( branch, tests, nodeLabel, jobOn, manuallyRun, onosTag ){
+    // nodeLabel : nodeLabel from tests.json
+    // jobOn : "SCPF" or "USECASE" or "FUNC" or "HA"
+    // this will return the function by wrapping them up with return{} to prevent them to be
+    // executed once this function is called to assign to specific variable.
+    return {
+        trigger( branch, tests, nodeLabel, jobOn, manuallyRun, onosTag )
+    }
+}
+
+def generateRunList(){
+    runList = [:]
+    validSchedules = test_list.getValidSchedules( day )
+    echo "validSchedules: " + validSchedules
+    for ( branch in onos_branches ){
+        runBranch = []
+        nodeLabels = test_list.getAllNodeLabels( branch, selectedTests )
+        for ( nodeLabel in nodeLabels ){
+            selectedNodeLabelTests = test_list.getTestsFromNodeLabel( nodeLabel, branch, selectedTests )
+            selectedNodeLabelCategories = test_list.getAllTestCategories( selectedNodeLabelTests )
+            for ( category in selectedNodeLabelCategories ){
+                selectedNodeLabelCategoryTests = test_list.getTestsFromCategory( category, selectedNodeLabelTests )
+
+                filteredList = [:]
+                for ( key in selectedNodeLabelCategoryTests.keySet() ){
+                    for ( sch in selectedNodeLabelCategoryTests[ key ][ "schedules" ] ){
+                        if ( validSchedules.contains( sch[ "day" ] ) && sch[ "branch" ] == test_list.convertBranchToBranchCode( branch ) || manually_run ){
+                            filteredList.put( key, selectedNodeLabelCategoryTests[ key ] )
+                            break
+                        }
+                    }
+                }
+
+                echo "=========================================="
+                echo "BRANCH: " + branch
+                echo "CATEGORY: " + category
+                echo "TESTS: " + filteredList
+                if ( filteredList != [:] ){
+                    exeTestList = test_list.getTestListAsString( filteredList )
+                    runList.put( branch + "-" + nodeLabel + "-" + category, trigger_pipeline( branch, exeTestList, nodeLabel, category, manually_run, onos_tag ) )
+                }
+
+            }
+        }
+    }
+    return runList
+}
+
+def runTests(){
+    runList = generateRunList()
+    printTestsToRun( runList )
+    parallel runList
+}
+
+// ***************
+// Generate Graphs
+// ***************
+
+def generateGraphs(){
+    // If it is automated running, it will generate the stats graph on VM.
+    if ( !manually_run ){
+        for ( String b in onos_branches ){
+            graphs.generateStatGraph( "TestStation-VMs",
+                                     test_list.addPrefixToBranch( b ),
+                                     graphPaths[ "histogramMultiple" ],
+                                     graphPaths[ "pieMultiple" ],
+                                     graphPaths[ "saveDirectory" ] )
+        }
+    }
+}
diff --git a/TestON/JenkinsFile/Overall_Graph_Generator b/TestON/JenkinsFile/Overall_Graph_Generator
index 6b30ed0..8e46c7c 100644
--- a/TestON/JenkinsFile/Overall_Graph_Generator
+++ b/TestON/JenkinsFile/Overall_Graph_Generator
@@ -21,25 +21,22 @@
 // This is the Jenkins script for manual-graph-generator-overall
 
 // read the dependency functions.
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
+graphs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsGraphs.groovy' )
 fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
 
 fileRelated.init()
 
 // set the file and directory paths.
-stat_graph_generator_file = fileRelated.histogramMultiple
-pie_graph_generator_file = fileRelated.pieMultiple
-graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-VM/"
-
-// init trend which will generate the pie and histogram graphs to be VM.
-funcs.initializeTrend( "VM" )
+stat_graph_generator_file = fileRelated.rScriptPaths[ "scripts" ][ "histogramMultiple" ]
+pie_graph_generator_file = fileRelated.rScriptPaths[ "scripts" ][ "pieMultiple" ]
+graph_saved_directory = fileRelated.workspaces[ "VM" ]
 
 onos_branch = params.ONOSbranch
 
 // generate the graph and post the result on TestStation-VMs. Right now, all the pie and histograms are saved
 // on VM.
-funcs.generateStatGraph( "TestStation-VMs",
+graphs.generateStatGraph( "TestStation-VMs",
                          onos_branch,
                          stat_graph_generator_file,
                          pie_graph_generator_file,
-                         graph_saved_directory )
+                         graph_saved_directory, "VM" )
diff --git a/TestON/JenkinsFile/SCPFJenkinsFile b/TestON/JenkinsFile/SCPFJenkinsFile
deleted file mode 100644
index cf31c9d..0000000
--- a/TestON/JenkinsFile/SCPFJenkinsFile
+++ /dev/null
@@ -1,63 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for SCPF-pipeline-<branch>
-
-// read the dependency files
-SCPFfuncs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/PerformanceFuncs.groovy' )
-SCPFfuncs.init()
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-
-// init funcs with SCPF specification
-funcs.initialize( "SCPF", SCPFfuncs )
-
-// read the information from TestON.property on BM
-def prop = null
-prop = funcs.getProperties()
-
-// get the list of the test to run.
-echo( "Testcases:" )
-def testsToRun = null
-testsToRun = funcs.getTestsToRun( prop[ "Tests" ] )
-funcs.printTestToRun( testsToRun )
-
-// check if it is using old flow.
-isOldFlow = prop[ "isOldFlow" ] == "true"
-SCPFfuncs.oldFlowRuleCheck( isOldFlow, prop[ "ONOSBranch" ] )
-
-// set test to run as a list of function
-def tests = [ : ]
-for ( String test : SCPFfuncs.SCPF.keySet() ){
-    toBeRun = testsToRun.contains( test )
-    def stepName = ( toBeRun ? "" : "Not " ) + "Running $test"
-
-    def pureTestName = test.replaceAll( "WithFlowObj", "" )
-    tests[ stepName ] = funcs.runTest( test, toBeRun, prop, pureTestName, false, SCPFfuncs.SCPF, "", "" )
-}
-
-// get start time
-start = funcs.getCurrentTime()
-// run the tests sequentially
-for ( test in tests.keySet() ){
-    tests[ test ].call()
-}
-
-// send result to slack after running test is done.
-funcs.sendResultToSlack( start, prop[ "manualRun" ], prop[ "WikiPrefix" ] )
diff --git a/TestON/JenkinsFile/SCPF_Graph_Generator b/TestON/JenkinsFile/SCPF_Graph_Generator
deleted file mode 100644
index da57cd0..0000000
--- a/TestON/JenkinsFile/SCPF_Graph_Generator
+++ /dev/null
@@ -1,53 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for manual-graph-generator-SCPF
-
-// read and set the functions from dependencies.
-SCPFfuncs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/PerformanceFuncs.groovy' )
-SCPFfuncs.init()
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-funcs.initialize( "SCPF", SCPFfuncs );
-
-def prop = null
-prop = funcs.getProperties()
-
-// get the variables from the Jenkins parameters.
-def Tests = params.Test
-isOldFlow = params.isOldFlow
-prop[ "ONOSBranch" ] = params.ONOSbranch
-
-SCPFfuncs.oldFlowRuleCheck( isOldFlow, prop[ "ONOSBranch" ] )
-
-def testsToRun = null
-testsToRun = funcs.getTestsToRun( Tests )
-
-// pureTestName is because we don't want 'WFobj' to be used for test name.
-def tests = [ : ]
-for ( String test : testsToRun ){
-    println test
-    pureTestName = test.replaceAll( "WithFlowObj", "" )
-    tests[ test ] = funcs.runTest( test, true, prop, pureTestName, true, [ ], "", "" )
-}
-
-// generate the graphs sequentially.
-for ( test in tests.keySet() ){
-    tests[ test ].call()
-}
diff --git a/TestON/JenkinsFile/SRHAJenkinsFile b/TestON/JenkinsFile/SRHAJenkinsFile
deleted file mode 100644
index 3ca8810..0000000
--- a/TestON/JenkinsFile/SRHAJenkinsFile
+++ /dev/null
@@ -1,74 +0,0 @@
-#!groovy
-// Copyright 2018 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for SRHA-pipeline-<branch>
-
-// read dependencies.
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
-fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
-
-// init configuration to be SR
-fileRelated.init()
-test_list.init()
-funcs.initialize( "SR" )
-
-// Allow to run with --params-file argument
-hasArgs = true
-
-// get the name of the Jenkins job.
-jobName = env.JOB_NAME
-
-// read the TestON.property depends on which branch it is running.
-// ( currently master on Fabric4, 2.1 on Fabric3 and 1.15 on Fabric2 )
-def prop = null
-prop = funcs.getProperties()
-SRHA_tests = test_list.getTestsFromCategory( "SRHA" )
-
-// set the file paths and directory
-graph_generator_file = fileRelated.trendIndividual
-graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-Fabric" + "/"
-
-// get the list of the tests.
-echo( "Testcases:" )
-def testsToRun = null
-testsToRun = funcs.getTestsToRun( prop[ "Tests" ] )
-funcs.printTestToRun( testsToRun )
-
-// save the functions to run test in the dictionary.
-def tests = [ : ]
-for ( String test : SRHA_tests.keySet() ){
-    toBeRun = testsToRun.contains( test )
-    def stepName = ( toBeRun ? "" : "Not " ) + "Running $test"
-    def pureTestName = ( SRHA_tests[ test ].containsKey( "test" ) ? SRHA_tests[ test ][ "test" ].split().head() : test )
-    tests[ stepName ] = funcs.runTest( test, toBeRun, prop, pureTestName, false,
-                                       SRHA_tests, graph_generator_file, graph_saved_directory )
-}
-
-// get start time
-start = funcs.getCurrentTime()
-
-// run the tests sequentially
-for ( test in tests.keySet() ){
-    tests[ test ].call()
-}
-//funcs.generateOverallGraph( prop, SR, graph_saved_directory )
-// send the notification of ending test after SRHA tests are done.
-funcs.sendResultToSlack( start, prop[ "manualRun" ], prop[ "WikiPrefix" ] )
diff --git a/TestON/JenkinsFile/SRJenkinsFile b/TestON/JenkinsFile/SRJenkinsFile
deleted file mode 100644
index e4af109..0000000
--- a/TestON/JenkinsFile/SRJenkinsFile
+++ /dev/null
@@ -1,74 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for SR-pipeline-<branch>
-
-// read dependencies.
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
-fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
-
-// init configuration to be SR
-fileRelated.init()
-test_list.init()
-funcs.initialize( "SR" )
-
-// get the name of the Jenkins job.
-jobName = env.JOB_NAME
-
-// additional setup for Segment routing because it is running multiple branch concurrently on different machines.
-funcs.additionalInitForSR( jobName )
-
-// read the TestON.property depends on which branch it is running.
-// ( currently master on Fabric4, 1.15 on Fabric2 and 2.1 on Fabric3 )
-def prop = null
-prop = funcs.getProperties()
-SR_tests = test_list.getTestsFromCategory( "SR" )
-
-// set the file paths and directory
-graph_generator_file = fileRelated.trendIndividual
-graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-Fabric" + funcs.fabricOn( prop[ "ONOSBranch" ] ) + "/"
-
-// get the list of the tests.
-echo( "Testcases:" )
-def testsToRun = null
-testsToRun = funcs.getTestsToRun( prop[ "Tests" ] )
-funcs.printTestToRun( testsToRun )
-
-// save the functions to run test in the dictionary.
-def tests = [ : ]
-for ( String test : SR_tests.keySet() ){
-    toBeRun = testsToRun.contains( test )
-    def stepName = ( toBeRun ? "" : "Not " ) + "Running $test"
-    def pureTestName = ( SR_tests[ test ].containsKey( "test" ) ? SR_tests[ test ][ "test" ].split().head() : test )
-    tests[ stepName ] = funcs.runTest( test, toBeRun, prop, pureTestName, false,
-                                     SR_tests, graph_generator_file, graph_saved_directory )
-}
-
-// get start time
-start = funcs.getCurrentTime()
-
-// run the tests sequentially
-for ( test in tests.keySet() ){
-    tests[ test ].call()
-}
-//funcs.generateOverallGraph( prop, SR, graph_saved_directory )
-// send the notification of ending test after SR tests is done.
-funcs.sendResultToSlack( start, prop[ "manualRun" ], prop[ "WikiPrefix" ] )
diff --git a/TestON/JenkinsFile/Trend_Graph_Generator b/TestON/JenkinsFile/Trend_Graph_Generator
deleted file mode 100644
index 2779d9b..0000000
--- a/TestON/JenkinsFile/Trend_Graph_Generator
+++ /dev/null
@@ -1,63 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for manual-graph-generator-trend
-
-// read the dependency functions
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
-
-fileRelated.init()
-
-// read the node cluster ( VM or BM or Fabrics ) from the Jenkins job.
-nodeCluster = params.NodeCluster
-
-funcs.initializeTrend( nodeCluster )
-
-// do additional check for Fabric since it will be different depends on which branch it is running on.
-if ( nodeCluster == "Fabric" ){
-    funcs.additionalInitForSR( params.ONOSbranch )
-}
-def prop = null
-prop = funcs.getProperties()
-
-// get the list of the tests from the parameters.
-def Tests = params.Test
-prop[ "ONOSBranch" ] = params.ONOSbranch
-
-// set some of the paths of the file and directory
-graph_generator_file = fileRelated.trendIndividual
-graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-" + nodeCluster +
-                        ( nodeCluster == "Fabric" ? funcs.fabricOn( prop[ "ONOSBranch" ] ) : "" ) + "/"
-
-def testsToRun = null
-testsToRun = funcs.getTestsToRun( Tests )
-
-// set functions into the dictionary.
-def tests = [ : ]
-for ( String test : testsToRun ){
-    println test
-    def pureTestName = test.split().head()
-    tests[ test ] = funcs.runTest( test, true, prop, pureTestName, true, [ ], graph_generator_file, graph_saved_directory )
-}
-
-for ( test in tests.keySet() ){
-    tests[ test ].call()
-}
diff --git a/TestON/JenkinsFile/USECASEJenkinsFile b/TestON/JenkinsFile/USECASEJenkinsFile
deleted file mode 100644
index 62da8ff..0000000
--- a/TestON/JenkinsFile/USECASEJenkinsFile
+++ /dev/null
@@ -1,69 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for USECASE-pipeline-<branch>
-
-// set the dependencies.
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
-fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
-
-// init configuration of funcs to be USECASE
-fileRelated.init()
-test_list.init()
-funcs.initialize( "USECASE" );
-
-// read the TestON.property files and save it as a dictionary
-def prop = null
-prop = funcs.getProperties()
-USECASE_tests = test_list.getTestsFromCategory( "USECASE" )
-
-// save directory and file.
-graph_generator_file = fileRelated.trendIndividual
-graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-BM/"
-
-// get tests to run.
-echo( "Testcases:" )
-def testsToRun = null
-testsToRun = funcs.getTestsToRun( prop[ "Tests" ] )
-funcs.printTestToRun( testsToRun )
-
-// save the function of the test running into the dictionary.
-def tests = [ : ]
-for ( String test : USECASE_tests.keySet() ){
-    toBeRun = testsToRun.contains( test )
-    def stepName = ( toBeRun ? "" : "Not " ) + "Running $test"
-    def pureTestName = ( USECASE_tests[ test ].containsKey( "test" ) ? USECASE_tests[ test ][ "test" ].split().head() : test )
-    tests[ stepName ] = funcs.runTest( test, toBeRun, prop, pureTestName, false,
-                                       USECASE_tests, graph_generator_file, graph_saved_directory )
-}
-
-// get start time of the test.
-start = funcs.getCurrentTime()
-// run the tests sequentially
-for ( test in tests.keySet() ){
-    tests[ test ].call()
-}
-
-// send the result to slack after USECASE test is done.
-funcs.sendResultToSlack( start, prop[ "manualRun" ], prop[ "WikiPrefix" ] )
-
-// generate the overall graph for USECASE.
-funcs.generateOverallGraph( prop, USECASE_tests, graph_saved_directory )
diff --git a/TestON/JenkinsFile/VM_BMJenkinsfileTrigger b/TestON/JenkinsFile/VM_BMJenkinsfileTrigger
deleted file mode 100644
index bb550c3..0000000
--- a/TestON/JenkinsFile/VM_BMJenkinsfileTrigger
+++ /dev/null
@@ -1,225 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the Jenkins script for vm-pipeline-trigger or bm-pipeline-trigger
-
-// set the functions of the dependencies.
-funcs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy' )
-triggerFuncs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/TriggerFuncs.groovy' )
-fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
-test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
-
-onos_tag = null
-manually_run = null
-now = null
-today = null
-onos_branches = null
-day = null
-post_result = null
-branchesParam = null
-isFabric = null
-testsParam = null
-
-dayMap = [:]
-fullDayMap = [:]
-all_testcases = [:]
-runTest = [:]
-selectedTests = [:]
-graphPaths = [:]
-
-main()
-
-def main() {
-    init()
-    runTests()
-    generateGraphs()
-}
-
-// **************
-// Initialization
-// **************
-
-// initialize file scope vars
-def init(){
-    // get the name of the job.
-    jobName = env.JOB_NAME
-
-    // set the versions of the onos
-    fileRelated.init()
-    test_list.init()
-    readParams()
-
-    funcs.initializeTrend( "Fabric" )
-    funcs.initialize( "Fabric" )
-
-    funcs.initializeTrend( "VM" )
-
-    triggerFuncs.init( funcs )
-
-    // list of the tests to be run will be saved in each choices.
-    day = ""
-
-    initDates()
-    onos_branches = getONOSBranches()
-    selectedTests = getONOSTests()
-
-    echo "selectedTests: " + selectedTests
-}
-
-def readParams(){
-    // get post result from the params for manually run.
-    post_result = params.PostResult
-    manually_run = params.manual_run
-    onos_tag = params.ONOSTag
-    branchesParam = params.branches
-    isOldFlow = params.isOldFlow
-    testsParam = params.Tests
-    isFabric = params.isFabric
-}
-
-// Set tests based on day of week
-def initDates(){
-    echo "-> initDates()"
-    now = funcs.getCurrentTime()
-    today = now[ Calendar.DAY_OF_WEEK ]
-    dayMap = [ ( Calendar.MONDAY )    : "mon",
-               ( Calendar.TUESDAY )   : "tue",
-               ( Calendar.WEDNESDAY ) : "wed",
-               ( Calendar.THURSDAY )  : "thu",
-               ( Calendar.FRIDAY )    : "fri",
-               ( Calendar.SATURDAY )  : "sat",
-               ( Calendar.SUNDAY )    : "sun" ]
-    fullDayMap = [ ( Calendar.MONDAY )    : "Monday",
-                   ( Calendar.TUESDAY )   : "Tuesday",
-                   ( Calendar.WEDNESDAY ) : "Wednesday",
-                   ( Calendar.THURSDAY )  : "Thursday",
-                   ( Calendar.FRIDAY )    : "Friday",
-                   ( Calendar.SATURDAY )  : "Saturday",
-                   ( Calendar.SUNDAY )    : "Sunday" ]
-    print now.toString()
-}
-
-// gets ONOS branches from params or string parameter
-def getONOSBranches(){
-    echo "-> getONOSBranches()"
-    if ( manually_run ){
-        return branchesParam.tokenize( "\n;, " )
-    } else {
-        return test_list.getBranchesFromDay( dayMap[ today ] )
-    }
-}
-
-def getONOSTests(){
-    echo "-> getONOSTests()"
-    if ( manually_run ){
-        return test_list.getTestsFromStringList( testsParam.tokenize( "\n;, " ) )
-    } else {
-        day = dayMap[ today ]
-        return test_list.getTestsFromDay( day )
-    }
-}
-
-// init paths for the files and directories.
-def initGraphPaths(){
-    graphPaths[ "histogramMultiple" ] = fileRelated.histogramMultiple
-    graphPaths[ "pieMultiple" ] = fileRelated.pieMultiple
-    graphPaths[ "saveDirectory" ] = fileRelated.jenkinsWorkspace + "postjob-VM/"
-}
-
-// **********************
-// Determine Tests to Run
-// **********************
-
-def printTestsToRun( runList ){
-    if ( manually_run ){
-        println "Tests to be run manually:"
-    } else {
-        if ( isFabric ){
-            postToSlackSR()
-        }
-        if ( today == Calendar.MONDAY ){
-            postToSlackTestsToRun()
-        }
-        println "Defaulting to " + day + " tests:"
-    }
-    for ( list in runList ){
-    //     triggerFuncs.print_tests( all_testcases[ b ] )
-        echo "" + list
-    }
-}
-
-def postToSlackSR(){
-    // If it is automated running, it will post the beginning message to the channel.
-    slackSend( channel: 'sr-failures', color: '#03CD9F',
-               message: ":sparkles:" * 16 + "\n" +
-                        "Starting tests on : " + now.toString() +
-                        "\n" + ":sparkles:" * 16 )
-}
-
-def postToSlackTestsToRun(){
-    slackSend( color: '#FFD988',
-               message: "Tests to be run this weekdays : \n" +
-                        triggerFuncs.printDaysForTest() )
-}
-
-// *********
-// Run Tests
-// *********
-
-def generateRunList(){
-    runList = [:]
-    for ( branch in onos_branches ){
-        runBranch = []
-        nodeLabels = test_list.getAllNodeLabels( branch, selectedTests )
-        for ( nodeLabel in nodeLabels ){
-            selectedNodeLabelTests = test_list.getTestsFromNodeLabel( nodeLabel, branch, selectedTests )
-            selectedNodeLabelCategories = test_list.getAllTestCategories( selectedNodeLabelTests )
-            for ( category in selectedNodeLabelCategories ){
-                selectedNodeLabelCategoryTests = test_list.getTestsFromCategory( category, selectedNodeLabelTests )
-                exeTestList = test_list.getTestListAsString( selectedNodeLabelCategoryTests )
-                runList.put( branch + "-" + nodeLabel, triggerFuncs.trigger_pipeline( branch, exeTestList, nodeLabel, category, manually_run, onos_tag ) )
-            }
-        }
-    }
-    return runList
-}
-
-def runTests(){
-    runList = generateRunList()
-    printTestsToRun( runList )
-    parallel runList
-}
-
-// ***************
-// Generate Graphs
-// ***************
-
-def generateGraphs(){
-    // If it is automated running, it will generate the stats graph on VM.
-    if ( !manually_run ){
-        for ( String b in onos_branches ){
-            funcs.generateStatGraph( "TestStation-VMs",
-                                     funcs.branchWithPrefix( b ),
-                                     graphPaths[ "histogramMultiple" ],
-                                     graphPaths[ "pieMultiple" ],
-                                     graphPaths[ "saveDirectory" ] )
-        }
-    }
-}
diff --git a/TestON/JenkinsFile/dependencies/GeneralFuncs.groovy b/TestON/JenkinsFile/dependencies/GeneralFuncs.groovy
deleted file mode 100644
index 4c6f021..0000000
--- a/TestON/JenkinsFile/dependencies/GeneralFuncs.groovy
+++ /dev/null
@@ -1,43 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the dependency Jenkins script.
-// it has some general functionality of making database command, basic graph part, and get list of the test
-
-// make the init part of the database command
-def database_command_create( pass, host, port, user ){
-    return pass + "|psql --host=" + host + " --port=" + port + " --username=" + user + " --password --dbname onostest -c "
-}
-
-// make the basic graph part for the Rscript
-def basicGraphPart( rFileName, host, port, user, pass, subject, branchName ){
-    return " Rscript " + rFileName + " " + host + " " + port + " " + user + " " + pass + " " + subject + " " + branchName
-}
-
-// get the list of the test as dictionary then return as a string
-def getTestList( tests ){
-    def list = ""
-    for ( String test : tests.keySet() ){
-        list += test + ","
-    }
-    return list[ 0..-2 ]
-}
-
-return this
diff --git a/TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy b/TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy
deleted file mode 100644
index d64f12e..0000000
--- a/TestON/JenkinsFile/dependencies/JenkinsCommonFuncs.groovy
+++ /dev/null
@@ -1,599 +0,0 @@
-#!groovy
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the dependency Jenkins script.
-// it has some common functions that runs test and generate graph.
-
-import groovy.time.TimeCategory
-import groovy.time.TimeDuration
-
-generalFuncs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/GeneralFuncs.groovy' )
-fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
-test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
-
-fileRelated.init()
-test_list.init()
-
-def initializeTrend( machine ){
-    // For initializing any trend graph jobs
-    // machine : Either VM,BM, or Fabric#
-
-    table_name = "executed_test_tests"
-    result_name = "executed_test_results"
-    testMachine = "TestStation-" + machine + "s"
-    this.machine = machine
-    isSCPF = false
-    hasArgs = false
-    isTrend = true
-}
-
-def initialize( type, SCPFfuncs ){
-    // Initializing for SCPF tests
-    // type : type of the test ( SR,FUNC,SCPF... )
-    // Passing the SCPFfunction which will be PerformanceFuncs.groovy
-
-    init( type )
-    SCPFfunc = SCPFfuncs
-    isSCPF = true
-    hasArgs = true // Has TestON cli arguments to be added when running the test
-    machine = machineType[ type ]
-}
-
-def initialize( type ){
-    // initializing for FUNC,HA,SR, and USECASE
-    // type : type of the test ( SR,FUNC,SCPF... )
-
-    init( type )
-    SCPFfunc = null
-    table_name = "executed_test_tests"
-    result_name = "executed_test_results"
-    trend_generator_file = fileRelated.trendMultiple
-    build_stats_generator_file = fileRelated.histogramMultiple
-    isSCPF = false
-    hasArgs = false
-}
-
-def init( type ){
-    // type : type of the test ( SR,FUNC,SCPF... )
-
-    machineType = [ "FUNC": "VM",
-                    "HA": "VM",
-                    "SR": "Fabric",
-                    "SCPF": "BM",
-                    "USECASE": "BM" ]
-    testType = type
-    testMachine = "TestStation-" + machineType[ type ] + "s"
-    isTrend = false
-}
-
-def additionalInitForSR( branch ){
-    // additional setup for SegmentRouting tests to determine the machine depends on the branch it is running.
-    // branch : branch of the onos. ( master, 2.1, 1.15... )
-
-    testMachine = ( ( new StringBuilder( testMachine ) ).insert( testMachine.size() - 1, fabricOn( branch ) ) ).
-            toString()
-    if ( isTrend ){
-        machine += fabricOn( branch )
-    }
-    else {
-        machineType[ testType ] += fabricOn( branch )
-    }
-    print testMachine
-}
-
-def fabricOn( branch ){
-    // gets the fabric machines with the branch of onos.
-    // branch : master, 2.1, 1.15...
-    // branch.reverse().take(4).reverse() will get last 4 characters of the string.
-    switch ( branch.reverse().take( 3 ).reverse() ){
-        case "ter": return "4"
-        case "2.1": return "3"
-        case "2.0": return "3"
-        case ".15": return "2"
-        case ".14": return "3"
-        case ".13": return "2"
-        case ".12": return "3"
-        default: return "4"
-    }
-}
-
-def printType(){
-    // print the test type and test machine that was initialized.
-
-    echo testType
-    echo testMachine
-}
-
-def getProperties(){
-    // get the properties of the test by reading the TestONOS.property
-
-    node( testMachine ) {
-        return readProperties( file: '/var/jenkins/TestONOS.property' )
-    }
-}
-
-def getTestsToRun( testList ){
-    // get test to run by tokenizing the list.
-
-    testList.tokenize( "\n;, " )
-}
-
-def getCurrentTime(){
-    // get time of the PST zone.
-
-    TimeZone.setDefault( TimeZone.getTimeZone( 'PST' ) )
-    return new Date()
-}
-
-def getTotalTime( start, end ){
-    // get total time of the test using start and end time.
-
-    return TimeCategory.minus( end, start )
-}
-
-def printTestToRun( testList ){
-    // printout the list of the test in the list.
-
-    for ( String test : testList ){
-        println test
-    }
-}
-
-def sendResultToSlack( start, isManualRun, branch ){
-    // send the result of the test to the slack when it is not manually running.
-    // start : start time of the test
-    // isManualRun : string that is whether "false" or "true"
-    // branch : branch of the onos.
-
-    try {
-        if ( isManualRun == "false" ){
-            end = getCurrentTime()
-            TimeDuration duration = TimeCategory.minus( end, start )
-            // FIXME: for now we disable notifications of normal test results
-            /*
-            slackSend( color: "#5816EE",
-                       message: testType + "-" + branch + " tests ended at: " + end.toString() +
-                                "\nTime took : " + duration )
-            */
-        }
-    }
-    catch ( all ){
-    }
-}
-
-def initAndRunTest( testName, testCategory ){
-    // Bash script that will
-    // Initialize the environment to the machine and run the test.
-    // testName : name of the test
-    // testCategory : (SR,FUNC ... )
-
-    return '''#!/bin/bash -l
-        set -i # interactive
-        set +e
-        shopt -s expand_aliases # expand alias in non-interactive mode
-        export PYTHONUNBUFFERED=1
-        ifconfig
-        echo "ONOS Branch is: $ONOSBranch"
-        echo "TestON Branch is: $TestONBranch"
-        echo "Test date: "
-        date
-        cd ~
-        export PATH=$PATH:onos/tools/test/bin
-        timeout 240 stc shutdown | head -100
-        timeout 240 stc teardown | head -100
-        timeout 240 stc shutdown | head -100
-        cd ~/OnosSystemTest/TestON/bin
-        git log | head
-        ./cleanup.sh -f
-        ''' + "./cli.py run " +
-           ( !hasArgs ? testName : testCategory[ testName ][ 'test' ] ) +
-           " --params GRAPH/nodeCluster=" + machineType[ testType ] + '''
-        ./cleanup.sh -f
-        # cleanup config changes
-        cd ~/onos/tools/package/config
-        git clean -df'''
-}
-
-def copyLogs(){
-    // bash script to copy the logs and other necessary element for SR tests.
-
-    result = ""
-    if ( testType == "SR" ){
-        result = '''
-      sudo rm /var/jenkins/workspace/SR-log-${WikiPrefix}/*
-      sudo cp *karaf.log.* /var/jenkins/workspace/SR-log-${WikiPrefix}/
-      sudo cp *Flows* /var/jenkins/workspace/SR-log-${WikiPrefix}/
-      sudo cp *Groups* /var/jenkins/workspace/SR-log-${WikiPrefix}/
-      sudo cp *.tar.gz /var/jenkins/workspace/SR-log-${WikiPrefix}/
-      sudo cp t3-* /var/jenkins/workspace/SR-log-${WikiPrefix}/
-      '''
-    }
-    return result
-}
-
-def cleanAndCopyFiles( testName ){
-    // clean up some files that were in the folder and copy the new files from the log
-    // testName : name of the test
-
-    return '''#!/bin/bash -i
-        set +e
-        echo "ONOS Branch is: ${ONOSBranch}"
-        echo "TestON Branch is: ${TestONBranch}"
-        echo "Job name is: "''' + testName + '''
-        echo "Workspace is: ${WORKSPACE}/"
-        echo "Wiki page to post is: ${WikiPrefix}-"
-        # remove any leftover files from previous tests
-        sudo rm ${WORKSPACE}/*Wiki.txt
-        sudo rm ${WORKSPACE}/*Summary.txt
-        sudo rm ${WORKSPACE}/*Result.txt
-        sudo rm ${WORKSPACE}/*Alarm.txt || true
-        sudo rm ${WORKSPACE}/*.csv
-        #copy files to workspace
-        cd `ls -t ~/OnosSystemTest/TestON/logs/*/ | head -1 | sed 's/://'`
-        ''' + copyLogs() + '''
-        sudo cp *.txt ${WORKSPACE}/
-        sudo cp *.csv ${WORKSPACE}/
-        cd ${WORKSPACE}/
-        for i in *.csv
-            do mv "$i" "$WikiPrefix"-"$i"
-        done
-        ls -al
-        cd '''
-}
-
-def fetchLogs( testName ){
-    // fetch the logs of onos from onos nodes to onos System Test logs
-    // testName: name of the test
-
-    return '''#!/bin/bash
-  set +e
-  cd ~/OnosSystemTest/TestON/logs
-  echo "TestON test name is: "''' + testName + '''
-  TestONlogDir=$(ls -t | grep ${TEST_NAME}_  |head -1)
-  echo "########################################################################################"
-  echo "#####  copying ONOS logs from all nodes to TestON/logs directory: ${TestONlogDir}"
-  echo "########################################################################################"
-  cd $TestONlogDir
-  if [ $? -eq 1 ]
-  then
-      echo "Job name does not match any test suite name to move log!"
-  else
-      pwd
-      for i in $OC{1..7}; do onos-fetch-logs $i || echo log does not exist for onos $i; done
-      for i in $OC{1..7}; do atomix-fetch-logs $i || echo log does not exist for atomix $i; done
-  fi
-  cd'''
-}
-
-def isPostingResult( manual, postresult ){
-    // check if it is posting the result.
-    // posting when it is automatically running or has postResult condition from the manual run
-
-    return manual == "false" || postresult == "true"
-}
-
-def postResult( prop, graphOnly ){
-    // post the result by triggering postjob.
-    // prop : property dictionary that was read from the machine.
-    // graphOnly : if it is graph generating job
-
-    if ( graphOnly || isPostingResult( prop[ "manualRun" ], prop[ "postResult" ] ) ){
-        def post = build job: "postjob-" + ( graphOnly ? machine : machineType[ testType ] ), propagate: false
-    }
-}
-
-def postLogs( testName, prefix ){
-    // posting logs of the onos jobs specifically SR tests
-    // testName : name of the test
-    // prefix : branch prefix ( master, 2.1, 1.15 ... )
-
-    resultURL = ""
-    if ( testType == "SR" ){
-        def post = build job: "SR-log-" + prefix, propagate: false
-        resultURL = post.getAbsoluteUrl()
-    }
-    return resultURL
-}
-
-def getSlackChannel(){
-    // get name of the slack channel.
-    // if the test is SR, it will return sr-failures
-
-    // FIXME: For now we move all notifications to #jenkins-related
-    // return "#" + ( testType == "SR" ? "sr-failures" : "jenkins-related" )
-    return "#jenkins-related"
-}
-
-def analyzeResult( prop, workSpace, pureTestName, testName, resultURL, wikiLink, isSCPF ){
-    // analyzing the result of the test and send to slack if any abnormal result is logged.
-    // prop : property dictionary
-    // workSpace : workSpace where the result file is saved
-    // pureTestName : TestON name of the test
-    // testName : Jenkins name of the test. Example: SCPFflowTPFobj
-    // resultURL : url for the logs for SR tests. Will not be posted if it is empty
-    // wikiLink : link of the wiki page where the result was posted
-    // isSCPF : Check if it is SCPF. If so, it won't post the wiki link.
-
-    node( testMachine ) {
-        def alarmFile = workSpace + "/" + pureTestName + "Alarm.txt"
-        if ( fileExists( alarmFile ) ) {
-            print "Abnormal test result logged"
-            def alarmContents = readFile( alarmFile )
-            slackSend( channel: getSlackChannel(),
-                       color: "FF0000",
-                       message: "[" + prop[ "ONOSBranch" ] + "]" + testName + " : triggered alarms:\n" +
-                                alarmContents + "\n" +
-                                "[TestON log] : \n" +
-                                "https://jenkins.onosproject.org/blue/organizations/jenkins/${ env.JOB_NAME }/detail/${ env.JOB_NAME }/${ env.BUILD_NUMBER }/pipeline" +
-                                ( isSCPF ? "" : ( "\n[Result on Wiki] : \n" +
-                                                  "https://wiki.onosproject.org/display/ONOS/" +
-                                                  wikiLink.replaceAll( "\\s", "+" ) ) ) +
-                                ( resultURL != "" ? ( "\n[Karaf log] : \n" +
-                                                      resultURL + "artifact/" ) : "" ),
-                       teamDomain: 'onosproject' )
-            Failed
-        }
-        else {
-            print "Test results are normal"
-        }
-    }
-}
-
-def publishToConfluence( isManualRun, isPostResult, wikiLink, file ){
-    // publish HTML script to wiki confluence
-    // isManualRun : string "true" "false"
-    // isPostResult : string "true" "false"
-    // wikiLink : link of the wiki page to publish
-    // file : name of the file to be published
-
-    if ( isPostingResult( isManualRun, isPostResult ) ){
-        publishConfluence siteName: 'wiki.onosproject.org', pageName: wikiLink, spaceName: 'ONOS',
-                          attachArchivedArtifacts: true, buildIfUnstable: true,
-                          editorList: [ confluenceWritePage( confluenceFile( file ) ) ]
-    }
-
-}
-
-def runTest( testName, toBeRun, prop, pureTestName, graphOnly, testCategory, graph_generator_file,
-             graph_saved_directory ){
-    // run the test on the machine that contains all the steps : init and run test, copy files, publish result ...
-    // testName : name of the test in Jenkins
-    // toBeRun : boolean value whether the test will be run or not. If not, it won't be run but shows up with empty
-    //           result on pipeline view
-    // prop : dictionary property on the machine
-    // pureTestName : Pure name of the test. ( ex. pureTestName of SCPFflowTpFobj will be SCPFflowTp )
-    // graphOnly : check if it is generating graph job. If so, it will only generate the generating graph part
-    // testCategory : Map for the test suit ( SCPF, SR, FUNC, ... ) which contains information about the tests
-    // graph_generator_file : Rscript file with the full path.
-    // graph_saved_directory : where the generated graph will be saved to.
-
-    return {
-        catchError {
-            stage( testName ) {
-                if ( toBeRun ){
-                    def workSpace = "/var/jenkins/workspace/" + testName
-                    def fileContents = ""
-                    node( testMachine ) {
-                        withEnv( [ 'ONOSBranch=' + prop[ "ONOSBranch" ],
-                                   'ONOSJAVAOPTS=' + prop[ "ONOSJAVAOPTS" ],
-                                   'TestONBranch=' + prop[ "TestONBranch" ],
-                                   'ONOSTag=' + prop[ "ONOSTag" ],
-                                   'WikiPrefix=' + prop[ "WikiPrefix" ],
-                                   'WORKSPACE=' + workSpace ] ) {
-                            if ( !graphOnly ){
-                                if ( isSCPF ){
-                                    // Remove the old database file
-                                    sh SCPFfunc.cleanupDatabaseFile( testName )
-                                }
-                                sh initAndRunTest( testName, testCategory )
-                                // For the Wiki page
-                                sh cleanAndCopyFiles( pureTestName )
-                            }
-                            databaseAndGraph( prop, testName, pureTestName, graphOnly,
-                                              graph_generator_file, graph_saved_directory )
-                            if ( !graphOnly ){
-                                sh fetchLogs( pureTestName )
-                                if ( !isSCPF ){
-                                    publishToConfluence( prop[ "manualRun" ], prop[ "postResult" ],
-                                                         testCategory[ testName ][ 'wiki_link' ],
-                                                         workSpace + "/" + testCategory[ testName ][ 'wiki_file' ] )
-                                }
-                            }
-                        }
-                    }
-                    postResult( prop, graphOnly )
-                    if ( !graphOnly ){
-                        def resultURL = postLogs( testName, prop[ "WikiPrefix" ] )
-                        analyzeResult( prop, workSpace, pureTestName, testName, resultURL,
-                                       isSCPF ? "" : testCategory[ testName ][ 'wiki_link' ],
-                                       isSCPF )
-                    }
-                }
-            }
-        }
-    }
-}
-
-def databaseAndGraph( prop, testName, pureTestName, graphOnly, graph_generator_file, graph_saved_directory ){
-    // part where it insert the data into the database.
-    // It will use the predefined encrypted variables from the Jenkins.
-    // prop : property dictionary that was read from the machine
-    // testName : Jenkins name for the test
-    // pureTestName : TestON name for the test
-    // graphOnly : boolean whether it is graph only or not
-    // graph_generator_file : Rscript file with the full path.
-    // graph_saved_directory : where the generated graph will be saved to.
-    if ( graphOnly || isPostingResult( prop[ "manualRun" ], prop[ "postResult" ] ) ){
-        // Post Results
-        withCredentials( [
-                string( credentialsId: 'db_pass', variable: 'pass' ),
-                string( credentialsId: 'db_user', variable: 'user' ),
-                string( credentialsId: 'db_host', variable: 'host' ),
-                string( credentialsId: 'db_port', variable: 'port' ) ] ) {
-            def database_command = generalFuncs.database_command_create( pass, host, port, user ) +
-                                   ( !isSCPF ? sqlCommand( testName ) : SCPFfunc.sqlCommand( testName ) )
-            sh '''#!/bin/bash
-              export DATE=\$(date +%F_%T)
-              cd ~
-              pwd ''' + ( graphOnly ? "" :
-                          ( !isSCPF ? databasePart( prop[ "WikiPrefix" ], pureTestName, database_command ) :
-                            SCPFfunc.databasePart( testName, database_command ) ) ) + '''
-              ''' + ( !isSCPF ? graphGenerating( host, port, user, pass, testName, prop, graph_saved_directory,
-                                                 graph_generator_file ) :
-                      SCPFfunc.getGraphGeneratingCommand( host, port, user, pass, testName, prop ) )
-        }
-    }
-}
-
-def generateCategoryStatsGraph( testMachineOn, manualRun, postresult, stat_file, pie_file, type, branch, testListPart,
-                                save_path, pieTestListPart ){
-    // function that will generate the category stat graphs for the overall test.
-    // testMachineOn : the machine the graph will be generated. It will be TestStation-VMs for the most cases
-    // manualRun : string of "true" or "false"
-    // postresult : string of "true" or "false"
-    // stat_file : file name with full path for Rscript for the stat graph
-    // pie_file : file name with full path for Rscript for the pie graph
-    // type : type of the test ( USECASE, FUNC, HA )
-    // branch : branch of the test ( master, onos-2.1, onos-1.15 )
-    // testListPart : list of the test to be included
-    // save_path : path that will save the graphs to
-    // pieTestListPart : list of the test for pie graph
-
-    if ( isPostingResult( manualRun, postresult ) ){
-        node( testMachineOn ) {
-
-            withCredentials( [
-                    string( credentialsId: 'db_pass', variable: 'pass' ),
-                    string( credentialsId: 'db_user', variable: 'user' ),
-                    string( credentialsId: 'db_host', variable: 'host' ),
-                    string( credentialsId: 'db_port', variable: 'port' ) ] ) {
-                sh '''#!/bin/bash
-              ''' + generalFuncs.basicGraphPart( stat_file, host, port, user, pass, type,
-                                                 branch ) + " \"" + testListPart + "\" latest " + save_path + '''
-              ''' + getOverallPieGraph( pie_file, host, port, user, pass, branch, type, pieTestListPart, 'y',
-                                        save_path ) + '''
-              ''' +
-                   getOverallPieGraph( pie_file, host, port, user, pass, branch, type, pieTestListPart, 'n', save_path )
-            }
-        }
-        postResult( [ ], true )
-    }
-}
-
-
-def generateOverallGraph( prop, testCategory, graph_saved_directory ){
-    // generate the overall graph for the test
-
-    if ( isPostingResult( prop[ "manualRun" ], prop[ "postResult" ] ) ){
-        node( testMachine ) {
-
-            withCredentials( [
-                    string( credentialsId: 'db_pass', variable: 'pass' ),
-                    string( credentialsId: 'db_user', variable: 'user' ),
-                    string( credentialsId: 'db_host', variable: 'host' ),
-                    string( credentialsId: 'db_port', variable: 'port' ) ] ) {
-                testList = generalFuncs.getTestList( testCategory )
-                sh '''#!/bin/bash
-                   ''' +
-                   generalFuncs.basicGraphPart( trend_generator_file, host, port,
-                                                user, pass, testType,
-                                                prop[ "ONOSBranch" ] ) + " " + testList + " 20 " + graph_saved_directory
-            }
-        }
-        postResult( prop, false )
-    }
-}
-
-def getOverallPieGraph( file, host, port, user, pass, branch, type, testList, yOrN, path ){
-    // Rcommand for the pie graph
-
-    return generalFuncs.basicGraphPart( file, host, port, user, pass, type, branch ) +
-           " \"" + testList + "\" latest " + yOrN + " " + path
-}
-
-def sqlCommand( testName ){
-    // get the inserting sqlCommand for non-SCPF tests.
-
-    return "\"INSERT INTO " + table_name + " VALUES('\$DATE','" + result_name + "','" +
-           testName + "',\$BUILD_NUMBER, '\$ONOSBranch', \$line);\" "
-}
-
-def graphGenerating( host, port, user, pass, testName, prop, graph_saved_directory, graph_generator_file ){
-    // get the graphGenerating R command for non-SCPF tests
-
-    return generalFuncs.basicGraphPart( graph_generator_file, host, port, user, pass, testName,
-                                        prop[ "ONOSBranch" ] ) + " 20 " + graph_saved_directory
-}
-
-def databasePart( wikiPrefix, testName, database_command ){
-    // to read and insert the data from .csv to the database
-
-    return '''
-    sed 1d ''' + workSpace + "/" + wikiPrefix + "-" + testName + '''.csv | while read line
-    do
-    echo \$line
-    echo ''' + database_command + '''
-    done '''
-}
-
-def generateStatGraph( testMachineOn, onos_branch, stat_graph_generator_file, pie_graph_generator_file,
-                       graph_saved_directory ){
-
-    // Will generate the stats graph.
-    FUNCtestsStr = test_list.getTestListAsString( test_list.getTestsFromCategory( "FUNC" ) )
-    HAtestsStr = test_list.getTestListAsString( test_list.getTestsFromCategory( "HA" ) )
-    USECASEtestsStr = test_list.getTestListAsString( test_list.getTestsFromCategory( "USECASE" ) )
-
-    testListParam = "FUNC-"     + FUNCtestsStr + ";" +
-                    "HA-"       + HAtestsStr   + ";" +
-                    "USECASE-"  + USECASEtestsStr
-
-    pieTestListParam = FUNCtestsStr + "," +
-                       HAtestsStr   + "," +
-                       USECASEtestsStr
-
-    generateCategoryStatsGraph( testMachineOn, "false", "true", stat_graph_generator_file, pie_graph_generator_file,
-                                "ALL", onos_branch, testListParam, graph_saved_directory, pieTestListParam )
-}
-
-def branchWithPrefix( branch ){
-    // get the branch with the prefix ( "onos-" )
-    return ( ( branch != "master" ) ? "onos-" : "" ) + branch
-}
-
-def testBranchWithPrefix( branch ){
-    // get TestON branch with the prefix ( "onos-" )
-    if ( branch == "1.12" )
-        return "onos-1.13"
-    else if ( branch == "1.13" )
-        return "onos-1.13"
-    else if ( branch == "1.14" )
-        return "onos-1.15"
-    else if ( branch == "1.15" )
-        return "onos-1.15"
-    else if ( branch == "2.0" )
-        return "onos-2.0"
-    else if ( branch == "2.1" )
-        return "onos-2.1"
-    else
-        return "master"
-}
-
-return this
diff --git a/TestON/JenkinsFile/dependencies/JenkinsGraphs.groovy b/TestON/JenkinsFile/dependencies/JenkinsGraphs.groovy
new file mode 100644
index 0000000..b39c2b4
--- /dev/null
+++ b/TestON/JenkinsFile/dependencies/JenkinsGraphs.groovy
@@ -0,0 +1,230 @@
+#!groovy
+// Copyright 2017 Open Networking Foundation (ONF)
+//
+// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
+// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
+// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
+//
+//     TestON is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 2 of the License, or
+//     (at your option) any later version.
+//
+//     TestON is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+//
+//     You should have received a copy of the GNU General Public License
+//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
+
+// This is the dependency Jenkins script.
+// it has some common functions that runs test and generate graph.
+
+fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
+test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
+
+fileRelated.init()
+test_list.init()
+
+testStation = null
+isSCPF = null
+
+def initialize( SCPFf=null ){
+    isSCPF = ( SCPFf != null )
+    SCPFfunc = SCPFf
+    trend_generator_file = fileRelated.rScriptPaths[ "scripts" ][ "trendMultiple" ]
+    build_stats_generator_file = fileRelated.rScriptPaths[ "scripts" ][ "histogramMultiple" ]
+}
+
+def getPostjobType( nodeL ){
+    switch ( nodeL ){
+        case "Fabric-1.x":
+            return "Fabric2"
+            break
+        case "Fabric-2.x":
+            return "Fabric3"
+            break
+        case "Fabric-master":
+            return "Fabric4"
+            break
+        default:
+            return nodeL
+            break
+    }
+}
+
+def postResult( prop, graphOnly, nodeLabel ){
+    // post the result by triggering postjob.
+    // prop : property dictionary that was read from the machine.
+    // graphOnly : if it is graph generating job
+
+    if ( graphOnly || isPostingResult( prop[ "manualRun" ], prop[ "postResult" ] ) ){
+        postjob_type = getPostjobType( nodeLabel )
+        def post = build job: "postjob-" + postjob_type, propagate: false
+    }
+}
+
+def isPostingResult( manual, postresult ){
+    // check if it is posting the result.
+    // posting when it is automatically running or has postResult condition from the manual run
+
+    return manual == "false" || postresult == "true"
+}
+
+def database_command_create( pass, host, port, user ){
+    return pass + "|psql --host=" + host + " --port=" + port + " --username=" + user + " --password --dbname onostest -c "
+}
+
+def databaseAndGraph( prop, testName, pureTestName, graphOnly, graph_generator_file, graph_saved_directory ){
+    // part where it insert the data into the database.
+    // It will use the predefined encrypted variables from the Jenkins.
+    // prop : property dictionary that was read from the machine
+    // testName : Jenkins name for the test
+    // pureTestName : TestON name for the test
+    // graphOnly : boolean whether it is graph only or not
+    // graph_generator_file : Rscript file with the full path.
+    // graph_saved_directory : where the generated graph will be saved to.
+    if ( graphOnly || isPostingResult( prop[ "manualRun" ], prop[ "postResult" ] ) ){
+        // Post Results
+        withCredentials( [
+                string( credentialsId: 'db_pass', variable: 'pass' ),
+                string( credentialsId: 'db_user', variable: 'user' ),
+                string( credentialsId: 'db_host', variable: 'host' ),
+                string( credentialsId: 'db_port', variable: 'port' ) ] ) {
+            def database_command = database_command_create( pass, host, port, user ) +
+                                   ( !isSCPF ? sqlCommand( testName ) : SCPFfunc.sqlCommand( testName ) )
+            sh script: '''#!/bin/bash
+              export DATE=\$(date +%F_%T)
+              cd ~
+              pwd ''' + ( graphOnly ? "" :
+                          ( !isSCPF ? databasePart( prop[ "WikiPrefix" ], pureTestName, database_command ) :
+                            SCPFfunc.databasePart( testName, database_command ) ) ), label: "Database"
+            sh script: ( !isSCPF ? graphGenerating( host, port, user, pass, testName, prop, graph_saved_directory,
+                                                 graph_generator_file ) :
+                      SCPFfunc.getGraphGeneratingCommand( host, port, user, pass, testName, prop ) ), label: "Generate Test Graph"
+        }
+    }
+}
+
+// make the basic graph part for the Rscript
+def basicGraphPart( rFileName, host, port, user, pass, subject, branchName ){
+    return " Rscript " + rFileName + " " + host + " " + port + " " + user + " " + pass + " " + subject + " " + branchName
+}
+
+def generateCategoryStatsGraph( testMachineOn, manualRun, postresult, stat_file, pie_file, type, branch, testListPart,
+                                save_path, pieTestListPart, nodeLabel ){
+    // function that will generate the category stat graphs for the overall test.
+    // testMachineOn : the machine the graph will be generated. It will be TestStation-VMs for the most cases
+    // manualRun : string of "true" or "false"
+    // postresult : string of "true" or "false"
+    // stat_file : file name with full path for Rscript for the stat graph
+    // pie_file : file name with full path for Rscript for the pie graph
+    // type : type of the test ( USECASE, FUNC, HA )
+    // branch : branch of the test ( master, onos-2.1, onos-1.15 )
+    // testListPart : list of the test to be included
+    // save_path : path that will save the graphs to
+    // pieTestListPart : list of the test for pie graph
+
+    if ( isPostingResult( manualRun, postresult ) ){
+        node( testMachineOn ) {
+
+            withCredentials( [
+                    string( credentialsId: 'db_pass', variable: 'pass' ),
+                    string( credentialsId: 'db_user', variable: 'user' ),
+                    string( credentialsId: 'db_host', variable: 'host' ),
+                    string( credentialsId: 'db_port', variable: 'port' ) ] ) {
+                sh script: ( '''#!/bin/bash
+              ''' + basicGraphPart( stat_file, host, port, user, pass, type,
+                                                 branch ) + " \"" + testListPart + "\" latest " + save_path + '''
+              ''' + getOverallPieGraph( pie_file, host, port, user, pass, branch, type, pieTestListPart, 'y',
+                                        save_path ) + '''
+              ''' + getOverallPieGraph( pie_file, host, port, user, pass, branch, type, pieTestListPart, 'n', save_path ) ), label: "Generate Stats Graphs"
+            }
+        }
+        postResult( [ ], true, nodeLabel )
+    }
+}
+
+
+def generateOverallGraph( prop, tests, graph_saved_directory, nodeLabel, testType ){
+    // generate the overall graph for the test
+
+    if ( isPostingResult( prop[ "manualRun" ], prop[ "postResult" ] ) ){
+        node( testStation ) {
+
+            withCredentials( [
+                    string( credentialsId: 'db_pass', variable: 'pass' ),
+                    string( credentialsId: 'db_user', variable: 'user' ),
+                    string( credentialsId: 'db_host', variable: 'host' ),
+                    string( credentialsId: 'db_port', variable: 'port' ) ] ) {
+                testList = test_list.getTestListAsString( tests )
+                sh script: ( '''#!/bin/bash
+                             ''' +
+                   basicGraphPart( trend_generator_file, host, port,
+                                                user, pass, testType,
+                                                prop[ "ONOSBranch" ] ) + " " + testList + " 20 " + graph_saved_directory ), label: "Generate Overall Graph"
+            }
+        }
+        postResult( prop, false, nodeLabel )
+    }
+}
+
+def getOverallPieGraph( file, host, port, user, pass, branch, type, testList, yOrN, path ){
+    // Rcommand for the pie graph
+
+    return basicGraphPart( file, host, port, user, pass, type, branch ) +
+           " \"" + testList + "\" latest " + yOrN + " " + path
+}
+
+def sqlCommand( testName ){
+    // get the inserting sqlCommand for non-SCPF tests.
+    table_name = "executed_test_tests"
+    result_name = "executed_test_results"
+
+    return "\"INSERT INTO " + table_name + " VALUES('\$DATE','" + result_name + "','" +
+           testName + "',\$BUILD_NUMBER, '\$ONOSBranch', \$line);\" "
+}
+
+def graphGenerating( host, port, user, pass, testName, prop, graph_saved_directory, graph_generator_file ){
+    // get the graphGenerating R command for non-SCPF tests
+
+    return basicGraphPart( graph_generator_file, host, port, user, pass, testName,
+                                        prop[ "ONOSBranch" ] ) + " 20 " + graph_saved_directory
+}
+
+def databasePart( wikiPrefix, testName, database_command ){
+    // to read and insert the data from .csv to the database
+
+    return '''
+    sed 1d ''' + workSpace + "/" + wikiPrefix + "-" + testName + '''.csv | while read line
+    do
+    echo \$line
+    echo ''' + database_command + '''
+    done '''
+}
+
+def generateStatGraph( testMachineOn, onos_branch, stat_graph_generator_file, pie_graph_generator_file,
+                       graph_saved_directory, nodeLabel ){
+
+    table_name = "executed_test_tests"
+    result_name = "executed_test_results"
+
+    // Will generate the stats graph.
+    FUNCtestsStr = test_list.getTestListAsString( test_list.getTestsFromCategory( "FUNC" ) )
+    HAtestsStr = test_list.getTestListAsString( test_list.getTestsFromCategory( "HA" ) )
+    USECASEtestsStr = test_list.getTestListAsString( test_list.getTestsFromCategory( "USECASE" ) )
+
+    testListParam = "FUNC-"     + FUNCtestsStr + ";" +
+                    "HA-"       + HAtestsStr   + ";" +
+                    "USECASE-"  + USECASEtestsStr
+
+    pieTestListParam = FUNCtestsStr + "," +
+                       HAtestsStr   + "," +
+                       USECASEtestsStr
+
+    generateCategoryStatsGraph( testMachineOn, "false", "true", stat_graph_generator_file, pie_graph_generator_file,
+                                "ALL", onos_branch, testListParam, graph_saved_directory, pieTestListParam, nodeLabel )
+}
+
+return this
diff --git a/TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy b/TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy
index 6eb1061..73a8751 100644
--- a/TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy
+++ b/TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy
@@ -22,30 +22,20 @@
 // This is the dependency Jenkins script.
 // This will initialize the paths of the jenkins file and paths.
 
-// init the paths for the directory
-def initLocation(){
-    jenkinsFolder = "~/OnosSystemTest/TestON/JenkinsFile/"
-    rScriptLocation = jenkinsFolder + "wikiGraphRScripts/"
-    jenkinsWorkspace = "/var/jenkins/workspace/"
-    SCPFSpecificLocation = rScriptLocation + "SCPFspecificGraphRScripts/"
-    CHOScriptDir = "~/CHO_Jenkins_Scripts/"
-}
+import groovy.json.*
 
-// init the paths for the files.
-def initFiles(){
-    trendIndividual = rScriptLocation + "trendIndividualTest.R"
-    trendMultiple = rScriptLocation + "trendMultipleTests.R"
-    trendSCPF = rScriptLocation + "trendSCPF.R"
-    trendCHO = rScriptLocation + "trendCHO.R"
-    histogramMultiple = rScriptLocation + "histogramMultipleTestGroups.R"
-    pieMultiple = rScriptLocation + "pieMultipleTests.R"
-}
+jenkinsFiles = ""
+rScriptPaths = [:]      // paths of r script files that generate wiki graphs
+workspaces = [:]        // postjob workspaces
 
 // init both directory and file paths.
 def init(){
-    initLocation()
-    initFiles()
+    def paths_buffer = readTrusted( "TestON/JenkinsFile/dependencies/paths.json" )
+    paths_json = readJSON text: paths_buffer
+
+    jenkinsFiles = paths_json[ "jenkinsFiles" ]
+    workspaces = paths_json[ "workspaces" ]
+    rScriptPaths = paths_json[ "rScript" ]
 }
 
 return this
-
diff --git a/TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy b/TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy
index 5badbcc..d62e114 100644
--- a/TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy
+++ b/TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy
@@ -23,6 +23,7 @@
 schedules = [:]
 branches = [:]
 
+// read all json files and save as maps
 def init(){
     def tests_buffer = readTrusted( "TestON/JenkinsFile/dependencies/tests.json" )
     def schedules_buffer = readTrusted( "TestON/JenkinsFile/dependencies/schedule.json" )
@@ -60,6 +61,7 @@
     return str_result[ 0..-2 ]
 }
 
+// given a list of tests as a string, returns the list of tests as a map, similar formatted to tests.json
 def getTestsFromStringList( list ){
     testsResult = [:]
     for ( item in list ){
@@ -85,14 +87,15 @@
     return schedulePropertyResult
 }
 
-def getAllBranches(){
-    return branches
-}
-
 // ********
 // Branches
 // ********
 
+// returns all branches from branches.json
+def getAllBranches(){
+    return branches
+}
+
 // given a day, returns all branches that are run on that day
 def getBranchesFromDay( day, tests=[:] ){
     branchesFromDayResult = []
@@ -104,8 +107,9 @@
     for ( String key in tests.keySet() ){
         for ( subDict in tests[ key ][ "schedules" ] ){
             sch = subDict[ "day" ]
-            if ( validSchedules.contains( sch ) && !branchesFromDayResult.contains( sch ) ){
-                branchesFromDayResult += convertBranchCodeToBranch( subDict[ "branch" ] )
+            new_branch = convertBranchCodeToBranch( subDict[ "branch" ], false )
+            if ( validSchedules.contains( sch ) && !branchesFromDayResult.contains( new_branch ) ){
+                branchesFromDayResult += new_branch
             }
         }
     }
@@ -125,14 +129,32 @@
     return branch_code
 }
 
+// given a branch, returns the corresponding branch code (hack)
+// Example: given "onos-1.15", returns "onos-1.x"
 def convertBranchToBranchCode( branch ){
-    if ( branch == "master" || branch.substring( 0, 1 ) == "o" ){
+    if ( branch == "master" ){
         return branch
+    } else if ( branch.substring( 0, 1 ) == "o" ) {
+        return branch.substring( 0, 6 ) + ".x"
     } else {
         return "onos-" + branch.substring( 0, 1 ) + ".x"
     }
 }
 
+// given a branch without a prefix, returns the branch with the "onos-" prefix
+def addPrefixToBranch( branchNoPrefix ){
+    if ( branchNoPrefix == "master" ){
+        return "master"
+    } else {
+        return "onos-" + branchNoPrefix
+    }
+}
+
+// given a branch with the prefix "onos-", returns the branch without the prefix
+def removePrefixFromBranch( branchWithPrefix ){
+    return branchWithPrefix.minus( "onos-" )
+}
+
 // *************
 // Test Category
 // *************
@@ -151,6 +173,7 @@
     return testsFromCategoryResult
 }
 
+// given the test name, returns the category (FUNC, HA, etc.) of that test
 def getCategoryOfTest( test_name, tests=[:] ){
     if ( tests == [:] ){
         tests = allTests
@@ -158,6 +181,7 @@
     return tests[ test_name ][ "category" ]
 }
 
+// returns all categories of all tests, or the given test list
 def getAllTestCategories( tests=[:] ){
     testCategoriesResult = []
     if ( tests == [:] ){
@@ -187,7 +211,7 @@
     return validSchedules
 }
 
-// given a day and branch, returns all tests that run on the given day on the given branch
+// given a day, returns all tests that run on the given day on the given branch
 def getTestsFromDay( day, tests=[:] ){
     resultDict = [:]
     if ( tests == [:] ){
@@ -226,7 +250,7 @@
 }
 
 // Given a test name and branch, return the node label associated.
-def getNodeLabel( test_name, branch, tests ){
+def getNodeLabel( test_name, branch, tests=[:] ){
     if ( tests == [:] ){
         tests = allTests
     }
@@ -238,7 +262,8 @@
     }
 }
 
-def getAllNodeLabels( branch, tests ){
+// given a branch, returns all nodeLabels from all tests, or a given test list
+def getAllNodeLabels( branch, tests=[:] ){
     nodeLabelResult = []
     if ( tests == [:] ){
         tests = allTests
diff --git a/TestON/JenkinsFile/dependencies/PerformanceFuncs.groovy b/TestON/JenkinsFile/dependencies/PerformanceFuncs.groovy
index 4e185fc..fd70fcc 100644
--- a/TestON/JenkinsFile/dependencies/PerformanceFuncs.groovy
+++ b/TestON/JenkinsFile/dependencies/PerformanceFuncs.groovy
@@ -242,7 +242,7 @@
                                          dbWhere: 'AND scale=5',
                                          y_axis: 'Latency (ms)' ]
     ]
-    graph_saved_directory = fileRelated.jenkinsWorkspace + "postjob-BM/"
+    graph_saved_directory = fileRelated.workspaces[ "BM" ]
 }
 
 def getGraphCommand( rFileName, extras, host, port, user, pass, testName, branchName, isOldFlow ){
@@ -255,10 +255,15 @@
     return result
 }
 
+// make the basic graph part for the Rscript
+def basicGraphPart( rFileName, host, port, user, pass, subject, branchName ){
+    return " Rscript " + rFileName + " " + host + " " + port + " " + user + " " + pass + " " + subject + " " + branchName
+}
+
 def generateGraph( rFileName, batch, host, port, user, pass, testName, branchName, isOldFlow ){
     //  generate the Rscript command for individual graphs
 
-    return generalFuncs.basicGraphPart( fileRelated.SCPFSpecificLocation + rFileName,
+    return basicGraphPart( fileRelated.rScriptPaths[ "directories" ][ "SCPF" ] + rFileName,
                                         host, port, user, pass, testName, branchName ) +
            " " + batch + " " + usingOldFlow( isOldFlow, testName ) + graph_saved_directory
 }
@@ -268,7 +273,7 @@
     def result = ""
 
     for ( int i = 0; i < SCPF[ testName ][ 'graphTitle' ].size(); i++ ){
-        result += generalFuncs.basicGraphPart( fileRelated.trendSCPF,
+        result += basicGraphPart( fileRelated.rScriptPaths[ "scripts" ][ "trendSCPF" ],
                                                host,
                                                port,
                                                user,
diff --git a/TestON/JenkinsFile/dependencies/TriggerFuncs.groovy b/TestON/JenkinsFile/dependencies/TriggerFuncs.groovy
deleted file mode 100644
index 4eb22ab..0000000
--- a/TestON/JenkinsFile/dependencies/TriggerFuncs.groovy
+++ /dev/null
@@ -1,276 +0,0 @@
-#!groovy
-
-// Copyright 2017 Open Networking Foundation (ONF)
-//
-// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
-// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
-// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
-//
-//     TestON is free software: you can redistribute it and/or modify
-//     it under the terms of the GNU General Public License as published by
-//     the Free Software Foundation, either version 2 of the License, or
-//     (at your option) any later version.
-//
-//     TestON is distributed in the hope that it will be useful,
-//     but WITHOUT ANY WARRANTY; without even the implied warranty of
-//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//     GNU General Public License for more details.
-//
-//     You should have received a copy of the GNU General Public License
-//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-
-// This is the dependency Jenkins script.
-// This will provide the portion that will set up the environment of the machine
-//      and trigger the corresponding jobs.
-
-test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
-test_list.init()
-
-def init( commonFuncs ){
-    funcs = commonFuncs
-}
-
-def lastCommaRemover( str ){
-    // function that will remove the last comma from the string
-
-    if ( str.size() > 0 && str[ str.size() - 1 ] == ',' ){
-        str = str.substring( 0, str.size() - 1 )
-    }
-    return str
-}
-
-def printDaysForTest(){
-    // Print the days for what test has.
-    AllTheTests = test_list.getAllTests()
-
-    result = ""
-    for ( String test in AllTheTests.keySet() ){
-        result += test + ": ["
-        test_schedule = test_list.getTestSchedule( test )
-        for ( String sch in test_schedule.keySet() ){
-            for ( String day in test_list.convertScheduleKeyToDays( sch ) ){
-                result += day + " "
-            }
-        }
-        result += "]\n"
-    }
-    return result
-}
-
-def runTestSeq( testList ){
-    // Running the test sequentially
-    return {
-        for ( test in testList.keySet() ){
-            testList[ test ].call()
-        }
-    }
-}
-
-def print_tests( tests ){
-    // print the list of the tsets to be run
-
-    for ( String test in tests.keySet() ){
-        if ( tests[ test ][ "tests" ] != "" ){
-            println test + ":"
-            println tests[ test ][ "tests" ]
-        }
-    }
-}
-
-def organize_tests( tests, testcases ){
-    // organize the test to its category using its name.
-    // most of the time it will use the first two character of the test name
-    // but there are some exceptions like FUNCbgpls or FUNCvirNetNB since they are now under USECASE
-
-    // depends on the first two letters of the test name, it will decide which category to put the test into.
-    def prefixes = [
-            "FU": "FUNC",
-            "HA": "HA",
-            "PL": "USECASE",
-            "SA": "USECASE",
-            "SC": "SCPF",
-            "SR": "SR",
-            "US": "USECASE",
-            "VP": "USECASE"
-    ]
-
-    def testList = tests.tokenize( "\n;, " )
-    for ( String test in testList ){
-        String prefix = ( test == "FUNCbgpls" || test == "FUNCvirNetNB" ) ? "US" : ( test[ 0..1 ] )
-        testcases[ prefixes[ prefix ] ][ "tests" ] += test + ","
-    }
-    return testcases
-}
-
-def trigger( branch, tests, nodeName, jobOn, manuallyRun, onosTag ){
-    // triggering function that will setup the environment and determine which pipeline to trigger
-
-    println "Job name: " + jobOn + "-pipeline-" + ( manuallyRun ? "manually" : branch )
-    def wiki = branch
-    def onos_branch = funcs.branchWithPrefix( branch )
-    def test_branch = funcs.testBranchWithPrefix( branch )
-    println "onos_branch with prefix: " + onos_branch
-    println "test_branch with prefix: " + test_branch
-    node( "TestStation-" + nodeName + "s" ) {
-        envSetup( onos_branch, test_branch, onosTag, jobOn, manuallyRun )
-        exportEnvProperty( onos_branch, test_branch, wiki, tests, post_result, manuallyRun, onosTag, isOldFlow )
-    }
-
-    jobToRun = jobOn + "-pipeline-" + ( manuallyRun ? "manually" : wiki )
-    build job: jobToRun, propagate: false
-}
-
-def trigger_pipeline( branch, tests, nodeName, jobOn, manuallyRun, onosTag ){
-    // nodeName : "BM" or "VM"
-    // jobOn : "SCPF" or "USECASE" or "FUNC" or "HA"
-    // this will return the function by wrapping them up with return{} to prevent them to be
-    // executed once this function is called to assign to specific variable.
-    return {
-        trigger( branch, tests, nodeName, jobOn, manuallyRun, onosTag )
-    }
-}
-
-// export Environment properties.
-def exportEnvProperty( onos_branch, test_branch, wiki, tests, postResult, manually_run, onosTag, isOldFlow ){
-    // export environment properties to the machine.
-
-    stage( "export Property" ) {
-        sh '''
-            echo "ONOSBranch=''' + onos_branch + '''" > /var/jenkins/TestONOS.property
-            echo "TestONBranch=''' + test_branch + '''" >> /var/jenkins/TestONOS.property
-            echo "ONOSTag=''' + onosTag + '''" >> /var/jenkins/TestONOS.property
-            echo "WikiPrefix=''' + wiki + '''" >> /var/jenkins/TestONOS.property
-            echo "ONOSJAVAOPTS=''' + env.ONOSJAVAOPTS + '''" >> /var/jenkins/TestONOS.property
-            echo "Tests=''' + tests + '''" >> /var/jenkins/TestONOS.property
-            echo "postResult=''' + postResult + '''" >> /var/jenkins/TestONOS.property
-            echo "manualRun=''' + manually_run + '''" >> /var/jenkins/TestONOS.property
-            echo "isOldFlow=''' + isOldFlow + '''" >> /var/jenkins/TestONOS.property
-        '''
-    }
-}
-
-// Initialize the environment Setup for the onos and OnosSystemTest
-def envSetup( onos_branch, test_branch, onos_tag, jobOn, manuallyRun ){
-    // to setup the environment using the bash script
-    println "onos_branch is set to " + onos_branch
-    println "test_branch is set to " + test_branch
-    stage( "envSetup" ) {
-        // after env: ''' + borrow_mn( jobOn ) + '''
-        sh '''#!/bin/bash -l
-        set +e
-        . ~/.bashrc
-        env
-        ''' + preSetup( onos_branch, test_branch, onos_tag, manuallyRun ) + '''
-        ''' + oldFlowCheck( jobOn, onos_branch ) + '''
-        ''' + postSetup( onos_branch, test_branch, onos_tag, manuallyRun )
-        generateKey()
-    }
-}
-
-def tagCheck( onos_tag, onos_branch ){
-    // check the tag for onos if it is not empty
-
-    result = "git checkout "
-    if ( onos_tag == "" ){
-        //create new local branch
-        result += onos_branch
-    }
-    else {
-        //checkout the tag
-        result += onos_tag
-    }
-    return result
-}
-
-def preSetup( onos_branch, test_branch, onos_tag, isManual ){
-    // pre setup part which will clean up and checkout to corresponding branch.
-
-    result = ""
-    if ( !isManual ){
-        result = '''echo -e "\n#####  Set TestON Branch #####"
-        echo "TestON Branch is set on: ''' + test_branch + '''"
-        cd ~/OnosSystemTest/
-        git checkout HEAD~1      # Make sure you aren't pn a branch
-        git branch | grep -v "detached from" | xargs git branch -d # delete all local branches merged with remote
-        git branch -D ''' + test_branch + ''' # just in case there are local changes. This will normally result in a branch not found error
-        git clean -df # clean any local files
-        git fetch --all # update all caches from remotes
-        git reset --hard origin/''' + test_branch + '''  # force local index to match remote branch
-        git clean -df # clean any local files
-        git checkout ''' + test_branch + ''' #create new local branch
-        git branch
-        git log -1 --decorate
-        echo -e "\n#####  Set ONOS Branch #####"
-        echo "ONOS Branch is set on: ''' + onos_branch + '''"
-        echo -e "\n #### check karaf version ######"
-        env |grep karaf
-        cd ~/onos
-        git checkout HEAD~1      # Make sure you aren't pn a branch
-        git branch | grep -v "detached from" | xargs git branch -d # delete all local branches merged with remote
-        git branch -D ''' + onos_branch + ''' # just incase there are local changes. This will normally result in a branch not found error
-        git clean -df # clean any local files
-        git fetch --all # update all caches from remotes
-        git reset --hard origin/''' + onos_branch + '''  # force local index to match remote branch
-        git clean -df # clean any local files
-        rm -rf buck-out
-        rm -rf bazel-*
-        ''' + tagCheck( onos_tag, onos_branch ) + '''
-        git branch
-        git log -1 --decorate
-        echo -e "\n##### set jvm heap size to 8G #####"
-        echo ${ONOSJAVAOPTS}
-        inserted_line="export JAVA_OPTS=\"\${ONOSJAVAOPTS}\""
-        sed -i "s/bash/bash\\n$inserted_line/" ~/onos/tools/package/bin/onos-service
-        echo "##### Check onos-service setting..... #####"
-        cat ~/onos/tools/package/bin/onos-service
-        export JAVA_HOME=/usr/lib/jvm/java-8-oracle'''
-    }
-    return result
-}
-
-def oldFlowCheck( jobOn, onos_branch ){
-    // part that will check if it is oldFlow. If so, it will switch to use old flow. Only affected with SCPF.
-
-    result = ""
-    if ( jobOn == "SCPF" && ( onos_branch == "master" || onos_branch == "onos-1.12" ) )
-        result = '''sed -i -e 's/@Component(immediate = true)/@Component(enabled = false)/g' ~/onos/core/store/dist/src/main/java/org/onosproject/store/flow/impl/''' + ( isOldFlow ? "DistributedFlowRuleStore" : "ECFlowRuleStore" ) + '''.java
-        sed -i -e 's/@Component(enabled = false)/@Component(immediate = true)/g' ~/onos/core/store/dist/src/main/java/org/onosproject/store/flow/impl/''' + ( isOldFlow ? "ECFlowRuleStore" : "DistributedFlowRuleStore" ) + ".java"
-    return result
-}
-
-def postSetup( onos_branch, test_branch, onos_tag, isManual ){
-    // setup that will build ONOS
-
-    result = ""
-    if ( !isManual ){
-        result = '''echo -e "\n##### build ONOS skip unit tests ######"
-        cd ~/onos
-        . tools/dev/bash_profile
-        op
-        sleep 30
-        echo -e "\n##### Stop all running instances of Karaf #####"
-        kill $(ps -efw | grep karaf | grep -v grep | awk '{print $2}')
-        sleep 30
-        git branch
-        '''
-    }
-    return result
-}
-
-def generateKey(){
-    // generate cluster-key of the onos
-
-    try {
-        sh '''
-        #!/bin/bash -l
-        set +e
-        . ~/.bashrc
-        env
-        onos-push-bits-through-proxy
-        onos-gen-cluster-key -f
-        '''
-    } catch ( all ){
-    }
-}
-
-return this
diff --git a/TestON/JenkinsFile/dependencies/paths.json b/TestON/JenkinsFile/dependencies/paths.json
new file mode 100644
index 0000000..567d484
--- /dev/null
+++ b/TestON/JenkinsFile/dependencies/paths.json
@@ -0,0 +1,27 @@
+{
+    "jenkinsFiles": "~/OnosSystemTest/TestON/JenkinsFile/",
+    "workspaces" : {
+        "base" : "/var/jenkins/workspace/",
+        "all-pipeline-trigger" : "/var/jenkins/workspace/all-pipeline-trigger/",
+        "BM" : "/var/jenkins/workspace/postjob-BM/",
+        "VM" : "/var/jenkins/workspace/postjob-VM/",
+        "Fabric" : "/var/jenkins/workspace/postjob-Fabric/",
+        "Fabric5" : "/var/jenkins/workspace/postjob-Fabric5/",
+        "Trellis" : "/var/jenkins/workspace/postjob-Trellis-POD/"
+    },
+    "rScript": {
+        "directories": {
+            "base": "~/OnosSystemTest/TestON/JenkinsFile/wikiGraphRScripts/",
+            "SCPF": "~/OnosSystemTest/TestON/JenkinsFile/wikiGraphRScripts/SCPFspecificGraphRScripts/",
+            "CHO": "~/CHO_Jenkins_Scripts/"
+        },
+        "scripts": {
+            "trendIndividual": "~/OnosSystemTest/TestON/JenkinsFile/wikiGraphRScripts/trendIndividualTest.R",
+            "trendMultiple": "~/OnosSystemTest/TestON/JenkinsFile/wikiGraphRScripts/trendMultipleTests.R",
+            "trendSCPF": "~/OnosSystemTest/TestON/JenkinsFile/wikiGraphRScripts/trendSCPF.R",
+            "trendCHO": "~/OnosSystemTest/TestON/JenkinsFile/wikiGraphRScripts/trendCHO.R",
+            "histogramMultiple": "~/OnosSystemTest/TestON/JenkinsFile/wikiGraphRScripts/histogramMultipleTestGroups.R",
+            "pieMultiple": "~/OnosSystemTest/TestON/JenkinsFile/wikiGraphRScripts/pieMultipleTests.R"
+        }
+    }
+}
diff --git a/TestON/JenkinsFile/dependencies/tests.json b/TestON/JenkinsFile/dependencies/tests.json
index ed48bcd..51fdb04 100644
--- a/TestON/JenkinsFile/dependencies/tests.json
+++ b/TestON/JenkinsFile/dependencies/tests.json
@@ -785,18 +785,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -808,18 +808,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -831,18 +831,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -854,18 +854,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -877,18 +877,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -901,17 +901,17 @@
             {
                 "branch": "master",
                 "day": "fri",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "fri",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "fri",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -924,17 +924,17 @@
             {
                 "branch": "master",
                 "day": "fri",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "fri",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "fri",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -947,17 +947,17 @@
             {
                 "branch": "master",
                 "day": "fri",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "fri",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "fri",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -970,17 +970,17 @@
             {
                 "branch": "master",
                 "day": "fri",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "fri",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "fri",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -993,17 +993,17 @@
             {
                 "branch": "master",
                 "day": "sat",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "sat",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "sat",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1016,17 +1016,17 @@
             {
                 "branch": "master",
                 "day": "sat",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "sat",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "sat",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1039,17 +1039,17 @@
             {
                 "branch": "master",
                 "day": "sat",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "sat",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "sat",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1062,18 +1062,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1084,18 +1084,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1108,18 +1108,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1132,18 +1132,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1157,7 +1157,17 @@
             {
                 "branch": "master",
                 "day": "fri",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
+            },
+            {
+                "branch": "onos-1.x",
+                "day": "fri",
+                "nodeLabel": "Fabric-1.x"
+            },
+            {
+                "branch": "onos-2.x",
+                "day": "fri",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1171,7 +1181,17 @@
             {
                 "branch": "master",
                 "day": "sat",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
+            },
+            {
+                "branch": "onos-1.x",
+                "day": "sat",
+                "nodeLabel": "Fabric-1.x"
+            },
+            {
+                "branch": "onos-2.x",
+                "day": "sat",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1185,7 +1205,17 @@
             {
                 "branch": "master",
                 "day": "sat",
-                "nodeLabel": "Fabric4"
+                "nodeLabel": "Fabric-master"
+            },
+            {
+                "branch": "onos-1.x",
+                "day": "sat",
+                "nodeLabel": "Fabric-1.x"
+            },
+            {
+                "branch": "onos-2.x",
+                "day": "sat",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1198,18 +1228,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
@@ -1222,18 +1252,18 @@
         "schedules": [
             {
                 "branch": "master",
-                "day": "weekdays",
-                "nodeLabel": "Fabric4"
+                "day": "everyday",
+                "nodeLabel": "Fabric-master"
             },
             {
                 "branch": "onos-1.x",
-                "day": "onos-1.x_schedule",
-                "nodeLabel": "Fabric2"
+                "day": "everyday",
+                "nodeLabel": "Fabric-1.x"
             },
             {
                 "branch": "onos-2.x",
-                "day": "onos-2.x_schedule",
-                "nodeLabel": "Fabric3"
+                "day": "everyday",
+                "nodeLabel": "Fabric-2.x"
             }
         ],
         "category": "SR",
diff --git a/TestON/JenkinsFile/generateWikiTestList.groovy b/TestON/JenkinsFile/generateWikiTestList.groovy
new file mode 100644
index 0000000..6ee9328
--- /dev/null
+++ b/TestON/JenkinsFile/generateWikiTestList.groovy
@@ -0,0 +1,181 @@
+#!groovy
+// Copyright 2019 Open Networking Foundation (ONF)
+//
+// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
+// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
+// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
+//
+//     TestON is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 2 of the License, or
+//     (at your option) any later version.
+//
+//     TestON is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+//
+//     You should have received a copy of the GNU General Public License
+//     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
+
+// This script generates the test list on the wiki.
+test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
+
+wikiContents = ""
+testHTMLtableContents = ""
+runningNode = "TestStation-BMs"
+supportBranch1 = null
+supportBranch2 = null
+
+testCategoryContents = [:]
+
+main()
+
+def main(){
+    test_list.init()
+
+    supportBranch1 = test_list.convertBranchCodeToBranch( "onos-1.x" )
+    supportBranch2 = test_list.convertBranchCodeToBranch( "onos-2.x" )
+
+    initHtmlForWiki()
+    initTestCategoryContents()
+    wikiContents += contentsToHTML()
+    wikiContents += endTable()
+    wikiContents += addBranchDescription()
+
+    debugPrintHTML()
+
+    node ( runningNode ) {
+        publishToConfluence( "Automated Test Schedule", wikiContents )
+    }
+}
+
+// Initial part of the wiki page.
+def initHtmlForWiki(){
+    wikiContents = '''
+    <table class="wrapped confluenceTable">
+        <colgroup>
+              <col />
+              <col />
+              <col />
+              <col />
+              <col />
+              <col />
+        </colgroup>
+        <tbody>
+            <tr>
+                <th colspan="1" class="confluenceTh">
+                    <br />
+                </th>
+                <th class="confluenceTh"><p>Monday</p></th>
+                <th class="confluenceTh"><p>Tuesday</p></th>
+                <th class="confluenceTh"><p>Wednesday</p></th>
+                <th class="confluenceTh"><p>Thursday</p></th>
+                <th class="confluenceTh"><p>Friday</p></th>
+                <th class="confluenceTh"><p>Saturday</p></th>
+                <th class="confluenceTh"><p>Sunday</p></th>
+            </tr>'''
+}
+
+def initTestCategoryContents(){
+    allCategories = test_list.getAllTestCategories()
+
+    for ( category in allCategories ){
+        testsFromCategory = test_list.getTestsFromCategory( category )
+
+        dayOfWeekDict = [ "mon" : null,
+                          "tue" : null,
+                          "wed" : null,
+                          "thu" : null,
+                          "fri" : null,
+                          "sat" : null,
+                          "sun" : null ]
+
+        for ( day in dayOfWeekDict.keySet() ){
+            testsFromDay = test_list.getTestsFromDay( day, testsFromCategory )
+            dayOfWeekDict[ day ] = testsFromDay
+        }
+
+        testCategoryContents.put( category, dayOfWeekDict )
+    }
+}
+
+def contentsToHTML(){
+    testHTMLtableContents = ""
+    for ( category in testCategoryContents.keySet() ){
+        categoryTableCells = ""
+        categoryTableCells += '''
+            <tr>
+                <th colspan="1" class="confluenceTh">''' + category + '''</th>'''
+        for ( day in testCategoryContents[ category ].keySet() ){
+            categoryTableCells += '''
+                <td class="confluenceTd">
+                    <ul>'''
+            for ( test in testCategoryContents[ category ][ day ].keySet() ){
+                testName = test
+                categoryTableCells += '''
+                        <li>''' + test + addAsterisks( category, day, test ) + '''</li>'''
+            }
+            categoryTableCells += '''
+                    </ul>
+                </td>'''
+        }
+        categoryTableCells += '''
+            </tr>'''
+
+        testHTMLtableContents += categoryTableCells
+    }
+    return testHTMLtableContents
+}
+
+// adds asterisks based on the support branch number (hack)
+// Example: if support branch is onos-1.x, then adds 1 asterisks, if onos-2.x, then adds 2 asterisks
+def addAsterisks( category, day, test ){
+    asterisks = ""
+    tempDict = [ test : testCategoryContents[ category ][ day ][ test ] ]
+    testBranches = test_list.getBranchesFromDay( day, tempDict )
+    asteriskCount = 0
+
+    for ( branch in testBranches ){
+        if ( branch.substring( 0, 1 ) != "m" ){
+            asteriskCount += branch.substring( 0, 1 ) as Integer
+        }
+    }
+
+    for ( i = 0; i < asteriskCount; i++ ){
+        asterisks += '''*'''
+    }
+    return asterisks
+}
+
+def endTable(){
+    return '''
+        </tbody>
+    </table>'''
+}
+
+def debugPrintHTML(){
+    echo "wikiContents:\n" + wikiContents
+}
+
+def addBranchDescription(){
+    branchDescription = ""
+
+    branchDescription += '''
+    <p>* test runs on the <b>''' + supportBranch1 + '''</b> branch.</p>
+    <p>** test runs on the <b>''' + supportBranch2 + '''</b> branch.</p>
+    <p>*** test runs on the <b>''' + supportBranch1 + ''', ''' + supportBranch2 + ''', and master branches''' + '''</b>.</p>
+    <p>Otherwise, test runs on the <b>''' + '''master''' + '''</b> branch.</p>'''
+
+
+    return branchDescription
+}
+
+def publishToConfluence( pageName, contents ){
+    // publish HTML script to wiki confluence
+
+    publishConfluence siteName: 'wiki.onosproject.org', pageName: pageName, spaceName: 'ONOS',
+                      attachArchivedArtifacts: true, buildIfUnstable: true,
+                      editorList: [ confluenceWritePage( confluenceText( contents ) ) ]
+
+}
diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
index c035569..6196d1f 100755
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -132,6 +132,7 @@
             if self.handle:
                 self.handle.setwinsize( 24, 250 )
                 self.handle.sendline( "cd " + self.home )
+                self.handle.expect( "cd " + self.home )
                 self.handle.expect( self.prompt )
                 return self.handle
             else:
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo b/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo
index 4fceea9..6262cb8 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo
@@ -7,6 +7,7 @@
             <password></password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo.flex b/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo.flex
index e3ad276..d0d2f36 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo.flex
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.topo.flex
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCbgpls/FUNCbgpls.topo b/TestON/tests/FUNC/FUNCbgpls/FUNCbgpls.topo
index 1dd294d..d51ca99 100755
--- a/TestON/tests/FUNC/FUNCbgpls/FUNCbgpls.topo
+++ b/TestON/tests/FUNC/FUNCbgpls/FUNCbgpls.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCflow/FUNCflow.topo b/TestON/tests/FUNC/FUNCflow/FUNCflow.topo
index 6959073..6c4b8aa 100755
--- a/TestON/tests/FUNC/FUNCflow/FUNCflow.topo
+++ b/TestON/tests/FUNC/FUNCflow/FUNCflow.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCformCluster/FUNCformCluster.topo b/TestON/tests/FUNC/FUNCformCluster/FUNCformCluster.topo
index c96b419..88163ad 100644
--- a/TestON/tests/FUNC/FUNCformCluster/FUNCformCluster.topo
+++ b/TestON/tests/FUNC/FUNCformCluster/FUNCformCluster.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCgroup/FUNCgroup.topo b/TestON/tests/FUNC/FUNCgroup/FUNCgroup.topo
index 6959073..6c4b8aa 100644
--- a/TestON/tests/FUNC/FUNCgroup/FUNCgroup.topo
+++ b/TestON/tests/FUNC/FUNCgroup/FUNCgroup.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCgroup/FUNCgroup.topo.physical b/TestON/tests/FUNC/FUNCgroup/FUNCgroup.topo.physical
index 956d1ef..1250fd9 100644
--- a/TestON/tests/FUNC/FUNCgroup/FUNCgroup.topo.physical
+++ b/TestON/tests/FUNC/FUNCgroup/FUNCgroup.topo.physical
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.topo b/TestON/tests/FUNC/FUNCintent/FUNCintent.topo
index b5e4f03..b6a4aa5 100755
--- a/TestON/tests/FUNC/FUNCintent/FUNCintent.topo
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.topo.physical b/TestON/tests/FUNC/FUNCintent/FUNCintent.topo.physical
index 0407aa2..9a3c4a2 100755
--- a/TestON/tests/FUNC/FUNCintent/FUNCintent.topo.physical
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.topo.physical
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.topo b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.topo
index 9f36491..5acb7f9 100755
--- a/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.topo
+++ b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo
index 8ea053c..658bac3 100755
--- a/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo
+++ b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 5 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.topo b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.topo
index e67d3a2..f149a02 100755
--- a/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.topo
+++ b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.topo b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.topo
index a662af5..a8c1b2d 100644
--- a/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.topo
+++ b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo
index e051fd7..33a3845 100755
--- a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo
+++ b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.topo b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.topo
index 40098fd..cf64189 100644
--- a/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.topo
+++ b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.topo b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.topo
index 6390959..b5ceb3f 100644
--- a/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.topo
+++ b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAbackupRecover/HAbackupRecover.topo b/TestON/tests/HA/HAbackupRecover/HAbackupRecover.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAbackupRecover/HAbackupRecover.topo
+++ b/TestON/tests/HA/HAbackupRecover/HAbackupRecover.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAclusterRestart/HAclusterRestart.topo b/TestON/tests/HA/HAclusterRestart/HAclusterRestart.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAclusterRestart/HAclusterRestart.topo
+++ b/TestON/tests/HA/HAclusterRestart/HAclusterRestart.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAcontinuousStopNodes/HAcontinuousStopNodes.topo b/TestON/tests/HA/HAcontinuousStopNodes/HAcontinuousStopNodes.topo
index 5d64681..7b00733 100644
--- a/TestON/tests/HA/HAcontinuousStopNodes/HAcontinuousStopNodes.topo
+++ b/TestON/tests/HA/HAcontinuousStopNodes/HAcontinuousStopNodes.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAfullNetPartition/HAfullNetPartition.topo b/TestON/tests/HA/HAfullNetPartition/HAfullNetPartition.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAfullNetPartition/HAfullNetPartition.topo
+++ b/TestON/tests/HA/HAfullNetPartition/HAfullNetPartition.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAkillNodes/HAkillNodes.topo b/TestON/tests/HA/HAkillNodes/HAkillNodes.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAkillNodes/HAkillNodes.topo
+++ b/TestON/tests/HA/HAkillNodes/HAkillNodes.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HApowerFailure/HApowerFailure.topo b/TestON/tests/HA/HApowerFailure/HApowerFailure.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HApowerFailure/HApowerFailure.topo
+++ b/TestON/tests/HA/HApowerFailure/HApowerFailure.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAsanity/HAsanity.topo b/TestON/tests/HA/HAsanity/HAsanity.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAsanity/HAsanity.topo
+++ b/TestON/tests/HA/HAsanity/HAsanity.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAscaling/HAscaling.topo b/TestON/tests/HA/HAscaling/HAscaling.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAscaling/HAscaling.topo
+++ b/TestON/tests/HA/HAscaling/HAscaling.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAsingleInstanceRestart/HAsingleInstanceRestart.topo b/TestON/tests/HA/HAsingleInstanceRestart/HAsingleInstanceRestart.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAsingleInstanceRestart/HAsingleInstanceRestart.topo
+++ b/TestON/tests/HA/HAsingleInstanceRestart/HAsingleInstanceRestart.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAstopNodes/HAstopNodes.topo b/TestON/tests/HA/HAstopNodes/HAstopNodes.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAstopNodes/HAstopNodes.topo
+++ b/TestON/tests/HA/HAstopNodes/HAstopNodes.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAupgrade/HAupgrade.topo b/TestON/tests/HA/HAupgrade/HAupgrade.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAupgrade/HAupgrade.topo
+++ b/TestON/tests/HA/HAupgrade/HAupgrade.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/HA/HAupgradeRollback/HAupgradeRollback.topo b/TestON/tests/HA/HAupgradeRollback/HAupgradeRollback.topo
index 4bf4bd4..e6082bc 100644
--- a/TestON/tests/HA/HAupgradeRollback/HAupgradeRollback.topo
+++ b/TestON/tests/HA/HAupgradeRollback/HAupgradeRollback.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.topo b/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.topo
index fdca38d..3f5c225 100755
--- a/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.topo
+++ b/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.topo
@@ -6,6 +6,7 @@
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosClusterDriver</type>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <connect_order>1</connect_order>
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -33,4 +34,4 @@
         </Mininet1>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/SAMP/SAMPstartTemplate_1node/SAMPstartTemplate_1node.topo b/TestON/tests/SAMP/SAMPstartTemplate_1node/SAMPstartTemplate_1node.topo
index 27925b7..1ca2322 100755
--- a/TestON/tests/SAMP/SAMPstartTemplate_1node/SAMPstartTemplate_1node.topo
+++ b/TestON/tests/SAMP/SAMPstartTemplate_1node/SAMPstartTemplate_1node.topo
@@ -11,6 +11,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -20,7 +21,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.topo b/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.topo
index 5eb64a0..a5de4a9 100755
--- a/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.topo
+++ b/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.topo
@@ -11,6 +11,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -20,7 +21,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.topo.physical b/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.topo.physical
index 5409afd..8b4de95 100755
--- a/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.topo.physical
+++ b/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.topo.physical
@@ -11,6 +11,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -20,7 +21,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/SCPF/SCPFcbench/SCPFcbench.topo b/TestON/tests/SCPF/SCPFcbench/SCPFcbench.topo
index ff9a459..87cbf84 100644
--- a/TestON/tests/SCPF/SCPFcbench/SCPFcbench.topo
+++ b/TestON/tests/SCPF/SCPFcbench/SCPFcbench.topo
@@ -8,6 +8,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -17,7 +18,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -25,4 +26,3 @@
     </COMPONENT>
 
 </TOPOLOGY>
-
diff --git a/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.topo b/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.topo
index 93e1e9d..4f7fd1d 100644
--- a/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.topo
+++ b/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,10 +17,10 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.topo b/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.topo
index ebde314..95ed6aa 100644
--- a/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.topo
+++ b/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.topo b/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.topo
index 93e1e9d..4f7fd1d 100644
--- a/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.topo
+++ b/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,10 +17,10 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.topo b/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.topo
index 93e1e9d..4f7fd1d 100644
--- a/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.topo
+++ b/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,10 +17,10 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.topo b/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.topo
index 93e1e9d..4f7fd1d 100644
--- a/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.topo
+++ b/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,10 +17,10 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.topo b/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.topo
index 72c1715..c88da04 100644
--- a/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.topo
+++ b/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.topo
@@ -8,6 +8,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -17,7 +18,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/SCPF/SCPFportLat/SCPFportLat.params b/TestON/tests/SCPF/SCPFportLat/SCPFportLat.params
index 7a08b43..c540850 100644
--- a/TestON/tests/SCPF/SCPFportLat/SCPFportLat.params
+++ b/TestON/tests/SCPF/SCPFportLat/SCPFportLat.params
@@ -33,7 +33,7 @@
     </CFG>
     <TSHARK>
         <tsharkReusltPath>/tmp/tshark_portStatus</tsharkReusltPath>
-        <ofpPortStatus>OF 1.3 146</ofpPortStatus>
+        <ofpPortStatus>OpenFlow 146</ofpPortStatus>
     </TSHARK>
     <SLEEP>
         <startup>5</startup>
diff --git a/TestON/tests/SCPF/SCPFportLat/SCPFportLat.topo b/TestON/tests/SCPF/SCPFportLat/SCPFportLat.topo
index 684335a..047d24f 100644
--- a/TestON/tests/SCPF/SCPFportLat/SCPFportLat.topo
+++ b/TestON/tests/SCPF/SCPFportLat/SCPFportLat.topo
@@ -6,6 +6,7 @@
             <host>localhost</host>  # ONOS "bench" machine
             <user>sdn</user>
             <password>rocks</password>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
             <COMPONENTS>
@@ -17,7 +18,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -40,4 +41,3 @@
     </COMPONENT>
 
 </TOPOLOGY>
- 
diff --git a/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py b/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py
index 4c94193..10dc7ce 100644
--- a/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py
+++ b/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py
@@ -51,7 +51,7 @@
     with open( main.tsharkResultPath, "r" ) as resultFile:
         resultText = resultFile.readline()
         main.log.info( "Capture result:" + resultText )
-        resultText = resultText.split( " " )
+        resultText = resultText.strip().split( " " )
         if len( resultText ) > 1:
             tsharkResultTime = int( float( resultText[ 1 ] ) * 1000.0 )
             resultFile.close()
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.topo b/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.topo
index 2461858..dcbc87b 100755
--- a/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.topo
+++ b/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.topo b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.topo
index 8b074c7..18f5fa2 100755
--- a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.topo
+++ b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.topo
@@ -5,6 +5,7 @@
             <host>localhost</host>  # ONOS "bench" machine
             <user>sdn</user>
             <password>rocks</password>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
             <COMPONENTS>
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -33,4 +34,4 @@
         </Mininet1>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.params b/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.params
index 134256b..a52690a 100644
--- a/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.params
+++ b/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.params
@@ -50,15 +50,15 @@
 
     <TSHARK>
         <up>
-            <TCP>openflow\ \[SYN\]</TCP>  #1
-            <RQ>OF 1.3 90 of_role_request</RQ> #2
-            <RR>OF 1.3 90 of_role_reply</RR> #3
-            <Feature>OF 1.3 98 of_features_reply</Feature>#4
+            <TCP>6653\ \[SYN\]</TCP> #1
+            <RQ>OpenFlow 90 Type: OFPT_ROLE_REQUEST</RQ> #2
+            <RR>OpenFlow 90 Type: OFPT_ROLE_REPLY</RR> #3
+            <Feature>OpenFlow 98 Type: OFPT_FEATURES_REPLY</Feature> #4
         </up>
 
         <down>
             <FA>\[FIN,\ ACK\]</FA>
-            <ACK>openflow\ \[ACK\]</ACK>
+            <ACK>6653\ \[ACK\]</ACK>
         </down>
     </TSHARK>
 
diff --git a/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.topo b/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.topo
index e4b8ee4..7736e81 100644
--- a/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.topo
+++ b/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost>  # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 7 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -38,4 +39,4 @@
         </Mininet1>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py b/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py
index b9463c2..4c26b59 100644
--- a/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py
+++ b/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py
@@ -59,7 +59,7 @@
         package: Package String
 
     """
-    pacakge = package.split( " " )
+    pacakge = package.strip().split( " " )
     dic = {}
     for s in pacakge:
         try:
@@ -101,7 +101,7 @@
         for term in keyTerm:
             if term in line:
                 # Exclude non-openflow FIN packets
-                if term == "[FIN, ACK]" and "openflow" not in line:
+                if term == "[FIN, ACK]" and "6653" not in line:
                     continue
                 path = '/tmp/Tshark_' + str( keyTerm[ term ] )
                 with open( path, 'a' ) as outputfile:
diff --git a/TestON/tests/USECASE/SegmentRouting/SRBridging/SRBridging.topo b/TestON/tests/USECASE/SegmentRouting/SRBridging/SRBridging.topo
index 7b188e2..82c7b3a 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRBridging/SRBridging.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRBridging/SRBridging.topo
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes>3</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -33,4 +34,4 @@
         </Mininet1>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRBridging/SRBridging.topo.physical b/TestON/tests/USECASE/SegmentRouting/SRBridging/SRBridging.topo.physical
index 4605185..905d24b 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRBridging/SRBridging.topo.physical
+++ b/TestON/tests/USECASE/SegmentRouting/SRBridging/SRBridging.topo.physical
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes>3</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRClusterRestart/SRClusterRestart.topo b/TestON/tests/USECASE/SegmentRouting/SRClusterRestart/SRClusterRestart.topo
index ad2c2b0..750b9b3 100755
--- a/TestON/tests/USECASE/SegmentRouting/SRClusterRestart/SRClusterRestart.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRClusterRestart/SRClusterRestart.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRDhcprelay/SRDhcprelay.topo b/TestON/tests/USECASE/SegmentRouting/SRDhcprelay/SRDhcprelay.topo
index dbb415d..82c7b3a 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRDhcprelay/SRDhcprelay.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRDhcprelay/SRDhcprelay.topo
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes>3</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.topo b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.topo
index ad2c2b0..750b9b3 100755
--- a/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRDynamicConf/SRDynamicConf.topo b/TestON/tests/USECASE/SegmentRouting/SRDynamicConf/SRDynamicConf.topo
index 7b188e2..82c7b3a 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRDynamicConf/SRDynamicConf.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRDynamicConf/SRDynamicConf.topo
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes>3</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -33,4 +34,4 @@
         </Mininet1>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRHighAvailability/SRHighAvailability.topo b/TestON/tests/USECASE/SegmentRouting/SRHighAvailability/SRHighAvailability.topo
index ad2c2b0..750b9b3 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRHighAvailability/SRHighAvailability.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRHighAvailability/SRHighAvailability.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRLinkFailure/SRLinkFailure.topo b/TestON/tests/USECASE/SegmentRouting/SRLinkFailure/SRLinkFailure.topo
index ad2c2b0..750b9b3 100755
--- a/TestON/tests/USECASE/SegmentRouting/SRLinkFailure/SRLinkFailure.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRLinkFailure/SRLinkFailure.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo
index b5da976..ee60f5e 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes>3</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.flex b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.flex
index 645243d..8b90b0e 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.flex
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.flex
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes>3</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.onf b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.onf
index 34a2013..1a7e816 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.onf
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.onf
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes>1</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SROnosFailure/SROnosFailure.topo b/TestON/tests/USECASE/SegmentRouting/SROnosFailure/SROnosFailure.topo
index 9ee92d6..750b9b3 100755
--- a/TestON/tests/USECASE/SegmentRouting/SROnosFailure/SROnosFailure.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SROnosFailure/SROnosFailure.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -34,4 +35,4 @@
         </Mininet1>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.topo b/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.topo
index fd61ee9..2e9e958 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.topo
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes>3</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.topo.flex b/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.topo.flex
index a9c3ed1..767cfc3 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.topo.flex
+++ b/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.topo.flex
@@ -6,6 +6,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -15,7 +16,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes>3</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.topo b/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.topo
index 9ee92d6..750b9b3 100755
--- a/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -34,4 +35,4 @@
         </Mininet1>
 
     </COMPONENT>
-</TOPOLOGY>
\ No newline at end of file
+</TOPOLOGY>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRSwitchFailure/SRSwitchFailure.topo b/TestON/tests/USECASE/SegmentRouting/SRSwitchFailure/SRSwitchFailure.topo
index a342504..3b9a194 100755
--- a/TestON/tests/USECASE/SegmentRouting/SRSwitchFailure/SRSwitchFailure.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRSwitchFailure/SRSwitchFailure.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used for True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/USECASE_SdnipFunction/USECASE_SdnipFunction.topo b/TestON/tests/USECASE/USECASE_SdnipFunction/USECASE_SdnipFunction.topo
index 680f6bc..d16c088 100644
--- a/TestON/tests/USECASE/USECASE_SdnipFunction/USECASE_SdnipFunction.topo
+++ b/TestON/tests/USECASE/USECASE_SdnipFunction/USECASE_SdnipFunction.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 1 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
@@ -46,4 +47,3 @@
 
     </COMPONENT>
 </TOPOLOGY>
-
diff --git a/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/USECASE_SdnipFunctionCluster.topo b/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/USECASE_SdnipFunctionCluster.topo
index 46a573a..dd9780e 100644
--- a/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/USECASE_SdnipFunctionCluster.topo
+++ b/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/USECASE_SdnipFunctionCluster.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/VPLS/VPLSBasic/VPLSBasic.topo b/TestON/tests/USECASE/VPLS/VPLSBasic/VPLSBasic.topo
index 4441c62..e49787d 100755
--- a/TestON/tests/USECASE/VPLS/VPLSBasic/VPLSBasic.topo
+++ b/TestON/tests/USECASE/VPLS/VPLSBasic/VPLSBasic.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
diff --git a/TestON/tests/USECASE/VPLS/VPLSfailsafe/VPLSfailsafe.topo b/TestON/tests/USECASE/VPLS/VPLSfailsafe/VPLSfailsafe.topo
index 4441c62..e49787d 100755
--- a/TestON/tests/USECASE/VPLS/VPLSfailsafe/VPLSfailsafe.topo
+++ b/TestON/tests/USECASE/VPLS/VPLSfailsafe/VPLSfailsafe.topo
@@ -7,6 +7,7 @@
             <password>rocks</password>
             <type>OnosClusterDriver</type>
             <connect_order>1</connect_order>
+            <home></home>   # defines where onos home is on the build machine. Defaults to "~/onos/" if empty.
             <COMPONENTS>
                 <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
                 <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty.
@@ -16,7 +17,7 @@
                 <web_pass></web_pass>
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
-                <onos_home></onos_home>  # defines where onos home is
+                <onos_home></onos_home>  # defines where onos home is on the target cell machine. Defaults to entry in "home" if empty.
                 <nodes> 3 </nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>