diff --git a/ghcide-bench.cabal b/ghcide-bench.cabal
--- a/ghcide-bench.cabal
+++ b/ghcide-bench.cabal
@@ -2,7 +2,7 @@
 build-type:         Simple
 category:           Development
 name:               ghcide-bench
-version:            2.1.0.0
+version:            2.3.0.0
 license:            Apache-2.0
 license-file:       LICENSE
 author:             The Haskell IDE team
@@ -12,7 +12,7 @@
 description:        An LSP client for running performance experiments on HLS
 homepage:           https://github.com/haskell/haskell-language-server/tree/master/ghcide#readme
 bug-reports:        https://github.com/haskell/haskell-language-server/issues
-tested-with:        GHC == 8.10.7 || == 9.0.2 || == 9.2.5
+tested-with:        GHC == 9.0.2 || == 9.2.5
 
 source-repository head
     type:     git
@@ -119,7 +119,7 @@
         base,
         extra,
         ghcide-bench,
-        lsp-test ^>= 0.15.0.1,
+        lsp-test ^>= 0.16,
         tasty,
         tasty-hunit >= 0.10,
         tasty-rerun,
diff --git a/src/Experiments.hs b/src/Experiments.hs
--- a/src/Experiments.hs
+++ b/src/Experiments.hs
@@ -29,7 +29,7 @@
 import           Control.Concurrent.Async           (withAsync)
 import           Control.Exception.Safe             (IOException, handleAny,
                                                      try)
-import           Control.Lens                       ((^.))
+import           Control.Lens                       (_Just, (&), (.~), (^.))
 import           Control.Lens.Extras                (is)
 import           Control.Monad.Extra                (allM, forM, forM_, forever,
                                                      unless, void, when,
@@ -108,6 +108,22 @@
       bench "hover" $ allWithIdentifierPos $ \DocumentPositions{..} ->
         isJust <$> getHover doc (fromJust identifierP),
       ---------------------------------------------------------------------------------------
+      bench "hover after edit" $ \docs -> do
+        forM_ docs $ \DocumentPositions{..} ->
+          changeDoc doc [charEdit stringLiteralP]
+        flip allWithIdentifierPos docs $ \DocumentPositions{..} ->
+          isJust <$> getHover doc (fromJust identifierP),
+      ---------------------------------------------------------------------------------------
+      bench
+        "hover after cradle edit"
+        (\docs -> do
+            hieYamlUri <- getDocUri "hie.yaml"
+            liftIO $ appendFile (fromJust $ uriToFilePath hieYamlUri) "##\n"
+            sendNotification SMethod_WorkspaceDidChangeWatchedFiles $ DidChangeWatchedFilesParams $
+             [ FileEvent hieYamlUri FileChangeType_Changed ]
+            flip allWithIdentifierPos docs $ \DocumentPositions{..} -> isJust <$> getHover doc (fromJust identifierP)
+        ),
+      ---------------------------------------------------------------------------------------
       bench "edit" $ \docs -> do
         forM_ docs $ \DocumentPositions{..} -> do
           changeDoc doc [charEdit stringLiteralP]
@@ -128,12 +144,6 @@
         waitForProgressDone
         return True,
       ---------------------------------------------------------------------------------------
-      bench "hover after edit" $ \docs -> do
-        forM_ docs $ \DocumentPositions{..} ->
-          changeDoc doc [charEdit stringLiteralP]
-        flip allWithIdentifierPos docs $ \DocumentPositions{..} ->
-          isJust <$> getHover doc (fromJust identifierP),
-      ---------------------------------------------------------------------------------------
       bench "getDefinition" $ allWithIdentifierPos $ \DocumentPositions{..} ->
         hasDefinitions <$> getDefinitions doc (fromJust identifierP),
       ---------------------------------------------------------------------------------------
@@ -162,30 +172,21 @@
         flip allWithIdentifierPos docs $ \DocumentPositions{..} ->
           not . null <$> getCompletions doc (fromJust identifierP),
       ---------------------------------------------------------------------------------------
-      benchWithSetup
+      bench
         "code actions"
         ( \docs -> do
             unless (any (isJust . identifierP) docs) $
                 error "None of the example modules is suitable for this experiment"
-            forM_ docs $ \DocumentPositions{..} -> do
-                forM_ identifierP $ \p -> changeDoc doc [charEdit p]
-                waitForProgressStart
-            waitForProgressDone
-        )
-        ( \docs -> not . null . catMaybes <$> forM docs (\DocumentPositions{..} ->
-            forM identifierP $ \p ->
-              getCodeActions doc (Range p p))
+            not . null . catMaybes <$> forM docs (\DocumentPositions{..} -> do
+              forM identifierP $ \p ->
+                getCodeActions doc (Range p p))
         ),
       ---------------------------------------------------------------------------------------
-      benchWithSetup
+      bench
         "code actions after edit"
         ( \docs -> do
             unless (any (isJust . identifierP) docs) $
                 error "None of the example modules is suitable for this experiment"
-            forM_ docs $ \DocumentPositions{..} ->
-                forM_ identifierP $ \p -> changeDoc doc [charEdit p]
-        )
-        ( \docs -> do
             forM_ docs $ \DocumentPositions{..} -> do
               changeDoc doc [charEdit stringLiteralP]
               waitForProgressStart
@@ -195,16 +196,9 @@
                 getCodeActions doc (Range p p))
         ),
       ---------------------------------------------------------------------------------------
-      benchWithSetup
+      bench
         "code actions after cradle edit"
         ( \docs -> do
-            forM_ docs $ \DocumentPositions{..} -> do
-                forM identifierP $ \p -> do
-                    changeDoc doc [charEdit p]
-                    waitForProgressStart
-            void waitForBuildQueue
-        )
-        ( \docs -> do
             hieYamlUri <- getDocUri "hie.yaml"
             liftIO $ appendFile (fromJust $ uriToFilePath hieYamlUri) "##\n"
             sendNotification SMethod_WorkspaceDidChangeWatchedFiles $ DidChangeWatchedFilesParams $
@@ -219,15 +213,22 @@
         ),
       ---------------------------------------------------------------------------------------
       bench
-        "hover after cradle edit"
-        (\docs -> do
-            hieYamlUri <- getDocUri "hie.yaml"
-            liftIO $ appendFile (fromJust $ uriToFilePath hieYamlUri) "##\n"
-            sendNotification SMethod_WorkspaceDidChangeWatchedFiles $ DidChangeWatchedFilesParams $
-             [ FileEvent hieYamlUri FileChangeType_Changed ]
-            flip allWithIdentifierPos docs $ \DocumentPositions{..} -> isJust <$> getHover doc (fromJust identifierP)
+        "code lens"
+        ( \docs -> not . null <$> forM docs (\DocumentPositions{..} ->
+            getCodeLenses doc)
         ),
       ---------------------------------------------------------------------------------------
+      bench
+        "code lens after edit"
+        ( \docs -> do
+            forM_ docs $ \DocumentPositions{..} -> do
+              changeDoc doc [charEdit stringLiteralP]
+              waitForProgressStart
+            waitForProgressDone
+            not . null <$> forM docs (\DocumentPositions{..} -> do
+              getCodeLenses doc)
+        ),
+      ---------------------------------------------------------------------------------------
       benchWithSetup
         "hole fit suggestions"
         ( mapM_ $ \DocumentPositions{..} -> do
@@ -363,8 +364,8 @@
       createDirectoryIfMissing True eventlogDir
 
   lspConfig <- if Experiments.Types.lspConfig ?config
-    then either error Just . eitherDecodeStrict' <$> BS.getContents
-    else return Nothing
+    then either error id . eitherDecodeStrict' <$> BS.getContents
+    else return mempty
 
   let conf = defaultConfig
         { logStdErr = verbose ?config,
@@ -483,7 +484,10 @@
             ]
           ++ ["--ot-memory-profiling" | Just _ <- [otMemoryProfiling ?config]]
     lspTestCaps =
-      fullCaps {_window = Just $ WindowClientCapabilities (Just True) Nothing Nothing }
+      fullCaps
+        & (L.window . _Just) .~ WindowClientCapabilities (Just True) Nothing Nothing
+        & (L.textDocument . _Just . L.codeAction . _Just . L.resolveSupport . _Just) .~ (#properties .== ["edit"])
+        & (L.textDocument . _Just . L.codeAction . _Just . L.dataSupport . _Just) .~ True
 
 showMs :: Seconds -> String
 showMs = printf "%.2f"
@@ -542,11 +546,9 @@
   (Session BenchRun -> IO BenchRun) ->
   Bench ->
   IO BenchRun
-runBench runSess b = handleAny (\e -> print e >> return badRun)
+runBench runSess Bench{..} = handleAny (\e -> print e >> return badRun)
   $ runSess
   $ do
-    case b of
-     Bench{..} -> do
       (startup, docs) <- duration $ do
         (d, docs) <- duration $ setupDocumentContents ?config
         output $ "Setting up document contents took " <> showDuration d
