Index: vcpx/cvsps.py
===================================================================
--- vcpx/cvsps.py	(revision 906)
+++ vcpx/cvsps.py	(revision 908)
@@ -281,7 +281,5 @@
                 revision, timestamp = revision.split(' ', 1)
 
-        # Trasform the whole history in a list, since we need to
-        # visit it beginning from the last element
-        csets = list(self.getPendingChangesets(revision))
+        csets = self.getPendingChangesets(revision)
         if not csets:
             raise TargetInitializationFailure(
@@ -289,5 +287,5 @@
                 "revision '%s'" % revision)
         if timestamp == 'INITIAL':
-            cset = csets[0]
+            cset = csets.next()
             timestamp = cset.date.isoformat(sep=' ')
         else:
@@ -346,7 +344,6 @@
 
         found = False
-        if cset is None and csets:
-            cset = csets.pop()
-        while cset is not None:
+        csets = self.state_file.reversed()
+        for cset in csets:
             for m in cset.entries:
                 info = entries.getFileInfo(m.name)
Index: vcpx/source.py
===================================================================
--- vcpx/source.py	(revision 847)
+++ vcpx/source.py	(revision 909)
@@ -185,6 +185,5 @@
         """
 
-        pending = len(self.state_file)
-        if pending == 0:
+        if not self.state_file.pending():
             last = self.state_file.lastAppliedChangeset()
             if last:
Index: vcpx/tailor.py
===================================================================
--- vcpx/tailor.py	(revision 876)
+++ vcpx/tailor.py	(revision 909)
@@ -102,7 +102,6 @@
             raise
 
-        nchanges = len(pendings)
-        if nchanges:
-            self.log_info("Applying %d upstream changesets" % nchanges)
+        if pendings.pending():
+            self.log_info("Applying pending upstream changesets")
 
             try:
Index: vcpx/tests/statefile.py
===================================================================
--- vcpx/tests/statefile.py	(revision 907)
+++ vcpx/tests/statefile.py	(revision 909)
@@ -21,5 +21,4 @@
         sf = StateFile(rontf.name, None)
         sf.setPendingChangesets([1,2,3,4,5])
-        self.assertEqual(len(sf), 5)
 
         sf = StateFile(rontf.name, None)
@@ -38,14 +37,16 @@
         sf.applied()
         self.assertEqual(sf.lastAppliedChangeset(), 2)
-        self.assertEqual(len(sf), 3)
         sf.finalize()
+        self.assertEqual(sf.pending(), True)
 
         sf = StateFile(rontf.name, None)
         self.assertEqual(sf.lastAppliedChangeset(), 2)
-        self.assertEqual(len(sf), 3)
         i = 3
         for cs in sf:
             self.assertEqual(cs, i)
+            sf.applied()
             i += 1
+        sf.finalize()
+        self.assertEqual(sf.pending(), False)
 
     def testJournal(self):
@@ -58,5 +59,4 @@
         sf = StateFile(rontf.name, None)
         sf.setPendingChangesets([1,2,3,4,5])
-        self.assertEqual(len(sf), 5)
 
         sf = StateFile(rontf.name, None)
@@ -68,10 +68,8 @@
         sf.applied()
         self.assertEqual(sf.lastAppliedChangeset(), 2)
-        self.assertEqual(len(sf), 3)
         self.assert_(exists(rontf.name + '.journal'))
 
         sf = StateFile(rontf.name, None)
         self.assertEqual(sf.lastAppliedChangeset(), 2)
-        self.assertEqual(len(sf), 3)
         i = 3
         for cs in sf:
@@ -86,5 +84,4 @@
         sf = StateFile(rontf.name, None)
         sf.setPendingChangesets([1,2,3,4,5])
-        self.assertEqual(len(sf), 5)
 
         reversed = list(sf.reversed())
Index: vcpx/statefile.py
===================================================================
--- vcpx/statefile.py	(revision 907)
+++ vcpx/statefile.py	(revision 909)
@@ -45,5 +45,4 @@
         self.last_applied = None
         self.current = None
-        self.queuelen = 0
 
     def _load(self):
@@ -60,9 +59,9 @@
             self.archive = open(self.filename)
             self.last_applied = load(self.archive)
-            self.queuelen = load(self.archive)
+            # compatibility dummity: there was the queuelen here
+            load(self.archive)
         except IOError:
             self.archive = None
             self.last_applied = None
-            self.queuelen = 0
 
     def _write(self, changesets):
@@ -75,5 +74,5 @@
             sf = open(self.filename, 'w')
             dump(self.last_applied, sf)
-            dump(len(changesets), sf)
+            dump(None, sf)
             for cs in changesets:
                 dump(cs, sf)
@@ -97,11 +96,5 @@
             self.archive = None
             raise StopIteration
-        self.queuelen -= 1
         return self.current
-
-    def __len__(self):
-        if self.archive is None:
-            self._load()
-        return self.queuelen
 
     def reversed(self):
@@ -128,4 +121,22 @@
             yield load(self.archive)
 
+    def pending(self):
+        """
+        Verify if there's at least one changeset still pending.
+        """
+
+        if self.archive is None:
+            self._load()
+        if self.archive is None:
+            return False
+
+        pos = self.archive.tell()
+        try:
+            next = load(self.archive)
+        except EOFError:
+            next = None
+        self.archive.seek(pos)
+        return next is not None
+
     def applied(self, current=None):
         """
@@ -170,20 +181,16 @@
                     old = open(self.filename)
                     load(old) # last applied
-                    queuelen = load(old)
-                    if queuelen>0:
+                    load(old) # dummy queuelen
+                    try:
                         cs = load(old)
                         # Skip already applied changesets
                         while cs <> last_applied:
-                            queuelen -= 1
-                            if queuelen==0:
-                                break
                             cs = load(old)
-
+                    except EOFError:
+                        cs = None
                     sf = open(self.filename + '.new', 'w')
                     dump(last_applied, sf)
-                    if queuelen==0:
-                        dump(queuelen, sf)
-                    else:
-                        dump(queuelen-1, sf)
+                    dump(None, sf)
+                    if cs is not None:
                         while True:
                             try:
@@ -199,5 +206,4 @@
                     sf = open(self.filename, 'w')
                     dump(last_applied, sf)
-                    dump(0, sf)
                     sf.close()
 
