diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+## 0.2.0.1
+
+* Switch to conduit 1.3
+* Allow testing with QuickCheck 2.10, 2.11 and 2.12
+
 ## 0.2.0.0
 
 * Export version number in Passman.Core.Version
diff --git a/passman-core.cabal b/passman-core.cabal
--- a/passman-core.cabal
+++ b/passman-core.cabal
@@ -1,5 +1,5 @@
 name:                passman-core
-version:             0.2.0.0
+version:             0.2.0.1
 synopsis:            Deterministic password generator core
 description:
     Generates unique passwords deterministically from a single master password.
@@ -18,8 +18,11 @@
 build-type:          Simple
 extra-source-files:  README.md
                    , ChangeLog.md
-cabal-version:       >=2.0
-tested-with:         GHC >= 8.0.1 && <= 8.2.2
+cabal-version:       2.0
+tested-with:         GHC == 8.0.2
+                   , GHC == 8.2.2
+                   , GHC == 8.4.3
+                   , GHC == 8.6.1
 
 library
   hs-source-dirs:      src
@@ -35,24 +38,22 @@
   autogen-modules:     Paths_passman_core
   ghc-options:         -Wall
   build-depends:       passman-core-internal
-                     , base            >= 4.9     && < 4.11
-                     , aeson           >= 0.7     && < 1.3
+                     , base            >= 4.9      && < 4.13
+                     , aeson           >= 0.7      && < 1.5
                      , bcrypt         ^>= 0.0.10
                      , bytestring     ^>= 0.10.8.1
-                     , conduit        ^>= 1.2.11
-                     , conduit-extra   >= 1.1.5   && < 1.3
-                     , containers     ^>= 0.5.7.1
+                     , conduit        ^>= 1.3.0
+                     , containers      >= 0.5.7.1  && < 0.7
                      , cryptohash-md5 ^>= 0.11.100.1
-                     , csv-conduit    ^>= 0.6.7
+                     , csv-conduit     >= 0.6.7    && < 0.8
                      , data-ordlist   ^>= 0.4.7.0
-                     , directory       >= 1.2.3   && < 1.4
+                     , directory       >= 1.2.3    && < 1.4
                      , filepath       ^>= 1.4.1.0
-                     , int-cast       ^>= 0.1.2.0
+                     , int-cast        >= 0.1.2.0  && < 0.3
                      , memory         ^>= 0.14.6
-                     , resourcet      ^>= 1.1.9
                      , text           ^>= 1.2.2.2
-                     , unix-compat     >= 0.4.3.1 && < 0.6
-                     , yaml           ^>= 0.8.23.3
+                     , unix-compat     >= 0.4.3.1  && < 0.6
+                     , yaml            >= 0.8.23.3 && < 0.11
   default-language:    Haskell2010
   other-extensions:    GeneralizedNewtypeDeriving
                        OverloadedStrings
@@ -94,11 +95,12 @@
                      , filepath
                      , text
 
-                     , async              ^>= 2.1.0
-                     , QuickCheck         ^>= 2.9.2
-                     , quickcheck-unicode ^>= 1.0.1.0
-                     , template-haskell    >= 2.11 && < 2.13
-                     , temporary          ^>= 1.2.0.3
+                     , async                 >= 2.1.0   && < 2.3
+                     , QuickCheck            >= 2.9.2   && < 2.13
+                     , quickcheck-instances ^>= 0.3.13
+                     , quickcheck-unicode   ^>= 1.0.1.0
+                     , template-haskell      >= 2.11    && < 2.15
+                     , temporary             >= 1.2.0.3 && < 1.4
   default-language:    Haskell2010
   other-extensions:    TemplateHaskell
                        TemplateHaskellQuotes
diff --git a/src/Passman/Core/Entry.hs b/src/Passman/Core/Entry.hs
--- a/src/Passman/Core/Entry.hs
+++ b/src/Passman/Core/Entry.hs
@@ -39,14 +39,12 @@
     , entryToCsv
     ) where
 
-import           Control.Monad.Trans.Resource (MonadResource, MonadThrow,
-                                               throwM)
+import           Conduit (MonadResource, MonadThrow, throwM, ConduitT, (.|),
+                          mapC, mapMC, sourceFile, sinkFile, sinkIOHandle,
+                          decodeUtf8C, encodeUtf8C)
+
 import           Control.Monad                (mfilter)
 
-import           Data.Conduit        (ConduitM, (.|))
-import qualified Data.Conduit.List   as C
-import           Data.Conduit.Binary (sourceFile, sinkFile, sinkIOHandle)
-import           Data.Conduit.Text   (decodeUtf8, encodeUtf8)
 import           Data.CSV.Conduit    (intoCSV, fromCSV, defCSVSettings)
 
 import           Numeric.Natural (Natural)
@@ -92,12 +90,12 @@
     deriving (Show, Eq)
 
 -- | Load `Entry`s from the specified file.
-load :: MonadResource m => FilePath -> ConduitM i Entry m ()
-load f = sourceFile f .| decodeUtf8 .| textToEntry
+load :: (MonadThrow m, MonadResource m) => FilePath -> ConduitT i Entry m ()
+load f = sourceFile f .| decodeUtf8C .| textToEntry
 
 -- | Convert `Text` into `Entry`s.
-textToEntry :: MonadThrow m => ConduitM Text Entry m ()
-textToEntry = intoCSV defCSVSettings .| C.mapM csvToEntry
+textToEntry :: MonadThrow m => ConduitT Text Entry m ()
+textToEntry = intoCSV defCSVSettings .| mapMC csvToEntry
 
 -- | Attempt to convert CSV fields into an `Entry`.
 csvToEntry :: MonadThrow m => [Text] -> m Entry
@@ -108,17 +106,17 @@
 csvToEntry _       = failM "too many columns"
 
 -- | Save `Entry`s to the specified file.
-save :: MonadResource m => FilePath -> ConduitM Entry o m ()
-save f = entryToText .| encodeUtf8 .| sinkFile f
+save :: MonadResource m => FilePath -> ConduitT Entry o m ()
+save f = entryToText .| encodeUtf8C .| sinkFile f
 
 -- | Append `Entry`s to the specified file.
-append :: MonadResource m => FilePath -> ConduitM Entry o m ()
-append fp = entryToText .| encodeUtf8 .| sinkIOHandle
+append :: MonadResource m => FilePath -> ConduitT Entry o m ()
+append fp = entryToText .| encodeUtf8C .| sinkIOHandle
     (openBinaryFile fp AppendMode)
 
 -- | Convert an `Entry` into `Text` for saving to file.
-entryToText :: Monad m => ConduitM Entry Text m ()
-entryToText = C.map entryToCsv .| fromCSV defCSVSettings
+entryToText :: Monad m => ConduitT Entry Text m ()
+entryToText = mapC entryToCsv .| fromCSV defCSVSettings
 
 -- | Convert an `Entry` into CSV fields.
 entryToCsv :: Entry -> [Text]
diff --git a/test/precomputed.hs b/test/precomputed.hs
--- a/test/precomputed.hs
+++ b/test/precomputed.hs
@@ -19,8 +19,7 @@
 
 import           Data.Functor.Identity (Identity (Identity))
 
-import           Data.Conduit       ((.|), yield, sourceToList)
-import           Data.Conduit.Lift  (runCatchC)
+import           Conduit ((.|), yield, sourceToList, runCatchC)
 
 import           Data.Maybe         (fromJust)
 import           Data.Yaml          (decode)
diff --git a/test/properties.hs b/test/properties.hs
--- a/test/properties.hs
+++ b/test/properties.hs
@@ -31,21 +31,21 @@
 import           Data.Maybe            (fromJust, isJust)
 import qualified Data.Text             as T
 
-import           Data.Conduit      ((.|), sourceToList, runConduitRes)
-import           Data.Conduit.List (sourceList, consume)
-import           Data.Conduit.Lift (runCatchC)
+import           Conduit ((.|), runConduitRes, runResourceT, runCatchC,
+                          sourceToList, yieldMany)
 
 import           System.IO.Temp  (withSystemTempDirectory)
 import           System.FilePath ((</>))
 import           System.Exit     (exitFailure)
 
-import           Test.QuickCheck         (Arbitrary (arbitrary, shrink), Gen,
-                                          Result, Property, suchThat,
-                                          arbitraryBoundedEnum)
-import           Test.QuickCheck.Monadic (PropertyM, assert, run, monadicIO,
-                                          pre)
-import           Test.QuickCheck.Test    (isSuccess, output)
-import qualified Test.QuickCheck.Unicode as U
+import           Test.QuickCheck           (Arbitrary (arbitrary, shrink), Gen,
+                                            Result, Property, suchThat,
+                                            arbitraryBoundedEnum)
+import           Test.QuickCheck.Monadic   (PropertyM, assert, run, monadicIO,
+                                            pre)
+import           Test.QuickCheck.Test      (isSuccess, output)
+import qualified Test.QuickCheck.Unicode   as U
+import           Test.QuickCheck.Instances ()
 
 import           Passman.Core.Mode  (SingletonMode, Mode (Mode), validModes,
                                      readMode, characterCode)
@@ -126,16 +126,16 @@
 prop_showReadEntry :: [Entry] -> Bool
 prop_showReadEntry xs = xs == xs'
   where
-    Identity xs' = sourceToList (sourceList xs .| entryToText .| textToEntry')
+    Identity xs' = sourceToList (yieldMany xs .| entryToText .| textToEntry')
     textToEntry' = runCatchC textToEntry >>= either (fail . show) pure
 
 prop_saveAppendLoadEntry :: [Entry] -> [Entry] -> Property
 prop_saveAppendLoadEntry xs ys = monadicIO $ do
     zs <- run $ withSystemTempDirectory "passman-testcase" $ \dir -> do
         let fp = dir </> "list.txt"
-        runConduitRes $ sourceList xs .| save fp
-        runConduitRes $ sourceList ys .| append fp
-        runConduitRes $ load fp .| consume
+        runConduitRes $ yieldMany xs .| save fp
+        runConduitRes $ yieldMany ys .| append fp
+        runResourceT  $ sourceToList $ load fp
     assert $ (xs ++ ys) == zs
 
 prop_toFromBase :: Natural -> Natural -> Bool
