Index: src/ch/ClipboardMonitor.cpp
===================================================================
diff -u -r4cd45795025411a82006a94d9c7f7f2d9ecda421 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/ClipboardMonitor.cpp	(.../ClipboardMonitor.cpp)	(revision 4cd45795025411a82006a94d9c7f7f2d9ecda421)
+++ src/ch/ClipboardMonitor.cpp	(.../ClipboardMonitor.cpp)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -70,9 +70,6 @@
 	// bufor
 	TCHAR path[_MAX_PATH];
 
-	CTaskPtr spTask;	// ptr to a task
-	CClipboardEntryPtr spEntry;
-
 	// register clipboard format
 	UINT nFormat=RegisterClipboardFormat(_T("Preferred DropEffect"));
 	UINT uiCounter=0, uiShutCounter=0;
@@ -88,19 +85,20 @@
 
 			UINT nCount=DragQueryFile(static_cast<HDROP>(handle), 0xffffffff, NULL, 0);
 
-			spTask = pData->m_pTasks->CreateTask();
+			TTaskDefinition tTaskDefinition;
 
-			for (UINT i=0;i<nCount;i++)
+			// list of files
+			for(UINT stIndex = 0; stIndex < nCount; stIndex++)
 			{
-				DragQueryFile(static_cast<HDROP>(handle), i, path, _MAX_PATH);
-				spEntry.reset(new CClipboardEntry);
-				spEntry->SetPath(path);
-				spTask->AddClipboardData(spEntry);
+				DragQueryFile(static_cast<HDROP>(handle), stIndex, path, _MAX_PATH);
+
+				tTaskDefinition.AddSourcePath(path);
 			}
 
+			// operation type
 			EOperationType eOperation = eOperation_Copy;
 
-			if (IsClipboardFormatAvailable(nFormat))
+			if(IsClipboardFormatAvailable(nFormat))
 			{
 				handle=GetClipboardData(nFormat);
 				LPVOID addr=GlobalLock(handle);
@@ -116,22 +114,11 @@
 			else
 				eOperation = eOperation_Copy;	// default - copy
 
-			spTask->SetOperationType(eOperation);	// copy
+			tTaskDefinition.SetOperationType(eOperation);	// copy
 
 			EmptyClipboard();
 			CloseClipboard();
 
-			BUFFERSIZES bs;
-			bs.m_bOnlyDefault=rConfig.get_bool(PP_BFUSEONLYDEFAULT);
-			bs.m_uiDefaultSize=(UINT)rConfig.get_signed_num(PP_BFDEFAULT);
-			bs.m_uiOneDiskSize=(UINT)rConfig.get_signed_num(PP_BFONEDISK);
-			bs.m_uiTwoDisksSize=(UINT)rConfig.get_signed_num(PP_BFTWODISKS);
-			bs.m_uiCDSize=(UINT)rConfig.get_signed_num(PP_BFCD);
-			bs.m_uiLANSize=(UINT)rConfig.get_signed_num(PP_BFLAN);
-
-			spTask->SetBufferSizes(&bs);
-			spTask->SetPriority(boost::numeric_cast<int>(rConfig.get_signed_num(PP_CMDEFAULTPRIORITY)));
-
 			// get dest folder
 			CFolderDialog dlg;
 
@@ -169,11 +156,11 @@
 			dlg.m_bdData.strText = GetResManager().LoadString(IDS_MAINBROWSETEXT_STRING);
 
 			// set count of data to display
-			size_t stClipboardSize = spTask->GetClipboardDataSize();
+			size_t stClipboardSize = tTaskDefinition.GetSourcePathCount();
 			size_t stEntries = (stClipboardSize > 3) ? 2 : stClipboardSize;
-			for(size_t i = 0; i < stEntries; i++)
+			for(size_t stIndex = 0; stIndex < stEntries; stIndex++)
 			{
-				dlg.m_bdData.strText += spTask->GetClipboardData(i)->GetPath() + _T("\n");
+				dlg.m_bdData.strText += tTaskDefinition.GetSourcePathNameAt(stIndex) + _T("\n");
 			}
 
 			// add ...
@@ -203,15 +190,27 @@
 			rConfig.set_bool(PP_FDIGNORESHELLDIALOGS, dlg.m_bdData.bIgnoreDialogs);
 			rConfig.write(NULL);
 
-			if(iResult != IDOK)
-				spTask.reset();
-			else
+			if(iResult == IDOK)
 			{
 				// get dest path
 				CString strData;
 				dlg.GetPath(strData);
-				spTask->SetDestPath(strData);
+				tTaskDefinition.SetDestinationPath(strData);
 
+				CTaskPtr spTask = pData->m_pTasks->CreateTask();
+				spTask->SetTaskDefinition(tTaskDefinition);
+
+				BUFFERSIZES bs;
+				bs.m_bOnlyDefault=rConfig.get_bool(PP_BFUSEONLYDEFAULT);
+				bs.m_uiDefaultSize=(UINT)rConfig.get_signed_num(PP_BFDEFAULT);
+				bs.m_uiOneDiskSize=(UINT)rConfig.get_signed_num(PP_BFONEDISK);
+				bs.m_uiTwoDisksSize=(UINT)rConfig.get_signed_num(PP_BFTWODISKS);
+				bs.m_uiCDSize=(UINT)rConfig.get_signed_num(PP_BFCD);
+				bs.m_uiLANSize=(UINT)rConfig.get_signed_num(PP_BFLAN);
+
+				spTask->SetBufferSizes(&bs);
+				spTask->SetPriority(boost::numeric_cast<int>(rConfig.get_signed_num(PP_CMDEFAULTPRIORITY)));
+
 				// add task to a list of tasks and start
 				pData->m_pTasks->Add(spTask);
 
Index: src/ch/FileInfo.cpp
===================================================================
diff -u -r9ece817722b8a0568f28c4ae238e6b46a0e85628 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/FileInfo.cpp	(.../FileInfo.cpp)	(revision 9ece817722b8a0568f28c4ae238e6b46a0e85628)
+++ src/ch/FileInfo.cpp	(.../FileInfo.cpp)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -122,11 +122,30 @@
 //////////////////////////////////////////////////////////////////////////////
 // CClipboardArray
 
+CClipboardArray::CClipboardArray()
+{
+}
+
 CClipboardArray::~CClipboardArray()
 {
 	RemoveAll();
 }
 
+CClipboardArray::CClipboardArray(const CClipboardArray& rSrc) :
+   m_vEntries(rSrc.m_vEntries)
+{
+}
+
+CClipboardArray& CClipboardArray::operator=(const CClipboardArray& rSrc)
+{
+   if(this != &rSrc)
+   {
+      m_vEntries = rSrc.m_vEntries;
+   }
+
+   return *this;
+}
+
 CClipboardEntryPtr CClipboardArray::GetAt(size_t stPos) const
 {
 	boost::shared_lock<boost::shared_mutex> lock(m_lock);
Index: src/ch/FileInfo.h
===================================================================
diff -u -r0c8e64ca71144467eed1f1d6c32d59bc2150a004 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/FileInfo.h	(.../FileInfo.h)	(revision 0c8e64ca71144467eed1f1d6c32d59bc2150a004)
+++ src/ch/FileInfo.h	(.../FileInfo.h)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -88,8 +88,12 @@
 class CClipboardArray
 {
 public:
+	CClipboardArray();
+	CClipboardArray(const CClipboardArray& rSrc);
 	~CClipboardArray();
 
+	CClipboardArray& operator=(const CClipboardArray& rSrc);
+
 	template<class Archive>
 	void Store(Archive& ar, unsigned int /*uiVersion*/, bool bData) const
 	{
Index: src/ch/MainWnd.cpp
===================================================================
diff -u -r2996cfa8b8db93f1b06a4e5f142ab74a23f67235 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/MainWnd.cpp	(.../MainWnd.cpp)	(revision 2996cfa8b8db93f1b06a4e5f142ab74a23f67235)
+++ src/ch/MainWnd.cpp	(.../MainWnd.cpp)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -505,26 +505,25 @@
 	}
 
 	// create new task
-	CTaskPtr spTask = m_tasks.CreateTask();
-	spTask->SetDestPath(strDstPath);
-	CClipboardEntryPtr spEntry;
+	TTaskDefinition tTaskDefinition;
+	tTaskDefinition.SetDestinationPath(strDstPath);
 
 	// files
 	for(int i = 0; i < astrFiles.GetSize(); i++)
 	{
-		spEntry.reset(new CClipboardEntry);
-		spEntry->SetPath(astrFiles.GetAt(i));
-		spTask->AddClipboardData(spEntry);
+		tTaskDefinition.AddSourcePath(astrFiles.GetAt(i));
 	}
 
-	spTask->SetOperationType(bMove ? eOperation_Move : eOperation_Copy);
+	tTaskDefinition.SetOperationType(bMove ? eOperation_Move : eOperation_Copy);
 
-	// special status
 	TTaskBasicConfiguration tTaskConfig;
 	tTaskConfig.SetCreateEmptyFiles(bOnlyCreate != FALSE);
 	tTaskConfig.SetCreateOnlyDirectories(bForceDirectories != FALSE);
 	tTaskConfig.SetIgnoreDirectories(bIgnoreDirs != FALSE);
 
+	CTaskPtr spTask = m_tasks.CreateTask();
+
+	spTask->SetTaskDefinition(tTaskDefinition);
 	spTask->SetTaskBasicConfiguration(tTaskConfig);
 			
 	// set some stuff related with task
@@ -591,19 +590,23 @@
 			rConfig.set_string(PP_RECENTPATHS, (*it), icpf::property::action_add);
 		}
 
-		// new task
-		CTaskPtr spTask = m_tasks.CreateTask();
-		spTask->SetDestPath(dlg.m_ccData.m_strDestPath);
-		CClipboardEntryPtr spEntry;
-		for (int i=0;i<dlg.m_ccData.m_astrPaths.GetSize();i++)
+
+		TTaskDefinition tTaskDefinition;
+
+		tTaskDefinition.SetOperationType((dlg.m_ccData.m_iOperation == 1) ? eOperation_Move : eOperation_Copy);
+
+		tTaskDefinition.SetDestinationPath(dlg.m_ccData.m_strDestPath);
+
+		for (int iIndex = 0; iIndex < dlg.m_ccData.m_astrPaths.GetSize(); iIndex++)
 		{
-			spEntry.reset(new CClipboardEntry);
-			spEntry->SetPath(dlg.m_ccData.m_astrPaths.GetAt(i));
-			spTask->AddClipboardData(spEntry);
+			tTaskDefinition.AddSourcePath(dlg.m_ccData.m_astrPaths.GetAt(iIndex));
 		}
-		
-		spTask->SetOperationType((dlg.m_ccData.m_iOperation == 1) ? eOperation_Move : eOperation_Copy);
 
+		// new task
+		CTaskPtr spTask = m_tasks.CreateTask();
+
+		spTask->SetTaskDefinition(tTaskDefinition);
+		
 		// special status
 		TTaskBasicConfiguration tTaskConfig;
 		tTaskConfig.SetCreateEmptyFiles(dlg.m_ccData.m_bCreateStructure);
Fisheye: Tag 044d0e17cdedf3055202486a2235e1a3c8dd6e56 refers to a dead (removed) revision in file `src/ch/ReplacePathsDlg.cpp'.
Fisheye: No comparison available.  Pass `N' to diff?
Fisheye: Tag 044d0e17cdedf3055202486a2235e1a3c8dd6e56 refers to a dead (removed) revision in file `src/ch/ReplacePathsDlg.h'.
Fisheye: No comparison available.  Pass `N' to diff?
Index: src/ch/StatusDlg.cpp
===================================================================
diff -u -r61ed5f2f3084ba759ec27f61b4f909ed8ce305e9 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/StatusDlg.cpp	(.../StatusDlg.cpp)	(revision 61ed5f2f3084ba759ec27f61b4f909ed8ce305e9)
+++ src/ch/StatusDlg.cpp	(.../StatusDlg.cpp)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -21,7 +21,6 @@
 #include "resource.h"
 #include "StatusDlg.h"
 #include "BufferSizeDlg.h"
-#include "ReplacePathsDlg.h"
 #include "StringHelpers.h"
 #include "StaticEx.h"
 #include "Structs.h"
@@ -82,8 +81,6 @@
 	ON_BN_CLICKED(IDC_REMOVE_FINISHED_BUTTON, OnRemoveFinishedButton)
 	ON_NOTIFY(LVN_KEYDOWN, IDC_STATUS_LIST, OnKeydownStatusList)
 	ON_NOTIFY(LVN_CHANGEDSELECTION, IDC_STATUS_LIST, OnSelectionChanged)
-	ON_BN_CLICKED(IDC_ADVANCED_BUTTON, OnAdvancedButton)
-	ON_COMMAND(ID_POPUP_REPLACE_PATHS, OnPopupReplacePaths)
 	ON_BN_CLICKED(IDC_SHOW_LOG_BUTTON, OnShowLogButton)
 	ON_BN_CLICKED(IDC_STICK_BUTTON, OnStickButton)
 	ON_BN_CLICKED(IDC_RESUME_BUTTON, OnResumeButton)
@@ -254,7 +251,7 @@
 
 	// insert 'file' subitem
 	lvi.iSubItem=2;
-	m_strTemp=td.m_pdpDestPath->GetPath();
+	m_strTemp=td.m_strDstPath;
 	lvi.pszText=m_strTemp.GetBuffer(0);
 	m_strTemp.ReleaseBuffer();
 	lvi.cchTextMax=lstrlen(lvi.pszText);
@@ -317,9 +314,9 @@
 		// refresh only when there are new selected item
 //		if (spTask != m_spLastSelected)
 		{
-			GetDlgItem(IDC_DESTINATION_STATIC)->SetWindowText(td.m_pdpDestPath->GetPath());
+			GetDlgItem(IDC_DESTINATION_STATIC)->SetWindowText(td.m_strDstPath);
 			GetDlgItem(IDC_PRIORITY_STATIC)->SetWindowText(GetResManager().LoadString(IDS_PRIORITY0_STRING+PriorityToIndex(td.m_nPriority)));
-			GetDlgItem(IDC_ASSOCIATEDFILES__STATIC)->SetWindowText(*td.m_pstrUniqueName+_T(".atd (.atp, .log)"));
+			GetDlgItem(IDC_ASSOCIATEDFILES__STATIC)->SetWindowText(td.m_strUniqueName + _T(".atd (.atp, .log)"));
 		}
 
 		// refresh m_spLastSelected
@@ -767,66 +764,6 @@
 	CLanguageDialog::OnCancel();
 }
 
-void CStatusDlg::OnAdvancedButton() 
-{
-	CMenu menu;
-	HMENU hMenu=GetResManager().LoadMenu(MAKEINTRESOURCE(IDR_ADVANCED_MENU));
-	if (!menu.Attach(hMenu))
-	{
-		DestroyMenu(hMenu);
-		return;
-	}
-	
-	CMenu* pPopup = menu.GetSubMenu(0);
-	ASSERT(pPopup != NULL);
-	if(pPopup)
-	{
-		// get the point to show menu at
-		CRect rect;
-		GetDlgItem(IDC_ADVANCED_BUTTON)->GetWindowRect(&rect);
-
-		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rect.right+1, rect.top, this);
-	}
-}
-
-void CStatusDlg::OnPopupReplacePaths() 
-{
-	// check if there's a selection currently
-	if ( (m_spSelectedItem=GetSelectedItemPointer()) != NULL )
-	{
-		if (m_spSelectedItem->GetTaskState() == eTaskState_Paused)
-		{
-			bool bContinue=false;
-			if (m_spSelectedItem->GetTaskState() == eTaskState_Error)
-			{
-				m_spSelectedItem->PauseProcessing();
-				bContinue=true;
-			}
-
-			// assuming here that there's selection and task is paused
-			CReplacePathsDlg dlg;
-			dlg.m_spTask=m_spSelectedItem;
-			if (dlg.DoModal() == IDOK)
-			{
-				// change 'no case'
-				int iClipboard=m_spSelectedItem->ReplaceClipboardStrings(dlg.m_strSource, dlg.m_strDest);
-
-				ictranslate::CFormat fmt(GetResManager().LoadString(IDS_REPLACEPATHSTEXT_STRING));
-				fmt.SetParam(_t("%count"), iClipboard);
-				AfxMessageBox(fmt);
-			}
-
-			// resume if earlier was an error
-			if (bContinue)
-				m_spSelectedItem->ResumeProcessing();
-		}
-		else
-			MsgBox(IDS_TASKNOTPAUSED_STRING);
-	}
-	else
-		MsgBox(IDS_TASKNOTSELECTED_STRING);
-}
-
 void CStatusDlg::OnShowLogButton() 
 {
 	// show log
@@ -835,10 +772,10 @@
 		return;
 
 	unsigned long lResult = (unsigned long)(ShellExecute(this->m_hWnd, _T("open"), _T("notepad.exe"),
-			CString(spTask->GetTaskPath()) + spTask->GetUniqueName() + _T(".log"), NULL, SW_SHOWNORMAL));
+			CString(spTask->GetTaskPath()) + spTask->GetTaskDefinition().GetTaskUniqueID() + _T(".log"), NULL, SW_SHOWNORMAL));
 	if(lResult < 32)
 	{
-		CString str = CString(spTask->GetTaskPath()) + spTask->GetUniqueName()+_T(".log");
+		CString str = CString(spTask->GetTaskPath()) + spTask->GetTaskDefinition().GetTaskUniqueID()+_T(".log");
 		ictranslate::CFormat fmt(GetResManager().LoadString(IDS_SHELLEXECUTEERROR_STRING));
 		fmt.SetParam(_t("%errno"), lResult);
 		fmt.SetParam(_t("%path"), str);
@@ -966,7 +903,6 @@
 	AddResizableControl(IDC_CANCEL_ALL_BUTTON, 0, 1.0, 0, 0);
 	AddResizableControl(IDC_REMOVE_FINISHED_BUTTON, 0, 1.0, 0, 0);
 	AddResizableControl(IDC_RESTART_ALL_BUTTON, 0, 1.0, 0, 0);
-	AddResizableControl(IDC_ADVANCED_BUTTON, 0, 1.0, 0, 0);
 
 	AddResizableControl(IDC_STICK_BUTTON, 1.0, 1.0, 0, 0);
 
Index: src/ch/StatusDlg.h
===================================================================
diff -u -r61ed5f2f3084ba759ec27f61b4f909ed8ce305e9 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/StatusDlg.h	(.../StatusDlg.h)	(revision 61ed5f2f3084ba759ec27f61b4f909ed8ce305e9)
+++ src/ch/StatusDlg.h	(.../StatusDlg.h)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -112,8 +112,6 @@
 	afx_msg void OnKeydownStatusList(NMHDR* pNMHDR, LRESULT* pResult);
 	afx_msg void OnSelectionChanged(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/);
 	virtual void OnCancel();
-	afx_msg void OnAdvancedButton();
-	afx_msg void OnPopupReplacePaths();
 	afx_msg void OnShowLogButton();
 	afx_msg void OnStickButton();
 	afx_msg void OnResumeButton();
Index: src/ch/TTaskConfiguration.cpp
===================================================================
diff -u -rb7709acbab26fdb108b77d3e08d3872f54248af2 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/TTaskConfiguration.cpp	(.../TTaskConfiguration.cpp)	(revision b7709acbab26fdb108b77d3e08d3872f54248af2)
+++ src/ch/TTaskConfiguration.cpp	(.../TTaskConfiguration.cpp)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -34,10 +34,33 @@
 {
 }
 
+TSubTaskCommonConfig::TSubTaskCommonConfig(const TSubTaskCommonConfig& rSrc) :
+   m_nPriority(THREAD_PRIORITY_NORMAL),
+   m_bDeleteAllFilesAfterAllCopyings(true),
+   m_bIgnoreReadOnlyAttributes(false)
+{
+   *this = rSrc;
+}
+
 TSubTaskCommonConfig::~TSubTaskCommonConfig()
 {
 }
 
+TSubTaskCommonConfig& TSubTaskCommonConfig::operator=(const TSubTaskCommonConfig& rSrc)
+{
+   if(this != &rSrc)
+   {
+      boost::shared_lock<boost::shared_mutex> src_lock(rSrc.m_lock);
+      boost::unique_lock<boost::shared_mutex> lock(m_lock);
+
+      m_nPriority = rSrc.m_nPriority;
+      m_bDeleteAllFilesAfterAllCopyings = rSrc.m_bDeleteAllFilesAfterAllCopyings;
+      m_bIgnoreReadOnlyAttributes = rSrc.m_bIgnoreReadOnlyAttributes;
+   }
+
+   return *this;
+}
+
 void TSubTaskCommonConfig::SetPriority(int iPriority)
 {
 	boost::unique_lock<boost::shared_mutex> lock(m_lock);
@@ -77,14 +100,34 @@
 ////////////////////////////////////////////////////////////////////////////
 // class TSubTaskScanDirectoriesConfig
 
-TSubTaskScanDirectoriesConfig::TSubTaskScanDirectoriesConfig()
+TSubTaskScanDirectoriesConfig::TSubTaskScanDirectoriesConfig() :
+   m_afFilters()
 {
 }
 
+TSubTaskScanDirectoriesConfig::TSubTaskScanDirectoriesConfig(const TSubTaskScanDirectoriesConfig& rSrc) :
+   m_afFilters()
+{
+   *this = rSrc;
+}
+
 TSubTaskScanDirectoriesConfig::~TSubTaskScanDirectoriesConfig()
 {
 }
 
+TSubTaskScanDirectoriesConfig& TSubTaskScanDirectoriesConfig::operator=(const TSubTaskScanDirectoriesConfig& rSrc)
+{
+   if(this != &rSrc)
+   {
+      boost::shared_lock<boost::shared_mutex> src_lock(rSrc.m_lock);
+      boost::unique_lock<boost::shared_mutex> lock(m_lock);
+
+      m_afFilters = rSrc.m_afFilters;
+   }
+
+   return *this;
+}
+
 void TSubTaskScanDirectoriesConfig::SetFilters(const CFiltersArray& rFilters)
 {
 	boost::unique_lock<boost::shared_mutex> lock(m_lock);
@@ -111,10 +154,39 @@
 	m_bsSizes.m_bOnlyDefault = false;
 }
 
+TSubTaskCopyMoveConfig::TSubTaskCopyMoveConfig(const TSubTaskCopyMoveConfig& rSrc) :
+   m_bDisableSystemBuffering(false),
+   m_ullMinSizeToDisableBuffering(0),
+   m_bPreserveFileDateTime(false),
+   m_bPreserveFileAttributes(false),
+   m_bIgnoreDirectories(false),
+   m_bCreateEmptyFiles(false),
+   m_bCreateOnlyDirectories(false)
+{
+   *this = rSrc;
+}
+
 TSubTaskCopyMoveConfig::~TSubTaskCopyMoveConfig()
 {
 }
 
+TSubTaskCopyMoveConfig& TSubTaskCopyMoveConfig::operator=(const TSubTaskCopyMoveConfig& rSrc)
+{
+   if(this != &rSrc)
+   {
+      m_bDisableSystemBuffering = rSrc.m_bDisableSystemBuffering;
+      m_ullMinSizeToDisableBuffering = rSrc.m_ullMinSizeToDisableBuffering;
+      m_bPreserveFileDateTime = rSrc.m_bPreserveFileDateTime;
+      m_bPreserveFileAttributes = rSrc.m_bPreserveFileAttributes;
+      m_bIgnoreDirectories = rSrc.m_bIgnoreDirectories;
+      m_bCreateEmptyFiles = rSrc.m_bCreateEmptyFiles;
+      m_bCreateOnlyDirectories = rSrc.m_bCreateOnlyDirectories;
+      m_bsSizes = rSrc.m_bsSizes;
+   }
+
+   return *this;
+}
+
 void TSubTaskCopyMoveConfig::SetDisableSystemBuffering(bool bDisableBuffering)
 {
 	boost::unique_lock<boost::shared_mutex> lock(m_lock);
Index: src/ch/TTaskConfiguration.h
===================================================================
diff -u -rb7709acbab26fdb108b77d3e08d3872f54248af2 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/TTaskConfiguration.h	(.../TTaskConfiguration.h)	(revision b7709acbab26fdb108b77d3e08d3872f54248af2)
+++ src/ch/TTaskConfiguration.h	(.../TTaskConfiguration.h)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -33,8 +33,11 @@
 {
 public:
 	TSubTaskCommonConfig();
+	TSubTaskCommonConfig(const TSubTaskCommonConfig& rSrc);
 	~TSubTaskCommonConfig();
 
+	TSubTaskCommonConfig& operator=(const TSubTaskCommonConfig& rSrc);
+
 	void SetPriority(int iPriority);
 	int GetPriority() const;
 
@@ -45,7 +48,7 @@
 	bool GetIgnoreReadOnlyAttributes() const;
 
 	template<class Archive>
-	void load(Archive& ar)
+	void load(Archive& ar, unsigned int /*uiVersion*/)
 	{
 		boost::unique_lock<boost::shared_mutex> lock(m_lock);
 
@@ -55,7 +58,7 @@
 	}
 
 	template<class Archive>
-	void save(Archive& ar)
+	void save(Archive& ar, unsigned int /*uiVersion*/) const
 	{
 		boost::shared_lock<boost::shared_mutex> lock(m_lock);
 
@@ -81,21 +84,24 @@
 {
 public:
 	TSubTaskScanDirectoriesConfig();
+	TSubTaskScanDirectoriesConfig(const TSubTaskScanDirectoriesConfig& rSrc);
 	~TSubTaskScanDirectoriesConfig();
 
+	TSubTaskScanDirectoriesConfig& operator=(const TSubTaskScanDirectoriesConfig& rSrc);
+
 	// filtering rules
 	void SetFilters(const CFiltersArray& rFilters);
 	const CFiltersArray& GetFilters() const { return m_afFilters; }
 
 	template<class Archive>
-	void load(Archive& ar)
+	void load(Archive& ar, unsigned int /*uiVersion*/)
 	{
 		boost::unique_lock<boost::shared_mutex> lock(m_lock);
 		ar >> m_afFilters;
 	}
 
 	template<class Archive>
-	void save(Archive& ar)
+	void save(Archive& ar, unsigned int /*uiVersion*/) const
 	{
 		boost::shared_lock<boost::shared_mutex> lock(m_lock);
 		ar << m_afFilters;
@@ -116,8 +122,11 @@
 {
 public:
 	TSubTaskCopyMoveConfig();
+	TSubTaskCopyMoveConfig(const TSubTaskCopyMoveConfig& rSrc);
 	~TSubTaskCopyMoveConfig();
 
+	TSubTaskCopyMoveConfig& operator=(const TSubTaskCopyMoveConfig& rSrc);
+
 	void SetDisableSystemBuffering(bool bDisableBuffering);
 	bool GetDisableSystemBuffering() const;
 
@@ -142,6 +151,44 @@
 	void SetCreateOnlyDirectories(bool bCreateOnlyDirs);
 	bool GetCreateOnlyDirectories() const;
 
+	template<class Archive>
+	void load(Archive& ar, unsigned int /*uiVersion*/)
+	{
+		boost::unique_lock<boost::shared_mutex> lock(m_lock);
+
+		ar & m_bDisableSystemBuffering;
+		ar & m_ullMinSizeToDisableBuffering;
+
+		ar & m_bPreserveFileDateTime;
+		ar & m_bPreserveFileAttributes;
+
+		ar & m_bsSizes;
+
+		ar & m_bIgnoreDirectories;
+		ar & m_bCreateEmptyFiles;
+		ar & m_bCreateOnlyDirectories;
+	}
+
+	template<class Archive>
+	void save(Archive& ar, unsigned int /*uiVersion*/) const
+	{
+		boost::shared_lock<boost::shared_mutex> lock(m_lock);
+
+		ar & m_bDisableSystemBuffering;
+		ar & m_ullMinSizeToDisableBuffering;
+
+		ar & m_bPreserveFileDateTime;
+		ar & m_bPreserveFileAttributes;
+
+		ar & m_bsSizes;
+
+		ar & m_bIgnoreDirectories;
+		ar & m_bCreateEmptyFiles;
+		ar & m_bCreateOnlyDirectories;
+	}
+
+	BOOST_SERIALIZATION_SPLIT_MEMBER();
+
 private:
 	bool m_bDisableSystemBuffering;						///< Disables system buffering of files
 	unsigned long long m_ullMinSizeToDisableBuffering;	///< Minimal file size to disable system buffering
@@ -183,6 +230,15 @@
 	const TSubTaskCopyMoveConfig& GetCopyMoveConfig() const { return m_tCopyMoveConfig; }
 //	const TSubTaskDeleteConfig& GetDeleteConfig() const { return m_tDeleteConfig; }
 
+	template<class Archive>
+	void serialize(Archive& ar, unsigned int /*uiVersion*/)
+	{
+		ar & m_tCommonConfig;
+		ar & m_tScanDirectoriesConfig;
+		ar & m_tCopyMoveConfig;
+//		ar & m_tDeleteConfig;
+	}
+
 private:
 	TSubTaskCommonConfig m_tCommonConfig;
 	TSubTaskScanDirectoriesConfig m_tScanDirectoriesConfig;
Index: src/ch/TTaskDefinition.cpp
===================================================================
diff -u -rb7709acbab26fdb108b77d3e08d3872f54248af2 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/TTaskDefinition.cpp	(.../TTaskDefinition.cpp)	(revision b7709acbab26fdb108b77d3e08d3872f54248af2)
+++ src/ch/TTaskDefinition.cpp	(.../TTaskDefinition.cpp)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -49,14 +49,20 @@
 	m_arrSourcePaths.Add(spEntry);
 }
 
-CString TTaskDefinition::GetSourcePathAt(size_t stIndex) const
+CString TTaskDefinition::GetSourcePathNameAt(size_t stIndex) const
 {
 	CClipboardEntryPtr spEntry = m_arrSourcePaths.GetAt(stIndex);
 	if(spEntry)
 		return spEntry->GetPath();
 	return CString();
 }
 
+CClipboardEntryPtr TTaskDefinition::GetSourcePathAt(size_t stIndex) const
+{
+	CClipboardEntryPtr spEntry = m_arrSourcePaths.GetAt(stIndex);
+	return spEntry;
+}
+
 size_t TTaskDefinition::GetSourcePathCount() const
 {
 	return m_arrSourcePaths.GetSize();
@@ -67,6 +73,11 @@
 	m_arrSourcePaths.RemoveAll();
 }
 
+CClipboardArray& TTaskDefinition::GetSourcePaths()
+{
+	return m_arrSourcePaths;
+}
+
 void TTaskDefinition::SetDestinationPath(const CString& strPath)
 {
 	m_tDestinationPath.SetPath(strPath);
@@ -77,16 +88,31 @@
 	return m_tDestinationPath.GetPath();
 }
 
+const CDestPath& TTaskDefinition::GetDestPath() const
+{
+	return m_tDestinationPath;
+}
+
 void TTaskDefinition::SetOperationType(EOperationType eOperation)
 {
 	m_tOperationPlan.SetOperationType(eOperation);
 }
 
+CString TTaskDefinition::GetTaskUniqueID() const
+{
+	return m_strTaskUniqueID.c_str();
+}
+
 EOperationType TTaskDefinition::GetOperationType() const
 {
 	return m_tOperationPlan.GetOperationType();
 }
 
+const TOperationPlan& TTaskDefinition::GetOperationPlan() const
+{
+	return m_tOperationPlan;
+}
+
 TTaskConfiguration& TTaskDefinition::GetConfiguration()
 {
 	return m_tOperationConfiguration;
Index: src/ch/TTaskDefinition.h
===================================================================
diff -u -rb7709acbab26fdb108b77d3e08d3872f54248af2 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/TTaskDefinition.h	(.../TTaskDefinition.h)	(revision b7709acbab26fdb108b77d3e08d3872f54248af2)
+++ src/ch/TTaskDefinition.h	(.../TTaskDefinition.h)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -37,46 +37,62 @@
 
 	// initialize object with data (get/set, from cfg file?, from string(cmd line options))
 	void AddSourcePath(const CString& strPath);
-	CString GetSourcePathAt(size_t stIndex) const;
+	CString GetSourcePathNameAt(size_t stIndex) const;
+	CClipboardEntryPtr GetSourcePathAt(size_t stIndex) const;
 	size_t GetSourcePathCount() const;
 	void ClearSourcePaths();
+	CClipboardArray& GetSourcePaths();
 
 	void SetDestinationPath(const CString& strPath);
 	CString GetDestinationPath() const;
+	const CDestPath& GetDestPath() const;
 
 	void SetOperationType(EOperationType eOperation);
 	EOperationType GetOperationType() const;
+	const TOperationPlan& GetOperationPlan() const;
 
 	TTaskConfiguration& GetConfiguration();
 	const TTaskConfiguration& GetConfiguration() const;
 
+	CString GetTaskUniqueID() const;
+
 	// serialize (from/to xml)
 	template<class Archive>
-	void load(Archive& ar)
+	void Load(Archive& ar, bool bData, const unsigned int uiVersion)
 	{
-		ar & m_strTaskUniqueID;
-		ar & m_arrSourcePaths;
-		ar & m_tDestinationPath;
-		ar & m_tOperationPlan;
-		ar & m_tOperationConfiguration;
+		if(bData)
+		{
+			ar & m_strTaskUniqueID;
+			m_arrSourcePaths.Load(ar, uiVersion, bData);
+			ar & m_tDestinationPath;
+			ar & m_tOperationPlan;
+			ar & m_tOperationConfiguration;
+		}
+		else
+		{
+			m_arrSourcePaths.Load(ar, uiVersion, bData);
+		}
 
 		m_bNeedsSaving = false;
 	}
 
 	template<class Archive>
-	void save(Archive& ar)
+	void Save(Archive& ar, bool bData, const unsigned int uiVersion) const
 	{
-		ar & m_strTaskUniqueID;
-		ar & m_arrSourcePaths;
-		ar & m_tDestinationPath;
-		ar & m_tOperationPlan;
-		ar & m_tOperationConfiguration;
+		if(bData)
+		{
+			ar & m_strTaskUniqueID;
+			m_arrSourcePaths.Store(ar, uiVersion, bData);
+			ar & m_tDestinationPath;
+			ar & m_tOperationPlan;
+			ar & m_tOperationConfiguration;
+		}
+		else
+			m_arrSourcePaths.Store(ar, uiVersion, bData);
 
 		m_bNeedsSaving = false;
 	}
 
-	BOOST_SERIALIZATION_SPLIT_MEMBER();
-
 private:
 	std::wstring m_strTaskUniqueID;				///< Unique ID of the task that will process this request (generated automatically)
 
@@ -90,7 +106,7 @@
 	TTaskConfiguration	m_tOperationConfiguration;
 
 	// Other info (volatile, not to be saved to xml)
-	bool m_bNeedsSaving;				///< Some parameters has been modified and this object needs to be serialized again
+	mutable bool m_bNeedsSaving;				///< Some parameters has been modified and this object needs to be serialized again
 };
 
 #endif // __TTASKDEFINITION_H__
Index: src/ch/TTaskOperationPlan.cpp
===================================================================
diff -u -rae09c8430aad5eaa8225df84878b7d9050bdccd6 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/TTaskOperationPlan.cpp	(.../TTaskOperationPlan.cpp)	(revision ae09c8430aad5eaa8225df84878b7d9050bdccd6)
+++ src/ch/TTaskOperationPlan.cpp	(.../TTaskOperationPlan.cpp)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -31,10 +31,34 @@
 {
 }
 
+TOperationPlan::TOperationPlan(const TOperationPlan& rSrc) :
+   m_eOperation(eOperation_None),
+   m_vSubOperations()
+{
+   boost::shared_lock<boost::shared_mutex> src_lock(rSrc.m_lock);
+
+   m_eOperation = rSrc.m_eOperation;
+   m_vSubOperations = rSrc.m_vSubOperations;
+}
+
 TOperationPlan::~TOperationPlan()
 {
 }
 
+TOperationPlan& TOperationPlan::operator=(const TOperationPlan& rSrc)
+{
+   if(this != &rSrc)
+   {
+      boost::shared_lock<boost::shared_mutex> src_lock(rSrc.m_lock);
+      boost::unique_lock<boost::shared_mutex> lock(m_lock);
+
+      m_eOperation = rSrc.m_eOperation;
+      m_vSubOperations = rSrc.m_vSubOperations;
+   }
+
+   return *this;
+}
+
 void TOperationPlan::SetOperationType(EOperationType eOperation)
 {
 	switch(eOperation)
Index: src/ch/TTaskOperationPlan.h
===================================================================
diff -u -rae09c8430aad5eaa8225df84878b7d9050bdccd6 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/TTaskOperationPlan.h	(.../TTaskOperationPlan.h)	(revision ae09c8430aad5eaa8225df84878b7d9050bdccd6)
+++ src/ch/TTaskOperationPlan.h	(.../TTaskOperationPlan.h)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -53,8 +53,11 @@
 {
 public:
 	TOperationPlan();
+    TOperationPlan(const TOperationPlan& rSrc);
 	~TOperationPlan();
 
+    TOperationPlan& operator=(const TOperationPlan& rSrc);
+
 	void SetOperationType(EOperationType eOperation);
 	EOperationType GetOperationType() const;
 
Index: src/ch/ch.rc
===================================================================
diff -u -r7d6b4eae7b58d17c4b554c25cc4cff875bd53161 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/ch.rc	(.../ch.rc)	(revision 7d6b4eae7b58d17c4b554c25cc4cff875bd53161)
+++ src/ch/ch.rc	(.../ch.rc)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -64,14 +64,6 @@
 // Menu
 //
 
-IDR_ADVANCED_MENU MENU 
-BEGIN
-    POPUP "_ADVANCED_POPUP_"
-    BEGIN
-        MENUITEM "&Change paths...",            ID_POPUP_REPLACE_PATHS
-    END
-END
-
 IDR_POPUP_MENU MENU 
 BEGIN
     POPUP "POPUP"
@@ -186,22 +178,6 @@
     PUSHBUTTON      "&Help",IDHELP,340,193,50,14,0,0,HIDHELP
 END
 
-IDD_REPLACE_PATHS_DIALOG DIALOGEX 0, 0, 343, 148
-STYLE DS_SETFONT | DS_CONTEXTHELP | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
-CAPTION "Partial replace of source paths"
-FONT 8, "Tahoma", 0, 0, 0x1
-BEGIN
-    LISTBOX         IDC_PATHS_LIST,7,17,329,52,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP,0,HIDC_PATHS_LIST
-    EDITTEXT        IDC_SOURCE_EDIT,7,70,329,14,ES_AUTOHSCROLL,0,HIDC_SOURCE_EDIT
-    EDITTEXT        IDC_DESTINATION_EDIT,7,98,309,14,ES_AUTOHSCROLL,0,HIDC_DESTINATION_EDIT
-    PUSHBUTTON      "...",IDC_BROWSE_BUTTON,320,98,16,14,0,0,HIDC_BROWSE_BUTTON
-    DEFPUSHBUTTON   "OK",IDOK,173,127,50,14,0,0,HIDOK
-    PUSHBUTTON      "&Cancel",IDCANCEL,229,127,50,14,0,0,HIDCANCEL
-    LTEXT           "Source paths:",IDC_001_STATIC,7,7,329,8
-    LTEXT           "Change to:",IDC_002_STATIC,7,89,329,8
-    PUSHBUTTON      "&Help",IDC_HELP_BUTTON,286,127,50,14,0,0,HIDC_HELP_BUTTON
-END
-
 IDD_STATUS_DIALOG DIALOGEX 0, 0, 479, 250
 STYLE DS_SETFONT | DS_CONTEXTHELP | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
 EXSTYLE WS_EX_APPWINDOW
@@ -218,7 +194,6 @@
     PUSHBUTTON      "Cancel/all",IDC_CANCEL_ALL_BUTTON,7,229,71,14,0,0,HIDC_CANCEL_ALL_BUTTON
     PUSHBUTTON      "Remove/all",IDC_REMOVE_FINISHED_BUTTON,79,229,71,14,0,0,HIDC_REMOVE_FINISHED_BUTTON
     PUSHBUTTON      "Restart/all",IDC_RESTART_ALL_BUTTON,151,229,71,14,0,0,HIDC_RESTART_ALL_BUTTON
-    PUSHBUTTON      "&Advanced >",IDC_ADVANCED_BUTTON,160,212,71,14,0,0,HIDC_ADVANCED_BUTTON
     PUSHBUTTON      "",IDC_STICK_BUTTON,472,243,7,7,BS_CENTER | BS_VCENTER | BS_FLAT,0,HIDC_STICK_BUTTON
     PUSHBUTTON      "&<<",IDC_ROLL_UNROLL_BUTTON,212,7,19,12,NOT WS_VISIBLE,0,HIDC_ROLL_UNROLL_BUTTON
     PUSHBUTTON      "...",IDC_SET_BUFFERSIZE_BUTTON,459,72,13,14,0,0,HIDC_SET_BUFFERSIZE_BUTTON
@@ -525,14 +500,6 @@
         BOTTOMMARGIN, 207
     END
 
-    IDD_REPLACE_PATHS_DIALOG, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 336
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 141
-    END
-
     IDD_STATUS_DIALOG, DIALOG
     BEGIN
         LEFTMARGIN, 7
Index: src/ch/ch.vc90.vcproj
===================================================================
diff -u -r151c47cd3e55e489cc9aa2e569e0bd28910ad42e -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/ch.vc90.vcproj	(.../ch.vc90.vcproj)	(revision 151c47cd3e55e489cc9aa2e569e0bd28910ad42e)
+++ src/ch/ch.vc90.vcproj	(.../ch.vc90.vcproj)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -940,14 +940,6 @@
 						>
 					</File>
 					<File
-						RelativePath="ReplacePathsDlg.cpp"
-						>
-					</File>
-					<File
-						RelativePath="ReplacePathsDlg.h"
-						>
-					</File>
-					<File
 						RelativePath="ShortcutsDlg.cpp"
 						>
 					</File>
Index: src/ch/resource.h
===================================================================
diff -u -r7d6b4eae7b58d17c4b554c25cc4cff875bd53161 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/resource.h	(.../resource.h)	(revision 7d6b4eae7b58d17c4b554c25cc4cff875bd53161)
+++ src/ch/resource.h	(.../resource.h)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -24,8 +24,6 @@
 #define IDD_FOLDER_BROWSING_DIALOG      150
 #define IDD_NEW_FOLDER_DIALOG           151
 #define IDD_NEW_QUICK_ACCESS_DIALOG     152
-#define IDR_ADVANCED_MENU               160
-#define IDD_REPLACE_PATHS_DIALOG        161
 #define IDI_QUESTION_ICON               163
 #define IDD_FEEDBACK_DSTFILE_DIALOG     167
 #define IDD_FEEDBACK_FILE_ERROR_DIALOG  167
@@ -126,7 +124,6 @@
 #define IDC_PRIORITY_COMBO              1071
 #define IDC_IGNORE_FOLDERS_CHECK        1073
 #define IDC_ONLY_CREATE_CHECK           1074
-#define IDC_ADVANCED_BUTTON             1077
 #define IDC_PATHS_LIST                  1078
 #define IDC_DESTFILENAME_EDIT           1090
 #define IDC_IGNORE_BUTTON               1097
@@ -569,7 +566,6 @@
 #define ID_POPUP_OPTIONS                32802
 #define ID_SHOW_MINI_VIEW               32803
 #define ID_POPUP_CUSTOM_COPY            32804
-#define ID_POPUP_REPLACE_PATHS          32805
 #define ID_POPUP_MONITORING             32806
 #define ID_POPUP_SHUTAFTERFINISHED      32807
 #define ID_POPUP_REGISTERDLL            32809
Index: src/ch/task.cpp
===================================================================
diff -u -r2996cfa8b8db93f1b06a4e5f142ab74a23f67235 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/task.cpp	(.../task.cpp)	(revision 2996cfa8b8db93f1b06a4e5f142ab74a23f67235)
+++ src/ch/task.cpp	(.../task.cpp)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -418,75 +418,6 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////
-// class TOperationDescription
-
-TOperationDescription::TOperationDescription() :
-	m_eOperation(eOperation_None)
-{
-}
-
-TOperationDescription::~TOperationDescription()
-{
-}
-
-void TOperationDescription::SetOperationType(EOperationType eOperation)
-{
-	switch(eOperation)
-	{
-	case eOperation_None:
-		THROW(_T("Cannot set operation type 'none'"), 0, 0, 0);
-		break;
-
-	case eOperation_Copy:
-		{
-			boost::unique_lock<boost::shared_mutex> lock(m_lock);
-			m_vSubOperations.clear();
-			m_vSubOperations.push_back(eSubOperation_Scanning);
-			m_vSubOperations.push_back(eSubOperation_Copying);
-			break;
-		}
-
-	case eOperation_Move:
-		{
-			boost::unique_lock<boost::shared_mutex> lock(m_lock);
-			m_vSubOperations.clear();
-			m_vSubOperations.push_back(eSubOperation_Scanning);
-			m_vSubOperations.push_back(eSubOperation_Copying);
-			m_vSubOperations.push_back(eSubOperation_Deleting);
-			break;
-		}
-
-	BOOST_STATIC_ASSERT(eOperation_Move == eOperation_Max - 1);
-
-	default:
-		THROW(_T("Unhandled case"), 0, 0, 0);
-	}
-
-	m_eOperation = eOperation;
-}
-
-EOperationType TOperationDescription::GetOperationType() const
-{
-	boost::shared_lock<boost::shared_mutex> lock(m_lock);
-	return m_eOperation;
-}
-
-size_t TOperationDescription::GetSubOperationsCount() const
-{
-	boost::shared_lock<boost::shared_mutex> lock(m_lock);
-	return m_vSubOperations.size();
-}
-
-ESubOperationType TOperationDescription::GetSubOperationAt(size_t stIndex) const
-{
-	boost::shared_lock<boost::shared_mutex> lock(m_lock);
-	if(stIndex >= m_vSubOperations.size())
-		THROW(_T("Index out of bounds"), 0, 0, 0);
-	else
-		return m_vSubOperations[stIndex];
-}
-
-////////////////////////////////////////////////////////////////////////////
 // class TTaskBasicConfiguration
 
 TTaskBasicConfiguration::TTaskBasicConfiguration() :
@@ -542,7 +473,7 @@
 CTask::CTask(chcore::IFeedbackHandler* piFeedbackHandler, size_t stSessionUniqueID) :
 	m_log(),
 	m_piFeedbackHandler(piFeedbackHandler),
-	m_files(m_clipboard),
+	m_files(m_tTaskDefinition.GetSourcePaths()),
 	m_nPriority(THREAD_PRIORITY_NORMAL),
 	m_bForce(false),
 	m_bContinue(false),
@@ -557,9 +488,6 @@
 	m_bsSizes.m_uiTwoDisksSize=262144;
 	m_bsSizes.m_uiCDSize=262144;
 	m_bsSizes.m_uiLANSize=65536;
-
-	_itot((int)time(NULL), m_strUniqueName.GetBufferSetLength(16), 10);
-	m_strUniqueName.ReleaseBuffer();
 }
 
 CTask::~CTask()
@@ -579,27 +507,6 @@
 	m_localStats.DisconnectGlobalStats();
 }
 
-// m_clipboard
-void CTask::AddClipboardData(const CClipboardEntryPtr& spEntry)
-{
-	m_clipboard.Add(spEntry);
-}
-
-CClipboardEntryPtr CTask::GetClipboardData(size_t stIndex)
-{
-	return m_clipboard.GetAt(stIndex);
-}
-
-size_t CTask::GetClipboardDataSize()
-{
-	return m_clipboard.GetSize();
-}
-
-int CTask::ReplaceClipboardStrings(CString strOld, CString strNew)
-{
-	return m_clipboard.ReplacePathsPrefix(strOld, strNew);
-}
-
 // m_files
 int CTask::ScanDirectory(CString strDirName, size_t stSrcIndex, bool bRecurse, bool bIncludeDirs)
 {
@@ -621,7 +528,7 @@
 			if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
 			{
 				CFileInfoPtr spFileInfo(boost::make_shared<CFileInfo>());
-				spFileInfo->SetClipboard(&m_clipboard);	// this is the link table (CClipboardArray)
+				spFileInfo->SetClipboard(&m_tTaskDefinition.GetSourcePaths());	// this is the link table (CClipboardArray)
 				
 				spFileInfo->Create(&wfd, strDirName, stSrcIndex);
 				if(m_afFilters.Match(spFileInfo))
@@ -632,7 +539,7 @@
 				if(bIncludeDirs)
 				{
 					CFileInfoPtr spFileInfo(boost::make_shared<CFileInfo>());
-					spFileInfo->SetClipboard(&m_clipboard);	// this is the link table (CClipboardArray)
+					spFileInfo->SetClipboard(&m_tTaskDefinition.GetSourcePaths());	// this is the link table (CClipboardArray)
 
 					// Add directory itself
 					spFileInfo->Create(&wfd, strDirName, stSrcIndex);
@@ -657,26 +564,6 @@
 	return 0;
 }
 
-// m_strDestPath - adds '\\'
-void CTask::SetDestPath(LPCTSTR lpszPath)
-{
-	boost::unique_lock<boost::shared_mutex> lock(m_lock);
-	m_dpDestPath.SetPath(lpszPath);
-}
-
-// guaranteed '\\'
-const CDestPath& CTask::GetDestPath()
-{
-	boost::shared_lock<boost::shared_mutex> lock(m_lock);
-	return m_dpDestPath;
-}
-
-int CTask::GetDestDriveNumber()
-{
-	boost::shared_lock<boost::shared_mutex> lock(m_lock);
-	return m_dpDestPath.GetDriveNumber();
-}
-
 void CTask::SetTaskState(ETaskCurrentState eTaskState)
 {
 	// NOTE: we could check some transition rules here
@@ -690,16 +577,6 @@
 	return m_eCurrentState;
 }
 
-void CTask::SetOperationType(EOperationType eOperationType)
-{
-	m_tOperation.SetOperationType(eOperationType);
-}
-
-EOperationType CTask::GetOperationType() const
-{
-	return m_tOperation.GetOperationType();
-}
-
 void CTask::SetTaskBasicConfiguration(const TTaskBasicConfiguration& TTaskBasicConfiguration)
 {
 	m_tTaskConfig = TTaskBasicConfiguration;
@@ -726,7 +603,7 @@
 
 int CTask::GetCurrentBufferIndex()
 {
-	return m_files.GetBufferIndexAt(m_TTaskBasicProgressInfo.GetCurrentIndex(),m_dpDestPath);
+	return m_files.GetBufferIndexAt(m_TTaskBasicProgressInfo.GetCurrentIndex(), m_tTaskDefinition.GetDestPath());
 }
 
 // m_pThread
@@ -769,14 +646,6 @@
 	m_localStats.SetProcessedSize(m_files.CalculatePartialSize(m_TTaskBasicProgressInfo.GetCurrentIndex()));
 }
 
-// m_strUniqueName
-
-CString CTask::GetUniqueName()
-{
-	boost::shared_lock<boost::shared_mutex> lock(m_lock);
-	return m_strUniqueName;
-}
-
 void CTask::Load(const CString& strPath, bool bData)
 {
 	std::ifstream ifs(strPath, ios_base::in | ios_base::binary);
@@ -785,28 +654,25 @@
 	boost::unique_lock<boost::shared_mutex> lock(m_lock);
 	if(bData)
 	{
-		m_clipboard.Load(ar, 0, bData);
-		ar >> m_tOperation;
+		m_tTaskDefinition.Load(ar, bData, 0);
 		ar >> m_tTaskConfig;
 
 		m_files.Load(ar, 0, false);
 
 		CalculateTotalSizeNL();
 
-		ar >> m_dpDestPath;
-
-		ar >> m_strUniqueName;
 		ar >> m_afFilters;
 	}
 	else
 	{
-		int iState = eTaskState_None;
+		m_tTaskDefinition.Load(ar, bData, 0);
 
 		ar >> m_TTaskBasicProgressInfo;
 
 		CalculateProcessedSizeNL();
 
 		// load task state, convert "waiting" state to "processing"
+		int iState = eTaskState_None;
 		ar >> iState;
 		if(iState >= eTaskState_None && iState < eTaskState_Max)
 		{
@@ -827,7 +693,6 @@
 		ar >> timeElapsed;
 		m_localStats.SetTimeElapsed(timeElapsed);
 
-		m_clipboard.Load(ar, 0, bData);
 		m_files.Load(ar, 0, true);
 
 		ar >> m_bSaved;
@@ -849,33 +714,23 @@
 		m_bSaved = true;
 	}
 
-	CString strPath = m_strTaskBasePath.c_str() + m_strUniqueName + (bData ? _T(".atd") : _T(".atp"));
+	CString strPath = m_strTaskBasePath.c_str() + m_tTaskDefinition.GetTaskUniqueID() + (bData ? _T(".atd") : _T(".atp"));
 
 	std::ofstream ofs(strPath, ios_base::out | ios_base::binary);
 	boost::archive::binary_oarchive ar(ofs);
 
 	if(bData)
 	{
-		m_clipboard.Store(ar, 0, bData);
-
-		ar << m_tOperation;
+		m_tTaskDefinition.Save(ar, bData, 0);
 		ar << m_tTaskConfig;
 
-		ESubOperationType eSubOperation = m_tOperation.GetSubOperationAt(m_TTaskBasicProgressInfo.GetSubOperationIndex());
-		if(eSubOperation != eSubOperation_Scanning)
-			m_files.Store(ar, 0, false);
-		else
-		{
-			size_t st(0);
-			ar << st;
-		}
+		m_files.Store(ar, 0, false);
 
-		ar << m_dpDestPath;
-		ar << m_strUniqueName;
 		ar << m_afFilters;
 	}
 	else
 	{
+		m_tTaskDefinition.Save(ar, bData, 0);
 		ar << m_TTaskBasicProgressInfo;
 
 		// store current state (convert from waiting to processing state before storing)
@@ -891,9 +746,7 @@
 		time_t timeElapsed = m_localStats.GetTimeElapsed();
 		ar << timeElapsed;
 
-		m_clipboard.Store(ar, 0, bData);
-
-		ESubOperationType eSubOperation = m_tOperation.GetSubOperationAt(m_TTaskBasicProgressInfo.GetSubOperationIndex());
+		ESubOperationType eSubOperation = m_tTaskDefinition.GetOperationPlan().GetSubOperationAt(m_TTaskBasicProgressInfo.GetSubOperationIndex());
 		if(eSubOperation != eSubOperation_Scanning)
 			m_files.Store(ar, 0, true);
 		else
@@ -986,8 +839,8 @@
 			pData->m_strPath = m_files.GetAt(0)->GetFileName();
 		else
 		{
-			if(m_clipboard.GetSize() > 0)
-				pData->m_strPath = m_clipboard.GetAt(0)->GetFileName();
+			if(m_tTaskDefinition.GetSourcePathCount() > 0)
+				pData->m_strPath = m_tTaskDefinition.GetSourcePathAt(0)->GetFileName();
 			else
 				pData->m_strPath = GetResManager().LoadString(IDS_NONEINPUTFILE_STRING);
 		}
@@ -1018,10 +871,10 @@
 		}
 		else
 		{
-			if(m_clipboard.GetSize() > 0)
+			if(m_tTaskDefinition.GetSourcePathCount() > 0)
 			{
-				pData->m_strFullFilePath = m_clipboard.GetAt(0)->GetPath();
-				pData->m_strFileName = m_clipboard.GetAt(0)->GetFileName();
+				pData->m_strFullFilePath = m_tTaskDefinition.GetSourcePathAt(0)->GetPath();
+				pData->m_strFileName = m_tTaskDefinition.GetSourcePathAt(0)->GetFileName();
 			}
 			else
 			{
@@ -1033,17 +886,17 @@
 
 	pData->m_pbsSizes=&m_bsSizes;
 	pData->m_nPriority=m_nPriority;
-	pData->m_pdpDestPath=&m_dpDestPath;
+	pData->m_strDstPath = m_tTaskDefinition.GetDestinationPath();
 	pData->m_pafFilters=&m_afFilters;
 	pData->m_eTaskState = m_eCurrentState;
 	pData->m_stIndex = stCurrentIndex;
 	pData->m_ullProcessedSize = m_localStats.GetProcessedSize();
 	pData->m_stSize=m_files.GetSize();
 	pData->m_ullSizeAll = m_localStats.GetTotalSize();
-	pData->m_pstrUniqueName=&m_strUniqueName;
+	pData->m_strUniqueName = m_tTaskDefinition.GetTaskUniqueID();
 
 	if(m_files.GetSize() > 0)
-		pData->m_iCurrentBufferIndex=m_bsSizes.m_bOnlyDefault ? 0 : m_files.GetAt((stCurrentIndex < m_files.GetSize()) ? stCurrentIndex : 0)->GetBufferIndex(m_dpDestPath);
+		pData->m_iCurrentBufferIndex=m_bsSizes.m_bOnlyDefault ? 0 : m_files.GetAt((stCurrentIndex < m_files.GetSize()) ? stCurrentIndex : 0)->GetBufferIndex(m_tTaskDefinition.GetDestPath());
 	else
 		pData->m_iCurrentBufferIndex=0;
 
@@ -1089,8 +942,8 @@
 	}
 
 	// second part
-	EOperationType eOperationType = m_tOperation.GetOperationType();
-	ESubOperationType eSubOperation = m_tOperation.GetSubOperationAt(m_TTaskBasicProgressInfo.GetSubOperationIndex());
+	EOperationType eOperationType = m_tTaskDefinition.GetOperationType();
+	ESubOperationType eSubOperation = m_tTaskDefinition.GetOperationPlan().GetSubOperationAt(m_TTaskBasicProgressInfo.GetSubOperationIndex());
 	if(eSubOperation == eSubOperation_Deleting)
 		_tcscat(pData->m_szStatusText, GetResManager().LoadString(IDS_STATUS0_STRING+6));
 	else if(eSubOperation == eSubOperation_Scanning)
@@ -1130,9 +983,9 @@
 {
 	m_lock.lock_shared();
 
-	CString strDel1 = lpszDirectory+m_strUniqueName+_T(".atd");
-	CString strDel2 = lpszDirectory+m_strUniqueName+_T(".atp");
-	CString strDel3 = lpszDirectory+m_strUniqueName+_T(".log");
+	CString strDel1 = lpszDirectory + m_tTaskDefinition.GetTaskUniqueID() + _T(".atd");
+	CString strDel2 = lpszDirectory + m_tTaskDefinition.GetTaskUniqueID() + _T(".atp");
+	CString strDel3 = lpszDirectory + m_tTaskDefinition.GetTaskUniqueID() + _T(".log");
 
 	m_lock.unlock_shared();
 
@@ -1178,7 +1031,7 @@
 	// but GetDiskFreeSpace returns false values
 
 	// get free space
-	if(!GetDynamicFreeSpace(GetDestPath().GetPath(), pullAvailable, NULL))
+	if(!GetDynamicFreeSpace(m_tTaskDefinition.GetDestinationPath(), pullAvailable, NULL))
 		return true;
 
 	return (*pullNeeded <= *pullAvailable);
@@ -1305,48 +1158,50 @@
 	m_files.Clear();
 
 	// enter some data to m_files
-	int iDestDrvNumber = GetDestDriveNumber();
+	int iDestDrvNumber = m_tTaskDefinition.GetDestPath().GetDriveNumber();
 	bool bIgnoreDirs = m_tTaskConfig.GetIgnoreDirectories();
 	bool bForceDirectories = m_tTaskConfig.GetCreateOnlyDirectories();
-	bool bMove = GetOperationType() == eOperation_Move;
+	bool bMove = m_tTaskDefinition.GetOperationType() == eOperation_Move;
 
 	// add everything
 	ictranslate::CFormat fmt;
 	bool bRetry = true;
 	bool bSkipInputPath = false;
 
-	size_t stSize = GetClipboardDataSize();
+	size_t stSize = m_tTaskDefinition.GetSourcePathCount();
 	for(size_t stIndex = 0; stIndex < stSize ; stIndex++)
 	{
 		CFileInfoPtr spFileInfo;
 
 		bSkipInputPath = false;
 
 		spFileInfo.reset(new CFileInfo());
-		spFileInfo->SetClipboard(GetClipboard());
+		spFileInfo->SetClipboard(&m_tTaskDefinition.GetSourcePaths());
 
 		// try to get some info about the input path; let user know if the path does not exist.
 		do
 		{
 			bRetry = false;
 
 			// read attributes of src file/folder
-			bool bExists = spFileInfo->Create(GetClipboardData(stIndex)->GetPath(), stIndex);
+			bool bExists = spFileInfo->Create(m_tTaskDefinition.GetSourcePathNameAt(stIndex), stIndex);
 			if(!bExists)
 			{
-				CString strSrcFile = GetClipboardData(stIndex)->GetPath();
+				CString strSrcFile = m_tTaskDefinition.GetSourcePathNameAt(stIndex);
 				FEEDBACK_FILEERROR ferr = { (PCTSTR)strSrcFile, NULL, eFastMoveError, ERROR_FILE_NOT_FOUND };
 				CFeedbackHandler::EFeedbackResult frResult = (CFeedbackHandler::EFeedbackResult)m_piFeedbackHandler->RequestFeedback(CFeedbackHandler::eFT_FileError, &ferr);
 				switch(frResult)
 				{
 				case CFeedbackHandler::eResult_Cancel:
+					m_files.Clear();
 					return eSubResult_CancelRequest;
 
 				case CFeedbackHandler::eResult_Retry:
 					bRetry = true;
 					break;
 
 				case CFeedbackHandler::eResult_Pause:
+					m_files.Clear();
 					return eSubResult_PauseRequest;
 
 				case CFeedbackHandler::eResult_Skip:
@@ -1367,21 +1222,21 @@
 
 		// log
 		fmt.SetFormat(_T("Adding file/folder (clipboard) : %path ..."));
-		fmt.SetParam(_t("%path"), GetClipboardData(stIndex)->GetPath());
+		fmt.SetParam(_t("%path"), m_tTaskDefinition.GetSourcePathNameAt(stIndex));
 		m_log.logi(fmt);
 
 		// found file/folder - check if the dest name has been generated
-		if(!GetClipboardData(stIndex)->IsDestinationPathSet())
+		if(!m_tTaskDefinition.GetSourcePathAt(stIndex)->IsDestinationPathSet())
 		{
 			// generate something - if dest folder == src folder - search for copy
-			if(GetDestPath().GetPath() == spFileInfo->GetFileRoot())
+			if(m_tTaskDefinition.GetDestinationPath() == spFileInfo->GetFileRoot())
 			{
 				CString strSubst;
-				FindFreeSubstituteName(spFileInfo->GetFullFilePath(), GetDestPath().GetPath(), &strSubst);
-				GetClipboardData(stIndex)->SetDestinationPath(strSubst);
+				FindFreeSubstituteName(spFileInfo->GetFullFilePath(), m_tTaskDefinition.GetDestinationPath(), &strSubst);
+				m_tTaskDefinition.GetSourcePathAt(stIndex)->SetDestinationPath(strSubst);
 			}
 			else
-				GetClipboardData(stIndex)->SetDestinationPath(spFileInfo->GetFileName());
+				m_tTaskDefinition.GetSourcePathAt(stIndex)->SetDestinationPath(spFileInfo->GetFileName());
 		}
 
 		// add if needed
@@ -1401,15 +1256,15 @@
 
 			// don't add folder contents when moving inside one disk boundary
 			if(bIgnoreDirs || !bMove || iDestDrvNumber == -1
-				|| iDestDrvNumber != spFileInfo->GetDriveNumber() || CFileInfo::Exist(spFileInfo->GetDestinationPath(GetDestPath().GetPath(), ((int)bForceDirectories) << 1)) )
+				|| iDestDrvNumber != spFileInfo->GetDriveNumber() || CFileInfo::Exist(spFileInfo->GetDestinationPath(m_tTaskDefinition.GetDestinationPath(), ((int)bForceDirectories) << 1)) )
 			{
 				// log
 				fmt.SetFormat(_T("Recursing folder %path"));
 				fmt.SetParam(_t("%path"), spFileInfo->GetFullFilePath());
 				m_log.logi(fmt);
 
 				// no movefile possibility - use CustomCopyFile
-				GetClipboardData(stIndex)->SetMove(false);
+				m_tTaskDefinition.GetSourcePathAt(stIndex)->SetMove(false);
 
 				ScanDirectory(spFileInfo->GetFullFilePath(), stIndex, true, !bIgnoreDirs || bForceDirectories);
 			}
@@ -1419,20 +1274,21 @@
 			{
 				// log
 				m_log.logi(_T("Kill request while adding data to files array (RecurseDirectories)"));
+				m_files.Clear();
 				return eSubResult_KillRequest;
 			}
 		}
 		else
 		{
 			if(bMove && iDestDrvNumber != -1 && iDestDrvNumber == spFileInfo->GetDriveNumber() &&
-				!CFileInfo::Exist(spFileInfo->GetDestinationPath(GetDestPath().GetPath(), ((int)bForceDirectories) << 1)) )
+				!CFileInfo::Exist(spFileInfo->GetDestinationPath(m_tTaskDefinition.GetDestinationPath(), ((int)bForceDirectories) << 1)) )
 			{
 				// if moving within one partition boundary set the file size to 0 so the overall size will
 				// be ok
 				spFileInfo->SetLength64(0);
 			}
 			else
-				GetClipboardData(stIndex)->SetMove(false);	// no MoveFile
+				m_tTaskDefinition.GetSourcePathAt(stIndex)->SetMove(false);	// no MoveFile
 
 			// add file info if passes filters
 			if(m_afFilters.Match(spFileInfo))
@@ -2171,7 +2027,7 @@
 			if(GetBufferSizes()->m_bOnlyDefault)
 				iBufferIndex = BI_DEFAULT;
 			else
-				iBufferIndex = pData->spSrcFile->GetBufferIndex(m_dpDestPath);
+				iBufferIndex = pData->spSrcFile->GetBufferIndex(m_tTaskDefinition.GetDestPath());
 
 			ulToRead = bNoBuffer ? ROUNDUP(pData->dbBuffer.GetSizes()->m_auiSizes[iBufferIndex], MAXSECTORSIZE) : pData->dbBuffer.GetSizes()->m_auiSizes[iBufferIndex];
 
@@ -2300,7 +2156,7 @@
 	size_t stSize = m_files.GetSize();
 	bool bIgnoreFolders = m_tTaskConfig.GetIgnoreDirectories();
 	bool bForceDirectories = m_tTaskConfig.GetCreateOnlyDirectories();
-	const CDestPath& dpDestPath = GetDestPath();
+	const CDestPath& dpDestPath = m_tTaskDefinition.GetDestPath();
 
 	// create a buffer of size m_nBufferSize
 	CUSTOM_COPY_PARAMS ccp;
@@ -2347,7 +2203,7 @@
 		ccp.strDstFile = spFileInfo->GetDestinationPath(dpDestPath.GetPath(), ((int)bForceDirectories) << 1 | (int)bIgnoreFolders);
 
 		// are the files/folders lie on the same partition ?
-		bool bMove = GetOperationType() == eOperation_Move;
+		bool bMove = m_tTaskDefinition.GetOperationType() == eOperation_Move;
 		if(bMove && dpDestPath.GetDriveNumber() != -1 && dpDestPath.GetDriveNumber() == spFileInfo->GetDriveNumber() && spFileInfo->GetMove())
 		{
 			bool bRetry = true;
@@ -2520,10 +2376,10 @@
 			fmt.SetParam(_t("%availablesize"), ullAvailableSize);
 			m_log.logw(fmt);
 
-			if(GetClipboardDataSize() > 0)
+			if(m_tTaskDefinition.GetSourcePathCount() > 0)
 			{
-				CString strSrcPath = GetClipboardData(0)->GetPath();
-				CString strDstPath = GetDestPath().GetPath();
+				CString strSrcPath = m_tTaskDefinition.GetSourcePathAt(0)->GetPath();
+                CString strDstPath = m_tTaskDefinition.GetDestinationPath();
 				FEEDBACK_NOTENOUGHSPACE feedStruct = { ullNeededSize, (PCTSTR)strSrcPath, (PCTSTR)strDstPath };
 				CFeedbackHandler::EFeedbackResult frResult = (CFeedbackHandler::EFeedbackResult)m_piFeedbackHandler->RequestFeedback(CFeedbackHandler::eFT_NotEnoughSpace, &feedStruct);
 
@@ -2573,7 +2429,7 @@
 
 		// initialize log file
 		tstring_t strPath = GetTaskPath();
-		strPath += GetUniqueName()+_T(".log");
+		strPath += m_tTaskDefinition.GetTaskUniqueID() + _T(".log");
 
 		m_log.init(strPath.c_str(), 262144, icpf::log_file::level_debug, false, false);
 
@@ -2589,18 +2445,18 @@
 
 		// wait for permission to really start (but only if search for files is not allowed to start regardless of the lock)
 		size_t stSubOperationIndex = m_TTaskBasicProgressInfo.GetSubOperationIndex();
-		if(!bReadTasksSize || stSubOperationIndex != 0 || m_tOperation.GetSubOperationsCount() == 0 || m_tOperation.GetSubOperationAt(0) != eSubOperation_Scanning)
+		if(!bReadTasksSize || stSubOperationIndex != 0 || m_tTaskDefinition.GetOperationPlan().GetSubOperationsCount() == 0 || m_tTaskDefinition.GetOperationPlan().GetSubOperationAt(0) != eSubOperation_Scanning)
 			eResult = CheckForWaitState();	// operation limiting
 
 		// start tracking time for this thread
 		m_localStats.EnableTimeTracking();
 
-		for(; stSubOperationIndex < m_tOperation.GetSubOperationsCount() && eResult == eSubResult_Continue; ++stSubOperationIndex)
+		for(; stSubOperationIndex < m_tTaskDefinition.GetOperationPlan().GetSubOperationsCount() && eResult == eSubResult_Continue; ++stSubOperationIndex)
 		{
 			// set current sub-operation index to allow resuming
 			m_TTaskBasicProgressInfo.SetSubOperationIndex(stSubOperationIndex);
 
-			ESubOperationType eSubOperation = m_tOperation.GetSubOperationAt(stSubOperationIndex);
+			ESubOperationType eSubOperation = m_tTaskDefinition.GetOperationPlan().GetSubOperationAt(stSubOperationIndex);
 			switch(eSubOperation)
 			{
 			case eSubOperation_Scanning:
@@ -2678,7 +2534,7 @@
 		}
 
 		// perform cleanup dependent on currently executing subtask
-		switch(m_tOperation.GetSubOperationAt(m_TTaskBasicProgressInfo.GetSubOperationIndex()))
+        switch(m_tTaskDefinition.GetOperationPlan().GetSubOperationAt(m_TTaskBasicProgressInfo.GetSubOperationIndex()))
 		{
 		case eSubOperation_Scanning:
 			m_files.Clear();		// get rid of m_files contents
Index: src/ch/task.h
===================================================================
diff -u -r2996cfa8b8db93f1b06a4e5f142ab74a23f67235 -r044d0e17cdedf3055202486a2235e1a3c8dd6e56
--- src/ch/task.h	(.../task.h)	(revision 2996cfa8b8db93f1b06a4e5f142ab74a23f67235)
+++ src/ch/task.h	(.../task.h)	(revision 044d0e17cdedf3055202486a2235e1a3c8dd6e56)
@@ -26,6 +26,7 @@
 #include "../libchcore/FeedbackHandlerBase.h"
 #include "FileFilter.h"
 #include "DestPath.h"
+#include "TTaskDefinition.h"
 
 // enum representing current processing state of the task
 enum ETaskCurrentState
@@ -42,28 +43,6 @@
 	eTaskState_Max
 };
 
-// enum represents type of the operation handled by the task
-enum EOperationType
-{
-	eOperation_None,
-	eOperation_Copy,
-	eOperation_Move,
-
-	// add new operation types before this enum value
-	eOperation_Max
-};
-
-enum ESubOperationType
-{
-	eSubOperation_None,
-	eSubOperation_Scanning,
-	eSubOperation_Copying,
-	eSubOperation_Deleting,
-
-	// add new operation types before this one
-	eSubOperation_Max
-};
-
 // special value representing no task
 #define NO_TASK_SESSION_UNIQUE_ID				0
 
@@ -77,7 +56,7 @@
 	size_t m_stIndex;
 	size_t m_stSize;
 
-	CDestPath* m_pdpDestPath;
+	CString m_strDstPath;
 	CFiltersArray* m_pafFilters;
 
 	ETaskCurrentState m_eTaskState;
@@ -91,7 +70,7 @@
 
 	time_t m_timeElapsed;
 
-	const CString* m_pstrUniqueName;	// doesn't change from first setting
+	CString m_strUniqueName;	// doesn't change from first setting
 
 	TCHAR m_szStatusText[_MAX_PATH];
 };
@@ -264,45 +243,6 @@
 	mutable boost::shared_mutex m_lock;
 };
 
-///////////////////////////////////////////////////////////////////////////
-// TOperationDescription
-
-// class describes the sub-operations to be performed
-class TOperationDescription
-{
-public:
-	TOperationDescription();
-	~TOperationDescription();
-
-	void SetOperationType(EOperationType eOperation);
-	EOperationType GetOperationType() const;
-
-	size_t GetSubOperationsCount() const;
-	ESubOperationType GetSubOperationAt(size_t stIndex) const;
-
-	template<class Archive>
-	void load(Archive& ar, unsigned int /*uiVersion*/)
-	{
-		EOperationType eOperation = eOperation_None;
-		ar >> eOperation;
-		SetOperationType(eOperation);
-	}
-
-	template<class Archive>
-	void save(Archive& ar, unsigned int /*uiVersion*/) const
-	{
-		ar << m_eOperation;
-	}
-
-	BOOST_SERIALIZATION_SPLIT_MEMBER();
-
-private:
-	EOperationType m_eOperation;
-	std::vector<ESubOperationType> m_vSubOperations;
-
-	mutable boost::shared_mutex m_lock;
-};
-
 class TTaskBasicConfiguration
 {
 public:
@@ -357,24 +297,14 @@
 	CTask(chcore::IFeedbackHandler* piFeedbackHandler, size_t stSessionUniqueID);
 	~CTask();
 
-	// m_clipboard
-	void AddClipboardData(const CClipboardEntryPtr& spEntry);
-	CClipboardEntryPtr GetClipboardData(size_t stIndex);
-	size_t GetClipboardDataSize();
-	int ReplaceClipboardStrings(CString strOld, CString strNew);
+	void SetTaskDefinition(const TTaskDefinition& rTaskDefinition) { m_tTaskDefinition = rTaskDefinition; }
+	const TTaskDefinition& GetTaskDefinition() const { return m_tTaskDefinition; }
 
-	// m_strDestPath
-	void SetDestPath(LPCTSTR lpszPath);
-	const CDestPath& GetDestPath();
-
 	void SetFilters(const CFiltersArray* pFilters);
 
 	void SetTaskState(ETaskCurrentState eTaskState);
 	ETaskCurrentState GetTaskState() const;
 
-	void SetOperationType(EOperationType eOperationType);
-	EOperationType GetOperationType() const;
-
 	void SetTaskBasicConfiguration(const TTaskBasicConfiguration& TTaskBasicConfiguration);
 	const TTaskBasicConfiguration& GetTaskBasicConfiguration() const;
 
@@ -388,9 +318,6 @@
 	int  GetPriority();
 	void SetPriority(int nPriority);
 
-	// m_strUniqueName
-	CString GetUniqueName();
-
 	void Load(const CString& strPath, bool bData);
 	void Store(bool bData);
 
@@ -405,8 +332,6 @@
 	void GetSnapshot(TASK_DISPLAY_DATA *pData);
 	void GetMiniSnapshot(TASK_MINI_DISPLAY_DATA *pData);
 
-	CClipboardArray* GetClipboard() { return &m_clipboard; };
-
 	void SetTaskPath(const tchar_t* pszDir);
 	const tchar_t* GetTaskPath() const;
 
@@ -462,8 +387,6 @@
 
 	ESubOperationResult CheckForFreeSpaceFB();
 
-	int GetDestDriveNumber();
-
 	// m_nStatus
 	void SetStatusNL(UINT nStatus, UINT nMask);
 	UINT GetStatusNL(UINT nMask = 0xffffffff);
@@ -499,13 +422,11 @@
 
 private:
 	// task initial information (needed to start a task); might be a bit processed.
-	CClipboardArray m_clipboard;        // original paths with which we started operation
-	CDestPath m_dpDestPath;             // destination path
+	TTaskDefinition m_tTaskDefinition;
 
 	// task settings
 	int m_nPriority;                    // task priority (really processing thread priority)
 
-	CString m_strUniqueName;            // name for the task (should be something like uuid)
 	CFiltersArray m_afFilters;          // filtering settings for files (will be filtered according to the rules inside when searching for files)
 
 	BUFFERSIZES m_bsSizes;              // sizes of buffers used to copy (derived from the global
@@ -517,8 +438,6 @@
 	// changing fast
 	volatile ETaskCurrentState m_eCurrentState;     // current state of processing this task represents
 
-	TOperationDescription m_tOperation;		// manages the operation and its suboperations
-
 	TTaskBasicConfiguration m_tTaskConfig;		// task configuration options
 
 	TTaskBasicProgressInfo m_TTaskBasicProgressInfo;	// task progress information