diff --git a/omnicodec.cabal b/omnicodec.cabal
--- a/omnicodec.cabal
+++ b/omnicodec.cabal
@@ -1,12 +1,13 @@
 name: omnicodec
-version: 0.6
+version: 0.7
 license: OtherLicense
 license-file: COPYING
 author: Magnus Therning
 maintainer: magnus@therning.org
 copyright: Magnus Therning, 2012
 synopsis: data encoding and decoding command line utilities
-description: Two simple command line tools built on sandi.
+description: Two simple command line tools built on sandi
+    (http://hackage.haskell.org/package/sandi).
 build-type: Simple
 category: Codec
 cabal-version: >= 1.6
@@ -23,13 +24,23 @@
 executable odec
     main-is: odec.hs
     hs-source-dirs: src
-    build-depends: base ==4.6.*, cmdargs ==0.10.*, bytestring ==0.10.*,
-        sandi ==0.1.*
+    build-depends:
+        base ==4.6.*,
+        cmdargs ==0.10.*,
+        conduit ==1.0.*,
+        bytestring ==0.10.*,
+        sandi ==0.2.*,
+        transformers ==0.3.*
     ghc-options: -Wall
 
 executable oenc
     main-is: oenc.hs
     hs-source-dirs: src
-    build-depends: base ==4.6.*, cmdargs ==0.10.*, bytestring ==0.10.*,
-        sandi ==0.1.*
+    build-depends:
+        base ==4.6.*,
+        cmdargs ==0.10.*,
+        conduit ==1.0.*,
+        bytestring ==0.10.*,
+        sandi ==0.2.*,
+        transformers ==0.3.*
     ghc-options: -Wall
diff --git a/src/odec.hs b/src/odec.hs
--- a/src/odec.hs
+++ b/src/odec.hs
@@ -22,25 +22,26 @@
 import Paths_omnicodec (version)
 
 import Control.Exception
-import Control.Monad
+import Control.Monad.IO.Class
+-- import Control.Monad
 import Data.ByteString as BS
 import Data.Maybe
 import Data.Version(showVersion)
 import System.Console.CmdArgs
-import System.Exit
+-- import System.Exit
 import System.IO as SIO
+import Data.Conduit
+import Data.Conduit.Binary
 
-import Codec.Binary.Base64 as B64
-import qualified Codec.Binary.Base64Url as B64U
-import qualified Codec.Binary.Base32 as B32
-import qualified Codec.Binary.Base32Hex as B32H
-import qualified Codec.Binary.Base16 as B16
-import qualified Codec.Binary.Base85 as B85
-import qualified Codec.Binary.QuotedPrintable as QP
-import qualified Codec.Binary.Uu as Uu
-import qualified Codec.Binary.Xx as Xx
--- import qualified Codec.Binary.PythonString as PS
--- import qualified Codec.Binary.Url as Url
+import qualified Data.Conduit.Codec.Base64 as B64
+import qualified Data.Conduit.Codec.Base64Url as B64U
+import qualified Data.Conduit.Codec.Base32 as B32
+import qualified Data.Conduit.Codec.Base32Hex as B32H
+import qualified Data.Conduit.Codec.Base16 as B16
+import qualified Data.Conduit.Codec.Base85 as B85
+import qualified Data.Conduit.Codec.QuotedPrintable as QP
+import qualified Data.Conduit.Codec.Uu as Uu
+import qualified Data.Conduit.Codec.Xx as Xx
 
 -- {{{1 command line options
 ver :: String
@@ -50,7 +51,7 @@
 data Codec = B64 | B64U | B32 | B32H | B16 | B85 | QP | Uu | Xx
     deriving(Show, Eq, Data, Typeable)
 
-codecMap :: [(Codec, BS.ByteString -> Either (BS.ByteString, BS.ByteString) BS.ByteString)]
+codecMap :: [(Codec, Conduit ByteString (ResourceT IO) ByteString)]
 codecMap =
     [ (B64, B64.decode)
     , (B64U, B64U.decode)
@@ -92,10 +93,10 @@
 main :: IO ()
 main = do
     cmdArgs myArgs >>= \ a -> do
-    let encFunc = lookup (argCodec a) codecMap
+    let decFunc = lookup (argCodec a) codecMap
     withMaybeFile (argInput a) ReadMode $ \ inputFile ->
         withMaybeFile (argOutput a) WriteMode $ \ outputFile ->
-            decodeFile (fromJust encFunc) inputFile outputFile
+            runResourceT $ decodeFile (fromJust decFunc) inputFile outputFile
 
 withMaybeFile :: Maybe FilePath -> IOMode -> (Handle -> IO r) -> IO r
 withMaybeFile fn mode func = let
@@ -107,12 +108,6 @@
         hClose
         func
 
-decodeFile :: (BS.ByteString -> Either a BS.ByteString) -> Handle -> Handle -> IO ()
-decodeFile decFunc inF outF = let
-        writeToFile d = either
-            (const $ SIO.hPutStrLn stderr "Decoding failed!" >> exitFailure)
-            (BS.hPut outF)
-            (decFunc d)
-    in do
-        inData <- BS.hGet inF 4096
-        unless (BS.null inData) $ writeToFile inData >> decodeFile decFunc inF outF
+-- decodeFile :: (BS.ByteString -> Either a BS.ByteString) -> Handle -> Handle -> IO ()
+decodeFile :: (MonadIO m) => Conduit ByteString m ByteString -> Handle -> Handle -> m ()
+decodeFile decFunc inF outF = sourceHandle inF $= decFunc $$ sinkHandle outF
diff --git a/src/oenc.hs b/src/oenc.hs
--- a/src/oenc.hs
+++ b/src/oenc.hs
@@ -22,24 +22,24 @@
 import Paths_omnicodec (version)
 
 import Control.Exception
-import Control.Monad
 import Data.ByteString as BS
 import Data.Maybe
 import Data.Version(showVersion)
 import System.Console.CmdArgs
 import System.IO
+import Data.Conduit
+import Data.Conduit.Binary
+import Control.Monad.IO.Class
 
-import Codec.Binary.Base64 as B64
-import qualified Codec.Binary.Base64Url as B64U
-import qualified Codec.Binary.Base32 as B32
-import qualified Codec.Binary.Base32Hex as B32H
-import qualified Codec.Binary.Base16 as B16
-import qualified Codec.Binary.Base85 as B85
-import qualified Codec.Binary.QuotedPrintable as QP
-import qualified Codec.Binary.Uu as Uu
-import qualified Codec.Binary.Xx as Xx
--- import qualified Codec.Binary.PythonString as PS
--- import qualified Codec.Binary.Url as Url
+import qualified Data.Conduit.Codec.Base64 as B64
+import qualified Data.Conduit.Codec.Base64Url as B64U
+import qualified Data.Conduit.Codec.Base32 as B32
+import qualified Data.Conduit.Codec.Base32Hex as B32H
+import qualified Data.Conduit.Codec.Base16 as B16
+import qualified Data.Conduit.Codec.Base85 as B85
+import qualified Data.Conduit.Codec.QuotedPrintable as QP
+import qualified Data.Conduit.Codec.Uu as Uu
+import qualified Data.Conduit.Codec.Xx as Xx
 
 -- {{{1 command line options
 ver :: String
@@ -49,7 +49,7 @@
 data Codec = B64 | B64U | B32 | B32H | B16 | B85 | QP | Uu | Xx
     deriving(Show, Eq, Data, Typeable)
 
-codecMap :: [(Codec, BS.ByteString -> BS.ByteString)]
+codecMap :: [(Codec, Conduit ByteString (ResourceT IO) ByteString)]
 codecMap =
     [ (B64, B64.encode)
     , (B64U, B64U.encode)
@@ -60,8 +60,6 @@
     , (QP, QP.encode)
     , (Uu, Uu.encode)
     , (Xx, Xx.encode)
-    -- , (PS, PS.encodeInc)
-    -- , (Url, Url.encodeInc)
     ]
 
 data MyArgs = MyArgs { argInput :: Maybe FilePath, argOutput :: Maybe FilePath, argCodec :: Codec }
@@ -94,7 +92,7 @@
     let encFunc = lookup (argCodec a) codecMap
     withMaybeFile (argInput a) ReadMode $ \ inputFile ->
         withMaybeFile (argOutput a) WriteMode $ \ outputFile ->
-            encodeFile (fromJust encFunc) inputFile outputFile
+            runResourceT $ encodeFile (fromJust encFunc) inputFile outputFile
 
 withMaybeFile :: Maybe FilePath -> IOMode -> (Handle -> IO r) -> IO r
 withMaybeFile fn mode func = let
@@ -106,7 +104,5 @@
         hClose
         func
 
-encodeFile :: (BS.ByteString -> BS.ByteString) -> Handle -> Handle -> IO ()
-encodeFile encFunc inF outF = do
-    inData <- BS.hGet inF 4096
-    unless (BS.null inData) $ BS.hPut outF (encFunc inData) >> encodeFile encFunc inF outF
+encodeFile :: (MonadIO m) => Conduit ByteString m ByteString -> Handle -> Handle -> m ()
+encodeFile encFunc inF outF = sourceHandle inF $= encFunc $$ sinkHandle outF
