Index: src/libchcore/TSubTaskArray.cpp
===================================================================
diff -u -r121d674474766192b5bf02afda67fb962635f56b -ree9b975618a07beb840aca724732da87b522d54b
--- src/libchcore/TSubTaskArray.cpp	(.../TSubTaskArray.cpp)	(revision 121d674474766192b5bf02afda67fb962635f56b)
+++ src/libchcore/TSubTaskArray.cpp	(.../TSubTaskArray.cpp)	(revision ee9b975618a07beb840aca724732da87b522d54b)
@@ -104,8 +104,7 @@
 {
 	m_oidSubOperationIndex.store(0, boost::memory_order_release);
 
-	std::pair<TSubTaskBasePtr, bool> tupleRow;
-	BOOST_FOREACH(tupleRow, m_vSubTasks)
+	for(const std::pair<TSubTaskBasePtr, bool>& tupleRow : m_vSubTasks)
 	{
 		if(tupleRow.first == NULL)
 			THROW_CORE_EXCEPTION(eErr_InternalProblem);
Index: src/libchcore/TSubTaskCopyMove.cpp
===================================================================
diff -u -r121d674474766192b5bf02afda67fb962635f56b -ree9b975618a07beb840aca724732da87b522d54b
--- src/libchcore/TSubTaskCopyMove.cpp	(.../TSubTaskCopyMove.cpp)	(revision 121d674474766192b5bf02afda67fb962635f56b)
+++ src/libchcore/TSubTaskCopyMove.cpp	(.../TSubTaskCopyMove.cpp)	(revision ee9b975618a07beb840aca724732da87b522d54b)
@@ -554,13 +554,20 @@
 			return TSubTaskBase::eSubResult_Continue;
 		}
 
-		// ullSeekTo (== m_tSubTaskStats.GetCurrentItemProcessedSize()) is already a part of stats
-		// so the only correction that might need to be done is subtracting the difference
-		// between stored last file position (aka ullSeekTo) and the real position
-		// to which the file pos was set to.
-		m_tSubTaskStats.SetCurrentItemProcessedSize(ullMove);
-		if(ullMove < ullSeekTo)
-			m_tSubTaskStats.DecreaseProcessedSize(ullSeekTo - ullMove);
+		// adjust the stats for the difference between what was already processed and what will now be considered processed
+		unsigned long long ullCurrentProcessedSize = m_tSubTaskStats.GetCurrentItemProcessedSize();
+		if (ullMove > ullCurrentProcessedSize)
+		{
+			unsigned long long ullDiff = ullMove - ullCurrentProcessedSize;
+			m_tSubTaskStats.IncreaseCurrentItemProcessedSize(ullDiff);
+			m_tSubTaskStats.IncreaseProcessedSize(ullDiff);
+		}
+		else if (ullMove < ullCurrentProcessedSize)
+		{
+			unsigned long long ullDiff = ullCurrentProcessedSize - ullMove;
+			m_tSubTaskStats.DecreaseCurrentItemProcessedSize(ullDiff);
+			m_tSubTaskStats.DecreaseProcessedSize(ullDiff);
+		}
 	}
 
 	// if the destination file already exists - truncate it to the current file position
Index: src/libchcore/TTask.cpp
===================================================================
diff -u -r121d674474766192b5bf02afda67fb962635f56b -ree9b975618a07beb840aca724732da87b522d54b
--- src/libchcore/TTask.cpp	(.../TTask.cpp)	(revision 121d674474766192b5bf02afda67fb962635f56b)
+++ src/libchcore/TTask.cpp	(.../TTask.cpp)	(revision ee9b975618a07beb840aca724732da87b522d54b)
@@ -541,7 +541,7 @@
 
 		// if the files cache is not completely read - clean it up
 		if(!m_tSubTaskContext.GetFilesCache().IsComplete())
-			m_tSubTaskContext.GetFilesCache().Clear();		// get rid of m_files contents; rare state not modified, since incomplete cache is not being stored
+			m_tSubTaskContext.GetFilesCache().Clear();		// scanning for files did not finish processing, so the content of the files cache are useless
 
 		// save progress before killed
 		Store();