Index: src/Fragmentation/Automation/FragmentQueue.cpp
===================================================================
--- src/Fragmentation/Automation/FragmentQueue.cpp	(revision 55938519c676fe8633bfec4246ea3754a88191d6)
+++ src/Fragmentation/Automation/FragmentQueue.cpp	(revision fe95b7a95acf0c88e89ca17057d71a53c556f761)
@@ -23,8 +23,10 @@
 
 #include "CodePatterns/Assert.hpp"
+#include "CodePatterns/Log.hpp"
 
 FragmentResult::ptr FragmentQueue::NoResult( new FragmentResult(-1) );
 FragmentResult::ptr FragmentQueue::NoResultQueued( new FragmentResult(-2) );
 FragmentResult::ptr FragmentQueue::ResultDelivered( new FragmentResult(-3) );
+size_t FragmentQueue::Max_Attempts = (size_t)1;
 
 /** Constructor for class FragmentQueue.
@@ -93,4 +95,11 @@
       "FragmentQueue::popJob() - there are no jobs on the queue.");
   FragmentJob::ptr job = jobs.front();
+#ifndef NDEBUG
+  std::pair< BackupMap::iterator, bool> inserter =
+#endif
+  backup.insert( std::make_pair( job->getId(), job ));
+  ASSERT (inserter.second,
+      "FragmentQueue::popJob() - job "+toString(job->getId())+
+      " is already in the backup.");
   ResultMap::iterator iter = results.find(job->getId());
   ASSERT(iter != results.end(),
@@ -197,12 +206,65 @@
 void FragmentQueue::pushResult(FragmentResult::ptr &_result)
 {
+  const JobId_t id = _result->getId();
   /// check for presence
-  ResultMap::iterator iter = results.find(_result->getId());
+  ResultMap::iterator iter = results.find(id);
   ASSERT(iter != results.end(),
-      "FragmentQueue::pushResult() - job "+toString(_result->getId())+" is not known to us.");
+      "FragmentQueue::pushResult() - job "+toString(id)+" is not known to us.");
   ASSERT(*iter->second == *NoResultQueued,
-      "FragmentQueue::pushResult() - is not waiting for the result of job "+toString(_result->getId())+".");
-  /// and overwrite NoResult in found entry
-  iter->second = _result;
-}
-
+      "FragmentQueue::pushResult() - is not waiting for the result of job "+toString(id)+".");
+  // check whether this is a resubmitted job
+  AttemptsMap::iterator attemptiter = attempts.find(id);
+  // check whether succeeded or (finally) failed
+  if ((_result->exitflag == 0) || ((attemptiter != attempts.end()) && (attemptiter->second >= Max_Attempts))) {
+    // give notice if it is resubmitted job
+    if (attemptiter != attempts.end()) {
+      if (attemptiter->second >= Max_Attempts)
+        ELOG(1, "Job #" << id << " failed on " << Max_Attempts << "th attempt for the last time.");
+      else
+        LOG(1, "INFO: Job #" << id << " succeeded on " << attemptiter->second << "th attempt.");
+    }
+    // remove in attempts
+    if (attemptiter != attempts.end())
+      attempts.erase(attemptiter);
+    // remove in backup map
+    BackupMap::iterator backupiter = backup.find(id);
+    ASSERT( backupiter != backup.end(),
+        "FragmentQueue::pushResult() - cannot find job "+toString(id)
+        +" in backup.");
+    backup.erase(backupiter);
+    /// and overwrite NoResult in found entry
+    iter->second = _result;
+  } else {
+    LOG(1, "Job " << id << " failed, resubmitting.");
+    // increase attempts
+    if (attemptiter != attempts.end())
+      ++(attemptiter->second);
+    else
+      attempts.insert( std::make_pair(id, (size_t)1) );
+    // resubmit job
+    resubmitJob(id);
+  }
+}
+
+/** Resubmit a job which a worker failed to calculate.
+ *
+ * @param jobid id of the failed job
+ */
+void FragmentQueue::resubmitJob(const JobId_t jobid)
+{
+  BackupMap::iterator iter = backup.find(jobid);
+  ASSERT( iter != backup.end(),
+      "FragmentQueue::resubmitJob() - job id "+toString(jobid)
+      +" not stored in backup.");
+  if (iter != backup.end()) {
+    // remove result
+    ResultMap::iterator resiter = results.find(jobid);
+    ASSERT( resiter != results.end(),
+        "FragmentQueue::resubmitJob() - resubmitting job "+toString(jobid)
+        +" for which no result is present.");
+    results.erase(resiter);
+    pushJob(iter->second);
+    backup.erase(iter);
+  }
+}
+
Index: src/Fragmentation/Automation/FragmentQueue.hpp
===================================================================
--- src/Fragmentation/Automation/FragmentQueue.hpp	(revision 55938519c676fe8633bfec4246ea3754a88191d6)
+++ src/Fragmentation/Automation/FragmentQueue.hpp	(revision fe95b7a95acf0c88e89ca17057d71a53c556f761)
@@ -40,4 +40,5 @@
   FragmentJob::ptr popJob();
   bool isJobPresent() const;
+  void resubmitJob(const JobId_t jobid);
 
   // querying for results
@@ -59,12 +60,20 @@
   //!> result that takes place in ResultQueue after real result has been delivered.
   static FragmentResult::ptr ResultDelivered;
+  //!> maximum number of attempts before job is not resubmitted
+  static size_t Max_Attempts;
 
   typedef std::deque<FragmentJob::ptr> JobQueue;
+  typedef std::map<JobId_t, FragmentJob::ptr> BackupMap;
   typedef std::map<JobId_t, FragmentResult::ptr> ResultMap;
+  typedef std::map<JobId_t, size_t> AttemptsMap;
 
   //!> queue for all jobs
   JobQueue jobs;
+  //!> backup map for popped jobs that workers failed to calculate
+  BackupMap backup;
   //!> map for all results that have been polled by the server
   ResultMap results;
+  //!> map for all jobs that had to be resubmitted storing how often this has been tried
+  AttemptsMap attempts;
 };
 
Index: src/Fragmentation/Automation/unittests/FragmentQueueUnitTest.cpp
===================================================================
--- src/Fragmentation/Automation/unittests/FragmentQueueUnitTest.cpp	(revision 55938519c676fe8633bfec4246ea3754a88191d6)
+++ src/Fragmentation/Automation/unittests/FragmentQueueUnitTest.cpp	(revision fe95b7a95acf0c88e89ca17057d71a53c556f761)
@@ -294,2 +294,40 @@
 }
 
+/** Unit test for resubmitJob().
+ *
+ */
+void FragmentQueueTest::resubmitTest()
+{
+  FragmentJob::ptr testJob(new FragmentJobStub(1));
+
+  // push a Job into queue
+#ifndef NDEBUG
+  CPPUNIT_ASSERT_NO_THROW( queue->pushJob(testJob) );
+#else
+  queue->pushJob(testJob);
+#endif
+  CPPUNIT_ASSERT_EQUAL((size_t)1, queue->jobs.size());
+  CPPUNIT_ASSERT_EQUAL((size_t)1, queue->results.size());
+
+  // pop the job
+  // pop both as if some work was being done
+#ifndef NDEBUG
+  CPPUNIT_ASSERT_NO_THROW( queue->popJob() );
+#else
+  queue->popJob();
+#endif
+  CPPUNIT_ASSERT_EQUAL((size_t)0, queue->jobs.size());
+  CPPUNIT_ASSERT_EQUAL((size_t)1, queue->results.size());
+
+  // resubmit
+#ifndef NDEBUG
+  CPPUNIT_ASSERT_NO_THROW( queue->resubmitJob((JobId_t)1) );
+#else
+  queue->resubmitJob((JobId_t)1);
+#endif
+
+  // check whethers it's present again
+  CPPUNIT_ASSERT_EQUAL((size_t)1, queue->jobs.size());
+  CPPUNIT_ASSERT_EQUAL((size_t)1, queue->results.size());
+}
+
Index: src/Fragmentation/Automation/unittests/FragmentQueueUnitTest.hpp
===================================================================
--- src/Fragmentation/Automation/unittests/FragmentQueueUnitTest.hpp	(revision 55938519c676fe8633bfec4246ea3754a88191d6)
+++ src/Fragmentation/Automation/unittests/FragmentQueueUnitTest.hpp	(revision fe95b7a95acf0c88e89ca17057d71a53c556f761)
@@ -28,4 +28,5 @@
     CPPUNIT_TEST ( ResultsTest );
     CPPUNIT_TEST ( AllResultsTest );
+    CPPUNIT_TEST ( resubmitTest );
     CPPUNIT_TEST_SUITE_END();
 
@@ -37,4 +38,5 @@
       void ResultsTest();
       void AllResultsTest();
+      void resubmitTest();
 
 private:
