diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,9 @@
+## 0.2.0
+
+* Move parseC into a new Conduit module.
+* Add payloadC and payloadContentsC.
+* parseRPMC should return a ParseError on error.
+
 ## 0.1.3
 
 * Derive Ord for DepRequirement.
diff --git a/Codec/RPM/Conduit.hs b/Codec/RPM/Conduit.hs
new file mode 100644
--- /dev/null
+++ b/Codec/RPM/Conduit.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE FlexibleContexts #-}
+
+-- |
+-- Module: Codec.RPM.Conduit
+-- Copyright: (c) 2016-2017 Red Hat, Inc.
+-- License: LGPL
+--
+-- Maintainer: https://github.com/weldr
+-- Stability: stable
+-- Portability: portable
+--
+-- A module for interacting with an 'RPM' record using conduits.
+
+module Codec.RPM.Conduit(parseRPMC,
+                         payloadC,
+                         payloadContentsC)
+ where
+
+import           Control.Monad.Except(MonadError, throwError)
+import           Control.Monad.Trans.Resource(MonadResource)
+import           Conduit((.|), Conduit, awaitForever, yield)
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Char8 as C
+import           Data.Conduit.Attoparsec(ParseError, conduitParserEither)
+import           Data.Conduit.Lzma(decompress)
+import           Data.CPIO(Entry, readCPIO)
+
+import Codec.RPM.Parse(parseRPM)
+import Codec.RPM.Types(RPM(..))
+
+-- | Like 'parseRPM', but puts the result into a 'Conduit' as an 'Either', containing either a
+-- 'ParseError' or an 'RPM'.  The result can be extracted with 'Control.Monad.Except.runExceptT',
+-- like so:
+--
+-- > import Conduit((.|), runConduitRes, sourceFile)
+-- > import Control.Monad.Except(runExceptT)
+-- > result <- runExceptT $ runConduitRes $ sourceFile "some.rpm" .| parseRPMC .| someConsumer
+--
+-- On success, the 'RPM' record will be passed down the conduit for futher processing or
+-- consumption.  On error, the rest of the conduit will be skipped and the 'ParseError' will
+-- be returned as the result to be dealt with.
+parseRPMC :: MonadError ParseError m => Conduit C.ByteString m RPM
+parseRPMC =
+    conduitParserEither parseRPM .| consumer
+ where
+    consumer = awaitForever $ either throwError (yield . snd)
+
+-- | Extract the package payload from an 'RPM', returning it in the conduit.
+payloadC :: Monad m => Conduit RPM m BS.ByteString
+payloadC = awaitForever (yield . rpmArchive)
+
+-- | Extract the package payload from an 'RPM', decompress it, and return each element of
+-- the payload as a 'Data.CPIO.Entry'.
+payloadContentsC :: MonadResource m => Conduit RPM m Entry
+payloadContentsC = payloadC
+                .| decompress Nothing
+                .| readCPIO
diff --git a/Codec/RPM/Parse.hs b/Codec/RPM/Parse.hs
--- a/Codec/RPM/Parse.hs
+++ b/Codec/RPM/Parse.hs
@@ -20,21 +20,17 @@
                        parseOneTag,
                        parseSection,
 #endif
-                       parseRPM,
-                       parseRPMC)
+                       parseRPM)
  where
 
 #if !MIN_VERSION_base(4,8,0)
 import           Control.Applicative((<$>))
 #endif
 import           Control.Monad(void)
-import           Control.Monad.Except(MonadError, throwError)
-import           Conduit((.|), Conduit, awaitForever, yield)
 import           Data.Attoparsec.Binary
 import           Data.Attoparsec.ByteString(Parser, anyWord8, count, take, takeByteString, word8)
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Char8 as C
-import           Data.Conduit.Attoparsec(ParseError(..), conduitParserEither)
 import           Data.Maybe(mapMaybe)
 import           Prelude hiding(take)
 
@@ -145,26 +141,3 @@
         remainder = (sectionSize . headerSectionHeader) hdr `mod` 8
      in
         if remainder > 0 then fromIntegral $ 8 - remainder else 0
-
--- | Like 'parseRPM', but puts the result into a 'Conduit' as an 'Either', containing either a
--- 'ParseError' or an 'RPM'.  The result can be extracted with 'Control.Monad.Except.runExceptT',
--- like so:
---
--- > import Conduit((.|), runConduitRes, sourceFile)
--- > import Control.Monad.Except(runExceptT)
--- > result <- runExceptT $ runConduitRes $ sourceFile "some.rpm" .| parseRPMC .| someConsumer
---
--- On success, the 'RPM' record will be passed down the conduit for futher processing or
--- consumption.  Functions can be written to extract just one element out of the 'RPM' and
--- pass it along.  For instance:
---
--- > payloadC :: MonadError e m => Conduit RPM m BS.ByteStrin
--- > payloadC = awaitForever (yield . rpmArchive)
---
--- On error, the rest of the conduit will be skipped and the 'ParseError' will be returned
--- as the result to be dealt with.
-parseRPMC :: MonadError String m => Conduit C.ByteString m RPM
-parseRPMC =
-    conduitParserEither parseRPM .| consumer
- where
-    consumer = awaitForever $ either (throwError . errorMessage) (yield . snd)
diff --git a/codec-rpm.cabal b/codec-rpm.cabal
--- a/codec-rpm.cabal
+++ b/codec-rpm.cabal
@@ -1,5 +1,5 @@
 name:               codec-rpm
-version:            0.1.3
+version:            0.2.0
 synopsis:           A library for manipulating RPM files
 description:        This module provides a library for reading RPM files and converting them
                     into useful data structures.  There is currently no way to operate in
@@ -27,7 +27,8 @@
     location:       https://github.com/weldr/codec-rpm
 
 library
-    exposed-modules:    Codec.RPM.Parse,
+    exposed-modules:    Codec.RPM.Conduit,
+                        Codec.RPM.Parse,
                         Codec.RPM.Tags,
                         Codec.RPM.Types,
                         Codec.RPM.Version
@@ -41,6 +42,8 @@
                         conduit >= 1.2.8 && < 1.3,
                         conduit-combinators >= 1.1.0 && < 1.2,
                         conduit-extra >= 1.1.15 && < 1.2,
+                        cpio-conduit >= 0.7.0 && < 0.8.0,
+                        lzma-conduit >= 1.1.3.3 && < 1.2,
                         mtl >= 2.2.1 && < 2.3,
                         parsec >= 3.1.11 && < 3.2,
                         pretty >= 1.1.2.0,
diff --git a/examples/inspect.hs b/examples/inspect.hs
--- a/examples/inspect.hs
+++ b/examples/inspect.hs
@@ -20,7 +20,7 @@
 import Text.PrettyPrint(render)
 import Text.PrettyPrint.HughesPJClass(Pretty(pPrint))
 
-import Codec.RPM.Parse(parseRPMC)
+import Codec.RPM.Conduit(parseRPMC)
 import Codec.RPM.Types(RPM)
 
 consumer :: MonadIO m => Consumer RPM m ()
diff --git a/examples/unrpm.hs b/examples/unrpm.hs
--- a/examples/unrpm.hs
+++ b/examples/unrpm.hs
@@ -30,7 +30,7 @@
 import           System.Exit(exitFailure)
 import           System.FilePath((</>), splitFileName)
 
-import Codec.RPM.Parse(parseRPMC)
+import Codec.RPM.Conduit(parseRPMC, payloadContentsC)
 import Codec.RPM.Types(RPM(..))
 
 -- Grab an RPM from stdin and convert it into a chunked conduit of ByteStrings.  This could
@@ -73,9 +73,7 @@
     result <- runExceptT $ runConduitRes $
               getRPM path
            .| parseRPMC
-           .| payloadC
-           .| decompress Nothing
-           .| readCPIO
+           .| payloadContentsC
            .| DCC.mapM_ (liftIO . writeCpioEntry)
     either print return result
 
