diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,10 @@
 The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 
+## 0.4.1
+### Added
+- Support column families.
+
 ## 0.4.0
 ### Changed
 - Depend on my new Haskell bindings.
diff --git a/rocksdb-query.cabal b/rocksdb-query.cabal
--- a/rocksdb-query.cabal
+++ b/rocksdb-query.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 9db21bfab84b1726ca28c3398842c81f3e8d774dd4d5cde2f5667f64a52b70c9
+-- hash: b80763c5cc5ac5d920a8520a11db9cf0eb4634498bd96fe94c7bca37ca199021
 
 name:           rocksdb-query
-version:        0.4.0
+version:        0.4.1
 synopsis:       RocksDB database querying library for Haskell
 description:    Please see the README on GitHub at <https://github.com/jprupp/rocksdb-query#readme>
 category:       Database
@@ -39,7 +39,7 @@
     , cereal
     , conduit
     , resourcet
-    , rocksdb-haskell-jprupp
+    , rocksdb-haskell-jprupp >=2.1.1
     , unliftio
   default-language: Haskell2010
 
@@ -56,7 +56,7 @@
     , cereal
     , data-default
     , hspec
-    , rocksdb-haskell-jprupp
+    , rocksdb-haskell-jprupp >=2.1.1
     , rocksdb-query
     , unliftio
   default-language: Haskell2010
diff --git a/src/Database/RocksDB/Query.hs b/src/Database/RocksDB/Query.hs
--- a/src/Database/RocksDB/Query.hs
+++ b/src/Database/RocksDB/Query.hs
@@ -39,6 +39,25 @@
                 Left e  -> throwString e
                 Right x -> return (Just x)
 
+-- | Read a value from the database, or 'Nothing' if not found.
+retrieveCommon ::
+       (MonadIO m, KeyValue key value, Serialize key, Serialize value)
+    => DB
+    -> Maybe ColumnFamily
+    -> key
+    -> m (Maybe value)
+retrieveCommon db mcf key =
+    f >>= \case
+        Nothing -> return Nothing
+        Just bytes ->
+            case decode bytes of
+                Left e  -> throwString e
+                Right x -> return (Just x)
+  where
+    f = case mcf of
+        Just cf -> R.getCF db cf (encode key)
+        Nothing -> R.get db (encode key)
+
 matchRecursiveList ::
      (MonadIO m, KeyValue key value, Serialize key, Serialize value)
   => key
@@ -142,10 +161,25 @@
     -> m ()
 insert db key value = R.put db (encode key) (encode value)
 
+-- | Insert a record into the database.
+insertCF ::
+       (MonadIO m, KeyValue key value, Serialize key, Serialize value)
+    => DB
+    -> ColumnFamily
+    -> key
+    -> value
+    -> m ()
+insertCF db cf key value = R.putCF db cf (encode key) (encode value)
+
 -- | Delete a record from the database.
 remove :: (MonadIO m, Key key, Serialize key) => DB -> key -> m ()
 remove db key = delete db (encode key)
 
+-- | Delete a record from the database.
+removeCF :: (MonadIO m, Key key, Serialize key)
+         => DB -> ColumnFamily -> key -> m ()
+removeCF db cf key = deleteCF db cf (encode key)
+
 -- | Get the 'BatchOp' to insert a record in the database.
 insertOp ::
        (KeyValue key value, Serialize key, Serialize value)
@@ -154,10 +188,23 @@
     -> BatchOp
 insertOp key value = R.Put (encode key) (encode value)
 
+-- | Get the 'BatchOp' to insert a record in the database.
+insertOpCF ::
+       (KeyValue key value, Serialize key, Serialize value)
+    => ColumnFamily
+    -> key
+    -> value
+    -> BatchOp
+insertOpCF cf key value = R.PutCF cf (encode key) (encode value)
+
 -- | Get the 'BatchOp' to delete a record from the database.
 deleteOp :: (Key key, Serialize key) => key -> BatchOp
 deleteOp key = Del (encode key)
 
+-- | Get the 'BatchOp' to delete a record from the database.
+deleteOpCF :: (Key key, Serialize key) => ColumnFamily -> key -> BatchOp
+deleteOpCF cf key = DelCF cf (encode key)
+
 -- | Write a batch to the database.
 writeBatch :: MonadIO m => DB -> [BatchOp] -> m ()
 writeBatch = write
@@ -175,6 +222,20 @@
 firstMatching db base =
     withIter db $ \it -> runConduit $ matching it base .| headC
 
+-- | Like 'matching' but return the first element only.
+firstMatchingCF ::
+       ( MonadUnliftIO m
+       , KeyValue key value
+       , Serialize key
+       , Serialize value
+       )
+    => DB
+    -> ColumnFamily
+    -> key
+    -> m (Maybe (key, value))
+firstMatchingCF db cf base =
+    withIterCF db cf $ \it -> runConduit $ matching it base .| headC
+
 -- | Like 'matchingSkip', but return the first element only.
 firstMatchingSkip ::
        ( MonadUnliftIO m
@@ -190,6 +251,22 @@
     withIter db $ \it -> runConduit $
     matchingSkip it base start .| headC
 
+-- | Like 'matchingSkip', but return the first element only.
+firstMatchingSkipCF ::
+       ( MonadUnliftIO m
+       , KeyValue key value
+       , Serialize key
+       , Serialize value
+       )
+    => DB
+    -> ColumnFamily
+    -> key
+    -> key
+    -> m (Maybe (key, value))
+firstMatchingSkipCF db cf base start =
+    withIterCF db cf $ \it -> runConduit $
+    matchingSkip it base start .| headC
+
 -- | Like 'matching' but return a list.
 matchingAsList ::
        ( MonadUnliftIO m
@@ -205,6 +282,22 @@
     iterSeek it (encode base)
     matchRecursiveList base it
 
+-- | Like 'matching' but return a list.
+matchingAsListCF ::
+       ( MonadUnliftIO m
+       , KeyValue key value
+       , Serialize key
+       , Serialize value
+       )
+    => DB
+    -> ColumnFamily
+    -> key
+    -> m [(key, value)]
+matchingAsListCF db cf base =
+    withIterCF db cf $ \it -> do
+    iterSeek it (encode base)
+    matchRecursiveList base it
+
 -- | Like 'matchingSkip', but return a list.
 matchingSkipAsList ::
        ( MonadUnliftIO m
@@ -218,5 +311,22 @@
     -> m [(key, value)]
 matchingSkipAsList db base start =
     withIter db $ \it -> do
+    iterSeek it (encode start)
+    matchRecursiveList base it
+
+-- | Like 'matchingSkip', but return a list.
+matchingSkipAsListCF ::
+       ( MonadUnliftIO m
+       , KeyValue key value
+       , Serialize key
+       , Serialize value
+       )
+    => DB
+    -> ColumnFamily
+    -> key
+    -> key
+    -> m [(key, value)]
+matchingSkipAsListCF db cf base start =
+    withIterCF db cf $ \it -> do
     iterSeek it (encode start)
     matchRecursiveList base it
