diff --git a/cabal-bounds.cabal b/cabal-bounds.cabal
--- a/cabal-bounds.cabal
+++ b/cabal-bounds.cabal
@@ -1,5 +1,5 @@
 name: cabal-bounds
-version: 0.2
+version: 0.2.1
 cabal-version: >=1.9.2
 build-type: Simple
 license: BSD3
@@ -26,20 +26,20 @@
              .
              > # update the version infos of all libraries
              > $> cabal update
-             > 
+             >
              > # drops the upper bound of all dependencies in 'myproject.cabal',
              > # most likely you want to ignore 'base'
              > $> cabal-bounds drop --upper --ignore=base myproject.cabal
-             > 
+             >
              > # create a cabal sandbox for building of 'myproject'
              > $> cabal sandbox init
-             >   
+             >
              > # build 'myproject'
              > $> cabal install
-             > 
+             >
              > # update the upper bound of all dependencies in 'myproject.cabal'
              > # by the cabal build information
-             > $> cabal-bounds update --upper --ignore=base myproject.cabal dist/dist-sandbox-*/setup-config 
+             > $> cabal-bounds update --upper --ignore=base myproject.cabal dist/dist-sandbox-*/setup-config
              .
              .
              .
@@ -51,7 +51,7 @@
              .
              > $> cabal-bounds drop ...
              > lens >=4.0.1 && <4.1   =>   lens
-             > 
+             >
              > $> cabal-bounds drop --upper ...
              > lens >=4.0.1 && <4.1   =>   lens >=4.0.1
              .
@@ -100,8 +100,8 @@
              .
              > $> cabal --version
              > cabal-install version 1.18.0.2
-             > using version 1.18.1 of the Cabal library 
-             > 
+             > using version 1.18.1 of the Cabal library
+             >
              > $> cabal install --constraint="Cabal == 1.18.1" cabal-bounds
              .
              If you update the 'cabal' binary and the used 'Cabal' library changes, then you have to rebuild 'cabal-bounds'.
@@ -164,8 +164,10 @@
  
 library
     build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,
-                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19
-    exposed-modules: CabalBounds.Args CabalBounds.Main CabalBounds.VersionComp
+                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4,
+                   unordered-containers >=0.2.3.3 && <0.3, Cabal >=1.18.0 && <1.19
+    exposed-modules: CabalBounds.Args CabalBounds.Main
+                     CabalBounds.VersionComp
     exposed: True
     buildable: True
     cpp-options: -DCABAL
@@ -177,7 +179,8 @@
  
 executable cabal-bounds
     build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,
-                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19
+                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4,
+                   unordered-containers >=0.2.3.3 && <0.3, Cabal >=1.18.0 && <1.19
     main-is: Main.hs
     buildable: True
     cpp-options: -DCABAL
@@ -190,7 +193,8 @@
  
 test-suite cabal-bounds-tests
     build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,
-                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19,
+                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4,
+                   unordered-containers >=0.2.3.3 && <0.3, Cabal >=1.18.0 && <1.19,
                    tasty ==0.7.*, tasty-golden >=2.2.0.2 && <2.3,
                    filepath >=1.3.0.1 && <1.4, cabal-bounds -any
     type: exitcode-stdio-1.0
diff --git a/src/CabalBounds/Drop.hs b/src/CabalBounds/Drop.hs
--- a/src/CabalBounds/Drop.hs
+++ b/src/CabalBounds/Drop.hs
@@ -18,10 +18,7 @@
 
 drop :: DropBound -> Targets -> Dependencies -> GenericPackageDescription -> GenericPackageDescription
 drop bound AllTargets deps pkgDescrp =
-   pkgDescrp & L.dependenciesOfLib        . filterDeps %~ dropFromDep
-             & L.dependenciesOfAllExes    . filterDeps %~ dropFromDep
-             & L.dependenciesOfAllTests   . filterDeps %~ dropFromDep
-             & L.dependenciesOfAllBenchms . filterDeps %~ dropFromDep
+   pkgDescrp & L.allDependencies . filterDeps %~ dropFromDep
    where
       filterDeps  = filterDependencies deps
       dropFromDep = dropFromDependency bound
diff --git a/src/CabalBounds/Lenses.hs b/src/CabalBounds/Lenses.hs
--- a/src/CabalBounds/Lenses.hs
+++ b/src/CabalBounds/Lenses.hs
@@ -3,6 +3,7 @@
 module CabalBounds.Lenses
    ( vbranch
    , vtags
+   , allDependencies
    , dependenciesOfLib
    , dependenciesOfAllExes
    , dependenciesOfExe
@@ -27,6 +28,10 @@
 makeLensesFor [ ("versionBranch", "vbranch")
               , ("versionTags"  , "vtags")
               ] ''Version
+
+
+allDependencies :: Traversal' GenericPackageDescription [Dependency]
+allDependencies = biplate
 
 dependenciesOfLib :: Traversal' GenericPackageDescription [Dependency]
 dependenciesOfLib = condLibraryL . _Just . biplate
diff --git a/src/CabalBounds/Update.hs b/src/CabalBounds/Update.hs
--- a/src/CabalBounds/Update.hs
+++ b/src/CabalBounds/Update.hs
@@ -7,30 +7,31 @@
 import qualified Distribution.PackageDescription as D
 import qualified Distribution.Package as P
 import qualified Distribution.Version as V
-import qualified Distribution.Simple.LocalBuildInfo as L
+import qualified Distribution.Simple.LocalBuildInfo as BI
 import qualified Distribution.Simple.PackageIndex as PX
 import qualified Distribution.InstalledPackageInfo as PI
 import Control.Lens
+import Control.Applicative ((<$>))
 import CabalBounds.Bound (UpdateBound(..))
 import CabalBounds.Targets (Targets(..), dependenciesOf)
 import CabalBounds.Dependencies (Dependencies, filterDependencies)
 import CabalBounds.VersionComp (VersionComp(..), defaultLowerComp)
-import CabalBounds.Lenses
-import Data.List (sort, foldl', find)
+import qualified CabalBounds.Lenses as L
+import Data.List (sort, foldl')
+import qualified Data.HashMap.Strict as HM
+import Data.Maybe (fromMaybe, listToMaybe)
 
-type InstalledPackages = [(P.PackageName, V.Version)]
+type PkgName           = String
+type InstalledPackages = HM.HashMap PkgName V.Version
 
-update :: UpdateBound -> Targets -> Dependencies -> D.GenericPackageDescription -> L.LocalBuildInfo -> D.GenericPackageDescription
+
+update :: UpdateBound -> Targets -> Dependencies -> D.GenericPackageDescription -> BI.LocalBuildInfo -> D.GenericPackageDescription
 update bound AllTargets deps pkgDescrp buildInfo =
-   pkgDescrp & dependenciesOfLib        . filterDeps %~ updateDep
-             & dependenciesOfAllExes    . filterDeps %~ updateDep
-             & dependenciesOfAllTests   . filterDeps %~ updateDep
-             & dependenciesOfAllBenchms . filterDeps %~ updateDep
+   pkgDescrp & L.allDependencies . filterDeps %~ updateDep
    where
       filterDeps = filterDependencies deps
       updateDep  = updateDependency bound (installedPackages buildInfo)
 
-
 update bound (Targets targets) deps pkgDescrp buildInfo =
    foldl' updateTarget pkgDescrp targets
    where
@@ -42,65 +43,81 @@
 
 
 updateDependency :: UpdateBound -> InstalledPackages -> P.Dependency -> P.Dependency
-updateDependency (UpdateLower comp) instPkgs dep@(P.Dependency pkgName _)
-   | Just (_, version) <- find ((== pkgName) . fst) instPkgs
-   , Just intervals    <- versionIntervals (versionComp comp version) Nothing
-   = P.Dependency pkgName (V.fromVersionIntervals intervals)
-
-   | otherwise
-   = dep
-
-updateDependency (UpdateUpper comp) instPkgs dep@(P.Dependency pkgName versionRange)
-   | not . V.isAnyVersion $ versionRange
-   , Just (_, upperVersion)             <- find ((== pkgName) . fst) instPkgs
-   , (V.LowerBound lowerVersion _, _):_ <- V.asVersionIntervals versionRange
-   , Just intervals                     <- versionIntervals lowerVersion (Just $ nextVersion $ versionComp comp upperVersion)
-   = P.Dependency pkgName (V.fromVersionIntervals intervals)
+updateDependency (UpdateLower comp) instPkgs dep =
+   fromMaybe dep $ do
+      let pkgName_ = pkgName dep
+      version <- HM.lookup pkgName_ instPkgs
+      vrange  <- mkVersionRange (comp `compOf` version) Nothing
+      return $ mkDependency pkgName_ vrange
 
-   | otherwise
+updateDependency (UpdateUpper comp) instPkgs dep
+   | V.isAnyVersion versionRange_
    = updateDependency (UpdateBoth defaultLowerComp comp) instPkgs dep
 
-updateDependency (UpdateBoth lowerComp upperComp) instPkgs dep@(P.Dependency pkgName _)
-   | Just (_, version) <- find ((== pkgName) . fst) instPkgs
-   , Just intervals    <- versionIntervals (versionComp lowerComp version) (Just $ nextVersion $ versionComp upperComp version)
-   = P.Dependency pkgName (V.fromVersionIntervals intervals)
-
    | otherwise
-   = dep
+   = fromMaybe dep $ do
+        upperVersion                <- HM.lookup pkgName_ instPkgs
+        V.LowerBound lowerVersion _ <- fst <$> (listToMaybe $ V.asVersionIntervals versionRange_)
+        vrange                      <- mkVersionRange lowerVersion (Just $ nextVersion $ comp `compOf` upperVersion)
+        return $ mkDependency pkgName_ vrange
+   where
+      versionRange_ = versionRange dep
+      pkgName_      = pkgName dep
 
+updateDependency (UpdateBoth lowerComp upperComp) instPkgs dep =
+   fromMaybe dep $ do
+      let pkgName_ = pkgName dep
+      version <- HM.lookup pkgName_ instPkgs
+      vrange  <- mkVersionRange (lowerComp `compOf` version) (Just $ nextVersion $ upperComp `compOf` version)
+      return $ mkDependency pkgName_ vrange
 
-versionIntervals :: V.Version -> Maybe V.Version -> Maybe V.VersionIntervals
-versionIntervals lowerVersion Nothing =
-   V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.NoUpperBound)]
 
-versionIntervals lowerVersion (Just upperVersion) =
-   V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.UpperBound upperVersion V.ExclusiveBound)]
+mkVersionRange :: V.Version -> Maybe V.Version -> Maybe V.VersionRange
+mkVersionRange lowerVersion Nothing =
+   V.fromVersionIntervals <$> V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.NoUpperBound)]
 
+mkVersionRange lowerVersion (Just upperVersion) =
+   V.fromVersionIntervals <$> V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound,
+                                                     V.UpperBound upperVersion V.ExclusiveBound)]
 
-versionComp :: VersionComp -> V.Version -> V.Version
-versionComp Major1 version =
-   version & vbranch %~ take 1
-           & vtags   .~ []
 
-versionComp Major2 version =
-   version & vbranch %~ take 2
-           & vtags   .~ []
+compOf :: VersionComp -> V.Version -> V.Version
+Major1 `compOf` version =
+   version & L.vbranch %~ take 1
+           & L.vtags   .~ []
 
-versionComp Minor version =
-   version & vtags .~ []
+Major2 `compOf` version =
+   version & L.vbranch %~ take 2
+           & L.vtags   .~ []
 
+Minor `compOf` version =
+   version & L.vtags .~ []
 
+
 nextVersion :: V.Version -> V.Version
 nextVersion version =
-   version & vbranch %~ increaseLast
+   version & L.vbranch %~ increaseLastComp
    where
-      increaseLast = reverse . (& ix 0 %~ (+ 1)) . reverse
+      increaseLastComp = reverse . (& ix 0 %~ (+ 1)) . reverse
 
 
-installedPackages :: L.LocalBuildInfo -> InstalledPackages
-installedPackages = map (& _2 %~ newestVersion)
+installedPackages :: BI.LocalBuildInfo -> InstalledPackages
+installedPackages = HM.fromList
+                    . map (\(P.PackageName n, v) -> (n, newestVersion v))
                     . filter ((not . null) . snd)
-                    . PX.allPackagesByName . L.installedPkgs
+                    . PX.allPackagesByName . BI.installedPkgs
    where
       newestVersion :: [PI.InstalledPackageInfo] -> V.Version
       newestVersion = last . sort . map (P.pkgVersion . PI.sourcePackageId)
+
+
+pkgName :: P.Dependency -> PkgName
+pkgName (P.Dependency (P.PackageName name) _) = name
+
+
+versionRange :: P.Dependency -> V.VersionRange
+versionRange (P.Dependency _ vrange) = vrange
+
+
+mkDependency :: PkgName -> V.VersionRange -> P.Dependency
+mkDependency name vrange = P.Dependency (P.PackageName name) vrange
