diff --git a/NgxExport.hs b/NgxExport.hs
--- a/NgxExport.hs
+++ b/NgxExport.hs
@@ -362,6 +362,11 @@
     pokeCStringLen x l p pl
     return 1
 
+safeYYHandler :: IO (L.ByteString, CUInt) -> IO (L.ByteString, CUInt)
+safeYYHandler = handle $ \e ->
+    return (C8L.pack $ show (e :: SomeException), 1)
+{-# INLINE safeYYHandler #-}
+
 sS :: SS -> CString -> CInt ->
     Ptr CString -> Ptr CInt -> IO CUInt
 sS f x (I n) p pl =
@@ -394,8 +399,8 @@
     Ptr (Ptr NgxStrType) -> Ptr CInt ->
     Ptr (StablePtr L.ByteString) -> IO CUInt
 yY f x (I n) p pl spd = do
-    (s, r) <- (flip (,) 0 . f <$> B.unsafePackCStringLen (x, n))
-                `catch` \e -> return (C8L.pack $ show (e :: SomeException), 1)
+    (s, r) <- safeYYHandler $
+        flip (,) 0 . f <$> B.unsafePackCStringLen (x, n)
     pokeLazyByteString s p pl spd
     return r
 
@@ -403,10 +408,9 @@
     Ptr (Ptr NgxStrType) -> Ptr CInt ->
     Ptr (StablePtr L.ByteString) -> IO CUInt
 ioyY f x (I n) p pl spd = do
-    (s, r) <- (do
-                  s <- B.unsafePackCStringLen (x, n) >>= flip f False
-                  fmap (flip (,) 0) $ return $! s
-              ) `catch` \e -> return (C8L.pack $ show (e :: SomeException), 1)
+    (s, r) <- safeYYHandler $ do
+        s <- B.unsafePackCStringLen (x, n) >>= flip f False
+        fmap (flip (,) 0) $ return $! s
     pokeLazyByteString s p pl spd
     return r
 
@@ -419,16 +423,17 @@
 asyncIOCommon :: IO C8L.ByteString ->
     CInt -> Bool -> Ptr (Ptr NgxStrType) -> Ptr CInt -> Ptr CUInt ->
     Ptr (StablePtr L.ByteString) -> IO ()
-asyncIOCommon a (I fd) efd p pl r spd = void . async $ do
-    (do {s <- a; fmap Right $ return $! s})
-        `catch` (\e -> return $ Left $ show (e :: SomeException)) >>=
-            either (pokeAll 1 . C8L.pack) (pokeAll 0)
+asyncIOCommon a (I fd) efd p pl pr spd = void . async $ do
+    (s, r) <- safeYYHandler $ do
+        s <- a
+        fmap (flip (,) 0) $ return $! s
+    pokeLazyByteString s p pl spd
+    poke pr r
     uninterruptibleMask_ $
         if efd
             then writeFlag8b
             else writeFlag1b >> closeFd fd `catchIOError` const (return ())
-    where pokeAll e s = pokeLazyByteString s p pl spd >> poke r e
-          writeBufN n s w
+    where writeBufN n s w
               | w < n = (w +) <$>
                   fdWriteBuf fd (plusPtr s $ fromIntegral w) (n - w)
                   `catchIOError`
@@ -499,11 +504,9 @@
 handler f x (I n) p pl pct plct pst spd =
     safeHandler pct pst $ do
         (s, ct, I st) <- f <$> B.unsafePackCStringLen (x, n)
-        PtrLen t l <- peek p >>= toBuffers s
-        when (l /= 1) (poke p t) >> poke pl l
         PtrLen sct lct <- newCStringLen ct
         pokeCStringLen sct lct pct plct >> poke pst st
-        when (t /= nullPtr) $ newStablePtr s >>= poke spd
+        pokeLazyByteString s p pl spd
         return 0
 
 defHandler :: YY -> CString -> CInt ->
@@ -520,10 +523,10 @@
 unsafeHandler f x (I n) p pl pct plct pst =
     safeHandler pct pst $ do
         (s, ct, I st) <- f <$> B.unsafePackCStringLen (x, n)
-        PtrLen t l <- B.unsafeUseAsCStringLen s return
-        pokeCStringLen t l p pl
         PtrLen sct lct <- B.unsafeUseAsCStringLen ct return
         pokeCStringLen sct lct pct plct >> poke pst st
+        PtrLen t l <- B.unsafeUseAsCStringLen s return
+        pokeCStringLen t l p pl
         return 0
 
 foreign export ccall ngxExportReleaseLockedByteString ::
diff --git a/ngx-export.cabal b/ngx-export.cabal
--- a/ngx-export.cabal
+++ b/ngx-export.cabal
@@ -1,5 +1,5 @@
 name:                ngx-export
-version:             0.7.0.0
+version:             0.7.0.1
 synopsis:            Helper module for Nginx haskell module
 description:         Helper module for
         <http://github.com/lyokha/nginx-haskell-module Nginx haskell module>
