diff --git a/lib/jqueue.py b/lib/jqueue.py
index e5e71b2d141a118c31e43a7bcdbe5f78d12630ad..32af60a34fb0296f97277e3e4265d642e54f5d56 100644
--- a/lib/jqueue.py
+++ b/lib/jqueue.py
@@ -382,6 +382,10 @@ class JobQueue(object):
     self.acquire()
     try:
       for job in self._GetJobsUnlocked(None):
+        # a failure in loading the job can cause 'None' to be returned
+        if job is None:
+          continue
+
         status = job.CalcStatus()
 
         if status in (constants.JOB_STATUS_QUEUED, ):
@@ -553,7 +557,19 @@ class JobQueue(object):
     finally:
       fd.close()
 
-    job = _QueuedJob.Restore(self, data)
+    try:
+      job = _QueuedJob.Restore(self, data)
+    except Exception, err:
+      new_path = self._GetArchivedJobPath(job_id)
+      if filepath == new_path:
+        # job already archived (future case)
+        logging.exception("Can't parse job %s", job_id)
+      else:
+        # non-archived case
+        logging.exception("Can't parse job %s, will archive.", job_id)
+        self._RenameFileUnlocked(filepath, new_path)
+      return None
+
     self._memcache[job_id] = job
     logging.debug("Added job %s to the cache", job_id)
     return job