diff --git a/library/Unl/Plist.php b/library/Unl/Plist.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ea98afb66b06e95cab4b59f8c25ca3a6c157ee0
--- /dev/null
+++ b/library/Unl/Plist.php
@@ -0,0 +1,87 @@
+<?php
+
+class Unl_Plist
+{
+	static public function plistToArray($xml)
+	{
+		$dom = DOMDocument::loadXML($xml);
+		$xPath = new DOMXPath($dom);
+		
+		$root = $xPath->query('plist/*')->item(0);
+		
+		return self::_parseNode($root);
+	}
+	
+	static protected function _parseNode($node)
+	{
+		switch ($node->nodeName) {
+			case 'integer':
+				return self::_parseInt($node);
+				break;
+			case 'string':
+			case 'key':
+				return self::_parseString($node);
+				break;
+			case 'date':
+				return self::_parseDate($node);
+				break;
+			case 'true':
+			case 'false':
+				return self::_parseBool($node);
+				break;
+			case 'dict':
+				return self::_parseDict($node);
+				break;
+			case 'array':
+				return self::_parseArray($node);
+				break;
+			default:
+				return null;
+		}
+	}
+
+    static protected function _parseInt($node)
+    {
+        return intval($node->textContent);
+    }
+    static protected function _parseString($node)
+    {
+        return $node->textContent;
+    }
+    static protected function _parseDate($node)
+    {
+        
+    }
+    static protected function _parseBool($node)
+    {
+        return (bool) ($node->nodeName == 'true');
+    }
+    static protected function _parseDict($node)
+    {
+    	$dict = array();
+    	$childNodes = array();
+    	foreach ($node->childNodes as $childNode) {
+    		if ($childNode->nodeName == '#text') {
+    			continue;
+    		}
+    		$childNodes[] = $childNode;
+    	}
+        for ($i = 0; $childNodes[$i]; $i += 2) {
+        	$key = self::_parseNode($childNodes[$i]);
+        	$value = self::_parseNode($childNodes[$i+1]);
+            $dict[$key] = $value;
+        }
+        return $dict;
+    }
+    static protected function _parseArray($node)
+    {
+        $array = array();
+        foreach ($node->childNodes as $childNode) {
+            if ($childNode->nodeName == '#text') {
+                continue;
+            }
+            $array[] = self::_parseNode($childNode);
+        }
+        return $array;
+    }
+}