diff --git a/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
index 0e563be..1760324 100755
--- a/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
+++ b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
@@ -63,7 +63,6 @@
 
     global itemName  # The name of this run. Used for logs.
     itemName = name
-    onosNode = int( onosNode )
 
     main.log.info( itemName + ": Adding single point to multi point intents" )
     try:
@@ -92,14 +91,23 @@
 
     # Check intents state
     if utilities.retry( f=checkIntentState, retValue=main.FALSE,
-                        args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+                        args=( main, [ intentId ] ), sleep=main.checkIntentSleep, attempts=5 ):
         main.assertReturnString += 'Install Intent State Passed\n'
+
+        #Check VLAN if test encapsulation
+        if encap != "":
+            if EncapsulatedIntentCheck( main, tag=encap ):
+                main.assertReturnString += 'Encapsulation intents check Passed\n'
+            else:
+                main.assertReturnString += 'Encapsulation intents check failed\n'
+
         if flowDuration( main ):
             main.assertReturnString += 'Flow duration check Passed\n'
             return intentId
         else:
             main.assertReturnString += 'Flow duration check failed\n'
             return main.FALSE
+
     else:
         main.log.error( "Host Intent did not install correctly" )
         main.assertReturnString += 'Install Intent State Failed\n'
@@ -165,8 +173,6 @@
 
     global itemName
     itemName = name
-    tempHostsData = {}
-    onosNode = int( onosNode )
 
     main.log.info( itemName + ": Testing Host Intent" )
 
@@ -242,7 +248,7 @@
             testResult = main.FALSE
 
         # Check Connection
-        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames, vlanId ) ):
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames, vlanId ), sleep=5, attempts=5 ):
             main.assertReturnString += 'Link Down Pingall Passed\n'
         else:
             main.assertReturnString += 'Link Down Pingall Failed\n'
@@ -353,7 +359,6 @@
 
     global itemName  # The name of this run. Used for logs.
     itemName = name
-    onosNode = int( onosNode )
 
     main.log.info( itemName + ": Adding point to point intents" )
 
@@ -409,8 +414,15 @@
 
     # Check intents state
     if utilities.retry( f=checkIntentState, retValue=main.FALSE,
-                        args=( main, [ intentId ] ), sleep=main.checkIntentSleep ):
+                        args=( main, [ intentId ] ), sleep=main.checkIntentSleep, attempts=5 ):
         main.assertReturnString += 'Install Intent State Passed\n'
+
+        # Check VLAN if test encapsulation
+        if encap != "":
+            if EncapsulatedIntentCheck( main, tag=encap ):
+                main.assertReturnString += 'Encapsulation intents check Passed\n'
+            else:
+                main.assertReturnString += 'Encapsulation intents check failed\n'
         if flowDuration( main ):
             main.assertReturnString += 'Flow duration check Passed\n'
             return intentId
@@ -502,17 +514,11 @@
     itemName = name
     host1 = host1
     host2 = host2
-    hostNames = [ host1, host2 ]
     intentsId = []
 
     iperfResult = main.TRUE
-    intentResult = main.TRUE
-    removeIntentResult = main.TRUE
-    flowResult = main.TRUE
-    topoResult = main.TRUE
     linkDownResult = main.TRUE
     linkUpResult = main.TRUE
-    onosNode = int( onosNode )
 
     # Adding bidirectional point  intents
     main.log.info( itemName + ": Adding point intents" )
@@ -650,7 +656,7 @@
 
         # link up
         linkUpResult = link( main, sw1, sw2, "up" )
-        if linkUpTemp:
+        if linkUpResult:
             main.assertReturnString += 'Link Up Passed\n'
         else:
             main.assertReturnString += 'Link Up Failed\n'
@@ -764,7 +770,6 @@
 
     global itemName  # The name of this run. Used for logs.
     itemName = name
-    onosNode = int( onosNode )
 
     main.log.info( itemName + ": Adding single point to multi point intents" )
 
@@ -891,7 +896,6 @@
 
     global itemName  # The name of this run. Used for logs.
     itemName = name
-    onosNode = int( onosNode )
 
     main.log.info( itemName + ": Adding mutli to single point intents" )
 
@@ -1031,8 +1035,6 @@
 
     global itemName
     itemName = name
-    tempHostsData = {}
-    onosNode = int( onosNode )
 
     main.log.info( itemName + ": Testing Point Intent" )
 
@@ -1129,7 +1131,7 @@
             testResult = main.FALSE
 
         # Check Connection
-        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames, vlanId, useTCP ) ):
+        if utilities.retry( f=scapyCheckConnection, retValue=main.FALSE, args=( main, senderNames, recipientNames, vlanId, useTCP ), sleep=5, attempts=5 ):
             main.assertReturnString += 'Link Down Pingall Passed\n'
         else:
             main.assertReturnString += 'Link Down Pingall Failed\n'
@@ -1215,8 +1217,6 @@
 
     global itemName
     itemName = name
-    tempHostsData = {}
-    onosNode = int( onosNode )
 
     main.log.info( itemName + ": Testing Point Intent" )
 
@@ -1506,9 +1506,7 @@
     """
         Use fwd app and pingall to discover all the hosts
     """
-    activateResult = main.TRUE
     appCheck = main.TRUE
-    getDataResult = main.TRUE
     main.log.info( "Activating reactive forwarding app " )
     activateResult = main.CLIs[ 0 ].activateApp( "org.onosproject.fwd" )
 
@@ -1541,7 +1539,6 @@
         Confirms that all ONOS nodes have discovered all scapy hosts
     """
     import collections
-    scapyHostCount = len( main.scapyHosts )
     hosts = main.topo.getAllHosts( main )  # Get host data from each ONOS node
     hostFails = []  # Reset for each failed attempt
 
@@ -1667,8 +1664,6 @@
         tempResult = main.CLIs[ i ].checkIntentState( intentsId=intentsId )
         results.append( tempResult )
 
-    expectedState = [ 'INSTALLED', 'INSTALLING' ]
-
     if all( result == main.TRUE for result in results ):
         main.log.info( itemName + ": Intents are installed correctly" )
     else:
@@ -1699,7 +1694,7 @@
 def link( main, sw1, sw2, option ):
 
     # link down
-    main.log.info( itemName + ": Bring link " + option + "between " +
+    main.log.info( itemName + ": Bring link " + option + " between " +
                        sw1 + " and " + sw2 )
     linkResult = main.Mininet1.link( end1=sw1, end2=sw2, option=option )
     return linkResult
@@ -1776,6 +1771,7 @@
                     connectionsFunctional = main.FALSE
                 else:
                     main.log.info( "Packet from {0} successfully received by {1}".format( sender , recipient ) )
+                    connectionsFunctional = main.TRUE
             else:
                 recipientComp.killFilter()
                 if expectFailure:
@@ -1786,6 +1782,7 @@
 
         return connectionsFunctional
 
+
 def removeAllIntents( main, intentsId ):
     """
         Remove all intents in the intentsId
@@ -1949,9 +1946,54 @@
                 waitFlowLife.append( device[ 'flows' ][ i ][ 'life' ] )
     main.log.info( "Determining whether flows where overwritten" )
     if len( flowLife ) == len( waitFlowLife ):
-        for i in range( len( flowLife) ):
+        for i in range( len( flowLife ) ):
             if waitFlowLife[ i ] - flowLife[ i ] < main.flowDurationSleep:
                 return main.FALSE
     else:
         return main.FALSE
     return main.TRUE
+
+
+def EncapsulatedIntentCheck( main, tag="" ):
+    """
+        Check encapsulated intents
+        tag: encapsulation tag (e.g. VLAN, MPLS)
+
+        Getting added flows
+        Check tags on each flows
+        If each direction has push or pop, passed
+        else failed
+
+    """
+    import json
+    HostJson = []
+    Jflows = main.CLIs[ 0 ].flows( noCore=True )
+    try:
+        Jflows = json.loads( Jflows )
+    except ValueError:
+        main.log.error( "Unable to read flows" )
+        return main.FALSE
+
+    for flow in Jflows:
+        if len(flow[ "flows" ]) != 0:
+            HostJson.append( flow[ "flows" ] )
+
+    totalflows = len( HostJson[ 0 ])
+
+    pop = 0
+    push = 0
+
+    PopTag = tag + "_POP"
+    PushTag = tag + "_PUSH"
+
+    for EachHostJson in HostJson:
+        for i in range( totalflows ):
+            if EachHostJson[ i ][ "treatment" ][ "instructions" ][ 0 ][ "subtype" ] == PopTag:
+                pop += 1
+            elif EachHostJson[ i ][ "treatment" ][ "instructions" ][ 0 ][ "subtype" ] == PushTag:
+                push += 1
+
+    if pop == totalflows and push == totalflows:
+        return main.TRUE
+    else:
+        return main.FALSE
\ No newline at end of file
