Index: src/libchcore/TSubTaskCopyMove.cpp
===================================================================
diff -u -N -r0380c176d1cfcdfd1cd2adfe01d9c1c5c38df9f1 -r7ba9f25ab2c2a42bac9f5455ecb98aaf6e29f02d
--- src/libchcore/TSubTaskCopyMove.cpp	(.../TSubTaskCopyMove.cpp)	(revision 0380c176d1cfcdfd1cd2adfe01d9c1c5c38df9f1)
+++ src/libchcore/TSubTaskCopyMove.cpp	(.../TSubTaskCopyMove.cpp)	(revision 7ba9f25ab2c2a42bac9f5455ecb98aaf6e29f02d)
@@ -48,6 +48,7 @@
 #include "TFilesystemFeedbackWrapper.h"
 #include "TFilesystemFileFeedbackWrapper.h"
 #include "log.h"
+#include "TDestinationPathProvider.h"
 
 namespace chcore
 {
@@ -138,9 +139,6 @@
 		unsigned long long ullCurrentItemProcessedSize = m_tSubTaskStats.GetCurrentItemProcessedSize();
 		bool bCurrentFileSilentResume = m_tSubTaskStats.CanCurrentItemSilentResume();
 
-		bool bIgnoreFolders = GetTaskPropValue<eTO_IgnoreDirectories>(rConfig);
-		bool bForceDirectories = GetTaskPropValue<eTO_CreateDirectoriesRelativeToRoot>(rConfig);
-
 		// create a buffer of size m_nBufferSize
 		CUSTOM_COPY_PARAMS ccp;
 		ccp.bProcessed = false;
@@ -151,6 +149,14 @@
 
 		AdjustBufferIfNeeded(ccp.dbBuffer, ccp.tBufferSizes, true);
 
+		bool bIgnoreFolders = GetTaskPropValue<eTO_IgnoreDirectories>(rConfig);
+		bool bForceDirectories = GetTaskPropValue<eTO_CreateDirectoriesRelativeToRoot>(rConfig);
+
+		TDestinationPathProvider tDstPathProvider(spFilesystem, pathDestination,
+			bIgnoreFolders, bForceDirectories,
+			GetTaskPropValue<eTO_AlternateFilenameFormatString_First>(GetContext().GetConfig()),
+			GetTaskPropValue<eTO_AlternateFilenameFormatString_AfterFirst>(GetContext().GetConfig()));
+
 		// log
 		TString strFormat;
 		strFormat = _T("Processing files/folders (ProcessFiles):\r\n\tOnlyCreate: %create\r\n\tFiles/folders count: %filecount\r\n\tIgnore Folders: %ignorefolders\r\n\tDest path: %dstpath\r\n\tCurrent index (0-based): %currindex");
@@ -194,7 +200,7 @@
 			}
 
 			// set dest path with filename
-			ccp.pathDstFile = CalculateDestinationPath(spFileInfo, pathDestination, ((int)bForceDirectories) << 1 | (int)bIgnoreFolders);
+			ccp.pathDstFile = tDstPathProvider.CalculateDestinationPath(spFileInfo);
 
 			// are the files/folders lie on the same partition ?
 			bool bMove = GetContext().GetOperationType() == eOperation_Move;
@@ -263,7 +269,7 @@
 				TFileInfoPtr spFileInfo = rFilesCache.GetAt(fcAttrIndex - 1);
 				if(spFileInfo->IsDirectory())
 				{
-					TSmartPath pathDstDir = CalculateDestinationPath(spFileInfo, pathDestination, ((int)bForceDirectories) << 1 | (int)bIgnoreFolders);
+					TSmartPath pathDstDir = tDstPathProvider.CalculateDestinationPath(spFileInfo);
 
 					spFilesystem->SetFileDirectoryTime(pathDstDir, spFileInfo->GetCreationTime(), spFileInfo->GetLastAccessTime(), spFileInfo->GetLastWriteTime());
 				}