Index: src/ch/CustomCopyDlg.cpp
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/ch/CustomCopyDlg.cpp	(.../CustomCopyDlg.cpp)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/ch/CustomCopyDlg.cpp	(.../CustomCopyDlg.cpp)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -690,19 +690,16 @@
 	{
 		_sntprintf(szLoaded, 1024, _T("%s %s"), GetResManager().LoadString(IDS_DATECREATED_STRING+rFilter.GetDateType()), GetResManager().LoadString(IDS_LT_STRING+rFilter.GetDateCmpType1()));
 		szLoaded[1023] = _T('\0');
-		if (rFilter.GetUseDate1())
-			_tcscat(szLoaded, rFilter.GetDate1().Format(_T(" %x")));
-		if (rFilter.GetUseTime1())
-			_tcscat(szLoaded, rFilter.GetTime1().Format(_T(" %X")));
+		chcore::TString strFmtDateTime = rFilter.GetDateTime1().Format(rFilter.GetUseDate1(), rFilter.GetUseTime1());
+		_tcscat(szLoaded, (PCTSTR)strFmtDateTime);
 
 		if (rFilter.GetUseDateTime2())
 		{
 			_tcscat(szLoaded, GetResManager().LoadString(IDS_AND_STRING));
-			_tcscat(szLoaded, GetResManager().LoadString(IDS_LT_STRING+rFilter.GetDateCmpType2()));
-			if (rFilter.GetUseDate2())
-				_tcscat(szLoaded, rFilter.GetDate2().Format(_T(" %x")));
-			if (rFilter.GetUseTime2())
-				_tcscat(szLoaded, rFilter.GetTime2().Format(_T(" %X")));
+			_tcscat(szLoaded, GetResManager().LoadString(IDS_LT_STRING + rFilter.GetDateCmpType2()));
+
+			strFmtDateTime = rFilter.GetDateTime2().Format(rFilter.GetUseDate2(), rFilter.GetUseTime2());
+			_tcscat(szLoaded, (PCTSTR)strFmtDateTime);
 		}
 	}
 	else
Index: src/ch/FilterDlg.cpp
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/ch/FilterDlg.cpp	(.../FilterDlg.cpp)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/ch/FilterDlg.cpp	(.../FilterDlg.cpp)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -141,9 +141,9 @@
 	chcore::TString strData;
 	m_ctlFilter.SetCurSel(m_ctlFilter.AddString(m_ffFilter.GetCombinedMask(strData)));
 	for (int i=0;i<m_astrAddMask.GetSize();i++)
-   {
-      m_ctlFilter.AddString(m_astrAddMask.GetAt(i));
-   }
+	{
+		m_ctlFilter.AddString(m_astrAddMask.GetAt(i));
+	}
 
 	m_bExclude = m_ffFilter.GetUseExcludeMask();
 	m_ctlExcludeMask.SetCurSel(m_ctlExcludeMask.AddString(m_ffFilter.GetCombinedExcludeMask(strData)));
@@ -173,13 +173,14 @@
 	m_ctlDateType2.SetCurSel(m_ffFilter.GetDateCmpType2());
 
 	SYSTEMTIME st;
-	m_ffFilter.GetDate1().GetAsSystemTime(st);
+	m_ffFilter.GetDateTime1().GetAsSystemTime(st);
 	m_ctlDate1.SendMessage(DTM_SETSYSTEMTIME, m_ffFilter.GetUseDate1() ? (WPARAM)GDT_VALID : (WPARAM)GDT_NONE, (LPARAM)&st);
-	m_ffFilter.GetDate2().GetAsSystemTime(st);
-	m_ctlDate2.SendMessage(DTM_SETSYSTEMTIME, m_ffFilter.GetUseDate2() ? (WPARAM)GDT_VALID : (WPARAM)GDT_NONE, (LPARAM)&st);
-	m_ffFilter.GetTime1().GetAsSystemTime(st);
+	m_ffFilter.GetDateTime1().GetAsSystemTime(st);
 	m_ctlTime1.SendMessage(DTM_SETSYSTEMTIME, m_ffFilter.GetUseTime1() ? (WPARAM)GDT_VALID : (WPARAM)GDT_NONE, (LPARAM)&st);
-	m_ffFilter.GetTime2().GetAsSystemTime(st);
+
+	m_ffFilter.GetDateTime2().GetAsSystemTime(st);
+	m_ctlDate2.SendMessage(DTM_SETSYSTEMTIME, m_ffFilter.GetUseDate2() ? (WPARAM)GDT_VALID : (WPARAM)GDT_NONE, (LPARAM)&st);
+	m_ffFilter.GetDateTime2().GetAsSystemTime(st);
 	m_ctlTime2.SendMessage(DTM_SETSYSTEMTIME, m_ffFilter.GetUseTime2() ? (WPARAM)GDT_VALID : (WPARAM)GDT_NONE, (LPARAM)&st);
 
 	// attributes
@@ -343,32 +344,32 @@
 	m_ctlExcludeMask.GetWindowText(strText);
 	m_ffFilter.SetUseExcludeMask((m_bExclude != 0) && !strText.IsEmpty());
 	m_ffFilter.SetCombinedExcludeMask((PCTSTR)strText);
-	
+
 	// size
 	m_ffFilter.SetUseSize1(m_bSize != 0);
 	m_ffFilter.SetUseSize2(m_bSize2 != 0);
 
-   m_ffFilter.SetSizeType1((chcore::CFileFilter::ESizeCompareType)m_ctlSizeType1.GetCurSel());
+	m_ffFilter.SetSizeType1((chcore::CFileFilter::ESizeCompareType)m_ctlSizeType1.GetCurSel());
 	m_ffFilter.SetSizeType2((chcore::CFileFilter::ESizeCompareType)m_ctlSizeType2.GetCurSel());
-	
+
 	m_ffFilter.SetSize1(static_cast<unsigned __int64>(m_uiSize1)*static_cast<unsigned __int64>(GetMultiplier(m_ctlSize1Multi.GetCurSel())));
 	m_ffFilter.SetSize2(static_cast<unsigned __int64>(m_uiSize2)*static_cast<unsigned __int64>(GetMultiplier(m_ctlSize2Multi.GetCurSel())));
 
 	// date
-   m_ffFilter.SetDateType((chcore::CFileFilter::EDateType)m_ctlDateType.GetCurSel());
+	m_ffFilter.SetDateType((chcore::CFileFilter::EDateType)m_ctlDateType.GetCurSel());
 
-   m_ffFilter.SetDateCmpType1((chcore::CFileFilter::EDateCompareType)m_ctlDateType1.GetCurSel());
+	m_ffFilter.SetDateCmpType1((chcore::CFileFilter::EDateCompareType)m_ctlDateType1.GetCurSel());
 	m_ffFilter.SetDateCmpType2((chcore::CFileFilter::EDateCompareType)m_ctlDateType2.GetCurSel());
 
-   CTime tDateTime;
-	m_ffFilter.SetUseDate1(m_ctlDate1.GetTime(tDateTime) == GDT_VALID);
-   m_ffFilter.SetDate1(tDateTime);
-	m_ffFilter.SetUseDate2(m_ctlDate2.GetTime(tDateTime) == GDT_VALID);
-   m_ffFilter.SetDate2(tDateTime);
-	m_ffFilter.SetUseTime1(m_ctlTime1.GetTime(tDateTime) == GDT_VALID);
-   m_ffFilter.SetTime1(tDateTime);
-	m_ffFilter.SetUseTime2(m_ctlTime2.GetTime(tDateTime) == GDT_VALID);
-   m_ffFilter.SetTime2(tDateTime);
+	CTime tDate;
+	CTime tTime;
+	m_ffFilter.SetUseDate1(m_ctlDate1.GetTime(tDate) == GDT_VALID);
+	m_ffFilter.SetUseTime1(m_ctlTime1.GetTime(tTime) == GDT_VALID);
+	m_ffFilter.SetDateTime1(chcore::TDateTime(tDate.GetYear(), tDate.GetMonth(), tDate.GetDay(), tTime.GetHour(), tTime.GetMinute(), tTime.GetSecond()));
+	
+	m_ffFilter.SetUseDate2(m_ctlDate2.GetTime(tDate) == GDT_VALID);
+	m_ffFilter.SetUseTime2(m_ctlTime2.GetTime(tTime) == GDT_VALID);
+	m_ffFilter.SetDateTime2(chcore::TDateTime(tDate.GetYear(), tDate.GetMonth(), tDate.GetDay(), tTime.GetHour(), tTime.GetMinute(), tTime.GetSecond()));
 
 	m_ffFilter.SetUseDateTime1((m_bDate1 != 0) && (m_ffFilter.GetUseDate1() || m_ffFilter.GetUseTime1()));
 	m_ffFilter.SetUseDateTime2((m_bDate2 != 0) && (m_ffFilter.GetUseDate2() || m_ffFilter.GetUseTime2()));
Index: src/ch/FilterDlg.h
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/ch/FilterDlg.h	(.../FilterDlg.h)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/ch/FilterDlg.h	(.../FilterDlg.h)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -70,12 +70,12 @@
 	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 	//}}AFX_VIRTUAL
 
-// Implementation
+	// Implementation
 public:
 	void SetSize2(unsigned __int64 ullSize);
-   chcore::CFileFilter m_ffFilter;
-   CStringArray m_astrAddMask;
-   CStringArray m_astrAddExcludeMask;
+	chcore::CFileFilter m_ffFilter;
+	CStringArray m_astrAddMask;
+	CStringArray m_astrAddExcludeMask;
 
 protected:
 	virtual void OnLanguageChanged();
Index: src/ch/TLocalFilesystem.h
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/ch/TLocalFilesystem.h	(.../TLocalFilesystem.h)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/ch/TLocalFilesystem.h	(.../TLocalFilesystem.h)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -28,8 +28,8 @@
 
 namespace chcore
 {
-   class CFileInfo;
-   typedef boost::shared_ptr<CFileInfo> CFileInfoPtr;
+	class CFileInfo;
+	typedef boost::shared_ptr<CFileInfo> CFileInfoPtr;
 }
 
 class TAutoFileHandle;
@@ -63,7 +63,7 @@
 	static bool RemoveDirectory(const chcore::TSmartPath& pathFile);
 	static bool DeleteFile(const chcore::TSmartPath& pathFile);
 
-   static bool GetFileInfo(const chcore::TSmartPath& pathFile, chcore::CFileInfoPtr& rFileInfo, size_t stSrcIndex = std::numeric_limits<size_t>::max(), const chcore::TPathContainer* pBasePaths = NULL);
+	static bool GetFileInfo(const chcore::TSmartPath& pathFile, chcore::CFileInfoPtr& rFileInfo, size_t stSrcIndex = std::numeric_limits<size_t>::max(), const chcore::TPathContainer* pBasePaths = NULL);
 	static bool FastMove(const chcore::TSmartPath& pathSource, const chcore::TSmartPath& pathDestination);
 
 	static TLocalFilesystemFind CreateFinderObject(const chcore::TSmartPath& pathDir, const chcore::TSmartPath& pathMask);
Index: src/ch/TSubTaskBase.h
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/ch/TSubTaskBase.h	(.../TSubTaskBase.h)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/ch/TSubTaskBase.h	(.../TSubTaskBase.h)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -54,7 +54,7 @@
 
 protected:
 	// some common operations
-   chcore::TSmartPath CalculateDestinationPath(const chcore::CFileInfoPtr& spFileInfo, chcore::TSmartPath strPath, int iFlags) const;
+	chcore::TSmartPath CalculateDestinationPath(const chcore::CFileInfoPtr& spFileInfo, chcore::TSmartPath strPath, int iFlags) const;
 	chcore::TSmartPath FindFreeSubstituteName(chcore::TSmartPath pathSrcPath, chcore::TSmartPath pathDstPath) const;
 
 private:
Index: src/ch/TSubTaskCopyMove.h
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/ch/TSubTaskCopyMove.h	(.../TSubTaskCopyMove.h)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/ch/TSubTaskCopyMove.h	(.../TSubTaskCopyMove.h)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -28,7 +28,7 @@
 namespace chcore
 {
 	class TDataBuffer;
-   typedef boost::shared_ptr<CFileInfo> CFileInfoPtr;
+	typedef boost::shared_ptr<CFileInfo> CFileInfoPtr;
 }
 
 struct CUSTOM_COPY_PARAMS;
@@ -42,7 +42,7 @@
 	ESubOperationResult Exec();
 
 private:
-   bool GetMove(const chcore::CFileInfoPtr& spFileInfo);
+	bool GetMove(const chcore::CFileInfoPtr& spFileInfo);
 	int GetBufferIndex(const chcore::CFileInfoPtr& spFileInfo);
 
 	ESubOperationResult CustomCopyFileFB(CUSTOM_COPY_PARAMS* pData);
Index: src/ch/TSubTaskDelete.cpp
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/ch/TSubTaskDelete.cpp	(.../TSubTaskDelete.cpp)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/ch/TSubTaskDelete.cpp	(.../TSubTaskDelete.cpp)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -39,7 +39,7 @@
 {
 	// log
 	icpf::log_file& rLog = GetContext().GetLog();
-   chcore::CFileInfoArray& rFilesCache = GetContext().GetFilesCache();
+	chcore::CFileInfoArray& rFilesCache = GetContext().GetFilesCache();
 	chcore::TTaskDefinition& rTaskDefinition = GetContext().GetTaskDefinition();
 	TTaskBasicProgressInfo& rBasicProgressInfo = GetContext().GetTaskBasicProgressInfo();
 	chcore::TWorkerThreadController& rThreadController = GetContext().GetThreadController();
@@ -50,7 +50,7 @@
 
 	// current processed path
 	BOOL bSuccess;
-   chcore::CFileInfoPtr spFileInfo;
+	chcore::CFileInfoPtr spFileInfo;
 	ictranslate::CFormat fmt;
 
 	// index points to 0 or next item to process
Index: src/ch/TSubTaskScanDirectory.cpp
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/ch/TSubTaskScanDirectory.cpp	(.../TSubTaskScanDirectory.cpp)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/ch/TSubTaskScanDirectory.cpp	(.../TSubTaskScanDirectory.cpp)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -80,7 +80,7 @@
 	size_t stSize = rTaskDefinition.GetSourcePathCount();
 	for(size_t stIndex = 0; stIndex < stSize ; stIndex++)
 	{
-      chcore::CFileInfoPtr spFileInfo;
+		chcore::CFileInfoPtr spFileInfo;
 
 		bSkipInputPath = false;
 
@@ -220,12 +220,12 @@
 
 int TSubTaskScanDirectories::ScanDirectory(chcore::TSmartPath pathDirName, size_t stSrcIndex, bool bRecurse, bool bIncludeDirs, chcore::CFiltersArray& afFilters)
 {
-   chcore::CFileInfoArray& rFilesCache = GetContext().GetFilesCache();
+	chcore::CFileInfoArray& rFilesCache = GetContext().GetFilesCache();
 	chcore::TTaskDefinition& rTaskDefinition = GetContext().GetTaskDefinition();
 	chcore::TWorkerThreadController& rThreadController = GetContext().GetThreadController();
 
 	TLocalFilesystemFind finder = TLocalFilesystem::CreateFinderObject(pathDirName, chcore::PathFromString(_T("*")));
-   chcore::CFileInfoPtr spFileInfo(boost::make_shared<chcore::CFileInfo>());
+	chcore::CFileInfoPtr spFileInfo(boost::make_shared<chcore::CFileInfo>());
 
 	while(finder.FindNext(spFileInfo))
 	{
@@ -238,7 +238,7 @@
 			{
 				spFileInfo->SetParentObject(stSrcIndex, &rTaskDefinition.GetSourcePaths());
 				rFilesCache.AddFileInfo(spFileInfo);
-            spFileInfo = boost::make_shared<chcore::CFileInfo>();
+				spFileInfo = boost::make_shared<chcore::CFileInfo>();
 			}
 		}
 		else
@@ -248,7 +248,7 @@
 			{
 				spFileInfo->SetParentObject(stSrcIndex, &rTaskDefinition.GetSourcePaths());
 				rFilesCache.AddFileInfo(spFileInfo);
-            spFileInfo = boost::make_shared<chcore::CFileInfo>();
+				spFileInfo = boost::make_shared<chcore::CFileInfo>();
 			}
 
 			if(bRecurse)
Index: src/ch/task.h
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/ch/task.h	(.../task.h)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/ch/task.h	(.../task.h)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -64,7 +64,7 @@
 	size_t m_stSize;
 
 	chcore::TSmartPath m_pathDstPath;
-   chcore::CFiltersArray* m_pafFilters;
+	chcore::CFiltersArray* m_pafFilters;
 
 	ETaskCurrentState m_eTaskState;
 	chcore::EOperationType m_eOperationType;
@@ -214,7 +214,7 @@
 
 	// current task state (derivatives of the task initial information)
 	// changing slowly or only partially
-   chcore::CFileInfoArray m_files;             // list of files/directories found during operating on the task input data (filled by search for files)
+	chcore::CFileInfoArray m_files;             // list of files/directories found during operating on the task input data (filled by search for files)
 
 	// changing fast
 	volatile ETaskCurrentState m_eCurrentState;     // current state of processing this task represents
@@ -225,7 +225,7 @@
 	TTaskLocalStats m_localStats;       // local statistics
 
 	// task settings
-   chcore::CFiltersArray m_afFilters;          // filtering settings for files (will be filtered according to the rules inside when searching for files)
+	chcore::CFiltersArray m_afFilters;          // filtering settings for files (will be filtered according to the rules inside when searching for files)
 
 	bool m_bForce;						// if the continuation of tasks should be independent of max concurrently running task limit
 	bool m_bContinue;					// allows task to continue
Index: src/libchcore/ErrorCodes.h
===================================================================
diff -u -rab32897e61cc637a1e28d9dc3f0489b8d16a429c -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/libchcore/ErrorCodes.h	(.../ErrorCodes.h)	(revision ab32897e61cc637a1e28d9dc3f0489b8d16a429c)
+++ src/libchcore/ErrorCodes.h	(.../ErrorCodes.h)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -32,6 +32,7 @@
 	eErr_UnhandledCase = 3,
 	eErr_InternalProblem = 4,
 	eErr_UseOfUninitializedObject = 5,
+	eErr_InvalidData = 6,
 
 	// shared memory (500+)
 	eErr_CannotOpenSharedMemory = 500,
Index: src/libchcore/FileFilter.cpp
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/libchcore/FileFilter.cpp	(.../FileFilter.cpp)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/libchcore/FileFilter.cpp	(.../FileFilter.cpp)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -53,17 +53,15 @@
 	m_bUseDateTime1=false;
 	m_eDateType = eDateType_Created;
 	m_eDateCmpType1 = eDateCmp_Greater;
-	m_bUseDate1=false;
-	m_tDate1=CTime::GetCurrentTime();
-	m_bUseTime1=false;
-	m_tTime1=CTime::GetCurrentTime();
+	m_bUseDate1 = false;
+	m_bUseTime1 = false;
+	m_tDateTime1.SetCurrentDateTime();
 
 	m_bUseDateTime2=false;
 	m_eDateCmpType2 = eDateCmp_Less;
 	m_bUseDate2=false;
-	m_tDate2=CTime::GetCurrentTime();
 	m_bUseTime2=false;
-	m_tTime2=CTime::GetCurrentTime();
+	m_tDateTime2.SetCurrentDateTime();
 
 	// attribute filtering
 	m_bUseAttributes=false;
@@ -101,16 +99,14 @@
 	m_eDateType=rFilter.m_eDateType;
 	m_eDateCmpType1=rFilter.m_eDateCmpType1;
 	m_bUseDate1=rFilter.m_bUseDate1;
-	m_tDate1=rFilter.m_tDate1;
 	m_bUseTime1=rFilter.m_bUseTime1;
-	m_tTime1=rFilter.m_tTime1;
+	m_tDateTime1 = rFilter.m_tDateTime1;
 
 	m_bUseDateTime2=rFilter.m_bUseDateTime2;
 	m_eDateCmpType2=rFilter.m_eDateCmpType2;
 	m_bUseDate2=rFilter.m_bUseDate2;
-	m_tDate2=rFilter.m_tDate2;
 	m_bUseTime2=rFilter.m_bUseTime2;
-	m_tTime2=rFilter.m_tTime2;
+	m_tDateTime2 = rFilter.m_tDateTime2;
 
 	// attribute filtering
 	m_bUseAttributes=rFilter.m_bUseAttributes;
@@ -143,7 +139,7 @@
 {
 	m_astrMask.Clear();
 
-   pMask.Split(_T("|"), m_astrMask);
+	pMask.Split(_T("|"), m_astrMask);
 }
 
 chcore::TString& CFileFilter::GetCombinedExcludeMask(chcore::TString& strMask) const
@@ -166,7 +162,7 @@
 {
 	m_astrExcludeMask.Clear();
 
-   pMask.Split(_T("|"), m_astrExcludeMask);
+	pMask.Split(_T("|"), m_astrExcludeMask);
 }
 
 void CFileFilter::StoreInConfig(chcore::TConfig& rConfig) const
@@ -188,16 +184,14 @@
 	SetConfigValue(rConfig, _T("DateA.Type"), m_eDateType);	// created/last modified/last accessed
 	SetConfigValue(rConfig, _T("DateA.FilteringType"), m_eDateCmpType1);	// before/after
 	SetConfigValue(rConfig, _T("DateA.EnableDatePart"), m_bUseDate1);
-	SetConfigValue(rConfig, _T("DateA.DateValue"), m_tDate1.GetTime());
 	SetConfigValue(rConfig, _T("DateA.EnableTimePart"), m_bUseTime1);
-	SetConfigValue(rConfig, _T("DateA.TimeValue"), m_tTime1.GetTime());
+	SetConfigValue(rConfig, _T("DateA.DateTimeValue"), m_tDateTime1);
 
 	SetConfigValue(rConfig, _T("DateB.Type"), m_bUseDateTime2);
 	SetConfigValue(rConfig, _T("DateB.FilteringType"), m_eDateCmpType2);
 	SetConfigValue(rConfig, _T("DateB.EnableDatePart"), m_bUseDate2);
-	SetConfigValue(rConfig, _T("DateB.DateValue"), m_tDate2.GetTime());
 	SetConfigValue(rConfig, _T("DateB.EnableTimePart"), m_bUseTime2);
-	SetConfigValue(rConfig, _T("DateB.TimeValue"), m_tTime2.GetTime());
+	SetConfigValue(rConfig, _T("DateB.DateTimeValue"), m_tDateTime2);
 
 	SetConfigValue(rConfig, _T("Attributes.Use"), m_bUseAttributes);
 	SetConfigValue(rConfig, _T("Attributes.Archive"), m_iArchive);
@@ -209,8 +203,6 @@
 
 void CFileFilter::ReadFromConfig(const chcore::TConfig& rConfig)
 {
-	__time64_t tTime = 0;
-
 	if(!GetConfigValue(rConfig, _T("IncludeMask.Use"), m_bUseMask))
 		m_bUseMask = false;
 
@@ -245,17 +237,11 @@
 		m_eDateCmpType1 = eDateCmp_Equal;
 	if(!GetConfigValue(rConfig, _T("DateA.EnableDatePart"), m_bUseDate1))
 		m_bUseDate1 = false;
-
-	if(!GetConfigValue(rConfig, _T("DateA.DateValue"), tTime))
-		tTime = 0;
-	m_tDate1 = tTime;
-
 	if(!GetConfigValue(rConfig, _T("DateA.EnableTimePart"), m_bUseTime1))
 		m_bUseTime1 = false;
 
-	if(!GetConfigValue(rConfig, _T("DateA.TimeValue"), tTime))
-		tTime = 0;
-	m_tTime1 = tTime;
+	if(!GetConfigValue(rConfig, _T("DateA.DateTimeValue"), m_tDateTime1))
+		m_tDateTime1.Clear();
 
 	if(!GetConfigValue(rConfig, _T("DateB.Type"), m_bUseDateTime2))
 		m_bUseDateTime2 = false;
@@ -264,14 +250,10 @@
 	if(!GetConfigValue(rConfig, _T("DateB.EnableDatePart"), m_bUseDate2))
 		m_bUseDate2 = false;
 
-	if(!GetConfigValue(rConfig, _T("DateB.DateValue"), tTime))
-		tTime = 0;
-	m_tDate2 = tTime;
+	if(!GetConfigValue(rConfig, _T("DateB.DateTimeValue"), m_tDateTime2))
+		m_tDateTime2.Clear();
 	if(!GetConfigValue(rConfig, _T("DateB.EnableTimePart"), m_bUseTime2))
 		m_bUseTime2 = false;
-	if(!GetConfigValue(rConfig, _T("DateB.TimeValue"), tTime))
-		tTime = 0;
-	m_tTime2 = tTime;
 
 	if(!GetConfigValue(rConfig, _T("Attributes.Use"), m_bUseAttributes))
 		m_bUseAttributes = false;
@@ -308,16 +290,14 @@
 	Serialize(rSerializer, m_eDateType);	// created/last modified/last accessed
 	Serialize(rSerializer, m_eDateCmpType1);	// before/after
 	Serialize(rSerializer, m_bUseDate1);
-	Serialize(rSerializer, m_tDate1);
 	Serialize(rSerializer, m_bUseTime1);
-	Serialize(rSerializer, m_tTime1);
+	Serialize(rSerializer, m_tDateTime1);
 
 	Serialize(rSerializer, m_bUseDateTime2);
 	Serialize(rSerializer, m_eDateCmpType2);
 	Serialize(rSerializer, m_bUseDate2);
-	Serialize(rSerializer, m_tDate2);
 	Serialize(rSerializer, m_bUseTime2);
-	Serialize(rSerializer, m_tTime2);
+	Serialize(rSerializer, m_tDateTime2);
 
 	Serialize(rSerializer, m_bUseAttributes);
 	Serialize(rSerializer, m_iArchive);
@@ -348,16 +328,14 @@
 	Serialize(rSerializer, m_eDateType);	// created/last modified/last accessed
 	Serialize(rSerializer, m_eDateCmpType1);	// before/after
 	Serialize(rSerializer, m_bUseDate1);
-	Serialize(rSerializer, m_tDate1);
 	Serialize(rSerializer, m_bUseTime1);
-	Serialize(rSerializer, m_tTime1);
+	Serialize(rSerializer, m_tDateTime1);
 
 	Serialize(rSerializer, m_bUseDateTime2);
 	Serialize(rSerializer, m_eDateCmpType2);
 	Serialize(rSerializer, m_bUseDate2);
-	Serialize(rSerializer, m_tDate2);
 	Serialize(rSerializer, m_bUseTime2);
-	Serialize(rSerializer, m_tTime2);
+	Serialize(rSerializer, m_tDateTime2);
 
 	Serialize(rSerializer, m_bUseAttributes);
 	Serialize(rSerializer, m_iArchive);
@@ -451,96 +429,74 @@
 	// date - get the time from rInfo
 	if (m_bUseDateTime1)
 	{
-      ATL::CTime tm;
-		switch (m_eDateType)
+		TDateTime tDateTime;
+		switch(m_eDateType)
 		{
 		case eDateType_Created:
-			tm=spInfo->GetCreationTime();
+			tDateTime = spInfo->GetCreationTime();
 			break;
 		case eDateType_Modified:
-			tm=spInfo->GetLastWriteTime();
+			tDateTime = spInfo->GetLastWriteTime();
 			break;
 		case eDateType_LastAccessed:
-			tm=spInfo->GetLastAccessTime();
+			tDateTime = spInfo->GetLastAccessTime();
 			break;
 		}
 
 		// counting...
-		unsigned long ulInfo=0, ulCheck=0;
-		if (m_bUseDate1)
-		{
-			ulInfo=(tm.GetYear()-1970)*32140800+tm.GetMonth()*2678400+tm.GetDay()*86400;
-			ulCheck=(m_tDate1.GetYear()-1970)*32140800+m_tDate1.GetMonth()*2678400+m_tDate1.GetDay()*86400;
-		}
+		time_t tDiff = m_tDateTime1.Compare(tDateTime, m_bUseDate1, m_bUseTime1);
 
-		if (m_bUseTime1)
-		{
-			ulInfo+=tm.GetHour()*3600+tm.GetMinute()*60+tm.GetSecond();
-			ulCheck+=m_tTime1.GetHour()*3600+m_tTime1.GetMinute()*60+m_tTime1.GetSecond();
-		}
-
 		// ... and comparing
-		switch (m_eDateCmpType1)
+		switch(m_eDateCmpType1)
 		{
 		case eDateCmp_Less:
-			if (ulInfo >= ulCheck)
+			if(tDiff >= 0)
 				return false;
 			break;
 		case eDateCmp_LessOrEqual:
-			if (ulInfo > ulCheck)
+			if(tDiff > 0)
 				return false;
 			break;
 		case eDateCmp_Equal:
-			if (ulInfo != ulCheck)
+			if(tDiff != 0)
 				return false;
 			break;
 		case eDateCmp_GreaterOrEqual:
-			if (ulInfo < ulCheck)
+			if(tDiff < 0)
 				return false;
 			break;
 		case eDateCmp_Greater:
-			if (ulInfo <= ulCheck)
+			if(tDiff <= 0)
 				return false;
 			break;
 		}
 
 		if (m_bUseDateTime2)
 		{
 			// counting...
-			ulInfo=0, ulCheck=0;
-			if (m_bUseDate2)
-			{
-				ulInfo=(tm.GetYear()-1970)*32140800+tm.GetMonth()*2678400+tm.GetDay()*86400;
-				ulCheck=(m_tDate2.GetYear()-1970)*32140800+m_tDate2.GetMonth()*2678400+m_tDate2.GetDay()*86400;
-			}
+			tDiff = m_tDateTime2.Compare(tDateTime, m_bUseDate2, m_bUseTime2);
 
-			if (m_bUseTime2)
-			{
-				ulInfo+=tm.GetHour()*3600+tm.GetMinute()*60+tm.GetSecond();
-				ulCheck+=m_tTime2.GetHour()*3600+m_tTime2.GetMinute()*60+m_tTime2.GetSecond();
-			}
-
 			// ... comparing
 			switch (m_eDateCmpType2)
 			{
 			case eDateCmp_Less:
-				if (ulInfo >= ulCheck)
+				if(tDiff >= 0)
 					return false;
 				break;
 			case eDateCmp_LessOrEqual:
-				if (ulInfo > ulCheck)
+				if(tDiff > 0)
 					return false;
 				break;
 			case eDateCmp_Equal:
-				if (ulInfo != ulCheck)
+				if(tDiff != 0)
 					return false;
 				break;
 			case eDateCmp_GreaterOrEqual:
-				if (ulInfo < ulCheck)
+				if(tDiff < 0)
 					return false;
 				break;
 			case eDateCmp_Greater:
-				if (ulInfo <= ulCheck)
+				if(tDiff <= 0)
 					return false;
 				break;
 			}
Index: src/libchcore/FileFilter.h
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/libchcore/FileFilter.h	(.../FileFilter.h)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/libchcore/FileFilter.h	(.../FileFilter.h)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -22,6 +22,7 @@
 #include "libchcore.h"
 #include "FileInfo.h"
 #include <atltime.h>
+#include "TDateTime.h"
 
 BEGIN_CHCORE_NAMESPACE
 
@@ -30,30 +31,30 @@
 class LIBCHCORE_API CFileFilter
 {
 public:
-   enum ESizeCompareType
-   {
-      eSizeCmp_Less = 0,
-      eSizeCmp_LessOrEqual = 1,
-      eSizeCmp_Equal = 2,
-      eSizeCmp_GreaterOrEqual = 3,
-      eSizeCmp_Greater = 4
-   };
+	enum ESizeCompareType
+	{
+		eSizeCmp_Less = 0,
+		eSizeCmp_LessOrEqual = 1,
+		eSizeCmp_Equal = 2,
+		eSizeCmp_GreaterOrEqual = 3,
+		eSizeCmp_Greater = 4
+	};
 
-   enum EDateCompareType
-   {
-      eDateCmp_Less = 0,
-      eDateCmp_LessOrEqual = 1,
-      eDateCmp_Equal = 2,
-      eDateCmp_GreaterOrEqual = 3,
-      eDateCmp_Greater = 4
-   };
+	enum EDateCompareType
+	{
+		eDateCmp_Less = 0,
+		eDateCmp_LessOrEqual = 1,
+		eDateCmp_Equal = 2,
+		eDateCmp_GreaterOrEqual = 3,
+		eDateCmp_Greater = 4
+	};
 
-   enum EDateType
-   {
-      eDateType_Created = 0,
-      eDateType_Modified = 1,
-      eDateType_LastAccessed = 2
-   };
+	enum EDateType
+	{
+		eDateType_Created = 0,
+		eDateType_Modified = 1,
+		eDateType_LastAccessed = 2
+	};
 
 public:
 	CFileFilter();
@@ -74,148 +75,140 @@
 	void Serialize(chcore::TReadBinarySerializer& rSerializer);
 	void Serialize(chcore::TWriteBinarySerializer& rSerializer) const;
 
-   // atrributes access
-   bool GetUseMask() const { return m_bUseMask; }
-   void SetUseMask(bool bUseMask) { m_bUseMask = bUseMask; }
+	// atrributes access
+	bool GetUseMask() const { return m_bUseMask; }
+	void SetUseMask(bool bUseMask) { m_bUseMask = bUseMask; }
 
-//   const chcore::TStringArray& GetMaskArray() const { return m_astrMask; }
-//   chcore::TStringArray& GetMaskArray() { return m_astrMask; }
+	//   const chcore::TStringArray& GetMaskArray() const { return m_astrMask; }
+	//   chcore::TStringArray& GetMaskArray() { return m_astrMask; }
 
-   bool GetUseExcludeMask() const { return m_bUseExcludeMask; }
-   void SetUseExcludeMask(bool bUseExcludeMask) { m_bUseExcludeMask = bUseExcludeMask; }
+	bool GetUseExcludeMask() const { return m_bUseExcludeMask; }
+	void SetUseExcludeMask(bool bUseExcludeMask) { m_bUseExcludeMask = bUseExcludeMask; }
 
-//   const chcore::TStringArray& GetExcludeMaskArray() const { return m_astrExcludeMask; }
-//   chcore::TStringArray& GetExcludeMaskArray() { return m_astrExcludeMask; }
+	//   const chcore::TStringArray& GetExcludeMaskArray() const { return m_astrExcludeMask; }
+	//   chcore::TStringArray& GetExcludeMaskArray() { return m_astrExcludeMask; }
 
-   bool GetUseSize1() const { return m_bUseSize1; }
-   void SetUseSize1(bool bUseSize1) { m_bUseSize1 = bUseSize1; }
+	bool GetUseSize1() const { return m_bUseSize1; }
+	void SetUseSize1(bool bUseSize1) { m_bUseSize1 = bUseSize1; }
 
-   ESizeCompareType GetSizeType1() const { return m_eSizeCmpType1; }
-   void SetSizeType1(ESizeCompareType eSizeType1) { m_eSizeCmpType1 = eSizeType1; }
+	ESizeCompareType GetSizeType1() const { return m_eSizeCmpType1; }
+	void SetSizeType1(ESizeCompareType eSizeType1) { m_eSizeCmpType1 = eSizeType1; }
 
-   unsigned long long GetSize1() const { return m_ullSize1; }
-   void SetSize1(unsigned long long ullSize1) { m_ullSize1 = ullSize1; }
+	unsigned long long GetSize1() const { return m_ullSize1; }
+	void SetSize1(unsigned long long ullSize1) { m_ullSize1 = ullSize1; }
 
-   bool GetUseSize2() const { return m_bUseSize2; }
-   void SetUseSize2(bool bUseSize2) { m_bUseSize2 = bUseSize2; }
+	bool GetUseSize2() const { return m_bUseSize2; }
+	void SetUseSize2(bool bUseSize2) { m_bUseSize2 = bUseSize2; }
 
-   ESizeCompareType GetSizeType2() const { return m_eSizeCmpType2; }
-   void SetSizeType2(ESizeCompareType eSizeType2) { m_eSizeCmpType2 = eSizeType2; }
+	ESizeCompareType GetSizeType2() const { return m_eSizeCmpType2; }
+	void SetSizeType2(ESizeCompareType eSizeType2) { m_eSizeCmpType2 = eSizeType2; }
 
-   unsigned long long GetSize2() const { return m_ullSize2; }
-   void SetSize2(unsigned long long ullSize2) { m_ullSize2 = ullSize2; }
+	unsigned long long GetSize2() const { return m_ullSize2; }
+	void SetSize2(unsigned long long ullSize2) { m_ullSize2 = ullSize2; }
 
-   // dates
-   CFileFilter::EDateType GetDateType() const { return m_eDateType; }
-   void SetDateType(CFileFilter::EDateType eDateType) { m_eDateType = eDateType; }
+	// dates
+	CFileFilter::EDateType GetDateType() const { return m_eDateType; }
+	void SetDateType(CFileFilter::EDateType eDateType) { m_eDateType = eDateType; }
 
-   // date 1
-   bool GetUseDateTime1() const { return m_bUseDateTime1; }
-   void SetUseDateTime1(bool bUseDateTime1) { m_bUseDateTime1 = bUseDateTime1; }
+	// date 1
+	bool GetUseDateTime1() const { return m_bUseDateTime1; }
+	void SetUseDateTime1(bool bUseDateTime1) { m_bUseDateTime1 = bUseDateTime1; }
 
-   CFileFilter::EDateCompareType GetDateCmpType1() const { return m_eDateCmpType1; }
-   void SetDateCmpType1(CFileFilter::EDateCompareType eCmpType1) { m_eDateCmpType1 = eCmpType1; }
+	CFileFilter::EDateCompareType GetDateCmpType1() const { return m_eDateCmpType1; }
+	void SetDateCmpType1(CFileFilter::EDateCompareType eCmpType1) { m_eDateCmpType1 = eCmpType1; }
 
-   bool GetUseDate1() const { return m_bUseDate1; }
-   void SetUseDate1(bool tDate1) { m_bUseDate1 = tDate1; }
+	bool GetUseDate1() const { return m_bUseDate1; }
+	void SetUseDate1(bool tDate1) { m_bUseDate1 = tDate1; }
 
-   const ATL::CTime& GetDate1() const { return m_tDate1; }
-   void SetDate1(const ATL::CTime& tDate1) { m_tDate1 = tDate1; }
+	bool GetUseTime1() const { return m_bUseTime1; }
+	void SetUseTime1(bool tTime1) { m_bUseTime1 = tTime1; }
 
-   bool GetUseTime1() const { return m_bUseTime1; }
-   void SetUseTime1(bool tTime1) { m_bUseTime1 = tTime1; }
+	const TDateTime& GetDateTime1() const { return m_tDateTime1; }
+	void SetDateTime1(const TDateTime& tDateTime1) { m_tDateTime1 = tDateTime1; }
 
-   const ATL::CTime& GetTime1() const { return m_tTime1; }
-   void SetTime1(const ATL::CTime& val) { m_tTime1 = val; }
+	// date 2
+	bool GetUseDateTime2() const { return m_bUseDateTime2; }
+	void SetUseDateTime2(bool bUseDateTime2) { m_bUseDateTime2 = bUseDateTime2; }
 
-   // date 2
-   bool GetUseDateTime2() const { return m_bUseDateTime2; }
-   void SetUseDateTime2(bool bUseDateTime2) { m_bUseDateTime2 = bUseDateTime2; }
+	CFileFilter::EDateCompareType GetDateCmpType2() const { return m_eDateCmpType2; }
+	void SetDateCmpType2(CFileFilter::EDateCompareType eCmpType2) { m_eDateCmpType2 = eCmpType2; }
 
-   CFileFilter::EDateCompareType GetDateCmpType2() const { return m_eDateCmpType2; }
-   void SetDateCmpType2(CFileFilter::EDateCompareType eCmpType2) { m_eDateCmpType2 = eCmpType2; }
+	bool GetUseDate2() const { return m_bUseDate2; }
+	void SetUseDate2(bool tDate2) { m_bUseDate2 = tDate2; }
 
-   bool GetUseDate2() const { return m_bUseDate2; }
-   void SetUseDate2(bool tDate2) { m_bUseDate2 = tDate2; }
+	bool GetUseTime2() const { return m_bUseTime2; }
+	void SetUseTime2(bool tTime2) { m_bUseTime2 = tTime2; }
 
-   const ATL::CTime& GetDate2() const { return m_tDate2; }
-   void SetDate2(const ATL::CTime& tDate2) { m_tDate2 = tDate2; }
+	const TDateTime& GetDateTime2() const { return m_tDateTime2; }
+	void SetDateTime2(const TDateTime& tDateTime2) { m_tDateTime2 = tDateTime2; }
 
-   bool GetUseTime2() const { return m_bUseTime2; }
-   void SetUseTime2(bool tTime2) { m_bUseTime2 = tTime2; }
+	// attributes
+	bool GetUseAttributes() const { return m_bUseAttributes; }
+	void SetUseAttributes(bool bUseAttributes) { m_bUseAttributes = bUseAttributes; }
 
-   const ATL::CTime& GetTime2() const { return m_tTime2; }
-   void SetTime2(const ATL::CTime& val) { m_tTime2 = val; }
+	int GetArchive() const { return m_iArchive; }
+	void SetArchive(int iArchive) { m_iArchive = iArchive; }
 
-   // attributes
-   bool GetUseAttributes() const { return m_bUseAttributes; }
-   void SetUseAttributes(bool bUseAttributes) { m_bUseAttributes = bUseAttributes; }
+	int GetReadOnly() const { return m_iReadOnly; }
+	void SetReadOnly(int iReadOnly) { m_iReadOnly = iReadOnly; }
 
-   int GetArchive() const { return m_iArchive; }
-   void SetArchive(int iArchive) { m_iArchive = iArchive; }
+	int GetHidden() const { return m_iHidden; }
+	void SetHidden(int iHidden) { m_iHidden = iHidden; }
 
-   int GetReadOnly() const { return m_iReadOnly; }
-   void SetReadOnly(int iReadOnly) { m_iReadOnly = iReadOnly; }
+	int GetSystem() const { return m_iSystem; }
+	void SetSystem(int iSystem) { m_iSystem = iSystem; }
 
-   int GetHidden() const { return m_iHidden; }
-   void SetHidden(int iHidden) { m_iHidden = iHidden; }
+	int GetDirectory() const { return m_iDirectory; }
+	void SetDirectory(int iDirectory) { m_iDirectory = iDirectory; }
 
-   int GetSystem() const { return m_iSystem; }
-   void SetSystem(int iSystem) { m_iSystem = iSystem; }
-
-   int GetDirectory() const { return m_iDirectory; }
-   void SetDirectory(int iDirectory) { m_iDirectory = iDirectory; }
-
 protected:
 	bool MatchMask(LPCTSTR lpszMask, LPCTSTR lpszString) const;
 	bool Scan(LPCTSTR& lpszMask, LPCTSTR& lpszString) const;
 
 private:
-   // files mask
-   bool m_bUseMask;
-   chcore::TStringArray m_astrMask;
+	// files mask
+	bool m_bUseMask;
+	chcore::TStringArray m_astrMask;
 
-   // files mask-
-   bool m_bUseExcludeMask;
-   chcore::TStringArray m_astrExcludeMask;
+	// files mask-
+	bool m_bUseExcludeMask;
+	chcore::TStringArray m_astrExcludeMask;
 
-   // size filtering
-   bool m_bUseSize1;
-   ESizeCompareType m_eSizeCmpType1;
-   unsigned long long m_ullSize1;
+	// size filtering
+	bool m_bUseSize1;
+	ESizeCompareType m_eSizeCmpType1;
+	unsigned long long m_ullSize1;
 
-   bool m_bUseSize2;
-   ESizeCompareType m_eSizeCmpType2;
-   unsigned long long m_ullSize2;
+	bool m_bUseSize2;
+	ESizeCompareType m_eSizeCmpType2;
+	unsigned long long m_ullSize2;
 
-   // date filtering
-   EDateType m_eDateType;	// created/last modified/last accessed
+	// date filtering
+	EDateType m_eDateType;	// created/last modified/last accessed
 
-   bool m_bUseDateTime1;
+	bool m_bUseDateTime1;
 #pragma warning(push)
 #pragma warning(disable: 4251)
-   EDateCompareType m_eDateCmpType1;	// before/after
-   bool m_bUseDate1;
-   ATL::CTime m_tDate1;
-   bool m_bUseTime1;
-   ATL::CTime m_tTime1;
+	EDateCompareType m_eDateCmpType1;	// before/after
+	bool m_bUseDate1;
+	bool m_bUseTime1;
+	TDateTime m_tDateTime1;
 
-   bool m_bUseDateTime2;
+	bool m_bUseDateTime2;
 
-   EDateCompareType m_eDateCmpType2;
-   bool m_bUseDate2;
-   ATL::CTime m_tDate2;
-   bool m_bUseTime2;
-   ATL::CTime m_tTime2;
+	EDateCompareType m_eDateCmpType2;
+	bool m_bUseDate2;
+	bool m_bUseTime2;
+	TDateTime m_tDateTime2;
 #pragma warning(pop)
 
-   // attribute filtering
-   bool m_bUseAttributes;
-   int m_iArchive;
-   int m_iReadOnly;
-   int m_iHidden;
-   int m_iSystem;
-   int m_iDirectory;
+	// attribute filtering
+	bool m_bUseAttributes;
+	int m_iArchive;
+	int m_iReadOnly;
+	int m_iHidden;
+	int m_iSystem;
+	int m_iDirectory;
 };
 
 class LIBCHCORE_API CFiltersArray
Index: src/libchcore/FileInfo.h
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/libchcore/FileInfo.h	(.../FileInfo.h)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/libchcore/FileInfo.h	(.../FileInfo.h)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -140,7 +140,7 @@
 	void Serialize(chcore::TWriteBinarySerializer& rSerializer, bool bOnlyFlags) const;
 
 protected:
-   const chcore::TPathContainer& m_rBasePaths;
+	const chcore::TPathContainer& m_rBasePaths;
 
 #pragma warning(push)
 #pragma warning(disable: 4251)
Index: src/libchcore/SerializationHelpers.h
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/libchcore/SerializationHelpers.h	(.../SerializationHelpers.h)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/libchcore/SerializationHelpers.h	(.../SerializationHelpers.h)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -101,23 +101,6 @@
 		SerializerType::StoreValue(rSerializer, tValue);
 	}
 
-#ifdef _ATL_VER
-   template<>
-   inline void Serialize<ATL::CTime>(TReadBinarySerializer& rSerializer, ATL::CTime& tValue)
-   {
-      long long llTime = 0;
-      Serialize(rSerializer, llTime);
-      tValue = ATL::CTime(llTime);
-   }
-
-   template<>
-   inline void Serialize<ATL::CTime>(TWriteBinarySerializer& rSerializer, const ATL::CTime& tValue)
-   {
-      long long llTime = tValue.GetTime();
-      Serialize(rSerializer, llTime);
-   }
-#endif
-
 #ifdef _MFC_VER
 	template<>
 	inline void Serialize<CString>(TReadBinarySerializer& rSerializer, CString& tValue)
@@ -133,22 +116,6 @@
 		Serialize(rSerializer, (PCTSTR)tValue);
 	}
 
-/*
-	template<>
-	inline void Serialize<CTime>(TReadBinarySerializer& rSerializer, CTime& tValue)
-	{
-		long long llTime = 0;
-		Serialize(rSerializer, llTime);
-		tValue = CTime(llTime);
-	}
-
-	template<>
-	inline void Serialize<CTime>(TWriteBinarySerializer& rSerializer, const CTime& tValue)
-	{
-		long long llTime = tValue.GetTime();
-		Serialize(rSerializer, llTime);
-	}
-*/
 #endif
 }
 
Index: src/libchcore/TDateTime.cpp
===================================================================
diff -u
--- src/libchcore/TDateTime.cpp	(revision 0)
+++ src/libchcore/TDateTime.cpp	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -0,0 +1,229 @@
+// ============================================================================
+//  Copyright (C) 2001-2011 by Jozef Starosczyk
+//  ixen@copyhandler.com
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU Library General Public License
+//  (version 2) as published by the Free Software Foundation;
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU Library General Public
+//  License along with this program; if not, write to the
+//  Free Software Foundation, Inc.,
+//  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// ============================================================================
+/// @file  TDateTime.cpp
+/// @date  2011/10/26
+/// @brief Contains implementation of date&time handling class.
+// ============================================================================
+#include "stdafx.h"
+#include "TDateTime.h"
+#include "SerializationHelpers.h"
+#include "TBinarySerializer.h"
+
+BEGIN_CHCORE_NAMESPACE
+
+TDateTime::TDateTime() :
+	m_tTime(0)
+{
+}
+
+TDateTime::TDateTime(int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond)
+{
+	if(iYear < 1900)
+		THROW_CORE_EXCEPTION(eErr_InvalidArgument);
+
+	tm tTime;
+
+	tTime.tm_sec = iSecond;
+	tTime.tm_min = iMinute;
+	tTime.tm_hour = iHour;
+	tTime.tm_mday = iDay;
+	tTime.tm_mon = iMonth - 1;
+	tTime.tm_year = iYear - 1900;
+	tTime.tm_isdst = -1;
+
+	m_tTime = _mktime64(&tTime);
+	if(m_tTime == -1)
+		THROW_CORE_EXCEPTION_WIN32(eErr_InvalidArgument, GetLastError());
+}
+
+TDateTime::TDateTime(FILETIME ftDateTime)
+{
+	operator=(ftDateTime);
+}
+
+TDateTime::TDateTime(SYSTEMTIME sysDateTime)
+{
+	operator=(sysDateTime);
+}
+
+TDateTime::TDateTime(time_t tDateTime) :
+	m_tTime(tDateTime)
+{
+}
+
+TDateTime& TDateTime::operator=(FILETIME ftDateTime)
+{
+	// convert and process as system time
+	FILETIME tLocalFileTime;
+	if(!FileTimeToLocalFileTime(&ftDateTime, &tLocalFileTime))
+		THROW_CORE_EXCEPTION_WIN32(eErr_InvalidArgument, GetLastError());
+
+	SYSTEMTIME sysTime;
+	if(!FileTimeToSystemTime(&tLocalFileTime, &sysTime))
+		THROW_CORE_EXCEPTION_WIN32(eErr_InvalidArgument, GetLastError());
+
+	return operator=(sysTime);
+}
+
+TDateTime& TDateTime::operator=(SYSTEMTIME sysDateTime)
+{
+	if(sysDateTime.wYear < 1900)
+		THROW_CORE_EXCEPTION(eErr_InvalidArgument);
+
+	tm tTime;
+
+	tTime.tm_sec = sysDateTime.wSecond;
+	tTime.tm_min = sysDateTime.wMinute;
+	tTime.tm_hour = sysDateTime.wHour;
+	tTime.tm_mday = sysDateTime.wDay;
+	tTime.tm_mon = sysDateTime.wMonth - 1;
+	tTime.tm_year = sysDateTime.wYear - 1900;
+	tTime.tm_isdst = -1;
+
+	m_tTime = _mktime64(&tTime);
+	if(m_tTime == -1)
+		THROW_CORE_EXCEPTION_WIN32(eErr_InvalidArgument, GetLastError());
+
+	return *this;
+}
+
+TDateTime& TDateTime::operator=(time_t tDateTime)
+{
+	m_tTime = tDateTime;
+	return *this;
+}
+
+void TDateTime::Clear()
+{
+	m_tTime = 0;
+}
+
+void TDateTime::SetCurrentDateTime()
+{
+	m_tTime = _time64(NULL);
+}
+
+void TDateTime::GetAsSystemTime(SYSTEMTIME& tSystemTime) const
+{
+	tm tThisTimeInfo;
+	errno_t err = _localtime64_s(&tThisTimeInfo, &m_tTime);
+	if(err != 0)
+		THROW_CORE_EXCEPTION(eErr_InvalidData);
+
+	tSystemTime.wYear = (WORD)(tThisTimeInfo.tm_year + 1900);
+	tSystemTime.wMonth = (WORD)(tThisTimeInfo.tm_mon + 1);
+	tSystemTime.wDayOfWeek = (WORD)tThisTimeInfo.tm_wday;
+	tSystemTime.wDay = (WORD)tThisTimeInfo.tm_mday;
+	tSystemTime.wHour = (WORD)tThisTimeInfo.tm_hour;
+	tSystemTime.wMinute = (WORD)tThisTimeInfo.tm_min;
+	tSystemTime.wSecond = (WORD)tThisTimeInfo.tm_sec;
+	tSystemTime.wMilliseconds = 0;
+}
+
+TString TDateTime::Format(bool bUseDate, bool bUseTime) const
+{
+	if(!bUseDate && !bUseTime)
+		return TString();
+
+	TString strTmp;
+	const size_t stMaxBufSize = 1024;
+	wchar_t* pszBuffer = strTmp.GetBuffer(stMaxBufSize);
+
+	PCTSTR pszFmt = NULL;
+	if(bUseDate && bUseTime)
+		pszFmt = _T("%x %X");
+	else if(bUseDate)
+		pszFmt = _T("%x");
+	else if(bUseTime)
+		pszFmt = _T("%X");
+
+	tm tThisTimeInfo;
+	errno_t err = _localtime64_s(&tThisTimeInfo, &m_tTime);
+	if(err != 0)
+		THROW_CORE_EXCEPTION(eErr_InvalidData);
+
+	if(!_tcsftime(pszBuffer, stMaxBufSize, pszFmt, &tThisTimeInfo))
+		THROW_CORE_EXCEPTION(eErr_InvalidData);
+
+	strTmp.ReleaseBuffer();
+	return strTmp;
+}
+
+time_t TDateTime::Compare(const TDateTime& rOtherDateTime, bool bCompareDate, bool bCompareTime) const
+{
+	if(!bCompareDate && !bCompareTime)
+		return 0;
+
+	tm tThisTimeInfo;
+	tm tOtherTimeInfo;
+	errno_t err = _localtime64_s(&tThisTimeInfo, &m_tTime);
+	if(err != 0)
+		THROW_CORE_EXCEPTION(eErr_InvalidData);
+	err = _localtime64_s(&tOtherTimeInfo, &rOtherDateTime.m_tTime);
+	if(err != 0)
+		THROW_CORE_EXCEPTION(eErr_InvalidData);
+	if(tThisTimeInfo.tm_isdst != tOtherTimeInfo.tm_isdst)
+		THROW_CORE_EXCEPTION(eErr_InternalProblem);
+
+	time_t tDiffDateTime = 0;
+	if(bCompareDate)
+	{
+		time_t tThisCompoundDate = (tThisTimeInfo.tm_year - 1900) * 32140800 + tThisTimeInfo.tm_mon * 2678400 + tThisTimeInfo.tm_mday * 86400;
+		time_t tOtherCompoundDate = (tOtherTimeInfo.tm_year - 1900) * 32140800 + tOtherTimeInfo.tm_mon * 2678400 + tOtherTimeInfo.tm_mday * 86400;
+
+		// <0 means that this date is less than other date, 0 means they are equal, >0 means that other date is less than this date
+		tDiffDateTime = tOtherCompoundDate - tThisCompoundDate;
+
+		// at this point we can return only if this date differs from other date; if they are equal, process time comparison if needed
+		if(tDiffDateTime != 0)
+			return tDiffDateTime;
+	}
+
+	if(bCompareTime)
+	{
+		time_t tThisCompoundTime = tThisTimeInfo.tm_hour * 3600 + tThisTimeInfo.tm_min * 60 + tThisTimeInfo.tm_sec;
+		time_t tOtherCompoundTime = tOtherTimeInfo.tm_hour * 3600 + tOtherTimeInfo.tm_min * 60 + tOtherTimeInfo.tm_sec;
+
+		tDiffDateTime = tOtherCompoundTime - tThisCompoundTime;
+	}
+
+	return tDiffDateTime;
+}
+
+void TDateTime::StoreInConfig(chcore::TConfig& rConfig, PCTSTR pszNodeName) const
+{
+	rConfig.SetValue(pszNodeName, m_tTime);
+}
+
+bool TDateTime::ReadFromConfig(const chcore::TConfig& rConfig, PCTSTR pszNodeName)
+{
+	return rConfig.GetValue(pszNodeName, m_tTime);
+}
+
+void TDateTime::Serialize(chcore::TReadBinarySerializer& rSerializer)
+{
+	Serializers::Serialize(rSerializer, m_tTime);
+}
+
+void TDateTime::Serialize(chcore::TWriteBinarySerializer& rSerializer) const
+{
+	Serializers::Serialize(rSerializer, m_tTime);
+}
+
+END_CHCORE_NAMESPACE
Index: src/libchcore/TDateTime.h
===================================================================
diff -u
--- src/libchcore/TDateTime.h	(revision 0)
+++ src/libchcore/TDateTime.h	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -0,0 +1,74 @@
+// ============================================================================
+//  Copyright (C) 2001-2011 by Jozef Starosczyk
+//  ixen@copyhandler.com
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU Library General Public License
+//  (version 2) as published by the Free Software Foundation;
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU Library General Public
+//  License along with this program; if not, write to the
+//  Free Software Foundation, Inc.,
+//  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+// ============================================================================
+/// @file  TDateTime.h
+/// @date  2011/10/26
+/// @brief Contains declaration of date&time handling class.
+// ============================================================================
+#ifndef __TDATETIME_H__
+#define __TDATETIME_H__
+
+#include "libchcore.h"
+#include "TConfig.h"
+
+BEGIN_CHCORE_NAMESPACE
+
+class TConfig;
+class TReadBinarySerializer;
+class TWriteBinarySerializer;
+
+class LIBCHCORE_API TDateTime
+{
+public:
+	TDateTime();
+	TDateTime(int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond);
+	TDateTime(FILETIME ftDateTime);
+	TDateTime(SYSTEMTIME sysDateTime);
+	TDateTime(time_t tDateTime);
+
+	TDateTime& operator=(FILETIME ftDateTime);
+	TDateTime& operator=(SYSTEMTIME sysDateTime);
+	TDateTime& operator=(time_t tDateTime);
+
+	// content modification
+	void Clear();
+	void SetCurrentDateTime();
+
+	// content extraction
+	void GetAsSystemTime(SYSTEMTIME& tSystemTime) const;
+	TString Format(bool bUseDate, bool bUseTime) const;
+
+	// comparison
+	time_t Compare(const TDateTime& rOtherDateTime, bool bCompareDate, bool bCompareTime) const;
+
+	// serialization
+	void StoreInConfig(chcore::TConfig& rConfig, PCTSTR pszNodeName) const;
+	bool ReadFromConfig(const chcore::TConfig& rConfig, PCTSTR pszNodeName);
+
+	void Serialize(chcore::TReadBinarySerializer& rSerializer);
+	void Serialize(chcore::TWriteBinarySerializer& rSerializer) const;
+
+private:
+	time_t m_tTime;
+};
+
+END_CHCORE_NAMESPACE
+
+CONFIG_MEMBER_SERIALIZATION(TDateTime)
+
+#endif
Index: src/libchcore/libchcore.vc90.vcproj
===================================================================
diff -u -rd12e49decb8a3df3e28f6786d38542390484ac07 -rf46d334ffd78c7daa7626f214ae698adbac5f36d
--- src/libchcore/libchcore.vc90.vcproj	(.../libchcore.vc90.vcproj)	(revision d12e49decb8a3df3e28f6786d38542390484ac07)
+++ src/libchcore/libchcore.vc90.vcproj	(.../libchcore.vc90.vcproj)	(revision f46d334ffd78c7daa7626f214ae698adbac5f36d)
@@ -412,6 +412,14 @@
 					>
 				</File>
 				<File
+					RelativePath=".\TDateTime.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\TDateTime.h"
+					>
+				</File>
+				<File
 					RelativePath=".\TLogger.cpp"
 					>
 				</File>