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.4.1
+version: 0.5
 cabal-version: >=1.9.2
 build-type: Simple
 license: BSD3
@@ -178,6 +178,7 @@
         unordered-containers >=0.2.3.3 && <0.3,
         transformers >=0.3.0.0 && <0.4,
         either >=4.1.1 && <4.2,
+        cabal-lenses >=0.1 && <0.2,
         Cabal >=1.18.0 && <1.21
     exposed-modules:
         CabalBounds.Args
@@ -194,7 +195,6 @@
         CabalBounds.Dependencies
         CabalBounds.Drop
         CabalBounds.Update
-        CabalBounds.Lenses
     ghc-options: -W
  
 executable cabal-bounds
diff --git a/lib/CabalBounds/Dependencies.hs b/lib/CabalBounds/Dependencies.hs
--- a/lib/CabalBounds/Dependencies.hs
+++ b/lib/CabalBounds/Dependencies.hs
@@ -3,7 +3,7 @@
 module CabalBounds.Dependencies
    ( Dependencies(..)
    , dependencies
-   , filterDependencies
+   , filterDependency
    ) where
 
 import Control.Lens
@@ -28,12 +28,12 @@
    = AllDependencies
 
 
-filterDependencies :: Dependencies -> Traversal' [Dependency] Dependency
-filterDependencies AllDependencies =
-   traversed
+filterDependency :: Dependencies -> Traversal' Dependency Dependency
+filterDependency AllDependencies =
+   filtered (const True)
 
-filterDependencies (OnlyDependencies deps) =
-   traversed . filtered (\(Dependency (PackageName pkgName) _) -> pkgName `elem` deps)
+filterDependency (OnlyDependencies deps) =
+   filtered (\(Dependency (PackageName pkgName) _) -> pkgName `elem` deps)
 
-filterDependencies (IgnoreDependencies deps) =
-   traversed . filtered (\(Dependency (PackageName pkgName) _) -> pkgName `notElem` deps)
+filterDependency (IgnoreDependencies deps) =
+   filtered (\(Dependency (PackageName pkgName) _) -> pkgName `notElem` deps)
diff --git a/lib/CabalBounds/Drop.hs b/lib/CabalBounds/Drop.hs
--- a/lib/CabalBounds/Drop.hs
+++ b/lib/CabalBounds/Drop.hs
@@ -7,31 +7,24 @@
 import Prelude hiding (drop)
 import Control.Lens
 import CabalBounds.Bound (DropBound(..))
-import CabalBounds.Sections (Sections(..), dependenciesOf)
-import CabalBounds.Dependencies (Dependencies, filterDependencies)
-import qualified CabalBounds.Lenses as L
+import CabalBounds.Dependencies (Dependencies, filterDependency)
+import qualified CabalLenses as CL
 import Data.List (foldl')
 import Distribution.PackageDescription (GenericPackageDescription)
 import Distribution.Package (Dependency(..))
 import Distribution.Version (mkVersionIntervals, fromVersionIntervals, asVersionIntervals, UpperBound(..), anyVersion)
 
 
-drop :: DropBound -> Sections -> Dependencies -> GenericPackageDescription -> GenericPackageDescription
-drop bound AllSections deps pkgDescrp =
-   pkgDescrp & L.allDependencies . filterDeps %~ dropFromDep
-   where
-      filterDeps  = filterDependencies deps
-      dropFromDep = dropFromDependency bound
-
-
-drop bound (Sections sections) deps pkgDescrp =
+drop :: DropBound -> [CL.Section] -> Dependencies -> GenericPackageDescription -> GenericPackageDescription
+drop bound sections deps pkgDescrp =
    foldl' dropFromSection pkgDescrp sections
    where
       dropFromSection pkgDescrp section =
-         pkgDescrp & dependenciesOf section . filterDeps %~ dropFromDep
+         pkgDescrp & CL.dependencyIf condVars section . filterDep %~ dropFromDep
 
-      filterDeps  = filterDependencies deps
+      filterDep   = filterDependency deps
       dropFromDep = dropFromDependency bound
+      condVars    = CL.fromDefaults pkgDescrp
 
 
 dropFromDependency :: DropBound -> Dependency -> Dependency
diff --git a/lib/CabalBounds/Lenses.hs b/lib/CabalBounds/Lenses.hs
deleted file mode 100644
--- a/lib/CabalBounds/Lenses.hs
+++ /dev/null
@@ -1,55 +0,0 @@
-{-# LANGUAGE TemplateHaskell, Rank2Types #-}
-
-module CabalBounds.Lenses
-   ( vbranch
-   , vtags
-   , allDependencies
-   , dependenciesOfLib
-   , dependenciesOfAllExes
-   , dependenciesOfExe
-   , dependenciesOfAllTests
-   , dependenciesOfTest
-   , dependenciesOfAllBenchms
-   , dependenciesOfBenchm
-   ) where
-
-import Distribution.PackageDescription
-import Distribution.Package
-import Distribution.Version
-import Control.Lens
-import Data.Data.Lens
-
-makeLensesFor [ ("condLibrary"    , "condLibraryL")
-              , ("condExecutables", "condExecutablesL")
-              , ("condTestSuites" , "condTestSuitesL")
-              , ("condBenchmarks" , "condBenchmarksL")
-              ] ''GenericPackageDescription
-
-makeLensesFor [ ("versionBranch", "vbranch")
-              , ("versionTags"  , "vtags")
-              ] ''Version
-
-
-allDependencies :: Traversal' GenericPackageDescription [Dependency]
-allDependencies = biplate
-
-dependenciesOfLib :: Traversal' GenericPackageDescription [Dependency]
-dependenciesOfLib = condLibraryL . _Just . biplate
-
-dependenciesOfAllExes :: Traversal' GenericPackageDescription [Dependency]
-dependenciesOfAllExes = condExecutablesL . traversed . _2 . biplate
-
-dependenciesOfExe :: String -> Traversal' GenericPackageDescription [Dependency]
-dependenciesOfExe exe = condExecutablesL . traversed . filtered ((== exe) . fst) . _2 . biplate
-
-dependenciesOfAllTests :: Traversal' GenericPackageDescription [Dependency]
-dependenciesOfAllTests = condTestSuitesL . traversed . _2 . biplate
-
-dependenciesOfTest :: String -> Traversal' GenericPackageDescription [Dependency]
-dependenciesOfTest test = condTestSuitesL . traversed . filtered ((== test) . fst) . _2 . biplate
-
-dependenciesOfAllBenchms :: Traversal' GenericPackageDescription [Dependency]
-dependenciesOfAllBenchms = condBenchmarksL . traversed . _2 . biplate
-
-dependenciesOfBenchm :: String -> Traversal' GenericPackageDescription [Dependency]
-dependenciesOfBenchm benchm = condBenchmarksL . traversed . filtered ((== benchm) . fst) . _2 . biplate
diff --git a/lib/CabalBounds/Main.hs b/lib/CabalBounds/Main.hs
--- a/lib/CabalBounds/Main.hs
+++ b/lib/CabalBounds/Main.hs
@@ -26,14 +26,14 @@
 cabalBounds args@A.Drop {} =
    leftToJust <$> runEitherT (do
       pkgDescrp <- packageDescription $ A.cabalFile args
-      let pkgDescrp' = D.drop (B.boundOfDrop args) (S.sections args) (DP.dependencies args) pkgDescrp
+      let pkgDescrp' = D.drop (B.boundOfDrop args) (S.sections args pkgDescrp) (DP.dependencies args) pkgDescrp
       liftIO $ writeFile (A.outputFile args) (showGenericPackageDescription pkgDescrp'))
 
 cabalBounds args@A.Update {} =
    leftToJust <$> runEitherT (do
       pkgDescrp <- packageDescription $ A.cabalFile args
       buildInfo <- localBuildInfo $ A.setupConfigFile args
-      let pkgDescrp' = U.update (B.boundOfUpdate args) (S.sections args) (DP.dependencies args) pkgDescrp buildInfo
+      let pkgDescrp' = U.update (B.boundOfUpdate args) (S.sections args pkgDescrp) (DP.dependencies args) pkgDescrp buildInfo
       liftIO $ writeFile (A.outputFile args) (showGenericPackageDescription pkgDescrp'))
 
 
diff --git a/lib/CabalBounds/Sections.hs b/lib/CabalBounds/Sections.hs
--- a/lib/CabalBounds/Sections.hs
+++ b/lib/CabalBounds/Sections.hs
@@ -1,45 +1,22 @@
-{-# LANGUAGE PatternGuards, Rank2Types #-}
+{-# LANGUAGE PatternGuards #-}
 
 module CabalBounds.Sections
-   ( Sections(..)
-   , Section(..)
-   , sections
-   , dependenciesOf
+   ( sections
    ) where
 
-import Control.Lens
-import Distribution.PackageDescription (GenericPackageDescription(..))
-import Distribution.Package (Dependency(..))
+import Distribution.PackageDescription (GenericPackageDescription)
 import CabalBounds.Args (Args)
 import qualified CabalBounds.Args as A
-import qualified CabalBounds.Lenses as L
-
-data Sections = Sections [Section]
-              | AllSections
-              deriving (Show, Eq)
-
--- | A section of the cabal file.
-data Section = Library
-             | Executable String
-             | TestSuite String
-             | Benchmark String
-             deriving (Show, Eq)
+import qualified CabalLenses as CL
 
-sections :: Args -> Sections
-sections args
-   | ts@(_:_) <- concat [ [ Library | A.library args ]
-                        , map Executable (A.executable args)
-                        , map TestSuite (A.testSuite args)
-                        , map Benchmark (A.benchmark args)
+sections :: Args -> GenericPackageDescription -> [CL.Section]
+sections args pkgDescrp
+   | ss@(_:_) <- concat [ [ CL.Library | A.library args ]
+                        , map CL.Executable (A.executable args)
+                        , map CL.TestSuite (A.testSuite args)
+                        , map CL.Benchmark (A.benchmark args)
                         ]
-   = Sections ts
+   = ss
 
    | otherwise
-   = AllSections
-
-
-dependenciesOf :: Section -> Traversal' GenericPackageDescription [Dependency]
-dependenciesOf Library            = L.dependenciesOfLib
-dependenciesOf (Executable exe)   = L.dependenciesOfExe exe
-dependenciesOf (TestSuite test)   = L.dependenciesOfTest test
-dependenciesOf (Benchmark benchm) = L.dependenciesOfBenchm benchm
+   = CL.allSections pkgDescrp
diff --git a/lib/CabalBounds/Update.hs b/lib/CabalBounds/Update.hs
--- a/lib/CabalBounds/Update.hs
+++ b/lib/CabalBounds/Update.hs
@@ -10,10 +10,9 @@
 import qualified Distribution.InstalledPackageInfo as PI
 import Control.Lens
 import CabalBounds.Bound (UpdateBound(..))
-import CabalBounds.Sections (Sections(..), dependenciesOf)
-import CabalBounds.Dependencies (Dependencies, filterDependencies)
+import CabalBounds.Dependencies (Dependencies, filterDependency)
 import CabalBounds.VersionComp (VersionComp(..))
-import qualified CabalBounds.Lenses as L
+import qualified CabalLenses as CL
 import Data.List (foldl')
 import qualified Data.HashMap.Strict as HM
 import Data.Maybe (fromMaybe)
@@ -22,21 +21,16 @@
 type InstalledPackages = HM.HashMap PkgName V.Version
 
 
-update :: UpdateBound -> Sections -> Dependencies -> D.GenericPackageDescription -> BI.LocalBuildInfo -> D.GenericPackageDescription
-update bound AllSections deps pkgDescrp buildInfo =
-   pkgDescrp & L.allDependencies . filterDeps %~ updateDep
-   where
-      filterDeps = filterDependencies deps
-      updateDep  = updateDependency bound (installedPackages buildInfo)
-
-update bound (Sections sections) deps pkgDescrp buildInfo =
+update :: UpdateBound -> [CL.Section] -> Dependencies -> D.GenericPackageDescription -> BI.LocalBuildInfo -> D.GenericPackageDescription
+update bound sections deps pkgDescrp buildInfo =
    foldl' updateSection pkgDescrp sections
    where
       updateSection pkgDescrp section =
-         pkgDescrp & dependenciesOf section . filterDeps %~ updateDep
+         pkgDescrp & CL.dependencyIf condVars section . filterDep %~ updateDep
 
-      filterDeps = filterDependencies deps
-      updateDep  = updateDependency bound (installedPackages buildInfo)
+      filterDep = filterDependency deps
+      updateDep = updateDependency bound (installedPackages buildInfo)
+      condVars  = CL.fromDefaults pkgDescrp
 
 
 updateDependency :: UpdateBound -> InstalledPackages -> P.Dependency -> P.Dependency
@@ -81,20 +75,20 @@
 
 compOf :: VersionComp -> V.Version -> V.Version
 Major1 `compOf` version =
-   version & L.vbranch %~ take 1
-           & L.vtags   .~ []
+   version & CL.versionBranchL %~ take 1
+           & CL.versionTagsL   .~ []
 
 Major2 `compOf` version =
-   version & L.vbranch %~ take 2
-           & L.vtags   .~ []
+   version & CL.versionBranchL %~ take 2
+           & CL.versionTagsL   .~ []
 
 Minor `compOf` version =
-   version & L.vtags .~ []
+   version & CL.versionTagsL .~ []
 
 
 nextVersion :: V.Version -> V.Version
 nextVersion version =
-   version & L.vbranch %~ increaseLastComp
+   version & CL.versionBranchL %~ increaseLastComp
    where
       increaseLastComp = reverse . (& ix 0 %~ (+ 1)) . reverse
 
