diff --git a/hdevtools.cabal b/hdevtools.cabal
--- a/hdevtools.cabal
+++ b/hdevtools.cabal
@@ -1,5 +1,5 @@
 name:                hdevtools
-version:             0.1.1.9
+version:             0.1.2.0
 synopsis:            Persistent GHC powered background server for FAST haskell development tools
 description:
     'hdevtools' is a backend for text editor plugins, to allow for things such as
@@ -81,5 +81,7 @@
     cpp-options:       -DENABLE_CABAL
 
   if impl(ghc >= 7.9)
-    build-depends:     Cabal >= 1.22
+    build-depends:     Cabal >= 1.22,
+                       bin-package-db
+
     cpp-options:       -DENABLE_CABAL
diff --git a/src/Cabal.hs b/src/Cabal.hs
--- a/src/Cabal.hs
+++ b/src/Cabal.hs
@@ -10,6 +10,7 @@
 import Data.Char (isSpace)
 import Data.List (foldl', nub, sort, find, isPrefixOf, isSuffixOf)
 #if __GLASGOW_HASKELL__ < 709
+import Control.Applicative ((<$>))
 import Data.Monoid (Monoid(..))
 #endif
 import Distribution.Package (PackageIdentifier(..), PackageName)
@@ -138,10 +139,11 @@
         let baseDir = fst . splitFileName $ path
         case getGhcVersion localBuildInfo of
             Nothing -> return $ Left "GHC is not configured"
+
+#if __GLASGOW_HASKELL__ >= 709
             Just _  -> do
                 let mbLibName = pkgLibName pkgDescr
                 let ghcOpts' = foldl' mappend mempty $ map (getComponentGhcOptions localBuildInfo) $ flip allComponentsBy (\c -> c) . localPkgDescr $ localBuildInfo
-#if __GLASGOW_HASKELL__ >= 709
                     -- FIX bug in GhcOptions' `mappend`
                     ghcOpts = ghcOpts' { ghcOptExtra = overNubListR (filter (/= "-Werror")) $ ghcOptExtra ghcOpts'
                                        , ghcOptPackageDBs = sort $ nub (ghcOptPackageDBs ghcOpts')
@@ -153,6 +155,10 @@
 
                 return $ Right $ renderGhcOptions ghcInfo ghcOpts
 #else
+            Just ghcVersion -> do
+                let mbLibName = pkgLibName pkgDescr
+                let ghcOpts' = foldl' mappend mempty $ map (getComponentGhcOptions localBuildInfo) $ flip allComponentsBy (\c -> c) . localPkgDescr $ localBuildInfo
+
                     ghcOpts = ghcOpts' { ghcOptExtra = filter (/= "-Werror") $ nub $ ghcOptExtra ghcOpts'
                                        , ghcOptPackages = filter (\(_, pkgId) -> Just (pkgName pkgId) /= mbLibName) $ nub (ghcOptPackages ghcOpts')
                                        , ghcOptSourcePath = map (baseDir </>) (ghcOptSourcePath ghcOpts')
diff --git a/src/CommandArgs.hs b/src/CommandArgs.hs
--- a/src/CommandArgs.hs
+++ b/src/CommandArgs.hs
@@ -76,6 +76,12 @@
         , line    :: Int
         , col     :: Int
         }
+    | FindSymbol
+        { socket :: Maybe FilePath
+        , ghcOpts :: [String]
+        , symbol :: String
+        , files :: [String]
+        }
     deriving (Show, Data, Typeable)
 
 dummyAdmin :: HDevTools
@@ -121,6 +127,14 @@
     , col     = 0
     }
 
+dummyFindSymbol :: HDevTools
+dummyFindSymbol = FindSymbol
+    { socket = Nothing
+    , ghcOpts = []
+    , symbol = ""
+    , files = []
+    }
+
 admin :: Annotate Ann
 admin = record dummyAdmin
     [ socket       := def += typFile += help "socket file to use"
@@ -164,8 +178,16 @@
     , col      := def += typ "COLUMN" += argPos 2
     ] += help "Get the type of the expression at the specified line and column"
 
+findSymbol :: Annotate Ann
+findSymbol = record dummyFindSymbol
+    [ socket   := def += typFile += help "socket file to use"
+    , ghcOpts  := def += typ "OPTION" += help "ghc options"
+    , symbol   := def += typ "SYMBOL" += argPos 0
+    , files    := def += typFile += args
+    ] += help "List the modules where the given symbol could be found"
+
 full :: String -> Annotate Ann
-full progName = modes_ [admin += auto, check, moduleFile, info, type_]
+full progName = modes_ [admin += auto, check, moduleFile, info, type_, findSymbol]
         += helpArg [name "h", groupname "Help"]
         += versionArg [groupname "Help"]
         += program progName
diff --git a/src/CommandLoop.hs b/src/CommandLoop.hs
--- a/src/CommandLoop.hs
+++ b/src/CommandLoop.hs
@@ -9,8 +9,9 @@
 
 import Control.Monad (when)
 import Data.IORef
-import Data.List (find)
+import Data.List (find, intercalate)
 #if __GLASGOW_HASKELL__ < 709
+import Control.Applicative ((<$>))
 import Data.Traversable (traverse)
 #endif
 import MonadUtils (MonadIO, liftIO)
@@ -27,6 +28,7 @@
 
 import Types (ClientDirective(..), Command(..), CommandExtra(..))
 import Info (getIdentifierInfo, getType)
+import FindSymbol (findSymbol)
 import Cabal (getPackageGhcOpts)
 import Stack
 
@@ -229,6 +231,21 @@
             , show endCol , " "
             , "\"", t, "\""
             ]
+runCommand state clientSend (CmdFindSymbol symbol files) = do
+    result <- withWarnings state False $ findSymbol symbol files
+    case result of
+        []      -> liftIO $ mapM_ clientSend
+                       [ ClientStderr $ "Couldn't find modules containing '" ++ symbol ++ "'"
+                       , ClientExit (ExitFailure 1)
+                       ]
+        modules -> liftIO $ mapM_ clientSend
+                       [ ClientStdout (formatModules modules)
+                       , ClientExit ExitSuccess
+                       ]
+    where
+    formatModules = intercalate "\n"
+
+
 
 #if __GLASGOW_HASKELL__ >= 706
 logAction :: IORef State -> ClientSend -> GHC.DynFlags -> GHC.Severity -> GHC.SrcSpan -> Outputable.PprStyle -> ErrUtils.MsgDoc -> IO ()
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -35,6 +35,7 @@
 fileArg args@(Check {}) = Just $ file args
 fileArg args@(Info  {}) = Just $ file args
 fileArg args@(Type  {}) = Just $ file args
+fileArg (FindSymbol {}) = Nothing
 
 pathArg' :: HDevTools -> Maybe String
 pathArg' (Admin {})      = Nothing
@@ -42,6 +43,7 @@
 pathArg' args@(Check {}) = path args
 pathArg' args@(Info  {}) = path args
 pathArg' args@(Type  {}) = path args
+pathArg' (FindSymbol {}) = Nothing
 
 pathArg :: HDevTools -> Maybe String
 pathArg args = case pathArg' args of
@@ -67,6 +69,7 @@
         ModuleFile {} -> doModuleFile sock args extra
         Info {} -> doInfo sock args extra
         Type {} -> doType sock args extra
+        FindSymbol {} -> doFindSymbol sock args extra
 
 doAdmin :: FilePath -> HDevTools -> CommandExtra -> IO ()
 doAdmin sock args _extra
@@ -108,3 +111,7 @@
 doType :: FilePath -> HDevTools -> CommandExtra -> IO ()
 doType = doFileCommand "type" $
     \args -> CmdType (file args) (line args, col args)
+
+doFindSymbol :: FilePath -> HDevTools -> CommandExtra -> IO ()
+doFindSymbol sock args extra =
+    serverCommand sock (CmdFindSymbol (symbol args) (files args)) extra
diff --git a/src/Types.hs b/src/Types.hs
--- a/src/Types.hs
+++ b/src/Types.hs
@@ -38,4 +38,5 @@
     | CmdModuleFile String
     | CmdInfo FilePath String
     | CmdType FilePath (Int, Int)
+    | CmdFindSymbol String [String]
     deriving (Read, Show)
