diff --git a/library/Potoki/Cereal/Transform.hs b/library/Potoki/Cereal/Transform.hs
--- a/library/Potoki/Cereal/Transform.hs
+++ b/library/Potoki/Cereal/Transform.hs
@@ -31,10 +31,10 @@
 {-# INLINE runPartialDecoder #-}
 runPartialDecoder :: forall decoded. (ByteString -> C.Result decoded) -> Transform ByteString (Either Text decoded)
 runPartialDecoder inputToResult =
-  Transform $ \ inputFetch -> return $ A.Fetch $ do
-    unconsumedRef <- newIORef mempty
-    finishedRef <- newIORef False
-    fetchParsed inputFetch finishedRef unconsumedRef
+  Transform $ \ inputFetch -> do
+    unconsumedRef <- liftIO $ newIORef mempty
+    finishedRef <- liftIO $ newIORef False
+    return $ A.Fetch $ fetchParsed inputFetch finishedRef unconsumedRef
   where
     fetchParsed :: A.Fetch ByteString -> IORef Bool -> IORef ByteString -> IO (Maybe (Either Text decoded))
     fetchParsed (A.Fetch inputFetchIO) finishedRef unconsumedRef =
diff --git a/potoki-cereal.cabal b/potoki-cereal.cabal
--- a/potoki-cereal.cabal
+++ b/potoki-cereal.cabal
@@ -1,43 +1,21 @@
-name:
-  potoki-cereal
-version:
-  0.3
-synopsis:
-  Streaming serialization
-category:
-  Potoki, Streaming
-homepage:
-  https://github.com/metrix-ai/potoki-cereal
-bug-reports:
-  https://github.com/metrix-ai/potoki-cereal/issues
-author:
-  Nikita Volkov <nikita.y.volkov@mail.ru>
-maintainer:
-  Metrix.AI Ninjas <ninjas@metrix.ai>
-copyright:
-  (c) 2017, Metrix.AI
-license:
-  MIT
-license-file:
-  LICENSE
-build-type:
-  Simple
-cabal-version:
-  >=1.10
-
-source-repository head
-  type:
-    git
-  location:
-    git://github.com/metrix-ai/potoki-cereal.git
+name: potoki-cereal
+version: 0.3.0.1
+synopsis: Streaming serialization
+category: Potoki, Streaming
+homepage: https://github.com/metrix-ai/potoki-cereal
+bug-reports: https://github.com/metrix-ai/potoki-cereal/issues
+author: Nikita Volkov <nikita.y.volkov@mail.ru>
+maintainer: Metrix.AI Tech Team <tech@metrix.ai>
+copyright: (c) 2017, Metrix.AI
+license: MIT
+license-file: LICENSE
+build-type: Simple
+cabal-version: >=1.10
 
 library
-  hs-source-dirs:
-    library
-  default-extensions:
-    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
-  default-language:
-    Haskell2010
+  hs-source-dirs: library
+  default-extensions: Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
+  default-language: Haskell2010
   exposed-modules:
     Potoki.Cereal.Consume
     Potoki.Cereal.Produce
@@ -53,3 +31,20 @@
     cereal >=0.5 && <0.6,
     potoki-core >=2.2.1 && <2.3,
     text >=1 && <2
+
+test-suite test
+  type: exitcode-stdio-1.0
+  hs-source-dirs: test
+  default-extensions: Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
+  default-language: Haskell2010
+  main-is: Main.hs
+  build-depends:
+    directory >=1.2 && <2,
+    potoki >=2 && <2.1,
+    potoki-cereal,
+    QuickCheck >=2.8.1 && <3,
+    quickcheck-instances >=0.3.11 && <0.4,
+    rerebase <2,
+    tasty >=0.12 && <2,
+    tasty-hunit >=0.9 && <0.11,
+    tasty-quickcheck >=0.9 && <0.11
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,40 @@
+module Main where
+
+import Prelude hiding (choose)
+import Test.QuickCheck.Instances
+import Test.Tasty
+import Test.Tasty.Runners
+import Test.Tasty.HUnit
+import Test.Tasty.QuickCheck
+import qualified Test.QuickCheck as QuickCheck
+import qualified Test.QuickCheck.Property as QuickCheck
+import qualified Potoki.Cereal.Consume as Consume
+import qualified Potoki.Cereal.Produce as Produce
+import qualified Potoki.Cereal.Transform as Transform
+import qualified Potoki.Consume as Consume
+import qualified Potoki.Produce as Produce
+import qualified Potoki.Transform as Transform
+import qualified Potoki.IO as IO
+import qualified System.Directory as IO
+
+
+main =
+  defaultMain $
+  testGroup "All" $
+  [
+    testProperty "" $ let
+      workDir = "dist/test-temp"
+      file = workDir <> "/list"
+      gen :: Gen [Int]
+      gen = do
+        length <- choose (0, 100)
+        replicateM length (choose (-100, 100))
+      in forAll gen $ \ list -> unsafePerformIO $ do
+        IO.createDirectoryIfMissing True workDir
+        raiseIOException =<< IO.produceAndConsume (Produce.list list) (Consume.encodeToFile file)
+        restoredList <- raiseText =<< raiseIOException =<< IO.produceAndConsume (Produce.fileDecoded file) (right' (right' Consume.list))
+        return (list === restoredList)
+  ]
+
+raiseIOException = either throwIO return
+raiseText = either (fail . show) return
