diff --git a/hls-explicit-imports-plugin.cabal b/hls-explicit-imports-plugin.cabal
--- a/hls-explicit-imports-plugin.cabal
+++ b/hls-explicit-imports-plugin.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.2
 name:               hls-explicit-imports-plugin
-version:            1.0.0.2
+version:            1.0.0.3
 synopsis:           Explicit imports plugin for Haskell Language Server
 license:            Apache-2.0
 license-file:       LICENSE
@@ -8,23 +8,22 @@
 maintainer:         pepeiborra@gmail.com
 category:           Development
 build-type:         Simple
-extra-source-files:
-  LICENSE
+extra-source-files: LICENSE
 
 library
   exposed-modules:    Ide.Plugin.ExplicitImports
   hs-source-dirs:     src
   build-depends:
     , aeson
-    , base                  >=4.12    && <5
+    , base                  >=4.12 && <5
     , containers
     , deepseq
     , ghc
-    , ghcide                ^>=1.3
+    , ghc-api-compat
+    , ghcide                ^>=1.4
+    , hls-graph
     , hls-plugin-api        ^>=1.1
     , lsp
-    , lsp-types
-    , hls-graph
     , text
     , unordered-containers
 
diff --git a/src/Ide/Plugin/ExplicitImports.hs b/src/Ide/Plugin/ExplicitImports.hs
--- a/src/Ide/Plugin/ExplicitImports.hs
+++ b/src/Ide/Plugin/ExplicitImports.hs
@@ -1,17 +1,16 @@
-{-# LANGUAGE CPP                   #-}
-{-# LANGUAGE DeriveAnyClass        #-}
-{-# LANGUAGE DeriveGeneric         #-}
-{-# LANGUAGE DerivingStrategies    #-}
-{-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE NamedFieldPuns        #-}
-{-# LANGUAGE OverloadedStrings     #-}
-{-# LANGUAGE RecordWildCards       #-}
-{-# LANGUAGE ScopedTypeVariables   #-}
-{-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE CPP                #-}
+{-# LANGUAGE DeriveAnyClass     #-}
+{-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE NamedFieldPuns     #-}
+{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE RecordWildCards    #-}
+{-# LANGUAGE TypeFamilies       #-}
 
 
 module Ide.Plugin.ExplicitImports
   ( descriptor
+  , descriptorForModules
   , extractMinimalImports
   , within
   ) where
@@ -26,7 +25,8 @@
 import qualified Data.Map.Strict                      as Map
 import           Data.Maybe                           (catMaybes, fromMaybe)
 import qualified Data.Text                            as T
-import           Development.IDE
+import           Development.IDE                      hiding (pluginHandlers,
+                                                       pluginRules)
 import           Development.IDE.Core.PositionMapping
 import           Development.IDE.GHC.Compat
 import           Development.IDE.Graph.Classes
@@ -35,9 +35,14 @@
 import           Ide.Types
 import           Language.LSP.Server
 import           Language.LSP.Types
+#if MIN_VERSION_ghc(9,0,0)
+import           GHC.Builtin.Names                    (pRELUDE)
+#else
 import           PrelNames                            (pRELUDE)
+#endif
 import           RnNames                              (findImportUsage,
                                                        getMinimalImports)
+import qualified SrcLoc
 import           TcRnMonad                            (initTcWithGbl)
 import           TcRnTypes                            (TcGblEnv (tcg_used_gres))
 
@@ -46,7 +51,14 @@
 
 -- | The "main" function of a plugin
 descriptor :: PluginId -> PluginDescriptor IdeState
-descriptor plId =
+descriptor = descriptorForModules (/= moduleName pRELUDE)
+
+descriptorForModules
+    :: (ModuleName -> Bool)
+      -- ^ Predicate to select modules that will be annotated
+    -> PluginId
+    -> PluginDescriptor IdeState
+descriptorForModules pred plId =
   (defaultPluginDescriptor plId)
     {
       -- This plugin provides a command handler
@@ -55,9 +67,9 @@
       pluginRules = minimalImportsRule,
       pluginHandlers = mconcat
         [ -- This plugin provides code lenses
-          mkPluginHandler STextDocumentCodeLens lensProvider
+          mkPluginHandler STextDocumentCodeLens $ lensProvider pred
           -- This plugin provides code actions
-        , mkPluginHandler STextDocumentCodeAction codeActionProvider
+        , mkPluginHandler STextDocumentCodeAction $ codeActionProvider pred
         ]
     }
 
@@ -88,8 +100,9 @@
 -- the provider should produce one code lens associated to the import statement:
 --
 -- > import Data.List (intercalate, sortBy)
-lensProvider :: PluginMethodHandler IdeState TextDocumentCodeLens
+lensProvider :: (ModuleName -> Bool) -> PluginMethodHandler IdeState TextDocumentCodeLens
 lensProvider
+  pred
   state -- ghcide state, used to retrieve typechecking artifacts
   pId -- plugin Id
   CodeLensParams {_textDocument = TextDocumentIdentifier {_uri}}
@@ -106,7 +119,7 @@
               sequence
                 [ generateLens pId _uri edit
                   | (imp, Just minImport) <- minImports,
-                    Just edit <- [mkExplicitEdit posMapping imp minImport]
+                    Just edit <- [mkExplicitEdit pred posMapping imp minImport]
                 ]
             return $ Right (List $ catMaybes commands)
           _ ->
@@ -116,8 +129,8 @@
 
 -- | If there are any implicit imports, provide one code action to turn them all
 --   into explicit imports.
-codeActionProvider :: PluginMethodHandler IdeState TextDocumentCodeAction
-codeActionProvider ideState _pId (CodeActionParams _ _ docId range _context)
+codeActionProvider :: (ModuleName -> Bool) -> PluginMethodHandler IdeState TextDocumentCodeAction
+codeActionProvider pred ideState _pId (CodeActionParams _ _ docId range _context)
   | TextDocumentIdentifier {_uri} <- docId,
     Just nfp <- uriToNormalizedFilePath $ toNormalizedUri _uri = liftIO $
     do
@@ -136,7 +149,7 @@
                 [ e
                   | (imp, Just explicit) <-
                       maybe [] getMinimalImportsResult minImports,
-                    Just e <- [mkExplicitEdit zeroMapping imp explicit]
+                    Just e <- [mkExplicitEdit pred zeroMapping imp explicit]
                 ]
               caExplicitImports = InR CodeAction {..}
               _title = "Make all imports explicit"
@@ -184,12 +197,13 @@
   (imports, mbMinImports) <- liftIO $ extractMinimalImports hsc tmr
   let importsMap =
         Map.fromList
-          [ (srcSpanStart l, T.pack (prettyPrint i))
-            | L l i <- fromMaybe [] mbMinImports
+          [ (SrcLoc.realSrcSpanStart l, T.pack (prettyPrint i))
+            | L (OldRealSrcSpan l) i <- fromMaybe [] mbMinImports
           ]
       res =
-        [ (i, Map.lookup (srcSpanStart (getLoc i)) importsMap)
+        [ (i, Map.lookup (SrcLoc.realSrcSpanStart l) importsMap)
           | i <- imports
+          , OldRealSrcSpan l <- [getLoc i]
         ]
   return ([], MinimalImportsResult res <$ mbMinImports)
 
@@ -220,16 +234,16 @@
   return (imports, minimalImports)
 extractMinimalImports _ _ = return ([], Nothing)
 
-mkExplicitEdit :: PositionMapping -> LImportDecl pass -> T.Text -> Maybe TextEdit
-mkExplicitEdit posMapping (L src imp) explicit
+mkExplicitEdit :: (ModuleName -> Bool) -> PositionMapping -> LImportDecl pass -> T.Text -> Maybe TextEdit
+mkExplicitEdit pred posMapping (L src imp) explicit
   -- Explicit import list case
   | ImportDecl {ideclHiding = Just (False, _)} <- imp =
     Nothing
   | not (isQualifiedImport imp),
-    RealSrcSpan l <- src,
+    OldRealSrcSpan l <- src,
     L _ mn <- ideclName imp,
     -- (almost) no one wants to see an explicit import list for Prelude
-    mn /= moduleName pRELUDE,
+    pred mn,
     Just rng <- toCurrentRange posMapping $ realSrcSpanToRange l =
     Just $ TextEdit rng explicit
   | otherwise =
