Index: src/libchcore/TBasePathData.cpp
===================================================================
diff -u -rf866db90e4b058a4f2e13cc6cf076d1e0bf2d956 -ref2ea2589f6eeed54f8001fee72936198172ceed
--- src/libchcore/TBasePathData.cpp	(.../TBasePathData.cpp)	(revision f866db90e4b058a4f2e13cc6cf076d1e0bf2d956)
+++ src/libchcore/TBasePathData.cpp	(.../TBasePathData.cpp)	(revision ef2ea2589f6eeed54f8001fee72936198172ceed)
@@ -59,12 +59,14 @@
 		m_bSkipFurtherProcessing(m_setModifications, false),
 		m_pathDst(m_setModifications)
 	{
+		m_pathSrc.Modify().StripSeparatorAtEnd();
 		m_setModifications[eMod_Added] = true;
 	}
 
 	void TBasePathData::SetDestinationPath(const TSmartPath& tPath)
 	{
 		m_pathDst = tPath;
+		m_pathDst.Modify().StripSeparatorAtEnd();
 	}
 
 	TSmartPath TBasePathData::GetDestinationPath() const
@@ -121,6 +123,10 @@
 		spRowReader->GetValue(_T("src_path"), m_pathSrc.Modify());
 		spRowReader->GetValue(_T("skip_processing"), m_bSkipFurtherProcessing.Modify());
 		spRowReader->GetValue(_T("dst_path"), m_pathDst.Modify());
+
+		m_pathSrc.Modify().StripSeparatorAtEnd();
+		m_pathDst.Modify().StripSeparatorAtEnd();
+
 		m_setModifications.reset();
 	}
 
Index: src/libchcore/TDestinationPathProvider.cpp
===================================================================
diff -u -r7ba9f25ab2c2a42bac9f5455ecb98aaf6e29f02d -ref2ea2589f6eeed54f8001fee72936198172ceed
--- src/libchcore/TDestinationPathProvider.cpp	(.../TDestinationPathProvider.cpp)	(revision 7ba9f25ab2c2a42bac9f5455ecb98aaf6e29f02d)
+++ src/libchcore/TDestinationPathProvider.cpp	(.../TDestinationPathProvider.cpp)	(revision ef2ea2589f6eeed54f8001fee72936198172ceed)
@@ -24,52 +24,76 @@
 			throw TCoreException(eErr_InvalidArgument, L"spFilesystem", LOCATION);
 	}
 
-
 	TSmartPath TDestinationPathProvider::CalculateDestinationPath(const TFileInfoPtr& spFileInfo)
 	{
 		if(!spFileInfo)
 			throw TCoreException(eErr_InvalidArgument, L"spFileInfo", LOCATION);
 
-		if(m_bForceDirectories)
-		{
-			// force create directories
-			TSmartPath pathCombined = m_pathDestinationBase + spFileInfo->GetFullFilePath().GetFileDir();
+		if (m_bForceDirectories)
+			return CalculateForceDirectories(spFileInfo);
 
-			// force create directory
-			m_spFilesystem->CreateDirectory(pathCombined, true);
+		if (m_bIgnoreFolders)
+			return CalculateIgnoreDirectories(spFileInfo);
 
-			return pathCombined + spFileInfo->GetFullFilePath().GetFileName();
-		}
-		else
-		{
-			TBasePathDataPtr spPathData = spFileInfo->GetBasePathData();
+		TBasePathDataPtr spPathData = spFileInfo->GetBasePathData();
+		if(!spPathData)
+			return m_pathDestinationBase + spFileInfo->GetFilePath();
 
-			if(!m_bIgnoreFolders && spPathData)
+		// generate new dest name
+		if(!spPathData->IsDestinationPathSet())
+		{
+			// generate something - if dest folder == src folder - search for copy
+			if(m_pathDestinationBase == spFileInfo->GetFullFilePath().GetFileRoot())
 			{
-				// generate new dest name
-				if(!spPathData->IsDestinationPathSet())
-				{
-					// generate something - if dest folder == src folder - search for copy
-					if(m_pathDestinationBase == spFileInfo->GetFullFilePath().GetFileRoot())
-					{
-						TSmartPath pathSubst = FindFreeSubstituteName(spFileInfo->GetFullFilePath());
-						spPathData->SetDestinationPath(pathSubst);
-					}
-					else
-					{
-						TSmartPath pathFilename = spFileInfo->GetFullFilePath().GetFileName();
-						pathFilename.StripPath(L":");
-						spPathData->SetDestinationPath(pathFilename);
-					}
-				}
-
-				return m_pathDestinationBase + spPathData->GetDestinationPath() + spFileInfo->GetFilePath();
+				TSmartPath pathSubst = FindFreeSubstituteName(spFileInfo->GetFullFilePath());
+				spPathData->SetDestinationPath(pathSubst);
 			}
 			else
-				return m_pathDestinationBase + spFileInfo->GetFilePath();
+			{
+				TSmartPath pathFilename = spPathData->GetSrcPath();
+				pathFilename.StripSeparatorAtEnd();
+				pathFilename.StripPath(L":");
+
+				spPathData->SetDestinationPath(pathFilename.GetFileName());
+			}
 		}
+
+		TSmartPath pathResult = m_pathDestinationBase + spPathData->GetDestinationPath() + spFileInfo->GetFilePath();
+		pathResult.StripSeparatorAtEnd();
+
+		return pathResult;
 	}
 
+	TSmartPath TDestinationPathProvider::CalculateForceDirectories(const TFileInfoPtr& spFileInfo)
+	{
+		// force create directories
+		TSmartPath tFileRoot = spFileInfo->GetFullFilePath().GetFileRoot();
+		tFileRoot.StripPath(L":");
+
+		TSmartPath pathCombined = m_pathDestinationBase + tFileRoot;
+
+		// force create directory
+		m_spFilesystem->CreateDirectory(pathCombined, true);
+
+		TSmartPath pathFile = spFileInfo->GetFullFilePath().GetFileName();
+		pathFile.StripPath(L":");
+		TSmartPath pathResult = pathCombined + pathFile;
+		pathResult.StripSeparatorAtEnd();
+
+		return pathResult;
+	}
+
+	TSmartPath TDestinationPathProvider::CalculateIgnoreDirectories(const TFileInfoPtr& spFileInfo)
+	{
+		TSmartPath pathFilename = spFileInfo->GetFullFilePath();
+		pathFilename.StripPath(L":");
+		pathFilename.StripSeparatorAtEnd();
+
+		TSmartPath pathResult = m_pathDestinationBase + pathFilename.GetFileName();
+
+		return pathResult;
+	}
+
 	// finds another name for a copy of src file(folder) in dest location
 	TSmartPath TDestinationPathProvider::FindFreeSubstituteName(TSmartPath pathSrcPath) const
 	{
Index: src/libchcore/TDestinationPathProvider.h
===================================================================
diff -u -r7ba9f25ab2c2a42bac9f5455ecb98aaf6e29f02d -ref2ea2589f6eeed54f8001fee72936198172ceed
--- src/libchcore/TDestinationPathProvider.h	(.../TDestinationPathProvider.h)	(revision 7ba9f25ab2c2a42bac9f5455ecb98aaf6e29f02d)
+++ src/libchcore/TDestinationPathProvider.h	(.../TDestinationPathProvider.h)	(revision ef2ea2589f6eeed54f8001fee72936198172ceed)
@@ -34,6 +34,8 @@
 		TSmartPath CalculateDestinationPath(const TFileInfoPtr& spFileInfo);
 
 	private:
+		TSmartPath CalculateForceDirectories(const TFileInfoPtr& spFileInfo);
+		TSmartPath CalculateIgnoreDirectories(const TFileInfoPtr& spFileInfo);
 		TSmartPath FindFreeSubstituteName(TSmartPath pathSrcPath) const;
 
 	private:
Index: src/libchcore/Tests/TestsTDestinationPathProvider.cpp
===================================================================
diff -u -rc0120993b38b7f0759e0887fd0e5a03dcced68de -ref2ea2589f6eeed54f8001fee72936198172ceed
--- src/libchcore/Tests/TestsTDestinationPathProvider.cpp	(.../TestsTDestinationPathProvider.cpp)	(revision c0120993b38b7f0759e0887fd0e5a03dcced68de)
+++ src/libchcore/Tests/TestsTDestinationPathProvider.cpp	(.../TestsTDestinationPathProvider.cpp)	(revision ef2ea2589f6eeed54f8001fee72936198172ceed)
@@ -60,8 +60,59 @@
 	}
 };
 
+// base src path, full src path, is file, destination path, ignore folders, force directories, expected resulting path
 INSTANTIATE_TEST_CASE_P(BasicTransformTests, TransformTest, ::testing::Values(
-	std::make_tuple(TString(L"c:"), TString(L"c:"), true, TString(L"x:\\"), false, false, TString(L"x:\\c"))
+	/////////////////////////////////////////
+	// full drive copy, std options, root
+	std::make_tuple(TString(L"c:"), TString(L"c:"), false, TString(L"x:\\"), false, false, TString(L"x:\\c")),			// 0
+	std::make_tuple(TString(L"c:\\"), TString(L"c:\\"), false, TString(L"x:\\"), false, false, TString(L"x:\\c")),		// 1
+	// full drive copy, ignore folders, root
+	std::make_tuple(TString(L"c:"), TString(L"c:"), false, TString(L"x:\\"), true, false, TString(L"x:\\c")),			// 2
+	std::make_tuple(TString(L"c:\\"), TString(L"c:\\"), false, TString(L"x:\\"), true, false, TString(L"x:\\c")),		// 3
+	// full drive copy, force directories, root
+	std::make_tuple(TString(L"c:"), TString(L"c:"), false, TString(L"x:\\"), false, true, TString(L"x:\\c")),			// 4
+	std::make_tuple(TString(L"c:\\"), TString(L"c:\\"), false, TString(L"x:\\"), false, true, TString(L"x:\\c")),		// 5
+
+	/////////////////////////////////////////
+	// full drive copy, std options, non-root
+	std::make_tuple(TString(L"c:"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), false, false, TString(L"x:\\c\\folder\\file.txt")),		// 6
+	std::make_tuple(TString(L"c:\\"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), false, false, TString(L"x:\\c\\folder\\file.txt")),		// 7
+	// full drive copy, ignore folders, non-root
+	std::make_tuple(TString(L"c:"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),					// 8
+	std::make_tuple(TString(L"c:\\"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),					// 9
+	// full drive copy, force directories, non-root
+	std::make_tuple(TString(L"c:"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder\\file.txt")),		// 10
+	std::make_tuple(TString(L"c:\\"), TString(L"c:\\folder\\file.txt"), true, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder\\file.txt")),		// 11
+
+	/////////////////////////////////////////
+	// folder copy, std options, folder root
+	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, false, TString(L"x:\\folder")),					// 12
+	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\"), false, TString(L"x:\\"), false, false, TString(L"x:\\folder")),				// 13
+	// folder copy, ignore folders, folder root
+	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), true, false, TString(L"x:\\folder")),					// 14
+	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\"), false, TString(L"x:\\"), true, false, TString(L"x:\\folder")),				// 15
+	// folder copy, force directories, folder root
+	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder")),					// 16
+	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\"), false, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder")),				// 17
+
+	/////////////////////////////////////////
+	// folder copy, std options, non folder root
+	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), false, false, TString(L"x:\\folder\\folder2\\file.txt")),		// 18
+	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), false, false, TString(L"x:\\folder\\folder2\\file.txt")),		// 19
+	// folder copy, ignore folders, non folder root
+	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),			// 20
+	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), true, false, TString(L"x:\\file.txt")),		// 21
+	// folder copy, force directories, non folder root
+	std::make_tuple(TString(L"c:\\folder"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder\\folder2\\file.txt")),			// 22
+	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder\\folder2\\file.txt"), true, TString(L"x:\\"), false, true, TString(L"x:\\c\\folder\\folder2\\file.txt")),		// 23
+
+	/////////////////////////////////////////
+	// special cases
+	// base path slightly differs from normal path (by a separator which should be ignored)
+	std::make_tuple(TString(L"c:\\folder\\"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, false, TString(L"x:\\folder")),			// 24
+
+	// case insensitivity
+	std::make_tuple(TString(L"c:\\Folder"), TString(L"c:\\folder"), false, TString(L"x:\\"), false, false, TString(L"x:\\Folder"))			// 25
 ));
 
 TEST_P(TransformTest, PathTest)
@@ -79,9 +130,9 @@
 	bool bForceDirectories = std::get<5>(rTestData);
 
 	// setup
-	std::shared_ptr<StrictMock<IFilesystemMock> > spFilesystemMock(new StrictMock<IFilesystemMock>);
+	std::shared_ptr<NiceMock<IFilesystemMock> > spFilesystemMock(new NiceMock<IFilesystemMock>);
 	EXPECT_CALL(*spFilesystemMock, PathExist(_))
-		.Times(0);
+		.WillRepeatedly(Return(false));
 
 	// test execution
 	TSmartPath pathResult = TransformPath(spFilesystemMock,
@@ -93,5 +144,5 @@
 		bForceDirectories);
 
 	// verification
-	EXPECT_STREQ(L"x:\\c", pathResult.ToString());
+	ASSERT_STREQ(strExpectedResultPath.c_str(), pathResult.ToString());
 }