diff --git a/TestON/tests/FuncPlatform/Dependency/App.py b/TestON/tests/FuncPlatform/Dependency/App.py
new file mode 100644
index 0000000..f6fecd6
--- /dev/null
+++ b/TestON/tests/FuncPlatform/Dependency/App.py
@@ -0,0 +1,42 @@
+
+def __init__( self ):
+    self.ip = '127.0.0.1'
+
+def activate( apps, nodeToActivateFrom=0 ):
+    """
+    Activate specified applications from node specified
+
+    Ex) apps = ['metrics', 'fwd']
+        nodeToActivateFrom = range( 0, nodes )
+    """
+    if isinstance( apps, ( int, basestring ) ):
+        main.log.error( "Please pass in a list of strings for args" )
+        return main.FALSE
+
+    if not isinstance( nodeToActivateFrom, ( int ) ) or \
+            nodeToActivateFrom < 0:
+        main.log.error( "Incorrect node specified" )
+        return main.FALSE
+
+    for app in apps:
+        # Check if app str in appList is in the main scope
+        # definition main.appList
+        if app not in main.appList:
+            main.log.error( "Invalid app name given" )
+            return main.FALSE
+      
+        # NOTE: assumes node 1 is always activating application
+        appOutput = main.CLIs[nodeToActivateFrom].activateApp( 
+                main.appList[app] ) 
+
+    return main.TRUE
+
+def isAppInstallSuccess():
+    """
+    Check the app list across clusters to determine
+    that apps have been installed successfully
+
+    """
+
+    main.log.report( "isAppInstallSuccess" )
+
diff --git a/TestON/tests/FuncPlatform/Dependency/Startup.py b/TestON/tests/FuncPlatform/Dependency/Startup.py
index 665be7f..3096eee 100644
--- a/TestON/tests/FuncPlatform/Dependency/Startup.py
+++ b/TestON/tests/FuncPlatform/Dependency/Startup.py
@@ -8,6 +8,7 @@
     * Return main.TRUE on success or comprehensive error message 
       on failure (TBD)
 """
+import time
 
 def __init__( self ):
     self.ip = '127.0.0.1' 
@@ -35,17 +36,41 @@
         # TODO: Comprehensive error message
         return 'git pull and mci failed'
 
-def initOnosStartupSequence( cellName, appsStr, benchIp, onosIps ):
+def initOnosStartupSequence( cellName, appStr, benchIp, mnIp, onosIps ):
     """
     Startup sequence includes the following:
-        * 
+        * Create cell file
+        * Set cell variables on ONOS bench
+        * Verify cell
+        * Create ONOS package
+        * Force install ONOS package
+        * Start ONOS service
+        * Start ONOS cli
     """
-    main.log.info( 'Initiating ONOS startup sequence' )
 
-def isOnosNormal( onosIps ):
-    """
-    Quick and comprehensive check for 'normality'
+    # NOTE: leave out create cell file until bug addressed
+    #cf = main.ONOSbench.createCellFile( benchIp, cellName, mnIp, 
+    #        str(appStr), *onosIps )
+    numNodes = len(onosIps) 
 
-    Definition of function TBD
-    """
-    main.log.info( 'isOnosNormal' )
+    sc = main.ONOSbench.setCell( cellName )
+    vc = main.ONOSbench.verifyCell()
+    op = main.ONOSbench.onosPackage()
+    for addr in onosIps:
+        oi = main.ONOSbench.onosInstall( node = addr )
+    
+    time.sleep( 5 )
+   
+    iu = main.TRUE
+    for node in onosIps:
+        iu = iu and main.ONOSbench.isup( node )
+   
+    cli = main.TRUE
+    for node in range( 0, numNodes ):
+        cli = cli and main.CLIs[node].startOnosCli( onosIps[node] )
+
+    if sc and vc and op and oi and iu and cli == main.TRUE:
+        return main.TRUE
+    else:
+        return main.FALSE
+
diff --git a/TestON/tests/FuncPlatform/FuncPlatform.params b/TestON/tests/FuncPlatform/FuncPlatform.params
index e0c40aa..eb274ae 100644
--- a/TestON/tests/FuncPlatform/FuncPlatform.params
+++ b/TestON/tests/FuncPlatform/FuncPlatform.params
@@ -1,11 +1,20 @@
 <PARAMS>
-    <testcases>1,2</testcases>
-    <startupSrc>
-        /home/admin/ONLabTest/TestON/tests/FuncPlatform/Dependency/Startup.py
-    </startupSrc>
-    <startupClassName>
-        Startup
-    </startupClassName>
+    <testcases>1,2,3</testcases>
+    <DEP>
+        <startupSrc>
+            /home/admin/ONLabTest/TestON/tests/FuncPlatform/Dependency/Startup.py
+        </startupSrc>
+        <startupClassName>
+            Startup
+        </startupClassName>
+        
+        <appSrc>
+            /home/admin/ONLabTest/TestON/tests/FuncPlatform/Dependency/App.py
+        </appSrc>
+        <appClassName>
+            App
+        </appClassName>
+    </DEP> 
 
     <CTRL>
         <num>3</num>
@@ -14,7 +23,20 @@
         <ip2>10.128.174.2</ip2>
         <ip3>10.128.174.3</ip3>
     </CTRL>
-    
+  
+    <MN>
+        <ip>10.128.10.90</ip>
+    </MN>
+
+    <BENCH>
+        <ip>10.128.174.10</ip>
+    </BENCH>
+
+    <CELL>
+        <name>func_plat</name>
+        <appStr>"drivers,openflow"</appStr>
+    </CELL>
+
     <GIT>
         <branchName>master</branchName>
         <pull>off</pull>
diff --git a/TestON/tests/FuncPlatform/FuncPlatform.py b/TestON/tests/FuncPlatform/FuncPlatform.py
index f846131..6bcb06c 100644
--- a/TestON/tests/FuncPlatform/FuncPlatform.py
+++ b/TestON/tests/FuncPlatform/FuncPlatform.py
@@ -2,11 +2,23 @@
 FuncPlatform
 
 A functional test designed to test the environment and 
-gather startup / shutdown related issues.
+gather information on startup -> shutdown related issues.
 
 Future works may also include security mode startup /
 shutdown check and cfg get and set.
 
+Abstracting the collection of commands that go hand in hand 
+should allow easy rearrangement of steps to replicate or 
+create scenarios. 
+For example:
+    CASE N - Represents a particular scenario
+        Steps - Represents abstraction methods called from 
+                dependency
+        1. Bring ONOS 1 up
+        2. Activate application X
+        3. Activate application Y
+        4. Deactivate application X
+
 contributers to contact for help:
 andrew@onlab.us
 """
@@ -16,8 +28,48 @@
         self.default = ''
 
     def CASE1( self, main ):
+        """
+        Main scope initialization case
+        """   
+        main.appList = { 
+            'bgprouter' : 'org.onosproject.bgprouter',
+            'config' : 'org.onosproject.config',
+            'cordfabric' : 'org.onosproject.cordfabric',
+            'demo' : 'org.onosproject.demo',
+            'distributedprimitives' : 'org.onosproject.distributedprimitives',
+            'election' : 'org.onosproject.election',
+            'flowrule' : 'org.onosproject.flowrule',
+            'fwd' : 'org.onosproject.fwd',
+            'intentperf' : 'org.onosproject.intentperf',
+            'messagingperf' : 'org.onosproject.messagingperf',
+            'metrics' : 'org.onosproject.metrics',
+            'mobility' : 'org.onosproject.mobility',
+            'netconf' : 'org.onosproject.netconf', 
+            'null' : 'org.onosproject.null',
+            'optical' : 'org.onosproject.optical'
+            } 
+        # List of ONOS ip's specififed in params
+        main.ONOSips = [] 
+        main.CLIs = []
+
+        for node in range( 0, int(main.params['CTRL']['num']) ):
+            main.ONOSips.append( main.params['CTRL']['ip'+str(node+1)] )
+            main.CLIs.append(
+                    getattr( main, 'ONOS' + str(node+1) + 'cli' ) )
+       
+    def CASE2( self, main ):
         import time
         import imp
+
+        startupSrc = main.params['DEP']['startupSrc']
+        startupClassName = main.params['DEP']['startupClassName']
+        cellName = main.params['CELL']['name']
+        appStr = main.params['CELL']['appStr']
+        benchIp = main.params['BENCH']['ip']
+        branchName = main.params['GIT']['branchName']
+        gitPull = main.params['GIT']['pull']
+        mnIp = main.params['MN']['ip']
+
         # importing dependency class(es)
         # Refer to source files in Dependency folder to
         # make changes to its respective methods
@@ -29,23 +81,6 @@
             main.cleanup()
             main.exit()
 
-        # List of ONOS ip's specififed in params
-        global ONOSips
-        # CLIs handle for each ONOS CLI client specified in .topo file
-        global CLIs
-
-        ONOSips = []
-        CLIs = []
-
-        for node in range( 0, int(main.params['CTRL']['num']) ):
-            ONOSips.append( main.params['CTRL']['ip'+str(node+1)] )
-            CLIs.append( getattr( main, 'ONOS' + str(i) + 'cli' ) )
-
-        startupSrc = main.params['startupSrc']
-        startupClassName = main.params['startupClassName']
-        branchName = main.params['GIT']['branchName']
-        gitPull = main.params['GIT']['pull']
-
         main.case( 'Setup environment and install ONOS' )
         if gitPull == 'on': 
             main.step( 'Git pull and clean install' )
@@ -57,12 +92,41 @@
                             str(gitPullResult) )
         
         main.step( 'Initiate ONOS startup sequence' )    
-        startupResult = startup.initOnosStartupSequence()
+        startupResult = startup.initOnosStartupSequence(
+                cellName, appStr, benchIp, mnIp, main.ONOSips )
         utilities.assert_equals( expect=main.TRUE,
                         actual=startupResult,
                         onpass='ONOS startup sequence successful',
                         onfail='ONOS startup sequence failed: ' +
                             str(startupResult) )
+        
+    def CASE3( self, main ):
+        import time
+        import imp
 
-    def CASE2( self, main ):
-        main.log.info( "Case 2" )
+        main.case( 'Activate applications and check installation' )
+        # Activate applications and check consistency 
+        # across clusters
+        appClassName = main.params['DEP']['appClassName']
+        appSrc = main.params['DEP']['appSrc']
+
+        # Import application file to use its methods
+        try:
+            app = imp.load_source( appClassName, appSrc )
+        except ImportError:
+            main.log.error( "Error importing class " +
+                    str(startupClassName) + " from " + str(startupSrc) )
+            main.cleanup()
+            main.exit()
+
+        # Sample app activation
+        main.step( 'Activating applications metrics and fwd' ) 
+        appList = ['metrics', 'fwd']
+        appResult = app.activate( appList ) 
+        utilities.assert_equals( expect=main.TRUE,
+                actual=appResult,
+                onpass= 'App activation of ' + str(appList) + ' successful',
+                onfail= 'App activation failed ' + str(appResult) )
+
+
+
