diff --git a/machines-binary.cabal b/machines-binary.cabal
--- a/machines-binary.cabal
+++ b/machines-binary.cabal
@@ -1,5 +1,5 @@
 name:                machines-binary
-version:             0.2.0.0
+version:             0.3.0.0
 synopsis:            Binary utilities for the machines library
 homepage:            http://github.com/aloiscochard/machines-binary
 license:             Apache-2.0
@@ -16,8 +16,6 @@
   ghc-options:       -Wall
   exposed-modules: 
     Data.Binary.Machine
-    Data.Binary.Get.Machine
-    Data.Binary.Put.Machine
   build-depends:       
     base >=4.6 && < 5
     , binary              >= 0.7      && < 0.8
diff --git a/src/Data/Binary/Get/Machine.hs b/src/Data/Binary/Get/Machine.hs
deleted file mode 100644
--- a/src/Data/Binary/Get/Machine.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-module Data.Binary.Get.Machine where
-
-import Data.ByteString (ByteString)
-import Data.Binary.Get (Decoder(..), Get, pushChunk, runGetIncremental)
-import Data.Machine (MachineT(..), ProcessT, Step(Await, Yield), Is(Refl), stopped)
-
-processGet :: Monad m => Get a -> ProcessT m ByteString a
-processGet getA = processDecoder (runGetIncremental getA)
-
-processDecoder :: Monad m => Decoder a -> ProcessT m ByteString a
-processDecoder decA = MachineT . return $ Await f Refl stopped where
-  f xs = case pushChunk decA xs of
-    -- TODO Add `Fail` case
-    Done _ _ a    -> MachineT . return $ Yield a stopped
-    decA'         -> processDecoder decA'
diff --git a/src/Data/Binary/Machine.hs b/src/Data/Binary/Machine.hs
--- a/src/Data/Binary/Machine.hs
+++ b/src/Data/Binary/Machine.hs
@@ -7,23 +7,22 @@
 
 import qualified Data.ByteString.Lazy as Lazy
 
-streamGet :: Monad m => Get a -> ProcessT m ByteString a
+streamGet :: Monad m => Get a -> ProcessT m ByteString (Either String a)
 streamGet getA = processDecoder' (runGetIncremental getA) (streamGet getA)
 
-processGet :: Monad m => Get a -> ProcessT m ByteString a
+processGet :: Monad m => Get a -> ProcessT m ByteString (Either String a)
 processGet getA = processDecoder (runGetIncremental getA)
 
-processDecoder :: Monad m => Decoder a -> ProcessT m ByteString a
+processDecoder :: Monad m => Decoder a -> ProcessT m ByteString (Either String a)
 processDecoder decA = processDecoder' decA stopped
 
-processDecoder' :: Monad m => Decoder a -> ProcessT m ByteString a -> ProcessT m ByteString a
+processDecoder' :: Monad m => Decoder a -> ProcessT m ByteString (Either String a) -> ProcessT m ByteString (Either String a)
 processDecoder' decA r = MachineT . return $ Await f Refl stopped where
   f xs = case pushChunk decA xs of
-    -- TODO Add `Fail` case
-    Fail _ _ s    -> error s
-    Done _ _ a    -> MachineT . return $ Yield a r
+    Fail _ _ e    -> yield' $ Left e
+    Done _ _ a    -> yield' $ Right a
     decA'         -> processDecoder' decA' r
-    -- decA'         -> error "foo"
+  yield' ea = MachineT . return $ Yield ea r
 
 processPut :: Monad m => (a -> Put) -> ProcessT m a ByteString
 processPut f = auto $ Lazy.toStrict . runPut . f
diff --git a/src/Data/Binary/Put/Machine.hs b/src/Data/Binary/Put/Machine.hs
deleted file mode 100644
--- a/src/Data/Binary/Put/Machine.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-module Data.Binary.Put.Machine where
-
-import Data.ByteString.Lazy (ByteString)
-import Data.Binary.Put (Put, runPut)
-import Data.Machine
-
-processPut :: Monad m => (a -> Put) -> ProcessT m a ByteString
-processPut f = repeatedly $ await >>= g where g = yield . runPut . f
