diff --git a/libpafe.cabal b/libpafe.cabal
--- a/libpafe.cabal
+++ b/libpafe.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                libpafe
-version:             0.1.0.0
+version:             0.1.1.0
 synopsis:            Wrapper for libpafe
 description:         Wrapper for Pasori library libpafe
 license:             GPL-2
@@ -26,25 +26,29 @@
   -- other-modules:       
   -- other-extensions:    
   build-depends:       base >=4.6 && <4.8
+                      ,transformers
   extra-libraries:     pafe
 
   hs-source-dirs:      src
   default-language:    Haskell2010
 
 Test-Suite test-read
-    type:              exitcode-stdio-1.0
-    main-is:           tests/test-read.hs
+  type:              exitcode-stdio-1.0
+  main-is:           tests/test-read.hs
   build-depends:       base >=4.6 && <4.8
-                      ,libpafe
+                      ,libpafe >= 0.1.1.0
                       ,bytestring
                       ,iconv
+                      ,transformers >= 0.4.3.0
+  default-language:    Haskell2010
 
 Test-Suite test-read-fcf
-    type:              exitcode-stdio-1.0
-    main-is:           tests/test-read-fcf.hs
+  type:              exitcode-stdio-1.0
+  main-is:           tests/test-read-fcf.hs
   build-depends:       base >=4.6 && <4.8
-                      ,libpafe
+                      ,libpafe >= 0.1.1.0
                       ,bytestring
                       ,iconv
+  default-language:    Haskell2010
 
 
diff --git a/src/Bindings/Libpafe/Pasori.hsc b/src/Bindings/Libpafe/Pasori.hsc
--- a/src/Bindings/Libpafe/Pasori.hsc
+++ b/src/Bindings/Libpafe/Pasori.hsc
@@ -2,6 +2,7 @@
 module Bindings.Libpafe.Pasori (
   pasoriPrepare
  ,pasoriClose
+ ,withPasori
 ) where
 
 #include <libpafe/libpafe.h>
@@ -10,6 +11,9 @@
 import Foreign.Ptr
 import Foreign.C.Types
 import Bindings.Libpafe.Types
+import Control.Monad.Trans.Maybe
+import Control.Monad.IO.Class (liftIO)
+import Control.Exception.Base (mask_)
 
 pasoriPrepare :: IO (Maybe (Ptr Pasori))
 pasoriPrepare = do
@@ -19,6 +23,15 @@
     0 -> return $ Just pasori
     otherwise -> pasoriClose pasori >> return Nothing
 
+withPasori :: (Ptr Pasori -> IO a) -- ^ IO action that uses pointer to pasori
+              -> IO (Maybe a) -- ^ The result
+withPasori act = mask_ $ runMaybeT $ do
+  pasori <- MaybeT pasoriPrepare
+  result <- liftIO $ act pasori
+  liftIO $ pasoriClose pasori
+  return result
+
+pasoriClose :: Ptr Pasori -> IO() 
 pasoriClose = pasori_close
 
 foreign import ccall pasori_open :: IO (Ptr Pasori)
diff --git a/tests/test-read.hs b/tests/test-read.hs
--- a/tests/test-read.hs
+++ b/tests/test-read.hs
@@ -11,24 +11,23 @@
 import qualified Data.ByteString.Lazy.Char8 as C
 import Data.Maybe
 import Codec.Text.IConv
+import Control.Monad.Trans.Maybe
+import Control.Monad.IO.Class
+import Control.Monad
 
 import System.Exit (exitFailure)
 
-main = readPasori >>= print
+main :: IO()
+main = do
+  felicaStr <- withPasori $ runMaybeT . readFelica
+  print felicaStr
+  print $ fromJust $ join felicaStr
 
-readPasori :: IO String
-readPasori = do
-  maybePasori <- pasoriPrepare
-  case maybePasori of
-    Just pasori -> do
-      maybeFelicaPtr <- felicaPolling 0xfe00 0 0 pasori 
-      let felicaPtr = fromJust maybeFelicaPtr
-      felica <- withForeignPtr felicaPtr peek 
-      print "IDm is:"
-      print felica
-      print "PMm is:"
-      print $ pmm felica
-      pasoriClose pasori
-      return $ show felica
-    Nothing -> error "Pasori is not connected"
+readFelica :: Ptr Pasori -> MaybeT IO String
+readFelica pasori = do
+  liftIO $ print pasori
+  felicaPtr <- MaybeT $ felicaPolling 0xffff 0 0 pasori 
+  liftIO $ print felicaPtr
+  felica <- liftIO $ withForeignPtr felicaPtr peek 
+  return $ show felica
 
