diff --git a/simple-pipe.cabal b/simple-pipe.cabal
--- a/simple-pipe.cabal
+++ b/simple-pipe.cabal
@@ -2,7 +2,7 @@
 cabal-version:	>= 1.8
 
 name:		simple-pipe
-version:	0.0.0.7
+version:	0.0.0.8
 stability:	Experimental
 author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>
@@ -82,17 +82,18 @@
 
 source-repository	head
     type:	git
-    location:	git://github.com/YoshikuniJujo/forest.git
+    location:	git://github.com/YoshikuniJujo/simple-pipe.git
 
 source-repository	this
     type:	git
-    location:	git://github.com/YoshikuniJujo/forest.git
-    tag:	simple-pipe-0.0.0.7
+    location:	git://github.com/YoshikuniJujo/simple-pipe.git
+    tag:	simple-pipe-0.0.0.8
 
 library
     hs-source-dirs:	src
-    exposed-modules:	Data.Pipe, Data.Pipe.List
+    exposed-modules:
+        Data.Pipe, Data.Pipe.List, Data.Pipe.IO, Data.Pipe.ByteString
     build-depends:
         base == 4.*, monad-control == 0.3.*, lifted-base == 0.2.*,
-        monads-tf == 0.1.*
+        monads-tf == 0.1.*, bytestring == 0.10.*
     ghc-options:	-Wall
diff --git a/src/Data/Pipe/ByteString.hs b/src/Data/Pipe/ByteString.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Pipe/ByteString.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE FlexibleContexts, PackageImports #-}
+
+module Data.Pipe.ByteString (fromHandleLn, toHandleLn, fromFileLn, toFileLn) where
+
+import "monads-tf" Control.Monad.Trans
+import Control.Monad.Trans.Control
+import Data.Pipe
+import System.IO
+
+import qualified Data.ByteString.Char8 as BSC
+
+fromHandleLn :: MonadIO m => Handle -> Pipe () BSC.ByteString m ()
+fromHandleLn h = liftIO (BSC.hGetLine h) >>= (>> fromHandleLn h) . yield
+
+toHandleLn :: MonadIO m => Handle -> Pipe BSC.ByteString () m ()
+toHandleLn h =
+	await >>= maybe (return ()) ((>> toHandleLn h) . liftIO . BSC.hPutStrLn h)
+
+fromFileLn :: (MonadIO m, MonadBaseControl IO m) =>
+	FilePath -> Pipe () BSC.ByteString m ()
+fromFileLn fp =
+	bracket (liftIO $ openFile fp ReadMode) (liftIO . hClose) fromHandleLn
+
+toFileLn :: (MonadIO m, MonadBaseControl IO m) =>
+	FilePath -> Pipe BSC.ByteString () m ()
+toFileLn fp = bracket (liftIO $ openFile fp WriteMode) (liftIO . hClose) toHandleLn
diff --git a/src/Data/Pipe/IO.hs b/src/Data/Pipe/IO.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Pipe/IO.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE FlexibleContexts, PackageImports #-}
+
+module Data.Pipe.IO (fromHandle, toHandle, fromFile, toFile) where
+
+import "monads-tf" Control.Monad.Trans
+import Control.Monad.Trans.Control
+import Data.Pipe
+import System.IO
+
+fromHandle :: MonadIO m => Handle -> Pipe () Char m ()
+fromHandle h = liftIO (hGetChar h) >>= (>> fromHandle h) . yield
+
+toHandle :: MonadIO m => Handle -> Pipe Char () m ()
+toHandle h = await >>= maybe (return ()) ((>> toHandle h) . liftIO . hPutChar h)
+
+fromFile :: (MonadIO m, MonadBaseControl IO m) => FilePath -> Pipe () Char m ()
+fromFile fp = bracket (liftIO $ openFile fp ReadMode) (liftIO . hClose) fromHandle
+
+toFile :: (MonadIO m, MonadBaseControl IO m) => FilePath -> Pipe Char () m ()
+toFile fp = bracket (liftIO $ openFile fp WriteMode) (liftIO . hClose) toHandle
