diff --git a/TestON/tests/LinkEventTP/LinkEventTP.params b/TestON/tests/LinkEventTP/LinkEventTP.params
new file mode 100644
index 0000000..2beb9aa
--- /dev/null
+++ b/TestON/tests/LinkEventTP/LinkEventTP.params
@@ -0,0 +1,61 @@
+<PARAMS>
+
+    <testcases>1,3,2,3,2,3,2,3</testcases>
+
+    <ENV>
+    <cellName>network_tp_test</cellName>
+    <cellFeatures>"webconsole,onos-core,onos-api,onos-cli,onos-null,onos-rest,onos-app-metrics,onos-app-metrics-intent,onos-app-metrics-topology"</cellFeatures>
+    </ENV>
+
+    <SCALE>2</SCALE>
+    <availableNodes>7</availableNodes>
+
+    <GIT>
+        <autopull>off</autopull>
+        <checkout>master</checkout>
+    </GIT>
+
+    <CTRL>
+        <USER>admin</USER>
+        <ip1>10.254.1.201</ip1>
+        <port1>6633</port1>
+        <ip2>10.254.1.202</ip2>
+        <port2>6633</port2>
+        <ip3>10.254.1.203</ip3>
+        <port3>6633</port3>
+        <ip4>10.254.1.204</ip4>
+        <port4>6633</port4>
+        <ip5>10.254.1.205</ip5>
+        <port5>6633</port5>
+	<ip6>10.254.1.206</ip6>
+        <port6>6633</port6>
+	<ip7>10.254.1.207</ip7>
+        <port7>6633</port7>
+    </CTRL>
+
+    <BENCH>
+        <user>admin</user>
+        <ip1>localhost</ip1>
+    </BENCH>
+
+    <TEST>                              #   duration =      time the test loop runs
+                                        #   log_interval =  how often the data is reported 
+                                        #   wait =          time between tests, used to let the averages run down 
+                                         
+        <metric1>topologyLinkEventRate</metric1>
+        <metric2>topologyGraphEventRate</metric2>
+        <flickerRate>2</flickerRate>
+        <duration>180</duration>
+        <log_interval>20</log_interval>
+        <wait>30</wait>
+        <configFile>/onos/tools/package/etc/org.onosproject.net.topology.impl.DefaultTopologyProvider.cfg</configFile>
+        <skipCleanInstall>yes</skipCleanInstall>
+        <MN>localhost</MN>
+	<logFile>link_event_tp_results_LOG</logFile>
+    </TEST>
+
+    <JSON>
+        <intents_rate>intentInstalledRate</intents_rate>
+    </JSON>
+
+</PARAMS>
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.py b/TestON/tests/LinkEventTP/LinkEventTP.py
new file mode 100644
index 0000000..1f5861e
--- /dev/null
+++ b/TestON/tests/LinkEventTP/LinkEventTP.py
@@ -0,0 +1,276 @@
+# ScaleOutTemplate --> LinkEventTP
+#
+# CASE1 starts number of nodes specified in param file
+#
+# cameron@onlab.us
+
+import sys
+import os
+
+
+class LinkEventTP:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):            #This is the initialization case
+        import os.path                  #this case will clean up all nodes 
+                                        #but only node 1 isnodestarted in this case
+        
+        global clusterCount             #number of nodes running
+        global ONOSIp                   #list of ONOS IP addresses 
+
+        clusterCount = 1
+        ONOSIp = [ 0 ]
+
+        #Load values from params file
+        checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
+        gitPull = main.params[ 'GIT' ][ 'autopull' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        Features= main.params[ 'ENV' ][ 'cellFeatures' ]
+        BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
+        BENCHUser = main.params[ 'BENCH' ][ 'user' ]
+        maxNodes = int(main.params[ 'availableNodes' ])
+        Features = main.params[ 'ENV' ][ 'cellFeatures' ]
+        skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
+        flickerRate = main.params[ 'TEST' ][ 'flickerRate']
+        MNip = main.params[ 'TEST' ][ 'MN' ]
+       
+ 	#Populate ONOSIp with ips from params 
+        for i in range(1, maxNodes + 1): 
+ 	    ipString = 'ip' + str(i) 
+     	    ONOSIp.append(main.params[ 'CTRL' ][ ipString ]) 
+        
+	#kill off all onos processes 
+        main.log.step("Safety check, killing all ONOS processes")
+        main.log.step("before initiating enviornment setup")
+        for node in range(1, maxNodes + 1):
+            main.ONOSbench.onosDie(ONOSIp[node])
+
+        #construct the cell file
+        main.log.step("Creating cell file")
+        exec "a = main.ONOSbench.createCellFile"
+        cellIp = []
+        for node in range (1, maxNodes + 1):
+            	cellIp.append(ONOSIp[node])
+        a(BENCHIp,cellName,MNip,str(Features), *cellIp)    #'0' as third arg because we are not using mininet
+
+        main.step( "Set Cell" )
+        main.ONOSbench.setCell(cellName)
+
+        #Uninstall everywhere
+        main.log.step( "Cleaning Enviornment..." )
+        for i in range(1, maxNodes + 1):
+            main.log.info(" Uninstalling ONOS " + str(i) )
+            main.ONOSbench.onosUninstall( ONOSIp[i] )
+
+        #git step - skipable 
+        main.step( "Git checkout and pull " + checkoutBranch )
+        if gitPull == 'on':
+            checkoutResult = main.ONOSbench.gitCheckout( checkoutBranch )
+            pullResult = main.ONOSbench.gitPull()
+
+        else:
+            checkoutResult = main.TRUE
+            pullResult = main.TRUE
+            main.log.info( "Skipped git checkout and pull" )
+        
+        #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
+        if skipMvn != "yes":
+            mvnResult = main.ONOSbench.cleanInstall()
+
+        #configuring file to enable flicker
+        main.log.step(" Configuring null provider to enable flicker. Flicker Rate = " + flickerRate )
+        homeDir = os.path.expanduser('~')
+        main.log.info(homeDir)
+        localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+
+        neighborsString = ""
+        for node in range(1, maxNodes + 1):
+            neighborsString += ONOSIp[node]
+            if node < maxNodes:
+                neighborsString += ","
+
+        configFile = open(filePath, 'w+')
+        main.log.info("File opened")
+        configFile.write("# Sample configurations for the NullLinkProvider.\n")
+        configFile.write("# \n")
+        configFile.write("# If enabled, sets time between linkEvent generation\n")
+        configFile.write("# in milliseconds.\n")
+        configFile.write("#\n") 
+        configFile.write("eventRate = " + flickerRate)
+        configFile.write("\n")
+        configFile.write("#Set order of islands to chain together, in a line.\n")
+        configFile.write("neighbors = " + neighborsString)
+        configFile.close()
+        main.log.info("Configuration completed")
+
+        ### configure event rate file ###
+        main.log.step("Writing Default Topology Provider config file")
+        localPath = main.params[ 'TEST' ][ 'configFile' ]
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+        configFile = open(filePath, 'w+')
+        main.log.info("File Opened")
+        configFile.write("maxEvents = 1\n")
+        configFile.write("maxIdleMs = 0\n")
+        configFile.write("maxBatchMs = 0\n")
+        main.log.info("File written and closed")
+       
+ 
+        devices_by_ip = ""
+        for node in range(1, maxNodes + 1):
+            devices_by_ip += (ONOSIp[node] + ":" + str(5))
+            if node < maxNodes:
+                devices_by_ip +=(",")
+        
+        main.log.step("Configuring device provider")
+        localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+        configFile = open(filePath, 'w+')
+        main.log.info("Device config file opened")
+        configFile.write("devConfigs = " + devices_by_ip)
+        configFile.close()
+        main.log.info("File closed")
+
+        logFileName = main.params[ 'TEST' ][ 'logFile' ]
+        logFile = open(logFileName, 'w+')
+        main.log.info("Created log File")
+        logFile.close()
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()  
+
+        main.step( "Installing ONOS package" )
+        install1Result = main.ONOSbench.onosInstall( node=ONOSIp[1] )
+
+        main.step( "Verify cells" )
+        verifyCellResult = main.ONOSbench.verifyCell()
+
+        main.step( "Enviornment setup and verification complete." )
+        main.ONOS1cli.startOnosCli( ONOSIp[1] )
+        main.step( "ONOS 1 is up and running." )
+	
+
+    def CASE2( self, main ):
+        # This case increases the cluster size by whatever scale is
+        # Note: 'scale' is the size of the step
+        # if scaling is not a part of your test, simply run this case
+        # once after CASE1 to set up your enviornment for your desired 
+        # cluster size. If scaling is a part of you test call this case each time 
+        # you want to increase cluster size
+
+        ''                                                         
+        'Increase number of nodes and initiate CLI'
+        ''
+        import time
+        global clusterCount
+
+        scale = int( main.params[ 'SCALE' ] )
+        clusterCount += scale
+
+        main.log.report( "Increasing cluster size to " + str( clusterCount ) )
+        for node in range((clusterCount - scale) + 1, clusterCount + 1):
+            main.ONOSbench.onosDie(ONOSIp[node])
+            time.sleep(10)
+            main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
+            main.ONOSbench.onosInstall( ONOSIp[node] )
+            exec "a = main.ONOS%scli.startOnosCli" %str(node)
+            a(ONOSIp[node])
+    
+    def CASE3( self, main ):   
+        import time
+        import json
+        import string 
+        import csv
+        import os.path
+
+
+        linkResult = main.FALSE
+        scale = int( main.params[ 'SCALE' ] )
+
+        testDelay = main.params[ 'TEST' ][ 'wait']
+        time.sleep( float( testDelay ) )
+
+        metric1 = main.params[ 'TEST' ][ 'metric1' ]
+        metric2 = main.params[ 'TEST' ][ 'metric2' ]
+        testDuration = main.params[ 'TEST' ][ 'duration' ]
+        stop = time.time() + float( testDuration )
+
+        msg = ( "Starting test loop for " + str(testDuration) + " seconds on a " + str(clusterCount) + " node cluster" )
+        main.log.info( msg )
+        logInterval = main.params[ 'TEST' ][ 'log_interval' ]
+
+        linkResults = [0,0,0,0,0,0,0,0]
+        graphResults = [0,0,0,0,0,0,0,0]
+        JsonStr = [ 0,0,0,0,0,0,0,0 ]
+        JsonObj = [ 0,0,0,0,0,0,0,0 ]
+        
+        while time.time() < stop:
+            time.sleep( float( logInterval ) )
+            for node in range(1, clusterCount+1):
+                exec "a = main.ONOS%scli.topologyEventsMetrics" %str(node)    
+                JsonStr[node] = a()
+                JsonObj[node] = json.loads( JsonStr[node] )
+                msg = ( "Node " + str(node)  +  " Link Event TP: " + str( JsonObj[node][ metric1 ][ 'm1_rate' ] ) )
+                main.log.info( msg )
+                msg = ( "Node " + str(node) + " Graph Event TP: " + str( JsonObj[node][ metric2 ][ 'm1_rate' ] ) )
+                main.log.info( msg )
+               
+                linkResults[node] = round(JsonObj[node][ metric2 ][ 'm1_rate' ],2)
+                graphResults[node] = round(JsonObj[node][ metric1  ][ 'm1_rate' ],2)
+
+        print("")
+        print("")
+
+        main.log.info("Final Link Event TP Results on " + str(clusterCount) + " node cluster")
+        main.log.info("_______________________________________________")
+        for node in range(1, clusterCount+1):
+            main.log.info("Node " + str(node) + ": " + str(linkResults[node])) 
+
+        print("")
+        print("")
+
+        main.log.info("Final Graph Event TP Results on " + str(clusterCount) + " node cluster")
+        main.log.info("_______________________________________________")
+        for node in range(1, clusterCount+1):
+            main.log.info("Node " + str(node) + ": " + str(graphResults[node]))           
+          
+        ################################################################################# 
+				# 	Data Logging
+
+        logFileName = main.params[ 'TEST' ][ 'logFile' ]
+        logFile = open(logFileName, 'a')
+        main.log.info("Log file opened")
+        flickerRate = main.params[ 'TEST' ][ 'flickerRate']
+
+        for node in range (1, clusterCount + 1):
+            logFile.write( str(clusterCount) + "," )
+            logFile.write("'" + "baremetal" + str(node)  + "'," )
+            logFile.write( testDuration + "," )
+            logFile.write( flickerRate + "," )
+            logFile.write( str(linkResults[node]) + "," )
+            logFile.write( str(graphResults[node]) + "\n" )
+
+        logFile.close()
+        main.log.info("Log file closed")        
+        
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.pyc b/TestON/tests/LinkEventTP/LinkEventTP.pyc
new file mode 100644
index 0000000..08393ed
--- /dev/null
+++ b/TestON/tests/LinkEventTP/LinkEventTP.pyc
Binary files differ
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.topo b/TestON/tests/LinkEventTP/LinkEventTP.topo
new file mode 100644
index 0000000..1c48a85
--- /dev/null
+++ b/TestON/tests/LinkEventTP/LinkEventTP.topo
@@ -0,0 +1,146 @@
+<TOPOLOGY>
+
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+		<home>~/onos</home>
+	    </COMPONENTS>
+
+        </ONOSbench>
+
+        <ONOS1cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1cli>
+
+        <ONOS2cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2cli>
+
+        <ONOS3cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS3cli>
+
+        <ONOS4cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS4cli>
+
+        <ONOS5cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS5cli>
+
+	<ONOS6cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS6cli>
+
+        <ONOS7cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>8</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS7cli>
+
+        <ONOS1>
+            <host>10.254.1.201</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>9</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOS2>
+            <host>10.254.1.202</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>10</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2>
+
+        <ONOS3>
+            <host>10.254.1.203</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>11</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS3>
+
+        <ONOS4>
+            <host>10.254.1.204</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>12</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS4>
+
+	
+        <ONOS5>
+            <host>10.254.1.205</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>13</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS5>
+
+        <ONOS6>
+            <host>10.254.1.206</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>14</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS6>
+
+        <ONOS7>
+            <host>10.254.1.207</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>15</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS7>
+
+    </COMPONENT>
+
+</TOPOLOGY>
diff --git a/TestON/tests/LinkEventTP/OLDLinkEventTP.py b/TestON/tests/LinkEventTP/OLDLinkEventTP.py
new file mode 100644
index 0000000..e12befa
--- /dev/null
+++ b/TestON/tests/LinkEventTP/OLDLinkEventTP.py
@@ -0,0 +1,348 @@
+# ScaleOutTemplate --> LinkEventTp
+#
+# CASE1 starts number of nodes specified in param file
+#
+# cameron@onlab.us
+
+import sys
+import os
+
+
+class LinkEventTP:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        import os.path
+        global clusterCount
+        clusterCount = 1
+
+        checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
+        gitPull = main.params[ 'GIT' ][ 'autopull' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
+        BENCHUser = main.params[ 'BENCH' ][ 'user' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        flickerRate = main.params[ 'TEST' ][ 'flickerRate']
+        
+
+        main.log.step( "Cleaning Enviornment..." )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+        main.ONOSbench.onosUninstall( ONOS2Ip )
+        main.ONOSbench.onosUninstall( ONOS3Ip )
+
+        main.step( "Git checkout and pull " + checkoutBranch )
+        if gitPull == 'on':
+            checkoutResult = main.ONOSbench.gitCheckout( checkoutBranch )
+            pullResult = main.ONOSbench.gitPull()
+
+        else:
+            checkoutResult = main.TRUE
+            pullResult = main.TRUE
+            main.log.info( "Skipped git checkout and pull" )
+
+        #mvnResult = main.ONOSbench.cleanInstall()
+
+        main.step( "Set cell for ONOS cli env" )
+        main.ONOS1cli.setCell( cellName )
+        main.ONOS2cli.setCell( cellName )
+        main.ONOS3cli.setCell( cellName )
+        
+        ### configuring file to enable flicker ###
+        main.log.info(" Configuring null provider to enable flicker. Flicker Rate = " + flickerRate ) 
+        homeDir = os.path.expanduser('~')
+        main.log.info(homeDir)
+        localPath = "/ONOS/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+
+        configFile = open(filePath, 'w+')
+        main.log.info("File opened")
+        configFile.write("# Sample configurations for the NullLinkProvider.\n")
+        configFile.write("# \n")
+        configFile.write("# If enabled, generates LinkDetected and LinkVanished events\n")
+        configFile.write("# to make the link appear to be flapping.\n")
+        configFile.write("#\n")
+        configFile.write("flicker = true\n")
+        configFile.write("#\n")
+        configFile.write("# If enabled, sets the time between LinkEvent generation,\n")
+        configFile.write("# in milliseconds.\n")
+        configFile.write("#\n")
+        configFile.write("eventRate = " + flickerRate)
+        configFile.close()
+        main.log.info("Configuration completed")
+        
+        #############################
+        #config file default topo provider 
+        ###########################
+
+        ### configure deafult topo provider event rate ###??????????????????
+        localPath = main.params[ 'TEST' ][ 'configFile' ]
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+        configFile = open(filePath, 'w+')
+        main.log.info("File Opened")
+        configFile.write("maxEvents = 1\n") 
+        configFile.write("maxIdleMs = 0\n")
+        configFile.write("maxBatchMs = 0\n")
+        main.log.info("File written and closed") 
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()  # no file or directory
+
+        main.step( "Installing ONOS package" )
+        install1Result = main.ONOSbench.onosInstall( node=ONOS1Ip )
+
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        main.step( "Applying cell file to environment" )
+        cellApplyResult = main.ONOSbench.setCell( cellName )
+        main.step( "verify cells" )
+        verifyCellResult = main.ONOSbench.verifyCell()
+
+        main.step( "Set cell for ONOS cli env" )
+        main.ONOS1cli.setCell( cellName )
+
+        cli1 = main.ONOS1cli.startOnosCli( ONOS1Ip )
+
+    def CASE2( self, main ):
+        """
+        Increase number of nodes and initiate CLI
+        """
+        import time
+        global clusterCount
+
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        #ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        #ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        #ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        #ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        scale = int( main.params[ 'SCALE' ] )
+
+        # Cluster size increased everytime the case is defined
+        clusterCount += scale
+
+        main.log.report( "Increasing cluster size to " +
+                         str( clusterCount ) )
+        installResult = main.FALSE
+
+        if scale == 2:
+            if clusterCount == 3:
+                main.log.info( "Installing nodes 2 and 3" )
+                install2Result = main.ONOSbench.onosInstall( node=ONOS2Ip )
+                install3Result = main.ONOSbench.onosInstall( node=ONOS3Ip )
+                cli2 = main.ONOS2cli.startOnosCli( ONOS2Ip )
+                cli3 = main.ONOS3cli.startOnosCli( ONOS3Ip )
+                installResult = main.TRUE 
+              
+        if scale == 1:
+            if clusterCount == 2:
+                main.log.info( "Installing node 2" )
+                install2Result = main.ONOSbench.onosInstall( node=ONOS2Ip )
+                cli2 = main.ONOS2cli.startOnosCli( ONOS2Ip )
+                installResult = main.TRUE 
+
+            if clusterCount == 3:
+                main.log.info( "Installing node 3" )
+                install3Result = main.ONOSbench.onosInstall( node=ONOS3Ip )
+                cli3 = main.ONOS3cli.startOnosCli( ONOS3Ip )
+                installResult = main.TRUE 
+
+
+    def CASE3( self, main ):
+        import time
+        import json
+        import string
+        import csv
+        
+        linkResult = main.FALSE 
+        
+        testDelay = main.params[ 'TEST' ][ 'wait']
+        time.sleep( float( testDelay ) )
+
+        metric1 = main.params[ 'TEST' ][ 'metric1' ]
+        metric2 = main.params[ 'TEST' ][ 'metric2' ]
+        testDuration = main.params[ 'TEST' ][ 'duration' ]
+        stop = time.time() + float( testDuration )
+    
+        main.ONOS1cli.featureInstall("onos-null")
+
+        msg = ( "Starting test loop for " + str(testDuration) + " seconds" )
+        main.log.info( msg )
+        logInterval = main.params[ 'TEST' ][ 'log_interval' ]
+
+        while time.time() < stop:
+            time.sleep( float( logInterval ) )
+
+            JsonStr1 = main.ONOS1cli.topologyEventsMetrics() 
+            JsonObj1 = json.loads( JsonStr1 ) 
+            msg = ( "Node 1 Link Event TP: " + str( JsonObj1[ metric1  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            msg = ( "Node 1 Graph Event TP: " + str( JsonObj1[ metric2  ][ 'm1_rate' ] ) )
+            main.log.info( msg ) 
+            
+            lastGraphRate = round(JsonObj1[ metric2 ][ 'm1_rate' ],2)
+            lastLinkRate = round(JsonObj1[ metric1  ][ 'm1_rate' ],2)
+
+        msg = ( "Final Link Event TP: " + str( lastLinkRate ) ) 
+        main.log.report( msg )
+        msg = ( "Final Graph Event TP: " + str( lastGraphRate ) )
+        main.log.report( msg )
+       
+        linkResult = main.TRUE 
+        '''
+        jenkinsReport = open('LinkEventTP.csv', 'w')
+        jenkinsReport.write("T1 - Node 1, T2 - Node 1, T2 - Node 2, T3 - Node 1, T3 - Node 2, T3 - Node 3\n")
+        jenkinsReport.write(str(lastRate1))
+        jenkinsReport.write("\n")
+        jenkinsReport.close()
+        
+        dbReportS1 = open('LinkEventTP-S1.csv','w')         #must be the name of the test "-S" followed by the scale 
+        dbReportS1.write(str(linkResult))
+        dbReportS1.write("\n")
+        dbReportS1.write(str(lastRate1))
+        dbReportS1.write("\n")                              #additional newline needed for bash script reading
+        dbReportS1.close()
+        '''
+
+
+    def CASE4( self, main ):
+        import time
+        import json
+        import string
+
+        linkResult = main.FALSE
+
+        testDelay = main.params[ 'TEST' ][ 'wait']
+        time.sleep( float( testDelay ) )
+
+        getMetric = main.params[ 'TEST' ][ 'metric1' ]
+        testDuration = main.params[ 'TEST' ][ 'duration' ]
+        stop = time.time() + float( testDuration )
+
+        main.ONOS2cli.featureInstall("onos-null")
+
+        msg = ( "Starting test loop for " + str(testDuration) + " seconds" )
+        main.log.info( msg )
+        logInterval = main.params[ 'TEST' ][ 'log_interval' ]
+
+        while time.time() < stop:
+            time.sleep( float( logInterval ) )
+
+            JsonStr1 = main.ONOS1cli.topologyEventsMetrics() 
+            JsonObj1 = json.loads( JsonStr1 )
+            msg = ( "Node 1 TP: " + str( JsonObj1[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate1 = round(JsonObj1[ getMetric  ][ 'm1_rate' ],2)
+
+
+            JsonStr2 = main.ONOS2cli.topologyEventsMetrics() 
+            JsonObj2 = json.loads( JsonStr2 )
+            msg = ( "Node 2 TP: " + str( JsonObj2[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate2 = round(JsonObj2[ getMetric  ][ 'm1_rate' ],2)
+
+
+        msg = ( "Final TP on node 1: " + str( lastRate1 ) )
+        main.log.report( msg )
+
+        msg = ( "Final TP on node 2: " + str( lastRate2 ) )
+        main.log.report( msg )
+
+        linkResult = main.TRUE
+
+        jenkinsReport = open('LinkEventTP.csv', 'a')
+        jenkinsReport.write(str(lastRate1))
+        jenkinsReport.write(", ")
+        jenkinsReport.write(str(lastRate2))
+        jenkinsReport.write(", ")
+        jenkinsReport.close()
+
+        dbReportS2 = open('LinkEventTP-S2.csv','w')         #must be the name of the test "-S" followed by the scale
+        dbReportS2.write(str(linkResult))
+        dbReportS2.write("\n")
+        dbReportS2.write(str(lastRate1))
+        dbReportS2.write("\n")
+        dbReportS2.write(str(lastRate2))
+        dbReportS2.write("\n")
+        dbReportS2.close()
+
+
+
+    def CASE5( self, main ):
+        import time
+        import json
+        import string
+
+        linkResult = main.FALSE
+
+        testDelay = main.params[ 'TEST' ][ 'wait']
+        time.sleep( float( testDelay ) )
+
+        getMetric = main.params[ 'TEST' ][ 'metric1' ]
+        testDuration = main.params[ 'TEST' ][ 'duration' ]
+        stop = time.time() + float( testDuration )
+
+        main.ONOS3cli.featureInstall("onos-null")
+
+        msg = ( "Starting test loop for " + str(testDuration) + " seconds" )
+        main.log.info( msg )
+        logInterval = main.params[ 'TEST' ][ 'log_interval' ]
+
+        while time.time() < stop:
+            time.sleep( float( logInterval ) )
+
+            JsonStr1 = main.ONOS1cli.topologyEventsMetrics()
+            JsonObj1 = json.loads( JsonStr1 )
+            msg = ( "Node 1 TP: " + str( JsonObj1[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate1 = round(JsonObj1[ getMetric  ][ 'm1_rate' ],2)
+
+            JsonStr2 = main.ONOS2cli.topologyEventsMetrics()
+            JsonObj2 = json.loads( JsonStr2 )
+            msg = ( "Node 2 TP: " + str( JsonObj2[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate2 = round(JsonObj2[ getMetric  ][ 'm1_rate' ],2)
+    
+            JsonStr3 = main.ONOS3cli.topologyEventsMetrics()
+            JsonObj3 = json.loads( JsonStr3 )
+            msg = ( "Node 3 TP: " + str( JsonObj3[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate3 = round(JsonObj3[ getMetric  ][ 'm1_rate' ],2)
+
+        msg = ( "Final TP on node 1: " + str( lastRate1 ) )
+        main.log.report( msg )
+
+        msg = ( "Final TP on node 2: " + str( lastRate2 ) )
+        main.log.report( msg )
+
+        msg = ( "Final TP on node 3: " + str( lastRate3 ) )
+        main.log.report( msg )
+
+        linkResult = main.TRUE
+
+        jenkinsReport = open('LinkEventTP.csv', 'a')
+        jenkinsReport.write(str(lastRate1))
+        jenkinsReport.write(", ")
+        jenkinsReport.write(str(lastRate2))
+        jenkinsReport.write(", ")
+        jenkinsReport.write(str(lastRate3))
+        jenkinsReport.close()
+       
+        dbReportS3 = open('LinkEventTP-S3.csv','w')         #must be the name of the test "-S" followed by the scale
+        dbReportS3.write(str(linkResult))
+        dbReportS3.write("\n")
+        dbReportS3.write(str(lastRate1))
+        dbReportS3.write("\n")
+        dbReportS3.write(str(lastRate2))
+        dbReportS3.write("\n")
+        dbReportS3.write(str(lastRate3))
+        dbReportS3.write("\n")
+        dbReportS3.close() 
+
+
diff --git a/TestON/tests/LinkEventTP/__init__.py b/TestON/tests/LinkEventTP/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/LinkEventTP/__init__.py
diff --git a/TestON/tests/LinkEventTP/__init__.pyc b/TestON/tests/LinkEventTP/__init__.pyc
new file mode 100644
index 0000000..5415a7b
--- /dev/null
+++ b/TestON/tests/LinkEventTP/__init__.pyc
Binary files differ
