diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.params b/TestON/tests/FUNC/FUNCintent/FUNCintent.params
index c55cd83..1215e16 100644
--- a/TestON/tests/FUNC/FUNCintent/FUNCintent.params
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.params
@@ -48,14 +48,14 @@
         <startup>15</startup>
         <reroute>5</reroute>
         <removeintent>10</removeintent>
-        <checkintent>10</checkintent>
+        <checkintent>5</checkintent>
         <fwd>10</fwd>
         <topoAttempts>3</topoAttempts>
         <flowDuration>10</flowDuration>
-        <checkConnection>50</checkConnection>
+        <checkConnection>30</checkConnection>
         <checkFlowCount>20</checkFlowCount>
-        <checkIntentHost>10</checkIntentHost>
-        <checkIntentPoint>20</checkIntentPoint>
+        <checkIntentHost>5</checkIntentHost>
+        <checkIntentPoint>5</checkIntentPoint>
     </SLEEP>
 
     <MININET>
diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.py b/TestON/tests/FUNC/FUNCintent/FUNCintent.py
index 074b472..5b88b25 100644
--- a/TestON/tests/FUNC/FUNCintent/FUNCintent.py
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.py
@@ -153,7 +153,6 @@
         main.log.info( "Safety check, killing all ONOS processes" +
                        " before initiating environment setup" )
 
-        time.sleep( main.startUpSleep )
         main.step( "Uninstalling ONOS package" )
         onosUninstallResult = main.TRUE
         for ip in main.ONOSip:
@@ -164,6 +163,7 @@
                                  actual=stepResult,
                                  onpass="Successfully uninstalled ONOS package",
                                  onfail="Failed to uninstall ONOS package" )
+        main.log.info( "Sleeping {} seconds".format( main.startUpSleep ) )
         time.sleep( main.startUpSleep )
 
         for i in range( main.maxNodes ):
@@ -197,7 +197,6 @@
                                  onpass="Successfully created ONOS package",
                                  onfail="Failed to create ONOS package" )
 
-        time.sleep( main.startUpSleep )
         main.step( "Installing ONOS package" )
         onosInstallResult = main.TRUE
         for i in range( main.numCtrls ):
@@ -217,6 +216,7 @@
                                  onpass="Test step PASS",
                                  onfail="Test step FAIL" )
 
+        main.log.info( "Sleeping {} seconds".format( main.startUpSleep ) )
         time.sleep( main.startUpSleep )
         main.step( "Starting ONOS service" )
         stopResult = main.TRUE
@@ -286,6 +286,7 @@
 
         while ( attempts >= 0 ) and\
             ( not devicesResults or not linksResults or not hostsResults ):
+            main.log.info( "Sleeping {} seconds".format( 2 ) )
             time.sleep( 2 )
             if not devicesResults:
                 devices = main.topo.getAllDevices( main )
@@ -1450,8 +1451,7 @@
                                       name="NOOPTION",
                                       senders=senders,
                                       recipients=recipients,
-                                      bandwidth=100,
-                                      bandwidthFlag=True )
+                                      bandwidth=100 )
 
         if installResult:
             testResult = main.intentFunction.testPointIntent(
diff --git a/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
index d4670b8..2607399 100755
--- a/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
+++ b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
@@ -6,6 +6,7 @@
 import time
 import copy
 import json
+import os
 
 def __init__( self ):
     self.default = ''
@@ -29,8 +30,7 @@
                        sw1="",
                        sw2="",
                        setVlan="",
-                       encap="",
-                       bandwidthFlag=False ):
+                       encap="" ):
     """
     Installs a Host Intent
 
@@ -101,7 +101,7 @@
     # Check intents state
     if utilities.retry( f=checkIntentState,
                         retValue=main.FALSE,
-                        args=( main, [ intentId ], bandwidthFlag ),
+                        args=( main, [ intentId ] ),
                         sleep=main.checkIntentSleep,
                         attempts=50 ):
         main.assertReturnString += 'Install Intent State Passed\n'
@@ -112,12 +112,22 @@
                 main.assertReturnString += 'Encapsulation intents check Passed\n'
             else:
                 main.assertReturnString += 'Encapsulation intents check failed\n'
+        if bandwidth != "":
+            allocationsFile = open( os.path.dirname( main.testFile ) + main.params[ 'DEPENDENCY' ][ 'filePath' ], 'r' )
+            expectedFormat = allocationsFile.read()
+            bandwidthCheck = checkBandwidthAllocations( main, expectedFormat )
+            allocationsFile.close()
+            if bandwidthCheck:
+                main.assertReturnString += 'Bandwidth Allocation check Passed\n'
+            else:
+                main.assertReturnString += 'Bandwidth Allocation check Failed\n'
+
 
         if flowDuration( main ):
             main.assertReturnString += 'Flow duration check Passed\n'
             return intentId
         else:
-            main.assertReturnString += 'Flow duration check failed\n'
+            main.assertReturnString += 'Flow duration check Failed\n'
             return main.FALSE
 
     else:
@@ -231,11 +241,11 @@
     if utilities.retry( f=checkFlowsCount,
                         retValue=main.FALSE,
                         args=[ main ],
-                        sleep=20,
+                        sleep=main.checkFlowCountSleep,
                         attempts=3 ) and utilities.retry( f=checkFlowsState,
                                                           retValue=main.FALSE,
                                                           args=[ main ],
-                                                          sleep=20,
+                                                          sleep=main.checkFlowCountSleep,
                                                           attempts=3 ):
         main.assertReturnString += 'Initial Flow State Passed\n'
     else:
@@ -320,6 +330,7 @@
             testResult = main.FALSE
 
         # Wait for reroute
+        main.log.info( "Sleeping {} seconds".format( main.rerouteSleep ) )
         time.sleep( main.rerouteSleep )
 
         # Check Intents
@@ -337,11 +348,11 @@
         if utilities.retry( f=checkFlowsCount,
                             retValue=main.FALSE,
                             args=[ main ],
-                            sleep=20,
+                            sleep=main.checkFlowCountSleep,
                             attempts=3 ) and utilities.retry( f=checkFlowsState,
                                                               retValue=main.FALSE,
                                                               args=[ main ],
-                                                              sleep=20,
+                                                              sleep=main.checkFlowCountSleep,
                                                               attempts=3 ):
             main.assertReturnString += 'Link Up Flow State Passed\n'
         else:
@@ -393,8 +404,7 @@
                         tcpSrc="",
                         tcpDst="",
                         setVlan="",
-                        encap="",
-                        bandwidthFlag=False ):
+                        encap="" ):
     """
     Installs a Single to Single Point Intent
 
@@ -498,13 +508,20 @@
     # Check intents state
     if utilities.retry( f=checkIntentState,
                         retValue=main.FALSE,
-                        args=( main, [ intentId ], bandwidthFlag ),
-                        sleep=main.checkIntentSleep * 2,
+                        args=( main, [ intentId ] ),
+                        sleep=main.checkIntentSleep,
                         attempts=50 ):
         main.assertReturnString += 'Install Intent State Passed\n'
 
         if bandwidth != "":
-            main.assertReturnString += 'Bandwidth Allocation Passed\n'
+            allocationsFile = open( os.path.dirname( main.testFile ) + main.params[ 'DEPENDENCY' ][ 'filePath' ], 'r' )
+            expectedFormat = allocationsFile.read()
+            bandwidthCheck = checkBandwidthAllocations( main, expectedFormat )
+            allocationsFile.close()
+            if bandwidthCheck:
+                main.assertReturnString += 'Bandwidth Allocation check Passed\n'
+            else:
+                main.assertReturnString += 'Bandwidth Allocation check Failed\n'
 
         # Check VLAN if test encapsulation
         if encap != "":
@@ -520,8 +537,6 @@
             main.assertReturnString += 'Flow duration check failed\n'
             return main.FALSE
     else:
-        if bandwidth != "":
-            main.assertReturnString += 'Bandwidth Allocation Failed\n'
         main.log.error( "Point Intent did not install correctly" )
         pointIntentFailFlag = True
         return main.FALSE
@@ -680,6 +695,7 @@
     intentsId.append( intent4 )
 
     # Check intents state
+    main.log.info( "Sleeping {} seconds".format( main.checkIntentSleep ) )
     time.sleep( main.checkIntentSleep )
     intentResult = utilities.retry( f=checkIntentState,
                                     retValue=main.FALSE,
@@ -766,6 +782,7 @@
         else:
             main.assertReturnString += 'Link Up Failed\n'
 
+        main.log.info( "Sleeping {} seconds".format( main.rerouteSleep ) )
         time.sleep( main.rerouteSleep )
 
         # Check flows count in each node
@@ -834,8 +851,7 @@
                                 sw2="",
                                 setVlan="",
                                 partial=False,
-                                encap="",
-                                bandwidthFlag=False ):
+                                encap="" ):
     """
     Installs a Single to Multi Point Intent
 
@@ -944,10 +960,19 @@
 
     if utilities.retry( f=checkIntentState,
                         retValue=main.FALSE,
-                        args=( main, [ intentId ], bandwidthFlag ),
+                        args=( main, [ intentId ] ),
                         sleep=main.checkIntentSleep,
                         attempts=attempts ):
         main.assertReturnString += 'Install Intent State Passed\n'
+        if bandwidth != "":
+            allocationsFile = open( os.path.dirname( main.testFile ) + main.params[ 'DEPENDENCY' ][ 'filePath' ], 'r' )
+            expectedFormat = allocationsFile.read()
+            bandwidthCheck = checkBandwidthAllocations( main, expectedFormat )
+            allocationsFile.close()
+            if bandwidthCheck:
+                main.assertReturnString += 'Bandwidth Allocation check Passed\n'
+            else:
+                main.assertReturnString += 'Bandwidth Allocation check Failed\n'
         if flowDuration( main ):
             main.assertReturnString += 'Flow duration check Passed\n'
             return intentId
@@ -974,8 +999,7 @@
                                 sw2="",
                                 setVlan="",
                                 partial=False,
-                                encap="",
-                                bandwidthFlag=False ):
+                                encap="" ):
     """
     Installs a Multi to Single Point Intent
 
@@ -1083,10 +1107,19 @@
 
     if utilities.retry( f=checkIntentState,
                         retValue=main.FALSE,
-                        args=( main, [ intentId ], bandwidthFlag ),
+                        args=( main, [ intentId ] ),
                         sleep=main.checkIntentSleep,
                         attempts=attempts ):
         main.assertReturnString += 'Install Intent State Passed\n'
+        if bandwidth != "":
+            allocationsFile = open( os.path.dirname( main.testFile ) + main.params[ 'DEPENDENCY' ][ 'filePath' ], 'r' )
+            expectedFormat = allocationsFile.read()
+            bandwidthCheck = checkBandwidthAllocations( main, expectedFormat )
+            allocationsFile.close()
+            if bandwidthCheck:
+                main.assertReturnString += 'Bandwidth Allocation check Passed\n'
+            else:
+                main.assertReturnString += 'Bandwidth Allocation check Failed\n'
         if flowDuration( main ):
             main.assertReturnString += 'Flow duration check Passed\n'
             return intentId
@@ -1225,11 +1258,11 @@
     if utilities.retry( f=checkFlowsCount,
                         retValue=main.FALSE,
                         args=[ main ],
-                        sleep=20,
+                        sleep=main.checkFlowCountSleep,
                         attempts=3 ) and utilities.retry( f=checkFlowsState,
                                                           retValue=main.FALSE,
                                                           args=[ main ],
-                                                          sleep=20,
+                                                          sleep=main.checkFlowCountSleep,
                                                           attempts=3 ):
         main.assertReturnString += 'Initial Flow State Passed\n'
     else:
@@ -1353,6 +1386,7 @@
             testResult = main.FALSE
 
         # Wait for reroute
+        main.log.info( "Sleeping {} seconds".format( main.rerouteSleep ) )
         time.sleep( main.rerouteSleep )
 
         # Check Intents
@@ -1370,11 +1404,11 @@
         if utilities.retry( f=checkFlowsCount,
                             retValue=main.FALSE,
                             args=[ main ],
-                            sleep=20,
+                            sleep=main.checkFlowCountSleep,
                             attempts=3 ) and utilities.retry( f=checkFlowsState,
                                                               retValue=main.FALSE,
                                                               args=[ main ],
-                                                              sleep=20,
+                                                              sleep=main.checkFlowCountSleep,
                                                               attempts=3 ):
             main.assertReturnString += 'Link Up Flow State Passed\n'
         else:
@@ -1766,6 +1800,7 @@
         testResult = main.FALSE
 
     # Wait for reroute
+    main.log.info( "Sleeping {} seconds".format( main.rerouteSleep ) )
     time.sleep( main.rerouteSleep )
 
     # Check Intents
@@ -1783,11 +1818,11 @@
     if utilities.retry( f=checkFlowsCount,
                         retValue=main.FALSE,
                         args=[ main ],
-                        sleep=5,
-                        attempts=5*20 ) and utilities.retry( f=checkFlowsState,
+                        sleep=main.checkFlowCountSleep,
+                        attempts=attempts ) and utilities.retry( f=checkFlowsState,
                                                              retValue=main.FALSE,
                                                              args=[ main ],
-                                                             sleep=5,
+                                                             sleep=main.checkFlowCountSleep,
                                                              attempts=attempts ):
         main.assertReturnString += 'Link Up Flow State Passed\n'
     else:
@@ -1843,6 +1878,7 @@
     activateResult = main.CLIs[ 0 ].activateApp( "org.onosproject.fwd" )
 
     # Wait for forward app activation to propagate
+    main.log.info( "Sleeping {} seconds".format( main.fwdSleep ) )
     time.sleep( main.fwdSleep )
 
     # Check that forwarding is enabled on all nodes
@@ -1980,23 +2016,41 @@
         main.log.info( itemName + ": Topology match" )
     return statusResult
 
-def checkIntentState( main, intentsId, bandwidthFlag=False ):
+def checkIntentState( main, intentsId ):
     """
         This function will check intent state to make sure all the intents
         are in INSTALLED state
+        Returns main.TRUE or main.FALSE
     """
     intentResult = main.TRUE
-    results = []
+    stateCheckResults = []
     for i in range( main.numCtrls ):
-        output = main.CLIs[ i ].checkIntentState( intentsId=intentsId, bandwidthFlag=bandwidthFlag )
-        results.append( output )
-    if all( result == main.TRUE for result in results ):
-        main.log.info( itemName + ": Intents are installed correctly" )
+        output = main.CLIs[ i ].checkIntentState( intentsId=intentsId )
+        stateCheckResults.append( output )
+    if all( result == main.TRUE for result in stateCheckResults ):
+        main.log.info( itemName + ": Intents state check passed" )
     else:
-        main.log.warn( "Intents are not installed correctly" )
+        main.log.warn( "Intents state check failed" )
         intentResult = main.FALSE
     return intentResult
 
+def checkBandwidthAllocations( main, bandwidth ):
+    """
+        Compare the given bandwith allocation output to the cli output on each node
+        Returns main.TRUE or main.FALSE
+    """
+    bandwidthResults = []
+    for i in range( main.numCtrls ):
+        output = main.CLIs[ i ].compareBandwidthAllocations( bandwidth )
+        bandwidthResults.append( output )
+    if all( result == main.TRUE for result in bandwidthResults ):
+        main.log.info( itemName + ": bandwidth check passed" )
+        bandwidthResult = main.TRUE
+    else:
+        main.log.warn( itemName + ": bandwidth check failed" )
+        bandwidthResult = main.FALSE
+    return bandwidthResult
+
 def checkFlowsState( main ):
 
     main.log.info( itemName + ": Check flows state" )
@@ -2113,6 +2167,7 @@
     for intent in intentsId:
         main.CLIs[ 0 ].removeIntent( intentId=intent, purge=True )
 
+    main.log.info( "Sleeping {} seconds".format( main.removeIntentSleep ) )
     time.sleep( main.removeIntentSleep )
 
     # If there is remianing intents then remove intents should fail
