diff --git a/vc/svn.py b/vc/svn.py
index 5091578..528990d 100644
--- a/vc/svn.py
+++ b/vc/svn.py
@@ -25,6 +25,7 @@ import os
 import re
 import errno
 import _vc
+import xml.etree.ElementTree
 
 class Vc(_vc.Vc):
 
@@ -44,11 +45,6 @@ class Vc(_vc.Vc):
         "C": _vc.STATE_CONFLICT,
     }
 
-    re_status_moved = re.compile(r'^(A) +[+] +- +([?]) +[?] +([^ ].*)$')
-    re_status_vc = re.compile(r'^(.) +\d+ +(\?|(?:\d+)) +[^ ]+ +([^ ].*)$')
-    re_status_non_vc = re.compile(r'^([?]) +([^ ].*)$')
-    re_status_tree_conflict = re.compile(r'^ +> +.*')
-
     def commit_command(self, message):
         return [self.CMD,"commit","-m",message]
     def diff_command(self):
@@ -69,7 +65,7 @@ class Vc(_vc.Vc):
 
         while 1:
             try:
-                entries = _vc.popen([self.CMD, "status", "-Nv", directory])
+                tree = xml.etree.ElementTree.parse(_vc.popen([self.CMD, "status", "-Nv", "--xml", directory]))
                 break
             except OSError, e:
                 if e.errno != errno.EAGAIN:
@@ -77,29 +73,35 @@ class Vc(_vc.Vc):
 
         matches = []
 
-        for line in entries:
-            # svn-1.6.x changed 'status' command output
-            # adding tree-conflict lines, c.f.:
-            # http://subversion.tigris.org/svn_1.6_releasenotes.html
-            m = self.re_status_tree_conflict.match(line)
-            if m:
-                # skip this line
-                continue
-            # A svn moved file
-            m = self.re_status_moved.match(line)
-            if m:
-                matches.append((m.group(3), m.group(1), m.group(2)))
-                continue
-            # A svn controlled file
-            m = self.re_status_vc.match(line)
-            if m:
-                matches.append((m.group(3), m.group(1), m.group(2)))
-                continue
-            # A new file, unknown to svn
-            m = self.re_status_non_vc.match(line)
-            if m:
-                matches.append((m.group(2), m.group(1), ""))
-                continue
+        for target in tree.findall("target"):
+            for entry in (t for t in target.getchildren() if t.tag == "entry"):
+                path = entry.attrib["path"]
+                for status in (e for e in entry.getchildren() if e.tag=="wc-status"):
+                    # clear variables for next entry
+                    item_char = ""
+                    item = status.attrib["item"]
+                    if (item != "unversioned"):
+                        rev = status.attrib["revision"]
+                    if item == "" or path == "":
+                        continue
+                    else:
+                        if item == "normal":
+                            item_char = " "
+                        elif item == "conflicted":
+                            item_char = "C"
+                        elif item == "added":
+                            item_char = "A"
+                        elif item == "deleted":
+                            item_char = "D"
+                        elif item == "modified":
+                            item_char = "M"
+                        elif item == "unversioned":
+                            item_char = "?"
+                        if item_char == "":
+                            print "Missing item data: ", status.attrib
+                        else:
+                            # append entry to matches
+                            matches.append((path, item_char, rev))
 
         matches.sort()
         return matches
