diff --git a/hls-test-utils.cabal b/hls-test-utils.cabal
--- a/hls-test-utils.cabal
+++ b/hls-test-utils.cabal
@@ -1,6 +1,6 @@
 cabal-version: 2.4
 name:          hls-test-utils
-version:       1.1.0.2
+version:       1.2.0.0
 synopsis:      Utilities used in the tests of Haskell Language Server
 description:
   Please see the README on GitHub at <https://github.com/haskell/haskell-language-server#readme>
@@ -41,15 +41,15 @@
     , directory
     , extra
     , filepath
-    , ghcide                  ^>=1.5.0
+    , ghcide                  ^>=1.6
     , hls-graph
-    , hls-plugin-api          ^>=1.2
+    , hls-plugin-api          ^>=1.3
     , hspec                   <2.8
     , hspec-core
     , lens
-    , lsp                     ^>=1.2
+    , lsp                     ^>=1.4
     , lsp-test                ^>=0.14
-    , lsp-types               >=1.2  && <1.4
+    , lsp-types               ^>=1.4.0.1
     , tasty
     , tasty-expected-failure
     , tasty-golden
diff --git a/src/Test/Hls.hs b/src/Test/Hls.hs
--- a/src/Test/Hls.hs
+++ b/src/Test/Hls.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE LambdaCase        #-}
 {-# LANGUAGE NamedFieldPuns    #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PolyKinds         #-}
 {-# LANGUAGE RecordWildCards   #-}
 module Test.Hls
   ( module Test.Tasty.HUnit,
@@ -28,16 +29,21 @@
     waitForTypecheck,
     waitForAction,
     sendConfigurationChanged,
-    getLastBuildKeys)
+    getLastBuildKeys,
+    waitForKickDone,
+    waitForKickStart,
+    )
 where
 
 import           Control.Applicative.Combinators
 import           Control.Concurrent.Async        (async, cancel, wait)
 import           Control.Concurrent.Extra
 import           Control.Exception.Base
-import           Control.Monad                   (unless, void)
+import           Control.Monad                   (guard, unless, void)
 import           Control.Monad.IO.Class
-import           Data.Aeson                      (Value (Null), toJSON)
+import           Data.Aeson                      (Result (Success),
+                                                  Value (Null), fromJSON,
+                                                  toJSON)
 import qualified Data.Aeson                      as A
 import           Data.ByteString.Lazy            (ByteString)
 import           Data.Default                    (def)
@@ -247,3 +253,22 @@
 sendConfigurationChanged :: Value -> Session ()
 sendConfigurationChanged config =
   sendNotification SWorkspaceDidChangeConfiguration (DidChangeConfigurationParams config)
+
+waitForKickDone :: Session ()
+waitForKickDone = void $ skipManyTill anyMessage nonTrivialKickDone
+
+waitForKickStart :: Session ()
+waitForKickStart = void $ skipManyTill anyMessage nonTrivialKickStart
+
+nonTrivialKickDone :: Session ()
+nonTrivialKickDone = kick "done" >>= guard . not . null
+
+nonTrivialKickStart :: Session ()
+nonTrivialKickStart = kick "start" >>= guard . not . null
+
+kick :: T.Text -> Session [FilePath]
+kick msg = do
+  NotMess NotificationMessage{_params} <- customNotification $ "kick/" <> msg
+  case fromJSON _params of
+    Success x -> return x
+    other     -> error $ "Failed to parse kick/done details: " <> show other
diff --git a/src/Test/Hls/Util.hs b/src/Test/Hls/Util.hs
--- a/src/Test/Hls/Util.hs
+++ b/src/Test/Hls/Util.hs
@@ -433,7 +433,7 @@
 
 -- | To locate a symbol, we provide a path to the file from the HLS root
 -- directory, the line number, and the column number. (0 indexed.)
-type SymbolLocation = (FilePath, Int, Int)
+type SymbolLocation = (FilePath, UInt, UInt)
 
 expectSameLocations :: [Location] -> [SymbolLocation] -> Assertion
 actual `expectSameLocations` expected = do
