diff --git a/Text/Parcom/ByteString/Lazy.hs b/Text/Parcom/ByteString/Lazy.hs
new file mode 100644
--- /dev/null
+++ b/Text/Parcom/ByteString/Lazy.hs
@@ -0,0 +1,18 @@
+{-#LANGUAGE MultiParamTypeClasses #-}
+module Text.Parcom.ByteString.Lazy
+where
+
+import Prelude hiding (head, null, tail)
+import Data.ByteString.Lazy
+import Data.Word8
+import Text.Parcom.Stream
+import Text.Parcom.Word8
+
+instance Stream ByteString Word8 where
+    peek = head
+    atEnd = null
+    consume = tail
+
+instance Listish ByteString Word8 where
+    toList = unpack
+    fromList = pack
diff --git a/Text/Parcom/ByteString/Strict.hs b/Text/Parcom/ByteString/Strict.hs
--- a/Text/Parcom/ByteString/Strict.hs
+++ b/Text/Parcom/ByteString/Strict.hs
@@ -12,3 +12,7 @@
     peek = head
     atEnd = null
     consume = tail
+
+instance Listish ByteString Word8 where
+    toList = unpack
+    fromList = pack
diff --git a/Text/Parcom/Core.hs b/Text/Parcom/Core.hs
--- a/Text/Parcom/Core.hs
+++ b/Text/Parcom/Core.hs
@@ -8,12 +8,12 @@
 , try, handle
 , notFollowedBy
 , (<?>), (<|>), empty
-, Stream, Token
+, Stream, Token, Listish
 )
 where
 
 import qualified Text.Parcom.Stream as Stream
-import Text.Parcom.Stream (Stream, Token)
+import Text.Parcom.Stream (Stream, Token, Listish)
 import Control.Monad (liftM, ap)
 import Control.Applicative
 import Control.Monad.Identity
diff --git a/Text/Parcom/Prim.hs b/Text/Parcom/Prim.hs
--- a/Text/Parcom/Prim.hs
+++ b/Text/Parcom/Prim.hs
@@ -1,12 +1,14 @@
 module Text.Parcom.Prim
 ( anyToken, oneOf, eof
 , satisfy
-, token, tokens
+, token, tokens, prefix
 )
 where
 
 import Text.Parcom.Core
 import Text.Parcom.Internal
+import Text.Parcom.Stream (toList, fromList)
+import Control.Monad (liftM)
 
 -- | Gets the next token from the stream
 anyToken :: (Monad m, Stream s t, Token t) => ParcomT s t m t
@@ -40,3 +42,6 @@
     c <- token x
     cs <- tokens xs
     return (c:cs)
+
+prefix :: (Monad m, Stream s t, Token t, Eq t, Show t, Listish s t) => s -> ParcomT s t m s
+prefix str = fromList `liftM` tokens (toList str)
diff --git a/Text/Parcom/Stream.hs b/Text/Parcom/Stream.hs
--- a/Text/Parcom/Stream.hs
+++ b/Text/Parcom/Stream.hs
@@ -21,3 +21,11 @@
 instance Token Char where
     isLineDelimiter '\n' = True
     isLineDelimiter _ = False
+
+class Listish s t | s -> t where
+    toList :: s -> [t]
+    fromList :: [t] -> s
+
+instance Listish [a] a where
+    toList = id
+    fromList = id
diff --git a/Text/Parcom/Text.hs b/Text/Parcom/Text.hs
new file mode 100644
--- /dev/null
+++ b/Text/Parcom/Text.hs
@@ -0,0 +1,6 @@
+module Text.Parcom.Text
+( module Text.Parcom.Text.Strict
+)
+where
+
+import Text.Parcom.Text.Strict
diff --git a/Text/Parcom/Text/Lazy.hs b/Text/Parcom/Text/Lazy.hs
new file mode 100644
--- /dev/null
+++ b/Text/Parcom/Text/Lazy.hs
@@ -0,0 +1,16 @@
+{-#LANGUAGE MultiParamTypeClasses #-}
+module Text.Parcom.Text.Lazy
+where
+
+import Prelude hiding (head, null, tail)
+import Data.Text.Lazy
+import Text.Parcom.Stream
+
+instance Stream Text Char where
+    peek = head
+    atEnd = null
+    consume = tail
+
+instance Listish Text Char where
+    toList = unpack
+    fromList = pack
diff --git a/Text/Parcom/Text/Strict.hs b/Text/Parcom/Text/Strict.hs
new file mode 100644
--- /dev/null
+++ b/Text/Parcom/Text/Strict.hs
@@ -0,0 +1,16 @@
+{-#LANGUAGE MultiParamTypeClasses #-}
+module Text.Parcom.Text.Strict
+where
+
+import Prelude hiding (head, null, tail)
+import Data.Text
+import Text.Parcom.Stream
+
+instance Stream Text Char where
+    peek = head
+    atEnd = null
+    consume = tail
+
+instance Listish Text Char where
+    toList = unpack
+    fromList = pack
diff --git a/Text/Parcom/Textual.hs b/Text/Parcom/Textual.hs
new file mode 100644
--- /dev/null
+++ b/Text/Parcom/Textual.hs
@@ -0,0 +1,16 @@
+module Text.Parcom.Textual
+where
+
+import Data.String
+import Text.Parcom.Prim
+import Text.Parcom.Core
+import Text.Parcom.Internal
+import Text.Parcom.Stream (Stream, Listish)
+
+string :: (Monad m, Stream s t, Listish s t, IsString s, Eq t, Show t, Token t) => String -> ParcomT s t m String
+string str = do
+    prefix $ fromString str
+    return str
+
+char :: (Monad m, Stream s t, Listish s t, IsString s, Eq t, Show t, Token t) => Char -> ParcomT s t m Char
+char c = string [c] >> return c
diff --git a/parcom-lib.cabal b/parcom-lib.cabal
--- a/parcom-lib.cabal
+++ b/parcom-lib.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                parcom-lib
-version:             0.2.0.0
+version:             0.3.0.1
 synopsis:            A simple parser-combinator library, a bit like Parsec but without the frills
 description:         Parcom provides parser combinator functionality in a string-type-agnostic way;
                      it supports strict ByteStrings (with Word8 tokens) and any list type (with
@@ -20,7 +20,19 @@
 cabal-version:       >=1.8
 
 library
-  exposed-modules: Text.Parcom.Stream, Text.Parcom.Core, Text.Parcom.Word8, Text.Parcom.ByteString, Text.Parcom.Internal, Text.Parcom.Combinators, Text.Parcom.Prim, Text.Parcom.ByteString.Strict
+  exposed-modules: Text.Parcom.Stream
+                 , Text.Parcom.Core
+                 , Text.Parcom.Word8
+                 , Text.Parcom.Internal
+                 , Text.Parcom.Combinators
+                 , Text.Parcom.Prim
+                 , Text.Parcom.Textual
+                 , Text.Parcom.ByteString
+                 , Text.Parcom.ByteString.Strict
+                 , Text.Parcom.ByteString.Lazy
+                 , Text.Parcom.Text
+                 , Text.Parcom.Text.Lazy
+                 , Text.Parcom.Text.Strict
   -- other-modules:       
   build-depends: base ==4.5.*
                , containers ==0.4.*
@@ -28,3 +40,4 @@
                , word8
                , mtl == 2.1.*
                , transformers == 0.3.*
+               , text == 0.11.*
