diff --git a/README b/README
--- a/README
+++ b/README
@@ -24,3 +24,4 @@
 Yuras Shumovich <shumovichy@gmail.com>
 Michael Tolly <tolly@wisc.edu>
 Philip Lundrigan <philiplundrigan@gmail.com>
+Moritz Angermann <moritz@lichtzwerge.de>
diff --git a/plist.cabal b/plist.cabal
--- a/plist.cabal
+++ b/plist.cabal
@@ -1,10 +1,11 @@
 name:                    plist
-version:                 0.0.4
+version:                 0.0.5
 license:                 BSD3
 license-file:            LICENSE
 author:                  Yuras Shumovich <shumovichy@gmail.com>,
                          Michael Tolly <tolly@wisc.edu>
                          Philip Lundrigan <philiplundrigan@gmail.com>
+                         Moritz Angermann <moritz@lichtzwerge.de>
 maintainer:              Yuras Shumovich <shumovichy@gmail.com>
 copyright:               (c) 2009, 2012 Yuras Shumovich
 category:                XML
diff --git a/src/Text/XML/Plist.hs b/src/Text/XML/Plist.hs
--- a/src/Text/XML/Plist.hs
+++ b/src/Text/XML/Plist.hs
@@ -16,7 +16,9 @@
 
 PlObject(..),
 writePlistToFile,
+writePlistToString,
 readPlistFromFile,
+readPlistFromString,
 objectToPlist,
 plistToObject,
 objectToXml,
diff --git a/src/Text/XML/Plist/Read.hs b/src/Text/XML/Plist/Read.hs
--- a/src/Text/XML/Plist/Read.hs
+++ b/src/Text/XML/Plist/Read.hs
@@ -15,6 +15,7 @@
 module Text.XML.Plist.Read (
 
 readPlistFromFile,
+readPlistFromString,
 plistToObject,
 xmlToObject
 
@@ -38,6 +39,14 @@
   res <- runX $ readDocument opts fileName >>> plistToObject
   case res of
     [] -> fail $ "can't parse " ++ fileName
+    (x:_) -> return x
+
+-- | Read 'PlObject' from string.
+readPlistFromString :: SysConfigList -> String -> IO PlObject
+readPlistFromString opts string = do
+  res <- runX $ readString opts string >>> plistToObject
+  case res of
+    [] -> fail $ "can't parse string " ++ string
     (x:_) -> return x
 
 -- | Arrow that converts XML tree to 'PlObject'.
diff --git a/src/Text/XML/Plist/Write.hs b/src/Text/XML/Plist/Write.hs
--- a/src/Text/XML/Plist/Write.hs
+++ b/src/Text/XML/Plist/Write.hs
@@ -15,6 +15,7 @@
 module Text.XML.Plist.Write (
 
 writePlistToFile,
+writePlistToString,
 objectToPlist,
 objectToXml
 
@@ -23,7 +24,7 @@
 import Text.XML.Plist.PlObject
 import Text.XML.HXT.Arrow.XmlState
 import Codec.Binary.Base64
-import Control.Monad (void)
+import Control.Monad (void, liftM)
 
 import Control.Arrow.IOStateListArrow
 import Text.XML.HXT.Arrow.WriteDocument
@@ -40,6 +41,14 @@
 writePlist :: String -> IOSLA (XIOState s) PlObject XmlTree
 writePlist fileName = objectToPlist >>>
   writeDocument [withIndent yes, withAddDefaultDTD yes] fileName
+
+-- | Write 'PlObject' to String
+writePlistToString :: PlObject -> IO String
+writePlistToString object = liftM concat $ runX (constA object >>> writePlist')
+
+writePlist' :: IOSLA (XIOState s) PlObject String
+writePlist' = objectToPlist >>>
+  writeDocumentToString [withIndent yes, withAddDefaultDTD yes]
 
 -- | Arrow to convert 'PlObject' to plist with root element and DTD declaration.
 objectToPlist :: ArrowDTD a => a PlObject XmlTree
