Index: imapclient/imapclient.py
===================================================================
--- imapclient/imapclient.py	(revision 90:5ac3ccadb5fc)
+++ imapclient/imapclient.py	(revision 91:cd7e6ad6d118)
@@ -64,5 +64,6 @@
 
     re_sep = re.compile('^\(\("[^"]*" "([^"]+)"\)\)')
-    re_folder = re.compile('\([^)]*\) "[^"]+" "?([^"]+)"?')
+#     re_folder = re.compile('\([^)]*\) "[^"]+" "?([^"]+)"?')
+    re_folder = re.compile(r'\([^)]*\) "[^"]+" (?P<qqq>"?)(?P<folder>.+)(?P=qqq)')
     re_status = re.compile(r'^\s*"?(?P<folder>[^"]+)"?\s+'
                            r'\((?P<status_items>.*)\)$')
@@ -160,7 +161,26 @@
         typ, data = self._imap.list(directory, pattern)
         self._checkok('list', typ, data)
-
+        return self._proc_folder_list(data)
+
+
+    def list_sub_folders(self, directory="", pattern="*"):
+        """Get a listing of subscribed folders on the server.
+
+        The default behaviour (no args) will list all subscribed folders for the
+        logged in user.
+
+        @param directory: The base directory to look for folders from.
+        @param pattern: A pattern to match against folder names. Only folder
+            names matching this pattern will be returned. Wildcards accepted.
+        @return: A list of folder names. As per the return of list_folders().
+        """
+        typ, data = self._imap.lsub(directory, pattern)
+        self._checkok('lsub', typ, data)
+        return self._proc_folder_list(data)
+
+
+    def _proc_folder_list(self, folder_data):
         folders = []
-        for line in data:
+        for line in folder_data:
             #TODO can the FetchParser code be adapted for use here?
             folder_text = None
@@ -170,32 +190,10 @@
                 match = self.re_folder.match(line)
                 if match:
-                    folder_text = match.group(1)
+                    folder_text = match.group('folder')
+                    folder_text = folder_text.replace(r'\"', '"')
             if folder_text is not None:
                 folders.append(self._decode_folder_name(folder_text))
         return folders
-
-
-    def list_sub_folders(self, directory="", pattern="*"):
-        """Get a listing of subscribed folders on the server.
-
-        The default behaviour (no args) will list all subscribed folders for the
-        logged in user.
-
-        @param directory: The base directory to look for folders from.
-        @param pattern: A pattern to match against folder names. Only folder
-            names matching this pattern will be returned. Wildcards accepted.
-        @return: A list of folder names. As per the return of list_folders().
-        """
-        typ, data = self._imap.lsub(directory, pattern)
-        self._checkok('lsub', typ, data)
-
-        folders = []
-        for line in data:
-            if line:
-                m = self.re_folder.match(line)
-                if m:
-                    folders.append(self._decode_folder_name(m.group(1)))
-        return folders
-
+        
 
     def select_folder(self, folder):
Index: imapclient/test/test_IMAPClient.py
===================================================================
--- imapclient/test/test_IMAPClient.py	(revision 87:a8519ecf8a1a)
+++ imapclient/test/test_IMAPClient.py	(revision 91:cd7e6ad6d118)
@@ -6,5 +6,5 @@
 from imapclient.fixed_offset import FixedOffset
 from imapclient.imapclient import datetime_to_imap
-from imapclient.test.mock import patch, sentinel
+from imapclient.test.mock import patch, sentinel, Mock
 from imapclient.test.testable_imapclient import TestableIMAPClient as IMAPClient
 import unittest
@@ -19,48 +19,77 @@
 class TestListFolders(IMAPClientTest):
 
-    def test_simple(self):
-        self.client._imap.list.return_value = ('OK', ['(\\HasNoChildren) "/" "A"',
-                                                      '(\\HasNoChildren) "/" "Foo Bar"',
-                                                      ])
+    def test_list_folders(self):
+        self.client._imap.list.return_value = ('OK', sentinel.folder_data)
+        self.client._proc_folder_list = Mock(return_value=sentinel.folder_list)
 
         folders = self.client.list_folders(sentinel.dir, sentinel.pattern)
 
         self.assert_(self.client._imap.list.call_args == ((sentinel.dir, sentinel.pattern), {}))
-        self.assert_(folders == ['A', 'Foo Bar'])
+        self.assert_(self.client._proc_folder_list.call_args == ((sentinel.folder_data,), {}))
+        self.assert_(folders is sentinel.folder_list)
+
+        
+    def test_list_sub_folders(self):
+        self.client._imap.lsub.return_value = ('OK', sentinel.folder_data)
+        self.client._proc_folder_list = Mock(return_value=sentinel.folder_list)
+
+        folders = self.client.list_sub_folders(sentinel.dir, sentinel.pattern)
+
+        self.assert_(self.client._imap.lsub.call_args == ((sentinel.dir, sentinel.pattern), {}))
+        self.assert_(self.client._proc_folder_list.call_args == ((sentinel.folder_data,), {}))
+        self.assert_(folders is sentinel.folder_list)
 
 
-    def test_NO(self):
+    def test_list_folders_NO(self):
         self.client._imap.list.return_value = ('NO', ['badness'])
         self.assertRaises(IMAPClient.Error, self.client.list_folders)
 
 
+    def test_list_sub_folders_NO(self):
+        self.client._imap.list.return_value = ('NO', ['badness'])
+        self.assertRaises(IMAPClient.Error, self.client.list_folders)
+
+
+    def test_simple(self):
+        folders = self.client._proc_folder_list(['(\\HasNoChildren) "/" "A"',
+                                                 '(\\HasNoChildren) "/" "Foo Bar"',
+                                                 ])
+        self.assert_(folders == ['A', 'Foo Bar'])
+
+
+
+
     def test_without_quotes(self):
-        self.client._imap.list.return_value = ('OK', ['(\\HasNoChildren) "/" A',
-                                                      '(\\HasNoChildren) "/" B',
-                                                      '(\\HasNoChildren) "/" C',
-                                                      ])
-
-        folders = self.client.list_folders()
+        folders = self.client._proc_folder_list(['(\\HasNoChildren) "/" A',
+                                                 '(\\HasNoChildren) "/" B',
+                                                 '(\\HasNoChildren) "/" C',
+                                                 ])
         self.assert_(folders == ['A', 'B', 'C'], 'got %r' % folders)
 
 
     def test_mixed(self):
-        self.client._imap.list.return_value = ('OK', ['(\\HasNoChildren) "/" Alpha',
-                                                      '(\\HasNoChildren) "/" "Foo Bar"',
-                                                      '(\\HasNoChildren) "/" C',
-                                                      ])
-
-        folders = self.client.list_folders()
+        folders = self.client._proc_folder_list(['(\\HasNoChildren) "/" Alpha',
+                                                 '(\\HasNoChildren) "/" "Foo Bar"',
+                                                 '(\\HasNoChildren) "/" C',
+                                                 ])
         self.assert_(folders == ['Alpha', 'Foo Bar', 'C'], 'got %r' % folders)
 
 
     def test_funky_characters(self):
-        self.client._imap.list.return_value = ('OK',
-                                               [('(\\NoInferiors \\UnMarked) "/" {5}', 'bang\xff'),
-                                                '',
-                                                '(\\HasNoChildren \\UnMarked) "/" "INBOX"'])
+        folders = self.client._proc_folder_list([('(\\NoInferiors \\UnMarked) "/" {5}', 'bang\xff'),
+                                                 '',
+                                                 '(\\HasNoChildren \\UnMarked) "/" "INBOX"'])
+        self.assert_(folders == ['bang\xff', 'INBOX'], 'got %r' % folders)
 
-        folders = self.client.list_folders()
-        self.assert_(folders == ['bang\xff', 'INBOX'], 'got %r' % folders)
+
+    def test_escaped_quotes(self):
+        folders = self.client._proc_folder_list(['(\\HasNoChildren) "/" "Test \"Folder\""',
+                                                 '(\\HasNoChildren) "/" "Left\"Right"',
+                                                 ])
+        self.assert_(folders == ['Test "Folder"', 'Left\"Right'], 'got %r' % folders)
+
+
+    def test_other_escaping(self):
+        self.fail("what other escapes are allowed?")
 
 
