Index: src/ch/AsyncHttpFile.cpp
===================================================================
diff -u -N -r8068e0c351055554340ac9755d1bc846893bf2b8 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/ch/AsyncHttpFile.cpp	(.../AsyncHttpFile.cpp)	(revision 8068e0c351055554340ac9755d1bc846893bf2b8)
+++ src/ch/AsyncHttpFile.cpp	(.../AsyncHttpFile.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -18,6 +18,8 @@
 // ============================================================================
 #include "stdafx.h"
 #include "AsyncHttpFile.h"
+#include "../common/TLogger.h"
+#include "ch.h"
 
 // timeout used with waiting for events (avoiding hangs)
 #define FORCE_TIMEOUT 60000
@@ -355,7 +357,7 @@
 	strMsg.Format(_T("[CAsyncHttpFile::InternetStatusCallback] hInternet: %p, dwContext: %Iu (operation: %lu), dwInternetStatus: %lu, lpvStatusInformation: %p, dwStatusInformationLength: %lu\n"),
 		hInternet, (size_t)dwContext, pRequest->eOperationType, dwInternetStatus, lpvStatusInformation, dwStatusInformationLength);
 	ATLTRACE(L"%s\n", strMsg);
-	LOG_DEBUG(strMsg);
+	LOG_DEBUG(GetLogger()) << strMsg;
 
 	switch(dwInternetStatus)
 	{
Index: src/ch/MainWnd.cpp
===================================================================
diff -u -N -r8068e0c351055554340ac9755d1bc846893bf2b8 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/ch/MainWnd.cpp	(.../MainWnd.cpp)	(revision 8068e0c351055554340ac9755d1bc846893bf2b8)
+++ src/ch/MainWnd.cpp	(.../MainWnd.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -188,7 +188,7 @@
 
 		if(!LoadTaskManager())
 		{
-			LOG_ERROR(_T("Couldn't load task manager data. User did not allow re-creation of the database."));
+			LOG_ERROR(GetLogger()) << _T("Couldn't load task manager data. User did not allow re-creation of the database.");
 			return -1;
 		}
 
@@ -200,7 +200,7 @@
 		m_spTasks->TasksRetryProcessing();
 
 		// start clipboard monitoring
-		LOG_INFO(_T("Starting clipboard monitor..."));
+		LOG_INFO(GetLogger()) << _T("Starting clipboard monitor...");
 		CClipboardMonitor::StartMonitor(m_spTasks);
 
 		CheckForUpdates();
@@ -229,7 +229,7 @@
 
 	if(bCaughtError)
 	{
-		LOG_ERROR(szErrInfo.get());
+		LOG_ERROR(GetLogger()) << szErrInfo.get();
 		return -1;
 	}
 	return 0;
@@ -264,7 +264,7 @@
 	}
 
 	// load last state
-	LOG_INFO(_T("Loading existing tasks..."));
+	LOG_INFO(GetLogger()) << _T("Loading existing tasks...");
 
 	// load tasks
 	m_spTasks->Load();
@@ -405,7 +405,7 @@
 
 	if(!strMessage.IsEmpty())
 	{
-		LOG_ERROR(L"Failed to finalize tasks before exiting Copy Handler. Error: " + strMessage);
+		LOG_ERROR(GetLogger()) << L"Failed to finalize tasks before exiting Copy Handler. Error: " + strMessage;
 
 		ictranslate::CFormat fmt;
 
@@ -437,7 +437,7 @@
 				fmt.SetFormat(_T("Failed to autosave task. Error: %err."));
 				fmt.SetParam(_T("%err"), (PCTSTR)strError);
 
-				LOG_ERROR(fmt);
+				LOG_ERROR(GetLogger()) << fmt;
 			}
 
 			SetTimer(1023, GetPropValue<PP_PAUTOSAVEINTERVAL>(GetConfig()), nullptr);
@@ -518,7 +518,7 @@
 				fmt.SetParam(_T("%xml"), wstrData.c_str());
 				fmt.SetParam(_T("%err"), (PCTSTR)strError);
 
-				LOG_ERROR(fmt);
+				LOG_ERROR(GetLogger()) << fmt;
 
 				fmt.SetFormat(GetResManager().LoadString(IDS_SHELLEXT_XML_IMPORT_FAILED));
 				fmt.SetParam(_T("%err"), (PCTSTR)strError);
@@ -628,7 +628,7 @@
 				fmt.SetParam(_T("%path"), strPath.ToString());
 				fmt.SetParam(_T("%err"), szBuffer.get());
 
-				LOG_ERROR(fmt);
+				LOG_ERROR(GetLogger()) << fmt;
 
 				fmt.SetFormat(GetResManager().LoadString(IDS_TASK_IMPORT_FAILED));
 				fmt.SetParam(_T("%path"), strPath.ToString());
@@ -899,7 +899,7 @@
 				_ASSERTE(FALSE);
 				CString strMsg;
 				strMsg.Format(L"Encountered problem trying to retrieve shell ext configuration.\nReason: %S", e.what());
-				LOG_ERROR(strMsg);
+				LOG_ERROR(GetLogger()) << strMsg;
 
 				return FALSE;
 			}
@@ -1062,7 +1062,7 @@
 		// perform checking for updates only when the minimal interval has passed
 		if(ullCurrentStamp - ullTimestamp >= ullMinInterval)
 		{
-			LOG_INFO(_T("Checking for updates..."));
+			LOG_INFO(GetLogger()) << _T("Checking for updates...");
 
 			CUpdaterDlg* pDlg = new CUpdaterDlg(true);
 			pDlg->m_bAutoDelete = true;
@@ -1076,7 +1076,7 @@
 			}
 			catch(const std::exception& /*e*/)
 			{
-				LOG_ERROR(_T("Storing last update check timestamp in configuration failed"));
+				LOG_ERROR(GetLogger()) << _T("Storing last update check timestamp in configuration failed");
 			}
 		}
 	}
Index: src/ch/Stdafx.h
===================================================================
diff -u -N -r4fe995b304ea342b50293f92d3c1992b43b820f7 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/ch/Stdafx.h	(.../Stdafx.h)	(revision 4fe995b304ea342b50293f92d3c1992b43b820f7)
+++ src/ch/Stdafx.h	(.../Stdafx.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -50,7 +50,6 @@
 
 #include "debug.h"
 #include "../libictranslate/LanguageDialog.h"
-#include "../libchcore/TLogger.h"
 #include "../libchcore/TConfigSerializers.h"
 
 #ifdef _UNICODE
Index: src/ch/UpdaterDlg.cpp
===================================================================
diff -u -N -r4797e4b6b266900bfdcdf4ca6eda47c216ad9db1 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/ch/UpdaterDlg.cpp	(.../UpdaterDlg.cpp)	(revision 4797e4b6b266900bfdcdf4ca6eda47c216ad9db1)
+++ src/ch/UpdaterDlg.cpp	(.../UpdaterDlg.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -10,9 +10,9 @@
 #include <boost/algorithm/string/split.hpp>
 #include <boost/algorithm/string/classification.hpp>
 #include "WindowsVersion.h"
-#include "../libchcore/TLogger.h"
 #include "resource.h"
 #include "CfgProperties.h"
+#include "../common/TLogger.h"
 
 #define UPDATER_TIMER 639
 
@@ -87,13 +87,13 @@
 	{
 		CString str;
 		str.Format(_T("Opening a browser with address %s..."), (PCTSTR)strDownloadAddr);
-		LOG_DEBUG(str);
+		LOG_DEBUG(GetLogger()) << str;
 
 		str.Format(_T("url.dll,FileProtocolHandler %s"), (PCTSTR)strDownloadAddr);
 		ULONG_PTR ulRes = (ULONG_PTR)ShellExecute(nullptr, _T("open"), _T("rundll32.exe"), str, nullptr, SW_SHOW);
 
 		str.Format(_T("ShellExecute returned %I64u"), (unsigned long long)ulRes);
-		LOG_DEBUG(str);
+		LOG_DEBUG(GetLogger()) << str;
 
 		// close the dialog if succeeded; 32 is some arbitrary value from ms docs
 		if(ulRes > 32)
@@ -389,7 +389,7 @@
 
 	if(!strError.IsEmpty())
 	{
-		LOG_ERROR(strError);
+		LOG_ERROR(GetLogger()) << strError;
 	}
 }
 
Index: src/ch/ch.cpp
===================================================================
diff -u -N -r8068e0c351055554340ac9755d1bc846893bf2b8 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/ch/ch.cpp	(.../ch.cpp)	(revision 8068e0c351055554340ac9755d1bc846893bf2b8)
+++ src/ch/ch.cpp	(.../ch.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -43,6 +43,7 @@
 #include "TMsgBox.h"
 #include "../libchcore/TWin32ErrorFormatter.h"
 #include "resource.h"
+#include "../common/TLogger.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -97,7 +98,8 @@
 }
 
 CCopyHandlerApp::CCopyHandlerApp() :
-	m_pMainWindow(nullptr)
+	m_pMainWindow(nullptr),
+	m_log(L"CH")
 {
 	// this is the one-instance application
 	InitProtection();
@@ -113,17 +115,17 @@
 	}
 }
 
-CCopyHandlerApp& GetApp()
+CCopyHandlerApp& GetApplication()
 {
 	return theApp;
 }
 
-ictranslate::CResourceManager& GetResManager()
+ictranslate::CResourceManager& CCopyHandlerApp::GetResManager()
 {
 	return ictranslate::CResourceManager::Acquire();
 }
 
-chcore::TConfig& GetConfig()
+chcore::TConfig& CCopyHandlerApp::GetConfig()
 {
 	static chcore::TConfig tCfg;
 	return tCfg;
@@ -281,7 +283,6 @@
 	// ================================= Configuration ========================================
 	CString strPath;
 	CString strCfgPath;
-	CString strLogPath;
 
 	// note that the GetProgramDataPath() below should create a directory; ExpandPath() could
 	// depend on the directory to be created earlier
@@ -308,38 +309,29 @@
 
 	// ================================= Logging ========================================
 	// initialize the global log file if it is requested by configuration file
-	strLogPath = strPath + _T("\\ch.log");
+	CString strLogPath = strPath + _T("\\ch.log");
 
-	chcore::TLogger& rLogger = chcore::TLogger::Acquire();
-	try
-	{
-		rLogger.init(strLogPath, GetPropValue<PP_LOGMAXSIZE>(rCfg), GetPropValue<PP_LOGLEVEL>(rCfg), false, false);
-		rLogger.Enable(GetPropValue<PP_LOGENABLELOGGING>(rCfg));
-	}
-	catch(...)
-	{
-		BOOST_ASSERT(false);
-	}
+	m_log.SetLogPath(strLogPath);
 
-	LOG_INFO(_T("============================ Initializing Copy Handler ============================"));
-	LOG_INFO(_T(""));
+	LOG_INFO(m_log) << _T("============================ Initializing Copy Handler ============================");
+	LOG_INFO(m_log) << _T("");
 
 	// ================================= COM ========================================
-	LOG_INFO(_T("Initializing COM"));
+	LOG_INFO(m_log) << _T("Initializing COM");
 
 	HRESULT hResult = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
 	if(FAILED(hResult))
 	{
 		CString strMsg;
 		strMsg.Format(_T("Cannot initialize COM, the application will now exit (result = 0x%lx)"), hResult);
 
-		LOG_ERROR(strMsg);
+		LOG_ERROR(m_log) << strMsg;
 		AfxMessageBox(strMsg, MB_ICONERROR | MB_OK);
 		return FALSE;
 	}
 
 	// ================================= Resource manager ========================================
-	LOG_INFO(_T("Initializing resource manager..."));
+	LOG_INFO(m_log) << _T("Initializing resource manager...");
 
 	ictranslate::CResourceManager& rResManager = ictranslate::CResourceManager::Acquire();
 
@@ -352,7 +344,7 @@
 	{
 		TCHAR szData[2048];
 		_sntprintf(szData, 2048, _T("Couldn't find the language file specified in configuration file:\n%s\nPlease correct this path to point the language file to use.\nProgram will now exit."), (PCTSTR)strPath);
-		LOG_ERROR(szData);
+		LOG_ERROR(m_log) << szData;
 		AfxMessageBox(szData, MB_ICONSTOP | MB_OK);
 		return FALSE;
 	}
@@ -377,7 +369,7 @@
 
 	// ================================= Checking for running instances of CH ========================================
 	// check instance - return false if it's the second one
-	LOG_INFO(_T("Checking for other running instances of Copy Handler"));
+	LOG_INFO(m_log) << _T("Checking for other running instances of Copy Handler");
 	if(!IsFirstInstance())
 	{
 		// if there is a command line specified, send it to the existing instance
@@ -387,7 +379,7 @@
 			if(hWnd == nullptr)
 			{
 				// cannot pass command line to running ch
-				LOG_ERROR(_T("Cannot determine running CH's window. Cannot pass command line there."));
+				LOG_ERROR(m_log) << _T("Cannot determine running CH's window. Cannot pass command line there.");
 				MsgBox(IDS_COMMAND_LINE_FAILED_STRING, MB_OK | MB_ICONERROR);
 				return FALSE;
 			}
@@ -402,22 +394,22 @@
 			// send a message to ch
 			if(::SendMessage(hWnd, WM_COPYDATA, 0, reinterpret_cast<LPARAM>(&cds)) == 0)
 			{
-				LOG_ERROR(_T("Command line was not processed properly at the running CH's instance."));
+				LOG_ERROR(m_log) << _T("Command line was not processed properly at the running CH's instance.");
 				MsgBox(IDS_COMMAND_LINE_FAILED_STRING, MB_OK | MB_ICONERROR);
 			}
 
 			return FALSE;
 		}
 		else
 		{
-			LOG_WARNING(_T("Other instance of Copy Handler is already running. Exiting."));
+			LOG_WARNING(m_log) << _T("Other instance of Copy Handler is already running. Exiting.");
 			MsgBox(IDS_ONECOPY_STRING, MB_OK | MB_ICONWARNING);
 			return FALSE;
 		}
 	}
 
 	// ================================= Common controls ========================================
-	LOG_INFO(_T("Initializing GUI common controls"));
+	LOG_INFO(m_log) << _T("Initializing GUI common controls");
 
 	// InitCommonControlsEx() is required on Windows XP if an application
 	// manifest specifies use of ComCtl32.dll version 6 or later to enable
@@ -429,25 +421,25 @@
 	InitCtrls.dwICC = ICC_WIN95_CLASSES;
 	if(!InitCommonControlsEx(&InitCtrls))
 	{
-		LOG_ERROR(_T("Cannot initialize common controls."));
+		LOG_ERROR(m_log) << _T("Cannot initialize common controls.");
 		MsgBox(IDS_ERROR_INITIALIZING_COMMON_CONTROLS, MB_OK | MB_ICONERROR);
 		return FALSE;
 	}
 
 	if(!AfxInitRichEdit2())
 	{
-		LOG_ERROR(_T("Cannot initialize rich edit control."));
+		LOG_ERROR(m_log) << _T("Cannot initialize rich edit control.");
 		MsgBox(IDS_ERROR_INITIALIZING_RICH_EDIT_CONTROL, MB_OK | MB_ICONERROR);
 		return FALSE;
 	}
 
 	// ================================= Shell extension ========================================
-	LOG_INFO(_T("Checking shell extension compatibility"));
+	LOG_INFO(m_log) << _T("Checking shell extension compatibility");
 
 	InitShellExtension();
 
 	// ================================= Initial settings ========================================
-	LOG_INFO(_T("Applying initial settings"));
+	LOG_INFO(m_log) << _T("Applying initial settings");
 
 	// set this process priority class
 	HANDLE hProcess = GetCurrentProcess();
@@ -459,7 +451,7 @@
 #endif
 
 	// ================================= Main window ========================================
-	LOG_INFO(_T("Creating main application window"));
+	LOG_INFO(m_log) << _T("Creating main application window");
 	// create main window
 	m_pMainWindow=new CMainWnd;
 	if (!((CMainWnd*)m_pMainWindow)->Create())
@@ -468,7 +460,7 @@
 	m_pMainWnd = m_pMainWindow;
 	CWinApp::InitInstance();
 
-	LOG_INFO(_T("Copy Handler initialized successfully"));
+	LOG_INFO(m_log) << _T("Copy Handler initialized successfully");
 
 	return TRUE;
 #endif
@@ -517,7 +509,7 @@
 	{
 		CString strMsg;
 		strMsg.Format(_T("Shell extension is not registered."));
-		LOG_WARNING(strMsg);
+		LOG_WARNING(m_log) << strMsg;
 
 		switch(iDoNotShowAgain_Unregistered)
 		{
@@ -542,7 +534,7 @@
 	{
 		CString strMsg;
 		strMsg.Format(_T("Shell extension has different version (0x%lx) than Copy Handler (0x%lx)."), (unsigned long)lExtensionVersion, (unsigned long)(PRODUCT_VERSION1 << 24 | PRODUCT_VERSION2 << 16 | PRODUCT_VERSION3 << 8 | PRODUCT_VERSION4));
-		LOG_WARNING(strMsg);
+		LOG_WARNING(m_log) << strMsg;
 
 		switch(iDoNotShowAgain_VersionMismatch)
 		{
@@ -575,6 +567,11 @@
 	}
 }
 
+TLogger& CCopyHandlerApp::GetLogger()
+{
+	return m_log;
+}
+
 void CCopyHandlerApp::RegisterShellExtension() 
 {
 	CString strPath = CString(m_pathProcessor.GetProgramPath()) + _T("\\");
@@ -605,7 +602,7 @@
 		// registered ok, but incompatible versions - probably restart required
 		CString strMsg;
 		strMsg.Format(_T("Registration succeeded, but still the shell extension has different version (0x%lx) than Copy Handler (0x%lx)."), (unsigned long)lExtensionVersion, (unsigned long)(PRODUCT_VERSION1 << 24 | PRODUCT_VERSION2 << 16 | PRODUCT_VERSION3 << 8 | PRODUCT_VERSION4));
-		LOG_WARNING(strMsg);
+		LOG_WARNING(m_log) << strMsg;
 
 		MsgBox(IDS_SHELL_EXTENSION_REGISTERED_MISMATCH_STRING, MB_ICONWARNING | MB_OK);
 	}
@@ -652,6 +649,7 @@
 		GetPropValue<PP_PLANGUAGE>(GetConfig(), strPath);
 		GetResManager().SetLanguage(m_pathProcessor.ExpandPath(strPath));
 	}
+/*
 
 	if(setPropNames.HasValue(PropData<PP_LOGENABLELOGGING>::GetPropertyName()))
 	{
@@ -672,7 +670,7 @@
 		chcore::TLogger& rLogger = chcore::TLogger::Acquire();
 
 		rLogger.set_max_size(GetPropValue<PP_LOGMAXSIZE>(GetConfig()));
-	}
+	}*/
 }
 
 void CCopyHandlerApp::OnResManNotify(UINT uiType)
@@ -755,14 +753,14 @@
 
 int CCopyHandlerApp::ExitInstance()
 {
-	LOG_INFO(_T("Pre-exit step - releasing shell extension"));
+	LOG_INFO(m_log) << _T("Pre-exit step - releasing shell extension");
 
 	m_tShellExtClient.Close();
 
-	LOG_INFO(_T("Pre-exit step - uninitializing COM"));
+	LOG_INFO(m_log) << _T("Pre-exit step - uninitializing COM");
 	CoUninitialize();
 
-	LOG_INFO(_T("============================ Leaving Copy Handler ============================"));
+	LOG_INFO(m_log) << _T("============================ Leaving Copy Handler ============================");
 
 	return __super::ExitInstance();
 }
Index: src/ch/ch.h
===================================================================
diff -u -N -r4fe995b304ea342b50293f92d3c1992b43b820f7 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/ch/ch.h	(.../ch.h)	(revision 4fe995b304ea342b50293f92d3c1992b43b820f7)
+++ src/ch/ch.h	(.../ch.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -24,12 +24,10 @@
 #include "../libchcore/TConfig.h"
 #include "TShellExtensionClient.h"
 #include "TCommandLineParser.h"
+#include "../common/TLogger.h"
+#include "../common/TLoggerInitializer.h"
+#include "../libchcore/TCoreEngine.h"
 
-/////////////////////////////////////////////////////////////////////////////
-// CCopyHandlerApp:
-// See CopyHandler.cpp for the implementation of this class
-//
-
 class CCopyHandlerApp : public CWinApp, public CAppHelper
 {
 public:
@@ -45,10 +43,12 @@
 
 	friend int MsgBox(UINT uiID, UINT nType=MB_OK, UINT nIDHelp=0);
 
-	friend CCopyHandlerApp& GetApp();
-	friend ictranslate::CResourceManager& GetResManager();
-	friend chcore::TConfig& GetConfig();
+	friend CCopyHandlerApp& GetApplication();
+	static ictranslate::CResourceManager& GetResManager();
+	static chcore::TConfig& GetConfig();
 
+	TLogger& GetLogger();
+
 	void RegisterShellExtension();
 	void UnregisterShellExtension();
 
@@ -68,9 +68,33 @@
 	TShellExtensionClient m_tShellExtClient;
 	TCommandLineParser m_cmdLineParser;
 
+	chcore::TCoreEngine m_chEngine;
+	TLoggerInitializer m_logInitializer;
+	TLogger m_log;
+
 	CWnd *m_pMainWindow;
 
 	DECLARE_MESSAGE_MAP()
 };
 
+inline CCopyHandlerApp& GetApp()
+{
+	return GetApplication();
+}
+
+inline TLogger& GetLogger()
+{
+	return GetApp().GetLogger();
+}
+
+inline ictranslate::CResourceManager& GetResManager()
+{
+	return CCopyHandlerApp::GetResManager();
+}
+
+inline chcore::TConfig& GetConfig()
+{
+	return CCopyHandlerApp::GetConfig();
+}
+
 #endif
Index: src/ch/ch.vc140.vcxproj
===================================================================
diff -u -N -r4a481bbe77043e0bda2435c6d62a02700b3e46c5 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/ch/ch.vc140.vcxproj	(.../ch.vc140.vcxproj)	(revision 4a481bbe77043e0bda2435c6d62a02700b3e46c5)
+++ src/ch/ch.vc140.vcxproj	(.../ch.vc140.vcxproj)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -198,6 +198,7 @@
       <SDLCheck>true</SDLCheck>
       <MinimalRebuild>true</MinimalRebuild>
       <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <DisableSpecificWarnings>4714</DisableSpecificWarnings>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -237,6 +238,7 @@
       <SDLCheck>true</SDLCheck>
       <MinimalRebuild>true</MinimalRebuild>
       <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <DisableSpecificWarnings>4714</DisableSpecificWarnings>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -276,8 +278,7 @@
       <WarningLevel>Level4</WarningLevel>
       <TreatWarningAsError>true</TreatWarningAsError>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <DisableSpecificWarnings>
-      </DisableSpecificWarnings>
+      <DisableSpecificWarnings>4714</DisableSpecificWarnings>
       <EnablePREfast>false</EnablePREfast>
       <SDLCheck>true</SDLCheck>
       <MinimalRebuild>true</MinimalRebuild>
@@ -317,8 +318,7 @@
       <WarningLevel>Level4</WarningLevel>
       <TreatWarningAsError>true</TreatWarningAsError>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <DisableSpecificWarnings>
-      </DisableSpecificWarnings>
+      <DisableSpecificWarnings>4714</DisableSpecificWarnings>
       <EnablePREfast>false</EnablePREfast>
       <SDLCheck>true</SDLCheck>
       <MinimalRebuild>true</MinimalRebuild>
@@ -364,6 +364,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <SDLCheck>true</SDLCheck>
       <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <DisableSpecificWarnings>4714</DisableSpecificWarnings>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -404,6 +405,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <SDLCheck>true</SDLCheck>
       <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <DisableSpecificWarnings>4714</DisableSpecificWarnings>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -445,6 +447,7 @@
       <TreatWarningAsError>true</TreatWarningAsError>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <SDLCheck>true</SDLCheck>
+      <DisableSpecificWarnings>4714</DisableSpecificWarnings>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -484,6 +487,7 @@
       <TreatWarningAsError>true</TreatWarningAsError>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <SDLCheck>true</SDLCheck>
+      <DisableSpecificWarnings>4714</DisableSpecificWarnings>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -506,6 +510,8 @@
   <ItemGroup>
     <ClInclude Include="..\Common\ipcstructs.h" />
     <ClInclude Include="..\common\targetver.h" />
+    <ClInclude Include="..\common\TLogger.h" />
+    <ClInclude Include="..\common\TLoggerInitializer.h" />
     <ClInclude Include="..\common\TShellExtMenuConfig.h" />
     <ClInclude Include="..\common\version.h" />
     <ClInclude Include="AsyncHttpFile.h" />
@@ -758,6 +764,17 @@
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Testing Debug|x64'">NotUsing</PrecompiledHeader>
     </ClCompile>
+    <ClCompile Include="..\common\TLogger.cpp">
+      <DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">4512;4714</DisableSpecificWarnings>
+      <DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Testing Release|Win32'">4512;4714</DisableSpecificWarnings>
+      <DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">4512;4714</DisableSpecificWarnings>
+      <DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Testing Debug|Win32'">4512;4714</DisableSpecificWarnings>
+      <DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4512;4714</DisableSpecificWarnings>
+      <DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Testing Release|x64'">4512;4714</DisableSpecificWarnings>
+      <DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|x64'">4512;4714</DisableSpecificWarnings>
+      <DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Testing Debug|x64'">4512;4714</DisableSpecificWarnings>
+    </ClCompile>
+    <ClCompile Include="..\common\TLoggerInitializer.cpp" />
     <ClCompile Include="..\common\TShellExtMenuConfig.cpp" />
     <ClCompile Include="AsyncHttpFile.cpp" />
     <ClCompile Include="CDragDropComboEx.cpp" />
Index: src/ch/ch.vc140.vcxproj.filters
===================================================================
diff -u -N -r25129f39720523eca2cb702242890a7862f70ec6 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/ch/ch.vc140.vcxproj.filters	(.../ch.vc140.vcxproj.filters)	(revision 25129f39720523eca2cb702242890a7862f70ec6)
+++ src/ch/ch.vc140.vcxproj.filters	(.../ch.vc140.vcxproj.filters)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -63,6 +63,9 @@
     <Filter Include="Source Files\Tools\UpdateChecker">
       <UniqueIdentifier>{2e2638f2-07f6-4472-bd2d-32151a7ef9ce}</UniqueIdentifier>
     </Filter>
+    <Filter Include="Source Files\Shared\Logging">
+      <UniqueIdentifier>{475febbf-e9ec-4293-a92f-d31c3f8c8072}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\Common\ipcstructs.h">
@@ -245,6 +248,12 @@
     <ClInclude Include="TTaskManagerWrapper.h">
       <Filter>Source Files\Core</Filter>
     </ClInclude>
+    <ClInclude Include="..\common\TLogger.h">
+      <Filter>Source Files\Shared\Logging</Filter>
+    </ClInclude>
+    <ClInclude Include="..\common\TLoggerInitializer.h">
+      <Filter>Source Files\Shared\Logging</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\common\TShellExtMenuConfig.cpp">
@@ -418,6 +427,12 @@
     <ClCompile Include="TTaskManagerWrapper.cpp">
       <Filter>Source Files\Core</Filter>
     </ClCompile>
+    <ClCompile Include="..\common\TLogger.cpp">
+      <Filter>Source Files\Shared\Logging</Filter>
+    </ClCompile>
+    <ClCompile Include="..\common\TLoggerInitializer.cpp">
+      <Filter>Source Files\Shared\Logging</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="res\ch.rc2">
Index: src/common/TLogger.cpp
===================================================================
diff -u -N
--- src/common/TLogger.cpp	(revision 0)
+++ src/common/TLogger.cpp	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -0,0 +1,41 @@
+// ============================================================================
+//  Copyright (C) 2001-2016 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.
+// ============================================================================
+#include "stdafx.h"
+#include "TLogger.h"
+#include <boost/log/attributes/constant.hpp>
+
+namespace keywords = boost::log::keywords;
+
+TLogger::TLogger(PCTSTR pszChannel) :
+	Logger(keywords::channel = pszChannel)
+{
+}
+
+TLogger::TLogger(PCTSTR pszLogPath, PCTSTR pszChannel) :
+	TLogger(pszChannel)
+{
+	m_iterLogPath = add_attribute("LogPath", boost::log::attributes::constant< std::wstring >(pszLogPath)).first;
+}
+
+void TLogger::SetLogPath(PCTSTR pszLogPath)
+{
+	if(m_iterLogPath != boost::log::attribute_set::iterator())
+		remove_attribute(m_iterLogPath);
+	m_iterLogPath = add_attribute("LogPath", boost::log::attributes::constant< std::wstring >(pszLogPath)).first;
+}
Index: src/common/TLogger.h
===================================================================
diff -u -N
--- src/common/TLogger.h	(revision 0)
+++ src/common/TLogger.h	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -0,0 +1,47 @@
+// ============================================================================
+//  Copyright (C) 2001-2016 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.
+// ============================================================================
+#ifndef __TLOGGER_H__
+#define __TLOGGER_H__
+
+#include <boost/log/trivial.hpp>
+#include <boost/log/sources/severity_channel_logger.hpp>
+
+using boost::log::trivial::severity_level;
+using Logger = boost::log::sources::wseverity_channel_logger_mt<severity_level, std::wstring>;
+
+class TLogger : public Logger
+{
+public:
+	TLogger(PCTSTR pszChannel);
+	TLogger(PCTSTR pszLogPath, PCTSTR pszChannel);
+
+	void SetLogPath(PCTSTR pszLogPath);
+
+private:
+	boost::log::attribute_set::iterator m_iterLogPath;
+};
+
+#define LOG_TRACE(logger) BOOST_LOG_SEV(logger, boost::log::trivial::trace)
+#define LOG_DEBUG(logger) BOOST_LOG_SEV(logger, boost::log::trivial::debug)
+#define LOG_INFO(logger) BOOST_LOG_SEV(logger, boost::log::trivial::info)
+#define LOG_WARNING(logger) BOOST_LOG_SEV(logger, boost::log::trivial::warning)
+#define LOG_ERROR(logger) BOOST_LOG_SEV(logger, boost::log::trivial::error)
+#define LOG_FATAL(logger) BOOST_LOG_SEV(logger, boost::log::trivial::fatal)
+
+#endif
Index: src/common/TLoggerInitializer.cpp
===================================================================
diff -u -N
--- src/common/TLoggerInitializer.cpp	(revision 0)
+++ src/common/TLoggerInitializer.cpp	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -0,0 +1,117 @@
+// ============================================================================
+//  Copyright (C) 2001-2016 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.
+// ============================================================================
+#include "stdafx.h"
+#include "TLoggerInitializer.h"
+#include <boost/log/trivial.hpp>
+#include <boost/log/expressions.hpp>
+#include <boost/log/sinks/text_file_backend.hpp>
+#include <boost/log/utility/setup/file.hpp>
+#include <boost/log/utility/setup/common_attributes.hpp>
+#include <boost/log/support/date_time.hpp>
+#include <boost/locale.hpp>
+#include <boost/log/sinks/async_frontend.hpp>
+#include <boost/log/sinks/text_multifile_backend.hpp>
+
+namespace logging = boost::log;
+namespace src = boost::log::sources;
+namespace sinks = boost::log::sinks;
+namespace keywords = boost::log::keywords;
+namespace expr = boost::log::expressions;
+namespace attrs = boost::log::attributes;
+
+using namespace boost::log::trivial;
+
+using LogSink = sinks::asynchronous_sink< sinks::text_multifile_backend >;
+using LogSinkPtr = boost::shared_ptr<LogSink>;
+
+struct TLoggerInitializer::InternalData
+{
+	LogSinkPtr m_spSink;
+};
+
+TLoggerInitializer::TLoggerInitializer() :
+	m_spData(new InternalData)
+{
+	InitSink();
+}
+
+TLoggerInitializer::~TLoggerInitializer()
+{
+	Uninit();
+}
+
+void TLoggerInitializer::InitSink()
+{
+	if(m_bWasInitialized)
+		return;
+
+	boost::shared_ptr< logging::core > core = logging::core::get();
+
+	logging::add_common_attributes();
+
+	// sink BACKEND
+	boost::shared_ptr< sinks::text_multifile_backend > backend = boost::make_shared< sinks::text_multifile_backend >();
+
+	// Set up the file naming pattern
+	backend->set_file_name_composer
+	(
+		sinks::file::as_file_name_composer(expr::stream << expr::attr< std::wstring >("LogPath"))
+	);
+
+	// Sink FRONTEND
+	LogSinkPtr sink(new LogSink(backend));
+
+	// Set the formatter
+	sink->set_formatter
+	(
+		expr::stream
+		<< expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
+		<< " [" << boost::log::trivial::severity << "] "
+		<< expr::attr< std::wstring >("Channel") << ": "
+		<< expr::wmessage
+	);
+
+	std::locale loc = boost::locale::generator()("en_EN.UTF-8");
+	sink->imbue(loc);
+
+	core->add_sink(sink);
+
+	m_spData->m_spSink = sink;
+
+	m_bWasInitialized = true;
+}
+
+void TLoggerInitializer::Uninit()
+{
+	if (!m_spData->m_spSink || !m_bWasInitialized)
+		return;
+
+	boost::shared_ptr< logging::core > core = logging::core::get();
+
+	// Remove the sink from the core, so that no records are passed to it
+	core->remove_sink(m_spData->m_spSink);
+
+	// Break the feeding loop
+	m_spData->m_spSink->stop();
+
+	// Flush all log records that may have left buffered
+	m_spData->m_spSink->flush();
+
+	m_spData->m_spSink.reset();
+}
Index: src/common/TLoggerInitializer.h
===================================================================
diff -u -N
--- src/common/TLoggerInitializer.h	(revision 0)
+++ src/common/TLoggerInitializer.h	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -0,0 +1,39 @@
+// ============================================================================
+//  Copyright (C) 2001-2016 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.
+// ============================================================================
+#ifndef __TLOGGERINITIALIZER_H__
+#define __TLOGGERINITIALIZER_H__
+
+class TLoggerInitializer
+{
+public:
+	TLoggerInitializer();
+	~TLoggerInitializer();
+
+	void Uninit();
+
+private:
+	void InitSink();
+
+private:
+	struct InternalData;
+	std::unique_ptr<InternalData> m_spData;
+	bool m_bWasInitialized = false;
+};
+
+#endif
Index: src/libchcore/TCoreEngine.cpp
===================================================================
diff -u -N
--- src/libchcore/TCoreEngine.cpp	(revision 0)
+++ src/libchcore/TCoreEngine.cpp	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -0,0 +1,37 @@
+// ============================================================================
+//  Copyright (C) 2001-2015 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.
+// ============================================================================
+#include "stdafx.h"
+#include "TCoreEngine.h"
+
+namespace chcore
+{
+	TCoreEngine::TCoreEngine()
+	{
+	}
+
+	TCoreEngine::~TCoreEngine()
+	{
+		Uninitialize();
+	}
+
+	void TCoreEngine::Uninitialize()
+	{
+		m_loggerInitializer.Uninit();
+	}
+}
Index: src/libchcore/TCoreEngine.h
===================================================================
diff -u -N
--- src/libchcore/TCoreEngine.h	(revision 0)
+++ src/libchcore/TCoreEngine.h	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -0,0 +1,43 @@
+// ============================================================================
+//  Copyright (C) 2001-2016 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.
+// ============================================================================
+#ifndef __TCOREENGINE_H__
+#define __TCOREENGINE_H__
+
+#include "libchcore.h"
+#include "../common/TLoggerInitializer.h"
+
+namespace chcore
+{
+	class LIBCHCORE_API TCoreEngine
+	{
+	public:
+		TCoreEngine();
+		~TCoreEngine();
+
+		void Uninitialize();
+
+	private:
+#pragma warning(push)
+#pragma warning(disable: 4251)
+		TLoggerInitializer m_loggerInitializer;
+#pragma warning(pop)
+	};
+}
+
+#endif
Index: src/libchcore/TFilesystemFeedbackWrapper.cpp
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TFilesystemFeedbackWrapper.cpp	(.../TFilesystemFeedbackWrapper.cpp)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TFilesystemFeedbackWrapper.cpp	(.../TFilesystemFeedbackWrapper.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -22,14 +22,13 @@
 #include "TFileException.h"
 #include "TFileInfo.h"
 #include "TWorkerThreadController.h"
-#include "log.h"
 
 namespace chcore
 {
-	TFilesystemFeedbackWrapper::TFilesystemFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, const IFilesystemPtr& spFilesystem, log_file& rLog, TWorkerThreadController& rThreadController) :
+	TFilesystemFeedbackWrapper::TFilesystemFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, const IFilesystemPtr& spFilesystem, const TSmartPath& pathLogger, TWorkerThreadController& rThreadController) :
 		m_spFeedbackHandler(spFeedbackHandler),
 		m_spFilesystem(spFilesystem),
-		m_rLog(rLog),
+		m_log(pathLogger.ToString(), L"Filesystem"),
 		m_rThreadController(rThreadController)
 	{
 		if (!spFilesystem)
@@ -62,7 +61,7 @@
 			strFormat = _T("Error %errno while calling CreateDirectory %path (ProcessFiles)");
 			strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 			strFormat.Replace(_T("%path"), pathDirectory.ToString());
-			m_rLog.loge(strFormat.c_str());
+			LOG_ERROR(m_log) << strFormat.c_str();
 
 			TFeedbackResult frResult = m_spFeedbackHandler->FileError(pathDirectory.ToWString(), TString(), EFileError::eCreateError, dwLastError);
 			switch (frResult.GetResult())
@@ -110,7 +109,7 @@
 		{
 			bRetry = false;
 
-			m_rLog.logi(_T("Checking for free space on destination disk..."));
+			LOG_INFO(m_log) << _T("Checking for free space on destination disk...");
 
 			// get free space
 			DWORD dwLastError = ERROR_SUCCESS;
@@ -131,7 +130,7 @@
 				strFormat = _T("Error %errno while checking free space at %path");
 				strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 				strFormat.Replace(_T("%path"), pathDestination.ToString());
-				m_rLog.loge(strFormat.c_str());
+				LOG_ERROR(m_log) << strFormat.c_str();
 
 				frResult = m_spFeedbackHandler->FileError(pathDestination.ToWString(), TString(), EFileError::eCheckForFreeSpace, dwLastError);
 				switch (frResult.GetResult())
@@ -160,22 +159,22 @@
 				TString strFormat = _T("Not enough free space on disk - needed %needsize bytes for data, available: %availablesize bytes.");
 				strFormat.Replace(_T("%needsize"), boost::lexical_cast<std::wstring>(ullNeededSize).c_str());
 				strFormat.Replace(_T("%availablesize"), boost::lexical_cast<std::wstring>(ullAvailableSize).c_str());
-				m_rLog.logw(strFormat.c_str());
+				LOG_WARNING(m_log) << strFormat.c_str();
 
 				frResult = m_spFeedbackHandler->NotEnoughSpace(pathFirstSrc.ToWString(), pathDestination.ToWString(), ullNeededSize);
 				switch (frResult.GetResult())
 				{
 				case EFeedbackResult::eResult_Cancel:
-					m_rLog.logi(_T("Cancel request while checking for free space on disk."));
+					LOG_INFO(m_log) << _T("Cancel request while checking for free space on disk.");
 					return TSubTaskBase::eSubResult_CancelRequest;
 
 				case EFeedbackResult::eResult_Retry:
-					m_rLog.logi(_T("Retrying to read drive's free space..."));
+					LOG_INFO(m_log) << _T("Retrying to read drive's free space...");
 					bRetry = true;
 					break;
 
 				case EFeedbackResult::eResult_Ignore:
-					m_rLog.logi(_T("Ignored warning about not enough place on disk to copy data."));
+					LOG_INFO(m_log) << _T("Ignored warning about not enough place on disk to copy data.");
 					return TSubTaskBase::eSubResult_Continue;
 
 				default:
@@ -221,13 +220,13 @@
 			TString strFormat = _T("Error #%errno while deleting folder %path");
 			strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 			strFormat.Replace(_T("%path"), spFileInfo->GetFullFilePath().ToString());
-			m_rLog.loge(strFormat.c_str());
+			LOG_ERROR(m_log) << strFormat.c_str();
 
 			TFeedbackResult frResult = m_spFeedbackHandler->FileError(spFileInfo->GetFullFilePath().ToWString(), TString(), EFileError::eDeleteError, dwLastError);
 			switch (frResult.GetResult())
 			{
 			case EFeedbackResult::eResult_Cancel:
-				m_rLog.logi(_T("Cancel request while deleting file."));
+				LOG_INFO(m_log) << _T("Cancel request while deleting file.");
 				return TSubTaskBase::eSubResult_CancelRequest;
 
 			case EFeedbackResult::eResult_Retry:
@@ -282,13 +281,13 @@
 			TString strFormat = _T("Error #%errno while deleting file %path");
 			strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 			strFormat.Replace(_T("%path"), spFileInfo->GetFullFilePath().ToString());
-			m_rLog.loge(strFormat.c_str());
+			LOG_ERROR(m_log) << strFormat.c_str();
 
 			TFeedbackResult frResult = m_spFeedbackHandler->FileError(spFileInfo->GetFullFilePath().ToWString(), TString(), EFileError::eDeleteError, dwLastError);
 			switch (frResult.GetResult())
 			{
 			case EFeedbackResult::eResult_Cancel:
-				m_rLog.logi(_T("Cancel request while deleting file."));
+				LOG_INFO(m_log) << _T("Cancel request while deleting file.");
 				return TSubTaskBase::eSubResult_CancelRequest;
 
 			case EFeedbackResult::eResult_Retry:
@@ -347,7 +346,7 @@
 			strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 			strFormat.Replace(_T("%srcpath"), spFileInfo->GetFullFilePath().ToString());
 			strFormat.Replace(_T("%dstpath"), pathDestination.ToString());
-			m_rLog.loge(strFormat.c_str());
+			LOG_ERROR(m_log) << strFormat.c_str();
 
 			TFeedbackResult frResult = m_spFeedbackHandler->FileError(pathSrc.ToWString(), pathDestination.ToWString(), EFileError::eFastMoveError, dwLastError);
 			switch (frResult.GetResult())
Index: src/libchcore/TFilesystemFeedbackWrapper.h
===================================================================
diff -u -N -r4fe995b304ea342b50293f92d3c1992b43b820f7 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TFilesystemFeedbackWrapper.h	(.../TFilesystemFeedbackWrapper.h)	(revision 4fe995b304ea342b50293f92d3c1992b43b820f7)
+++ src/libchcore/TFilesystemFeedbackWrapper.h	(.../TFilesystemFeedbackWrapper.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -21,6 +21,7 @@
 
 #include "IFilesystem.h"
 #include "TSubTaskBase.h"
+#include "../common/TLogger.h"
 
 namespace chcore
 {
@@ -30,7 +31,7 @@
 	class TFilesystemFeedbackWrapper
 	{
 	public:
-		TFilesystemFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, const IFilesystemPtr& spFilesystem, log_file& rLog, TWorkerThreadController& rThreadController);
+		TFilesystemFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, const IFilesystemPtr& spFilesystem, const TSmartPath& pathLogger, TWorkerThreadController& rThreadController);
 		TFilesystemFeedbackWrapper& operator=(const TFilesystemFeedbackWrapper&) = delete;
 
 		TSubTaskBase::ESubOperationResult CreateDirectoryFB(const TSmartPath& pathDirectory);
@@ -51,7 +52,7 @@
 	private:
 		IFeedbackHandlerPtr m_spFeedbackHandler;
 		IFilesystemPtr m_spFilesystem;
-		log_file& m_rLog;
+		TLogger m_log;
 		TWorkerThreadController& m_rThreadController;
 	};
 }
Index: src/libchcore/TFilesystemFileFeedbackWrapper.cpp
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TFilesystemFileFeedbackWrapper.cpp	(.../TFilesystemFileFeedbackWrapper.cpp)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TFilesystemFileFeedbackWrapper.cpp	(.../TFilesystemFileFeedbackWrapper.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -23,13 +23,12 @@
 #include <boost/make_shared.hpp>
 #include "TFileInfo.h"
 #include "TWorkerThreadController.h"
-#include "log.h"
 
 namespace chcore
 {
-	TFilesystemFileFeedbackWrapper::TFilesystemFileFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, log_file& rLog, TWorkerThreadController& rThreadController, const IFilesystemPtr& spFilesystem) :
+	TFilesystemFileFeedbackWrapper::TFilesystemFileFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, const TSmartPath& pathLogger, TWorkerThreadController& rThreadController, const IFilesystemPtr& spFilesystem) :
 		m_spFeedbackHandler(spFeedbackHandler),
-		m_rLog(rLog),
+		m_log(pathLogger.ToString(), L"Filesystem-File"),
 		m_rThreadController(rThreadController),
 		m_spFilesystem(spFilesystem)
 	{
@@ -71,7 +70,7 @@
 				TString strFormat = _T("Cancel request [error %errno] while opening source file %path (OpenSourceFileFB)");
 				strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 				strFormat.Replace(_T("%path"), fileSrc->GetFilePath().ToString());
-				m_rLog.loge(strFormat.c_str());
+				LOG_ERROR(m_log) << strFormat.c_str();
 
 				return TSubTaskBase::eSubResult_CancelRequest;
 			}
@@ -85,7 +84,7 @@
 				TString strFormat = _T("Retrying [error %errno] to open source file %path (OpenSourceFileFB)");
 				strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 				strFormat.Replace(_T("%path"), fileSrc->GetFilePath().ToString());
-				m_rLog.loge(strFormat.c_str());
+				LOG_ERROR(m_log) << strFormat.c_str();
 
 				bRetry = true;
 				break;
@@ -158,7 +157,7 @@
 				TString strFormat = _T("Retrying [error %errno] to open destination file %path (CustomCopyFileFB)");
 				strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 				strFormat.Replace(_T("%path"), fileDst->GetFilePath().ToString());
-				m_rLog.loge(strFormat.c_str());
+				LOG_ERROR(m_log) << strFormat.c_str();
 
 				bRetry = true;
 				break;
@@ -169,7 +168,7 @@
 				TString strFormat = _T("Cancel request [error %errno] while opening destination file %path (CustomCopyFileFB)");
 				strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 				strFormat.Replace(_T("%path"), fileDst->GetFilePath().ToString());
-				m_rLog.loge(strFormat.c_str());
+				LOG_ERROR(m_log) << strFormat.c_str();
 
 				return TSubTaskBase::eSubResult_CancelRequest;
 			}
@@ -261,7 +260,7 @@
 					// log
 					TString strFormat = _T("Cancel request while checking result of dialog before opening source file %path (CustomCopyFileFB)");
 					strFormat.Replace(_T("%path"), fileDst->GetFilePath().ToString());
-					m_rLog.logi(strFormat.c_str());
+					LOG_INFO(m_log) << strFormat.c_str();
 
 					return TSubTaskBase::eSubResult_CancelRequest;
 				}
@@ -283,7 +282,7 @@
 				TString strFormat = _T("Retrying [error %errno] to open destination file %path (CustomCopyFileFB)");
 				strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 				strFormat.Replace(_T("%path"), fileDst->GetFilePath().ToString());
-				m_rLog.loge(strFormat.c_str());
+				LOG_ERROR(m_log) << strFormat.c_str();
 
 				bRetry = true;
 
@@ -295,7 +294,7 @@
 				TString strFormat = _T("Cancel request [error %errno] while opening destination file %path (CustomCopyFileFB)");
 				strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 				strFormat.Replace(_T("%path"), fileDst->GetFilePath().ToString());
-				m_rLog.loge(strFormat.c_str());
+				LOG_ERROR(m_log) << strFormat.c_str();
 
 				return TSubTaskBase::eSubResult_CancelRequest;
 			}
@@ -342,7 +341,7 @@
 			TString strFormat = _T("Error %errno while truncating file %path to 0");
 			strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 			strFormat.Replace(_T("%path"), pathFile.ToString());
-			m_rLog.loge(strFormat.c_str());
+			LOG_ERROR(m_log) << strFormat.c_str();
 
 			TFeedbackResult frResult = m_spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eResizeError, dwLastError);
 			switch (frResult.GetResult())
@@ -398,7 +397,7 @@
 			strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 			strFormat.Replace(_T("%count"), boost::lexical_cast<std::wstring>(rBuffer.GetRequestedDataSize()).c_str());
 			strFormat.Replace(_T("%path"), pathFile.ToString());
-			m_rLog.loge(strFormat.c_str());
+			LOG_ERROR(m_log) << strFormat.c_str();
 
 			TFeedbackResult frResult = m_spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eReadError, dwLastError);
 			switch (frResult.GetResult())
@@ -455,7 +454,7 @@
 			strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 			strFormat.Replace(_T("%count"), boost::lexical_cast<std::wstring>(rBuffer.GetBytesTransferred()).c_str());
 			strFormat.Replace(_T("%path"), pathFile.ToString());
-			m_rLog.loge(strFormat.c_str());
+			LOG_ERROR(m_log) << strFormat.c_str();
 
 			TFeedbackResult frResult = m_spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eWriteError, dwLastError);
 			switch (frResult.GetResult())
@@ -511,7 +510,7 @@
 			TString strFormat = _T("Error %errno while trying to finalize file %path (CustomCopyFileFB)");
 			strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 			strFormat.Replace(_T("%path"), pathFile.ToString());
-			m_rLog.loge(strFormat.c_str());
+			LOG_ERROR(m_log) << strFormat.c_str();
 
 			TFeedbackResult frResult = m_spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eFinalizeError, dwLastError);
 			switch (frResult.GetResult())
Index: src/libchcore/TFilesystemFileFeedbackWrapper.h
===================================================================
diff -u -N -r4fe995b304ea342b50293f92d3c1992b43b820f7 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TFilesystemFileFeedbackWrapper.h	(.../TFilesystemFileFeedbackWrapper.h)	(revision 4fe995b304ea342b50293f92d3c1992b43b820f7)
+++ src/libchcore/TFilesystemFileFeedbackWrapper.h	(.../TFilesystemFileFeedbackWrapper.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -23,6 +23,7 @@
 #include "TSubTaskBase.h"
 #include "IFeedbackHandler.h"
 #include "IFilesystem.h"
+#include "../common/TLogger.h"
 
 namespace chcore
 {
@@ -32,7 +33,7 @@
 	class TFilesystemFileFeedbackWrapper
 	{
 	public:
-		TFilesystemFileFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, log_file& rLog, TWorkerThreadController& rThreadController, const IFilesystemPtr& spFilesystem);
+		TFilesystemFileFeedbackWrapper(const IFeedbackHandlerPtr& spFeedbackHandler, const TSmartPath& pathLogger, TWorkerThreadController& rThreadController, const IFilesystemPtr& spFilesystem);
 		TFilesystemFileFeedbackWrapper& operator=(const TFilesystemFileFeedbackWrapper&) = delete;
 
 		TSubTaskBase::ESubOperationResult OpenSourceFileFB(const IFilesystemFilePtr& fileSrc);
@@ -57,7 +58,7 @@
 	private:
 		IFeedbackHandlerPtr m_spFeedbackHandler;
 		IFilesystemPtr m_spFilesystem;
-		log_file& m_rLog;
+		TLogger m_log;
 		TWorkerThreadController& m_rThreadController;
 	};
 }
Index: src/libchcore/TLogger.cpp
===================================================================
diff -u -N
--- src/libchcore/TLogger.cpp	(revision a27d1acf1bda3c25b6dcce0d0eb0278009ce63ae)
+++ src/libchcore/TLogger.cpp	(revision 0)
@@ -1,125 +0,0 @@
-// ============================================================================
-//  Copyright (C) 2001-2009 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 TLogger.cpp
-/// @date 2009/05/19
-/// @brief Contains logger class implementation.
-// ============================================================================
-#include "stdafx.h"
-#include "libchcore.h"
-#include "TLogger.h"
-
-namespace chcore
-{
-	TLogger TLogger::S_Logger;
-
-	// ============================================================================
-	/// TLogger::TLogger
-	/// @date 2009/05/23
-	///
-	/// @brief     Constructs the TLogger object.
-	// ============================================================================
-	TLogger::TLogger() :
-		m_bEnabled(false)
-	{
-	}
-
-	// ============================================================================
-	/// TLogger::Acquire
-	/// @date 2009/05/20
-	///
-	/// @brief     Acquires logger object.
-	/// @return    Reference to the logger object.
-	// ============================================================================
-	TLogger& TLogger::Acquire()
-	{
-		return S_Logger;
-	}
-
-	// ============================================================================
-	/// TLogger::LogDebug
-	/// @date 2009/05/20
-	///
-	/// @brief     Logs an information to file (debug level).
-	/// @param[in] pszText	Text to be logged.
-	// ============================================================================
-	void TLogger::LogDebug(const wchar_t* pszText)
-	{
-		BOOST_ASSERT(pszText);
-		if (!pszText)
-			return;
-
-		TLogger& rLogger = Acquire();
-		if (rLogger.m_bEnabled && rLogger.is_initialized())
-			rLogger.logd(pszText);
-	}
-
-	// ============================================================================
-	/// TLogger::LogInfo
-	/// @date 2009/05/20
-	///
-	/// @brief     Logs an information to the file (info level).
-	/// @param[in] pszText	Text to be logged.
-	// ============================================================================
-	void TLogger::LogInfo(const wchar_t* pszText)
-	{
-		BOOST_ASSERT(pszText);
-		if (!pszText)
-			return;
-
-		TLogger& rLogger = Acquire();
-		if (rLogger.m_bEnabled && rLogger.is_initialized())
-			rLogger.logi(pszText);
-	}
-
-	// ============================================================================
-	/// TLogger::LogWarning
-	/// @date 2009/05/20
-	///
-	/// @brief     Logs an information to the file (info level).
-	/// @param[in] pszText	Text to be logged.
-	// ============================================================================
-	void TLogger::LogWarning(const wchar_t* pszText)
-	{
-		BOOST_ASSERT(pszText);
-		if (!pszText)
-			return;
-
-		TLogger& rLogger = Acquire();
-		if (rLogger.m_bEnabled && rLogger.is_initialized())
-			rLogger.logw(pszText);
-	}
-
-	// ============================================================================
-	/// TLogger::LogError
-	/// @date 2009/05/20
-	///
-	/// @brief     Logs an information to the file (info level).
-	/// @param[in] pszText	Text to be logged.
-	// ============================================================================
-	void TLogger::LogError(const wchar_t* pszText)
-	{
-		BOOST_ASSERT(pszText);
-		if (!pszText)
-			return;
-
-		TLogger& rLogger = Acquire();
-		if (rLogger.m_bEnabled && rLogger.is_initialized())
-			rLogger.loge(pszText);
-	}
-}
Index: src/libchcore/TLogger.h
===================================================================
diff -u -N
--- src/libchcore/TLogger.h	(revision a27d1acf1bda3c25b6dcce0d0eb0278009ce63ae)
+++ src/libchcore/TLogger.h	(revision 0)
@@ -1,67 +0,0 @@
-// ============================================================================
-//  Copyright (C) 2001-2009 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 TLogger.h
-/// @date 2009/05/19
-/// @brief File contains logger class declaration.
-// ============================================================================
-#ifndef __LOGGER_H__
-#define __LOGGER_H__
-
-#include "libchcore.h"
-#include "log.h"
-
-#define LOG_DEBUG(text)\
-	chcore::TLogger::LogDebug(text)
-
-#define LOG_INFO(text)\
-	chcore::TLogger::LogInfo(text)
-
-#define LOG_WARNING(text)\
-	chcore::TLogger::LogWarning(text)
-
-#define LOG_ERROR(text)\
-	chcore::TLogger::LogError(text)
-
-namespace chcore
-{
-	// Class manages logging of informations to a file.
-	class LIBCHCORE_API TLogger : public log_file
-	{
-	public:
-		TLogger();
-
-		// Retrieving global object instance
-		static TLogger& Acquire();		///< Acquires the Logger object
-
-		// Logging
-		static void LogDebug(const wchar_t* pszText);
-		static void LogInfo(const wchar_t* pszText);
-		static void LogWarning(const wchar_t* pszText);
-		static void LogError(const wchar_t* pszText);
-
-		// Initialization/settings
-		void Enable(bool bEnable) throw() { m_bEnabled = bEnable; }
-
-	protected:
-		static TLogger S_Logger;
-		bool m_bEnabled;		// logging enabled?
-	};
-}
-
-#endif
Index: src/libchcore/TLoggerInfo.cpp
===================================================================
diff -u -N
--- src/libchcore/TLoggerInfo.cpp	(revision 0)
+++ src/libchcore/TLoggerInfo.cpp	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -0,0 +1,15 @@
+#include "stdafx.h"
+#include "TLoggerInfo.h"
+
+namespace chcore
+{
+	TLoggerInfo::TLoggerInfo(const TSmartPath& pathLog) :
+		m_strLogPath(pathLog)
+	{
+	}
+
+	TSmartPath TLoggerInfo::GetLogPath() const
+	{
+		return m_strLogPath;
+	}
+}
Index: src/libchcore/TLoggerInfo.h
===================================================================
diff -u -N
--- src/libchcore/TLoggerInfo.h	(revision 0)
+++ src/libchcore/TLoggerInfo.h	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -0,0 +1,23 @@
+#ifndef __TLOGGERINFO_H__
+#define __TLOGGERINFO_H__
+
+#include "libchcore.h"
+#include "TPath.h"
+
+namespace chcore
+{
+	class LIBCHCORE_API TLoggerInfo
+	{
+	public:
+		TLoggerInfo(const TSmartPath& pathLog);
+
+		TSmartPath GetLogPath() const;
+
+	private:
+		TSmartPath m_strLogPath;
+	};
+
+	using TLoggerInfoPtr = std::shared_ptr<TLoggerInfo>;
+}
+
+#endif
Index: src/libchcore/TSubTaskContext.cpp
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskContext.cpp	(.../TSubTaskContext.cpp)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TSubTaskContext.cpp	(.../TSubTaskContext.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -25,20 +25,19 @@
 #include "ErrorCodes.h"
 #include "TCoreException.h"
 #include "TFileFiltersArray.h"
-#include "log.h"
 
 namespace chcore
 {
 	TSubTaskContext::TSubTaskContext(TConfig& rConfig, const TBasePathDataContainerPtr& spBasePaths,
 		const TFileFiltersArray& rFilters,
-		TTaskConfigTracker& rCfgTracker, log_file& rLog,
+		TTaskConfigTracker& rCfgTracker, const TSmartPath& rPathLogFile,
 		TWorkerThreadController& rThreadController, const IFilesystemPtr& spFilesystem) :
 		m_rConfig(rConfig),
 		m_eOperationType(eOperation_None),
 		m_spBasePaths(spBasePaths),
 		m_pathDestination(),
 		m_rCfgTracker(rCfgTracker),
-		m_rLog(rLog),
+		m_pathLogFile(rPathLogFile),
 		m_rThreadController(rThreadController),
 		m_spFilesystem(spFilesystem),
 		m_rFilters(rFilters)
@@ -106,14 +105,14 @@
 		return m_rCfgTracker;
 	}
 
-	log_file& TSubTaskContext::GetLog()
+	TSmartPath TSubTaskContext::GetLogPath() const
 	{
-		return m_rLog;
+		return m_pathLogFile;
 	}
 
-	const log_file& TSubTaskContext::GetLog() const
+	void TSubTaskContext::SetLogPath(const TSmartPath& pathLog)
 	{
-		return m_rLog;
+		m_pathLogFile = pathLog;
 	}
 
 	TWorkerThreadController& TSubTaskContext::GetThreadController()
Index: src/libchcore/TSubTaskContext.h
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskContext.h	(.../TSubTaskContext.h)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TSubTaskContext.h	(.../TSubTaskContext.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -29,6 +29,7 @@
 #include "TBasePathData.h"
 #include "TFileInfoArray.h"
 #include "IFilesystem.h"
+#include "TLoggerInfo.h"
 
 namespace chcore
 {
@@ -46,7 +47,7 @@
 	public:
 		TSubTaskContext(TConfig& rConfig, const TBasePathDataContainerPtr& spBasePaths,
 			const TFileFiltersArray& rFilters,
-			TTaskConfigTracker& rCfgTracker, log_file& rLog,
+			TTaskConfigTracker& rCfgTracker, const TSmartPath& rPathLogFile,
 			TWorkerThreadController& rThreadController, const IFilesystemPtr& spFilesystem);
 		~TSubTaskContext();
 
@@ -68,8 +69,8 @@
 		TTaskConfigTracker& GetCfgTracker();
 		const TTaskConfigTracker& GetCfgTracker() const;
 
-		log_file& GetLog();
-		const log_file& GetLog() const;
+		TSmartPath GetLogPath() const;
+		void SetLogPath(const TSmartPath& pathLog);
 
 		TWorkerThreadController& GetThreadController();
 		const TWorkerThreadController& GetThreadController() const;
@@ -108,7 +109,7 @@
 #pragma warning(pop)
 
 		// additional data
-		log_file& m_rLog;
+		TSmartPath m_pathLogFile;
 
 		// thread control
 		TWorkerThreadController& m_rThreadController;
Index: src/libchcore/TSubTaskCopyMove.cpp
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskCopyMove.cpp	(.../TSubTaskCopyMove.cpp)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TSubTaskCopyMove.cpp	(.../TSubTaskCopyMove.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -47,7 +47,6 @@
 #include "TFileException.h"
 #include "TFilesystemFeedbackWrapper.h"
 #include "TFilesystemFileFeedbackWrapper.h"
-#include "log.h"
 #include "TDestinationPathProvider.h"
 
 namespace chcore
@@ -66,9 +65,10 @@
 	///////////////////////////////////////////////////////////////////////////////////////////////////
 	// class TSubTaskCopyMove
 
-	TSubTaskCopyMove::TSubTaskCopyMove(TSubTaskContext& tSubTaskContext) :
-		TSubTaskBase(tSubTaskContext),
-		m_tSubTaskStats(eSubOperation_Copying)
+	TSubTaskCopyMove::TSubTaskCopyMove(TSubTaskContext& rContext) :
+		TSubTaskBase(rContext),
+		m_tSubTaskStats(eSubOperation_Copying),
+		m_log(rContext.GetLogPath().ToString(), L"ST-CopyMove")
 	{
 	}
 
@@ -101,7 +101,6 @@
 		TScopedRunningTimeTracker guard(m_tSubTaskStats);
 		TFeedbackHandlerWrapperPtr spFeedbackHandler(std::make_shared<TFeedbackHandlerWrapper>(spFeedback, guard));
 
-		log_file& rLog = GetContext().GetLog();
 		TFileInfoArray& rFilesCache = GetContext().GetFilesCache();
 		TTaskConfigTracker& rCfgTracker = GetContext().GetCfgTracker();
 		TWorkerThreadController& rThreadController = GetContext().GetThreadController();
@@ -110,10 +109,10 @@
 		IFilesystemPtr spFilesystem = GetContext().GetLocalFilesystem();
 		TBasePathDataContainerPtr spSrcPaths = GetContext().GetBasePaths();
 
-		TFilesystemFeedbackWrapper tFilesystemFBWrapper(spFeedbackHandler, spFilesystem, rLog, rThreadController);
+		TFilesystemFeedbackWrapper tFilesystemFBWrapper(spFeedbackHandler, spFilesystem, GetContext().GetLogPath(), rThreadController);
 
 		// log
-		rLog.logi(_T("Processing files/folders (ProcessFiles)"));
+		LOG_INFO(m_log) << _T("Processing files/folders (ProcessFiles)");
 
 		// initialize stats if not resuming (when resuming we have already initialized
 		// the stats once - it is being restored in Load() too).
@@ -166,15 +165,15 @@
 		strFormat.Replace(_T("%dstpath"), pathDestination.ToString());
 		strFormat.Replace(_T("%currindex"), boost::lexical_cast<std::wstring>(fcIndex).c_str());
 
-		rLog.logi(strFormat.c_str());
+		LOG_INFO(m_log) << strFormat.c_str();
 
 		for(; fcIndex < fcSize; fcIndex++)
 		{
 			// should we kill ?
 			if(rThreadController.KillRequested())
 			{
 				// log
-				rLog.logi(_T("Kill request while processing file in ProcessFiles"));
+				LOG_INFO(m_log) << _T("Kill request while processing file in ProcessFiles");
 				return TSubTaskBase::eSubResult_KillRequest;
 			}
 
@@ -253,7 +252,7 @@
 		bool bUpdateDirTimes = GetTaskPropValue<eTO_SetDestinationDateTime>(rConfig);
 		if(bUpdateDirTimes)
 		{
-			rLog.logi(_T("Setting directory attributes"));
+			LOG_INFO(m_log) << _T("Setting directory attributes");
 
 			// iterate backwards
 			for(file_count_t fcAttrIndex = fcSize; fcAttrIndex != 0; --fcAttrIndex)
@@ -262,7 +261,7 @@
 				if(rThreadController.KillRequested())
 				{
 					// log
-					rLog.logi(_T("Kill request while processing file in ProcessFiles"));
+					LOG_INFO(m_log) << _T("Kill request while processing file in ProcessFiles");
 					return TSubTaskBase::eSubResult_KillRequest;
 				}
 
@@ -282,7 +281,7 @@
 		m_tSubTaskStats.SetCurrentPath(TString());
 
 		// log
-		rLog.logi(_T("Finished processing in ProcessFiles"));
+		LOG_INFO(m_log) << _T("Finished processing in ProcessFiles");
 
 		return TSubTaskBase::eSubResult_Continue;
 	}
@@ -334,11 +333,10 @@
 	TSubTaskBase::ESubOperationResult TSubTaskCopyMove::CustomCopyFileFB(const IFeedbackHandlerPtr& spFeedbackHandler, CUSTOM_COPY_PARAMS* pData)
 	{
 		TWorkerThreadController& rThreadController = GetContext().GetThreadController();
-		log_file& rLog = GetContext().GetLog();
 		const TConfig& rConfig = GetContext().GetConfig();
 		IFilesystemPtr spFilesystem = GetContext().GetLocalFilesystem();
 
-		TFilesystemFileFeedbackWrapper tFileFBWrapper(spFeedbackHandler, rLog, rThreadController, spFilesystem);
+		TFilesystemFileFeedbackWrapper tFileFBWrapper(spFeedbackHandler, GetContext().GetLogPath(), rThreadController, spFilesystem);
 
 		TString strFormat;
 		TSubTaskBase::ESubOperationResult eResult = TSubTaskBase::eSubResult_Continue;
@@ -408,7 +406,7 @@
 					strFormat = _T("Kill request while main copying file %srcpath -> %dstpath");
 					strFormat.Replace(_T("%srcpath"), pData->spSrcFile->GetFullFilePath().ToString());
 					strFormat.Replace(_T("%dstpath"), pData->pathDstFile.ToString());
-					rLog.logi(strFormat.c_str());
+					LOG_INFO(m_log) << strFormat.c_str();
 
 					eResult = TSubTaskBase::eSubResult_KillRequest;
 					bStopProcessing = true;
@@ -792,7 +790,6 @@
 	{
 		const TConfig& rConfig = GetContext().GetConfig();
 		TTaskConfigTracker& rCfgTracker = GetContext().GetCfgTracker();
-		log_file& rLog = GetContext().GetLog();
 
 		if(bForce || (rCfgTracker.IsModified() && rCfgTracker.IsModified(TOptionsSet() % eTO_DefaultBufferSize % eTO_OneDiskBufferSize % eTO_TwoDisksBufferSize % eTO_CDBufferSize % eTO_LANBufferSize % eTO_UseOnlyDefaultBuffer % eTO_BufferQueueDepth, true)))
 		{
@@ -809,7 +806,7 @@
 			strFormat.Replace(_T("%lansize2"), boost::lexical_cast<std::wstring>(rBufferSizes.GetLANSize()).c_str());
 			strFormat.Replace(_T("%cnt"), boost::lexical_cast<std::wstring>(rBufferSizes.GetBufferCount()).c_str());
 
-			rLog.logi(strFormat.c_str());
+			LOG_INFO(m_log) << strFormat.c_str();
 
 			rBuffer.ReinitializeBuffers(rBufferSizes.GetBufferCount(), rBufferSizes.GetMaxSize());
 
@@ -824,7 +821,6 @@
 		const TSmartPath& pathFile,
 		bool& bSkip)
 	{
-		log_file& rLog = GetContext().GetLog();
 		DWORD dwLastError = rBuffer.GetErrorCode();
 
 		bSkip = false;
@@ -834,7 +830,7 @@
 		strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(dwLastError).c_str());
 		strFormat.Replace(_T("%count"), boost::lexical_cast<std::wstring>(rBuffer.GetRequestedDataSize()).c_str());
 		strFormat.Replace(_T("%path"), pathFile.ToString());
-		rLog.loge(strFormat.c_str());
+		LOG_ERROR(m_log) << strFormat.c_str();
 
 		TFeedbackResult frResult = spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eReadError, dwLastError);
 		switch(frResult.GetResult())
@@ -863,7 +859,6 @@
 		const TSmartPath& pathFile,
 		bool& bSkip)
 	{
-		log_file& rLog = GetContext().GetLog();
 		DWORD dwLastError = rBuffer.GetErrorCode();
 
 		bSkip = false;
@@ -873,7 +868,7 @@
 		strFormat.Replace(_T("%errno"), boost::lexical_cast<std::wstring>(rBuffer.GetErrorCode()).c_str());
 		strFormat.Replace(_T("%count"), boost::lexical_cast<std::wstring>(rBuffer.GetBytesTransferred()).c_str());
 		strFormat.Replace(_T("%path"), pathFile.ToString());
-		rLog.loge(strFormat.c_str());
+		LOG_ERROR(m_log) << strFormat.c_str();
 
 		TFeedbackResult frResult = spFeedbackHandler->FileError(pathFile.ToWString(), TString(), EFileError::eWriteError, dwLastError);
 		switch (frResult.GetResult())
Index: src/libchcore/TSubTaskCopyMove.h
===================================================================
diff -u -N -r4fe995b304ea342b50293f92d3c1992b43b820f7 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskCopyMove.h	(.../TSubTaskCopyMove.h)	(revision 4fe995b304ea342b50293f92d3c1992b43b820f7)
+++ src/libchcore/TSubTaskCopyMove.h	(.../TSubTaskCopyMove.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -28,6 +28,7 @@
 #include "CommonDataTypes.h"
 #include "TBufferSizes.h"
 #include "IFilesystemFile.h"
+#include "../common/TLogger.h"
 
 namespace chcore
 {
@@ -81,6 +82,7 @@
 #pragma warning(push)
 #pragma warning(disable: 4251)
 		TSubTaskStatsInfo m_tSubTaskStats;
+		TLogger m_log;
 #pragma warning(pop)
 	};
 }
Index: src/libchcore/TSubTaskDelete.cpp
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskDelete.cpp	(.../TSubTaskDelete.cpp)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TSubTaskDelete.cpp	(.../TSubTaskDelete.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -38,7 +38,6 @@
 #include "TBufferSizes.h"
 #include "TFileException.h"
 #include "TFilesystemFeedbackWrapper.h"
-#include "log.h"
 
 namespace chcore
 {
@@ -47,7 +46,8 @@
 
 	TSubTaskDelete::TSubTaskDelete(TSubTaskContext& rContext) :
 		TSubTaskBase(rContext),
-		m_tSubTaskStats(eSubOperation_Deleting)
+		m_tSubTaskStats(eSubOperation_Deleting),
+		m_log(rContext.GetLogPath().ToString(), L"ST-Delete")
 	{
 	}
 
@@ -81,15 +81,14 @@
 		TFeedbackHandlerWrapperPtr spFeedbackHandler(std::make_shared<TFeedbackHandlerWrapper>(spFeedback, guard));
 
 		// log
-		log_file& rLog = GetContext().GetLog();
 		TFileInfoArray& rFilesCache = GetContext().GetFilesCache();
 		TWorkerThreadController& rThreadController = GetContext().GetThreadController();
 		IFilesystemPtr spFilesystem = GetContext().GetLocalFilesystem();
 
-		TFilesystemFeedbackWrapper tFilesystemFBWrapper(spFeedbackHandler, spFilesystem, rLog, rThreadController);
+		TFilesystemFeedbackWrapper tFilesystemFBWrapper(spFeedbackHandler, spFilesystem, GetContext().GetLogPath(), rThreadController);
 
 		// log
-		rLog.logi(_T("Deleting files (DeleteFiles)..."));
+		LOG_INFO(m_log) << _T("Deleting files (DeleteFiles)...");
 
 		// new stats
 		m_tSubTaskStats.SetCurrentBufferIndex(TBufferSizes::eBuffer_Default);
@@ -119,7 +118,7 @@
 			if (rThreadController.KillRequested())
 			{
 				// log
-				rLog.logi(_T("Kill request while deleting files (Delete Files)"));
+				LOG_INFO(m_log) << _T("Kill request while deleting files (Delete Files)");
 				return TSubTaskBase::eSubResult_KillRequest;
 			}
 
@@ -147,7 +146,7 @@
 		m_tSubTaskStats.SetCurrentPath(TString());
 
 		// log
-		rLog.logi(_T("Deleting files finished"));
+		LOG_INFO(m_log) << _T("Deleting files finished");
 
 		return TSubTaskBase::eSubResult_Continue;
 	}
Index: src/libchcore/TSubTaskDelete.h
===================================================================
diff -u -N -rcb4e9d4b60d62b25ae2cf556c0642601af56c787 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskDelete.h	(.../TSubTaskDelete.h)	(revision cb4e9d4b60d62b25ae2cf556c0642601af56c787)
+++ src/libchcore/TSubTaskDelete.h	(.../TSubTaskDelete.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -25,6 +25,7 @@
 
 #include "libchcore.h"
 #include "TSubTaskBase.h"
+#include "../common/TLogger.h"
 
 namespace chcore
 {
@@ -53,6 +54,7 @@
 #pragma warning(push)
 #pragma warning(disable: 4251)
 		TSubTaskStatsInfo m_tSubTaskStats;
+		TLogger m_log;
 #pragma warning(pop)
 	};
 }
Index: src/libchcore/TSubTaskFastMove.cpp
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskFastMove.cpp	(.../TSubTaskFastMove.cpp)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TSubTaskFastMove.cpp	(.../TSubTaskFastMove.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -39,14 +39,14 @@
 #include "TBufferSizes.h"
 #include "TFileException.h"
 #include "TFilesystemFeedbackWrapper.h"
-#include "log.h"
 #include "TDestinationPathProvider.h"
 
 namespace chcore
 {
 	TSubTaskFastMove::TSubTaskFastMove(TSubTaskContext& rContext) :
 		TSubTaskBase(rContext),
-		m_tSubTaskStats(eSubOperation_FastMove)
+		m_tSubTaskStats(eSubOperation_FastMove),
+		m_log(rContext.GetLogPath().ToString(), L"ST-FastMove")
 	{
 	}
 
@@ -84,17 +84,16 @@
 		TFeedbackHandlerWrapperPtr spFeedbackHandler(std::make_shared<TFeedbackHandlerWrapper>(spFeedback, guard));
 
 		// log
-		log_file& rLog = GetContext().GetLog();
 		TWorkerThreadController& rThreadController = GetContext().GetThreadController();
 		TBasePathDataContainerPtr spBasePaths = GetContext().GetBasePaths();
 		const TConfig& rConfig = GetContext().GetConfig();
 		TSmartPath pathDestination = GetContext().GetDestinationPath();
 		const TFileFiltersArray& rafFilters = GetContext().GetFilters();
 		IFilesystemPtr spFilesystem = GetContext().GetLocalFilesystem();
 
-		TFilesystemFeedbackWrapper tFilesystemFBWrapper(spFeedbackHandler, spFilesystem, rLog, rThreadController);
+		TFilesystemFeedbackWrapper tFilesystemFBWrapper(spFeedbackHandler, spFilesystem, GetContext().GetLogPath(), rThreadController);
 
-		rLog.logi(_T("Performing initial fast-move operation..."));
+		LOG_INFO(m_log) << _T("Performing initial fast-move operation...");
 
 		// new stats
 		m_tSubTaskStats.SetCurrentBufferIndex(TBufferSizes::eBuffer_Default);
@@ -173,7 +172,7 @@
 			if (rThreadController.KillRequested())
 			{
 				// log
-				rLog.logi(_T("Kill request while fast moving items"));
+				LOG_INFO(m_log) << _T("Kill request while fast moving items");
 				return eSubResult_KillRequest;
 			}
 		}
@@ -183,7 +182,7 @@
 		m_tSubTaskStats.SetCurrentPath(TString());
 
 		// log
-		rLog.logi(_T("Fast moving finished"));
+		LOG_INFO(m_log) << _T("Fast moving finished");
 
 		return eSubResult_Continue;
 	}
Index: src/libchcore/TSubTaskFastMove.h
===================================================================
diff -u -N -r4fe995b304ea342b50293f92d3c1992b43b820f7 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskFastMove.h	(.../TSubTaskFastMove.h)	(revision 4fe995b304ea342b50293f92d3c1992b43b820f7)
+++ src/libchcore/TSubTaskFastMove.h	(.../TSubTaskFastMove.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -25,6 +25,7 @@
 
 #include "libchcore.h"
 #include "TSubTaskBase.h"
+#include "../Common/TLogger.h"
 
 namespace chcore
 {
@@ -56,6 +57,7 @@
 #pragma warning(push)
 #pragma warning(disable: 4251)
 		TSubTaskStatsInfo m_tSubTaskStats;
+		TLogger m_log;
 #pragma warning(pop)
 	};
 }
Index: src/libchcore/TSubTaskScanDirectory.cpp
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskScanDirectory.cpp	(.../TSubTaskScanDirectory.cpp)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TSubTaskScanDirectory.cpp	(.../TSubTaskScanDirectory.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -39,15 +39,15 @@
 #include "TBufferSizes.h"
 #include "TFileException.h"
 #include "TFilesystemFeedbackWrapper.h"
-#include "log.h"
 
 namespace chcore
 {
 	///////////////////////////////////////////////////////////////////////////////////////////////////
 	// class TSubTaskScanDirectories
 	TSubTaskScanDirectories::TSubTaskScanDirectories(TSubTaskContext& rContext) :
 		TSubTaskBase(rContext),
-		m_tSubTaskStats(eSubOperation_Scanning)
+		m_tSubTaskStats(eSubOperation_Scanning),
+		m_log(rContext.GetLogPath().ToString(), L"ST-ScanDirs")
 	{
 	}
 
@@ -85,17 +85,16 @@
 		TFeedbackHandlerWrapperPtr spFeedbackHandler(std::make_shared<TFeedbackHandlerWrapper>(spFeedback, guard));
 
 		// log
-		log_file& rLog = GetContext().GetLog();
 		TFileInfoArray& rFilesCache = GetContext().GetFilesCache();
 		TWorkerThreadController& rThreadController = GetContext().GetThreadController();
 		TBasePathDataContainerPtr spBasePaths = GetContext().GetBasePaths();
 		const TConfig& rConfig = GetContext().GetConfig();
 		const TFileFiltersArray& rafFilters = GetContext().GetFilters();
 		IFilesystemPtr spFilesystem = GetContext().GetLocalFilesystem();
 
-		TFilesystemFeedbackWrapper tFilesystemFBWrapper(spFeedbackHandler, spFilesystem, rLog, rThreadController);
+		TFilesystemFeedbackWrapper tFilesystemFBWrapper(spFeedbackHandler, spFilesystem, GetContext().GetLogPath(), rThreadController);
 
-		rLog.logi(_T("Searching for files..."));
+		LOG_INFO(m_log) << _T("Searching for files...");
 
 		// reset progress
 		rFilesCache.SetComplete(false);
@@ -148,7 +147,7 @@
 			// log
 			strFormat = _T("Adding file/folder (clipboard) : %path ...");
 			strFormat.Replace(_T("%path"), pathCurrent.ToString());
-			rLog.logi(strFormat.c_str());
+			LOG_INFO(m_log) << strFormat.c_str();
 
 			// add if needed
 			if (spFileInfo->IsDirectory())
@@ -162,22 +161,22 @@
 					// log
 					strFormat = _T("Added folder %path");
 					strFormat.Replace(_T("%path"), spFileInfo->GetFullFilePath().ToString());
-					rLog.logi(strFormat.c_str());
+					LOG_INFO(m_log) << strFormat.c_str();
 				}
 
 				// don't add folder contents when moving inside one disk boundary
 				// log
 				strFormat = _T("Recursing folder %path");
 				strFormat.Replace(_T("%path"), spFileInfo->GetFullFilePath().ToString());
-				rLog.logi(strFormat.c_str());
+				LOG_INFO(m_log) << strFormat.c_str();
 
 				ScanDirectory(spFileInfo->GetFullFilePath(), spBasePath, true, !bIgnoreDirs || bForceDirectories, rafFilters);
 
 				// check for kill need
 				if (rThreadController.KillRequested())
 				{
 					// log
-					rLog.logi(_T("Kill request while adding data to files array (RecurseDirectories)"));
+					LOG_INFO(m_log) << _T("Kill request while adding data to files array (RecurseDirectories)");
 					rFilesCache.Clear();
 					return eSubResult_KillRequest;
 				}
@@ -191,7 +190,7 @@
 				// log
 				strFormat = _T("Added file %path");
 				strFormat.Replace(_T("%path"), spFileInfo->GetFullFilePath().ToString());
-				rLog.logi(strFormat.c_str());
+				LOG_INFO(m_log) << strFormat.c_str();
 			}
 		}
 
@@ -203,7 +202,7 @@
 		rFilesCache.SetComplete(true);
 
 		// log
-		rLog.logi(_T("Searching for files finished"));
+		LOG_INFO(m_log) << _T("Searching for files finished");
 
 		return eSubResult_Continue;
 	}
Index: src/libchcore/TSubTaskScanDirectory.h
===================================================================
diff -u -N -r4fe995b304ea342b50293f92d3c1992b43b820f7 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TSubTaskScanDirectory.h	(.../TSubTaskScanDirectory.h)	(revision 4fe995b304ea342b50293f92d3c1992b43b820f7)
+++ src/libchcore/TSubTaskScanDirectory.h	(.../TSubTaskScanDirectory.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -27,6 +27,7 @@
 #include "TSubTaskBase.h"
 #include "TPath.h"
 #include "TBasePathData.h"
+#include "../common/TLogger.h"
 
 namespace chcore
 {
@@ -61,6 +62,7 @@
 #pragma warning(push)
 #pragma warning(disable: 4251)
 		TSubTaskStatsInfo m_tSubTaskStats;
+		TLogger m_log;
 #pragma warning(pop)
 	};
 }
Index: src/libchcore/TTask.cpp
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TTask.cpp	(.../TTask.cpp)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TTask.cpp	(.../TTask.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -38,7 +38,6 @@
 #include "TFeedbackHandlerWrapper.h"
 #include <boost/make_shared.hpp>
 #include "TTaskConfigBufferSizes.h"
-#include "log.h"
 #include <wchar.h>
 #include "TLocalFilesystem.h"
 #include "TTaskConfigVerifier.h"
@@ -48,14 +47,14 @@
 	////////////////////////////////////////////////////////////////////////////
 	// TTask members
 
-	TTask::TTask(const ISerializerPtr& spSerializer, const IFeedbackHandlerPtr& spFeedbackHandler) :
-		m_log(),
+	TTask::TTask(const ISerializerPtr& spSerializer, const IFeedbackHandlerPtr& spFeedbackHandler, const TTaskDefinition& rTaskDefinition, const TSmartPath& rLogPath) :
+		m_log(rLogPath.ToString(), L"Task"),
 		m_spInternalFeedbackHandler(spFeedbackHandler),
 		m_spSrcPaths(new TBasePathDataContainer),
 		m_bForce(false),
 		m_bContinue(false),
 		m_tSubTaskContext(m_tConfiguration, m_spSrcPaths, m_afFilters,
-			m_cfgTracker, m_log, m_workerThread,
+			m_cfgTracker, rLogPath, m_workerThread,
 			std::make_shared<TLocalFilesystem>()),
 		m_tSubTasksArray(m_tSubTaskContext),
 		m_spSerializer(spSerializer)
@@ -64,8 +63,29 @@
 			throw TCoreException(eErr_InvalidArgument, L"spFeedbackHandler", LOCATION);
 		if(!spSerializer)
 			throw TCoreException(eErr_InvalidArgument, L"spSerializer", LOCATION);
+
+		m_tBaseData.SetLogPath(rLogPath);
+		SetTaskDefinition(rTaskDefinition);
 	}
 
+	TTask::TTask(const ISerializerPtr& spSerializer, const IFeedbackHandlerPtr& spFeedbackHandler, const TTaskBaseData& rBaseTaskData) :
+		m_log(rBaseTaskData.GetLogPath().ToString(), L"Task"),
+		m_spInternalFeedbackHandler(spFeedbackHandler),
+		m_spSrcPaths(new TBasePathDataContainer),
+		m_bForce(false),
+		m_bContinue(false),
+		m_tSubTaskContext(m_tConfiguration, m_spSrcPaths, m_afFilters,
+			m_cfgTracker, rBaseTaskData.GetLogPath(), m_workerThread,
+			std::make_shared<TLocalFilesystem>()),
+		m_tSubTasksArray(m_tSubTaskContext),
+		m_spSerializer(spSerializer)
+	{
+		if(!spFeedbackHandler)
+			throw TCoreException(eErr_InvalidArgument, L"spFeedbackHandler", LOCATION);
+		if(!spSerializer)
+			throw TCoreException(eErr_InvalidArgument, L"spSerializer", LOCATION);
+	}
+
 	TTask::~TTask()
 	{
 		KillThread();
@@ -124,10 +144,8 @@
 		SetTaskPropValue<eTO_ThreadPriority>(m_tConfiguration, nPriority);
 	}
 
-	void TTask::Load()
+	void TTask::Load(const TTaskBaseData& rBaseData)
 	{
-		using namespace chcore;
-
 		bool bLogPathLoaded = false;
 		bool bLoadFailed = false;
 		const size_t stMaxSize = 1024;
@@ -138,7 +156,7 @@
 			boost::unique_lock<boost::shared_mutex> lock(m_lock);
 
 			ISerializerContainerPtr spContainer = m_spSerializer->GetContainer(_T("task"));
-			m_tBaseData.Load(spContainer);
+			m_tBaseData = rBaseData;// .Load(spContainer);
 
 			bLogPathLoaded = true;
 
@@ -160,11 +178,11 @@
 			spContainer = m_spSerializer->GetContainer(_T("feedback"));
 			m_spInternalFeedbackHandler->Load(spContainer);
 
-			m_tSubTasksArray.Load(m_spSerializer);
-
 			// ensure copy-based context entries are properly updated after loading
 			m_tSubTaskContext.SetDestinationPath(m_tBaseData.GetDestinationPath());
 			m_tSubTaskContext.SetOperationType(m_tSubTasksArray.GetOperationType());
+
+			m_tSubTasksArray.Load(m_spSerializer);
 		}
 		catch (const TBaseException& e)
 		{
@@ -188,14 +206,28 @@
 			try
 			{
 				if (bLogPathLoaded)
-					GetLog().loge(szErr);
+				{
+					LOG_ERROR(m_log) << szErr;
+				}
 			}
 			catch (const std::exception&)
 			{
 			}
 		}
 	}
 
+	TTaskPtr TTask::Load(const ISerializerPtr& spSerializer, const IFeedbackHandlerPtr& spFeedbackHandler)
+	{
+		TTaskBaseData tBaseData;
+		ISerializerContainerPtr spContainer = spSerializer->GetContainer(_T("task"));
+		tBaseData.Load(spContainer);
+
+		TTaskPtr spTask = std::shared_ptr<TTask>(new TTask(spSerializer, spFeedbackHandler, tBaseData));
+		spTask->Load(tBaseData);
+
+		return spTask;
+	}
+
 	void TTask::Store(bool bForce)
 	{
 		if (GetTaskState() == eTaskState_LoadError)
@@ -275,7 +307,7 @@
 
 	void TTask::BeginProcessing()
 	{
-		GetLog().logi(_T("Requested task to begin processing"));
+		LOG_INFO(m_log) << _T("Requested task to begin processing");
 
 		boost::unique_lock<boost::shared_mutex> lock(m_lock);
 		if (m_tBaseData.GetCurrentState() != eTaskState_LoadError)
@@ -287,7 +319,7 @@
 		// the same as retry but less demanding
 		if (GetTaskState() == eTaskState_Paused)
 		{
-			GetLog().logi(_T("Requested task resume"));
+			LOG_INFO(m_log) << _T("Requested task resume");
 			SetTaskState(eTaskState_Processing);
 			BeginProcessing();
 		}
@@ -321,7 +353,7 @@
 
 	void TTask::RestartProcessing()
 	{
-		GetLog().logi(_T("Requested task restart"));
+		LOG_INFO(m_log) << _T("Requested task restart");
 		KillThread();
 
 		SetTaskState(eTaskState_None);
@@ -346,7 +378,7 @@
 	{
 		if (GetTaskState() != eTaskState_Finished && GetTaskState() != eTaskState_Cancelled)
 		{
-			GetLog().logi(_T("Requested task pause"));
+			LOG_INFO(m_log) << _T("Requested task pause");
 			KillThread();
 			SetTaskState(eTaskState_Paused);
 		}
@@ -357,7 +389,7 @@
 		// change to ST_CANCELLED
 		if (GetTaskState() != eTaskState_Finished)
 		{
-			GetLog().logi(_T("Requested task cancel"));
+			LOG_INFO(m_log) << _T("Requested task cancel");
 			KillThread();
 			SetTaskState(eTaskState_Cancelled);
 		}
@@ -495,7 +527,7 @@
 				SetTaskState(eTaskState_Processing);
 				bContinue = true;
 
-				m_log.logi(_T("Finished waiting for begin permission"));
+				LOG_INFO(m_log) << _T("Finished waiting for begin permission");
 
 				//			return; // skips sleep and kill flag checking
 			}
@@ -505,7 +537,7 @@
 			if (m_workerThread.KillRequested())
 			{
 				// log
-				m_log.logi(_T("Kill request while waiting for begin permission (wait state)"));
+				LOG_INFO(m_log) << _T("Kill request while waiting for begin permission (wait state)");
 				return TSubTaskBase::eSubResult_KillRequest;
 			}
 		}
@@ -535,9 +567,6 @@
 		{
 			TSubTaskBase::ESubOperationResult eResult = TSubTaskBase::eSubResult_Continue;
 
-			// initialize log file
-			m_log.init(m_tBaseData.GetLogPath().ToString(), 262144, log_file::level_debug, false, false);
-
 			// start operation
 			OnBeginOperation();
 
@@ -643,7 +672,7 @@
 
 		// log
 		TString strMsg = TString(L"Caught exception in ThrdProc: ") + upExceptionInfoBuffer.get();
-		m_log.loge(strMsg.c_str());
+		LOG_ERROR(m_log) << strMsg.c_str();
 
 		// let others know some error happened
 		spFeedbackHandler->OperationError();
@@ -668,7 +697,7 @@
 		strFormat.Replace(_T("%hour"), boost::lexical_cast<std::wstring>(tm.GetHour()).c_str());
 		strFormat.Replace(_T("%minute"), boost::lexical_cast<std::wstring>(tm.GetMinute()).c_str());
 		strFormat.Replace(_T("%second"), boost::lexical_cast<std::wstring>(tm.GetSecond()).c_str());
-		m_log.logi(strFormat.c_str());
+		LOG_INFO(m_log) << strFormat.c_str();
 	}
 
 	void TTask::OnEndOperation()
@@ -682,7 +711,7 @@
 		strFormat.Replace(_T("%hour"), boost::lexical_cast<std::wstring>(tm.GetHour()).c_str());
 		strFormat.Replace(_T("%minute"), boost::lexical_cast<std::wstring>(tm.GetMinute()).c_str());
 		strFormat.Replace(_T("%second"), boost::lexical_cast<std::wstring>(tm.GetSecond()).c_str());
-		m_log.logi(strFormat.c_str());
+		LOG_INFO(m_log) << strFormat.c_str();
 	}
 
 	void TTask::RequestStopThread()
@@ -726,12 +755,4 @@
 	{
 		return m_spSerializer;
 	}
-
-	log_file& TTask::GetLog()
-	{
-		if (!m_log.is_initialized())
-			m_log.init(m_tBaseData.GetLogPath().ToString(), 262144, log_file::level_debug, false, false);
-
-		return m_log;
-	}
 }
Index: src/libchcore/TTask.h
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TTask.h	(.../TTask.h)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TTask.h	(.../TTask.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -33,20 +33,23 @@
 #include "ISerializer.h"
 #include "TTaskBaseData.h"
 #include <mutex>
-#include "log.h"
 #include "IFilesystem.h"
+#include "..\Common\TLogger.h"
 
 namespace chcore
 {
 	class TBufferSizes;
 
 	///////////////////////////////////////////////////////////////////////////
 	// TTask
+	class TTask;
+	using TTaskPtr = std::shared_ptr<TTask>;
 
 	class LIBCHCORE_API TTask
 	{
 	private:
-		TTask(const ISerializerPtr& spSerializer, const IFeedbackHandlerPtr& spFeedbackHandler);
+		TTask(const ISerializerPtr& spSerializer, const IFeedbackHandlerPtr& spFeedbackHandler, const TTaskBaseData& rBaseTaskData);
+		TTask(const ISerializerPtr& spSerializer, const IFeedbackHandlerPtr& spFeedbackHandler, const TTaskDefinition& rTaskDefinition, const TSmartPath& rLogPath);
 
 	public:
 		~TTask();
@@ -66,7 +69,7 @@
 		// thread
 		void SetPriority(int nPriority);
 
-		void Load();
+		static TTaskPtr Load(const ISerializerPtr& spSerializer, const IFeedbackHandlerPtr& spFeedbackHandler);
 		void Store(bool bForce);
 
 		void BeginProcessing();
@@ -85,10 +88,11 @@
 		void RestoreFeedbackDefaults();
 
 	private:
+		void Load(const TTaskBaseData& rBaseData);
+
 		void SetTaskDefinition(const TTaskDefinition& rTaskDefinition);
 
 		void SetLogPath(const TSmartPath& pathLog);
-		log_file& GetLog();
 
 		// methods are called when task is being added or removed from the global task array
 		/// Method is called when this task is being added to a TTaskManager object
@@ -162,7 +166,10 @@
 		bool m_bContinue;					// allows task to continue
 
 		// other helpers
-		log_file m_log;				///< Log file where task information will be stored
+#pragma warning(push)
+#pragma warning(disable: 4251)
+		TLogger m_log;				///< Log file where task information will be stored
+#pragma warning(pop)
 
 		/// Thread controlling object
 		TWorkerThreadController m_workerThread;
@@ -181,8 +188,6 @@
 
 		friend class TTaskManager;
 	};
-
-	typedef std::shared_ptr<TTask> TTaskPtr;
 }
 
 #endif
Index: src/libchcore/TTaskBaseData.h
===================================================================
diff -u -N -re96806b7f8ff7ca7e9f4afbea603e6351a3dc3e3 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TTaskBaseData.h	(.../TTaskBaseData.h)	(revision e96806b7f8ff7ca7e9f4afbea603e6351a3dc3e3)
+++ src/libchcore/TTaskBaseData.h	(.../TTaskBaseData.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -29,9 +29,11 @@
 {
 	class LIBCHCORE_API TTaskBaseData
 	{
+/*
 	private:
 		TTaskBaseData(const TTaskBaseData&);
 		TTaskBaseData& operator=(const TTaskBaseData&);
+*/
 
 	public:
 		TTaskBaseData();
Index: src/libchcore/TTaskConfigVerifier.cpp
===================================================================
diff -u -N -rdcc6234ed612a75910b8900704c9d564096a037a -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TTaskConfigVerifier.cpp	(.../TTaskConfigVerifier.cpp)	(revision dcc6234ed612a75910b8900704c9d564096a037a)
+++ src/libchcore/TTaskConfigVerifier.cpp	(.../TTaskConfigVerifier.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -19,23 +19,22 @@
 #include "stdafx.h"
 #include "TTaskConfigVerifier.h"
 #include "TTaskConfiguration.h"
-#include "log.h"
 #include <boost\format.hpp>
+#include "..\Common\TLogger.h"
 
 namespace chcore
 {
-	void TTaskConfigVerifier::VerifyAndUpdate(TConfig& rConfig, log_file* pLog)
+	void TTaskConfigVerifier::VerifyAndUpdate(TConfig& rConfig, TLogger* pLog)
 	{
 		TString strFirstFormat = GetTaskPropValue<eTO_AlternateFilenameFormatString_First>(rConfig);
 		if(strFirstFormat.Find(L"%name") == TString::npos || strFirstFormat.Find(L"%ext") == TString::npos)
 		{
 			TString strDefaultFormat = TaskPropData<eTO_AlternateFilenameFormatString_First>::GetDefaultValue();
 			if(pLog)
 			{
-				pLog->logw(
-					boost::str(boost::wformat(L"First alternate filename format string (%1%) does not contain %%name placeholder. Switching to default (%2%).")
+				LOG_WARNING(*pLog) << boost::str(boost::wformat(L"First alternate filename format string (%1%) does not contain %%name placeholder. Switching to default (%2%).")
 						% strFirstFormat.c_str()
-						% strDefaultFormat.c_str()).c_str());
+						% strDefaultFormat.c_str()).c_str();
 			}
 
 			SetTaskPropValue<eTO_AlternateFilenameFormatString_First>(rConfig, strDefaultFormat);
@@ -48,10 +47,10 @@
 			TString strDefaultFormat = TaskPropData<eTO_AlternateFilenameFormatString_AfterFirst>::GetDefaultValue();
 			if(pLog)
 			{
-				pLog->logw(
+				LOG_WARNING(*pLog) <<
 					boost::str(boost::wformat(L"Subsequent alternate filename format string (%1%) does not contain %%name or %%count placeholder. Switching to default (%2%).")
 						% strSubsequentFormat.c_str()
-						% strDefaultFormat.c_str()).c_str());
+						% strDefaultFormat.c_str()).c_str();
 			}
 
 			SetTaskPropValue<eTO_AlternateFilenameFormatString_AfterFirst>(rConfig, strDefaultFormat);
Index: src/libchcore/TTaskConfigVerifier.h
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TTaskConfigVerifier.h	(.../TTaskConfigVerifier.h)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/TTaskConfigVerifier.h	(.../TTaskConfigVerifier.h)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -19,15 +19,16 @@
 #ifndef __TTASKCONFIGVERIFIER_H__
 #define __TTASKCONFIGVERIFIER_H__
 
+class TLogger;
+
 namespace chcore
 {
-	class log_file;
 	class TConfig;
 
 	class TTaskConfigVerifier
 	{
 	public:
-		static void VerifyAndUpdate(TConfig& rConfig, log_file* pLog);
+		static void VerifyAndUpdate(TConfig& rConfig, TLogger* pLog);
 	};
 }
 
Index: src/libchcore/TTaskManager.cpp
===================================================================
diff -u -N -r4fe995b304ea342b50293f92d3c1992b43b820f7 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/TTaskManager.cpp	(.../TTaskManager.cpp)	(revision 4fe995b304ea342b50293f92d3c1992b43b820f7)
+++ src/libchcore/TTaskManager.cpp	(.../TTaskManager.cpp)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -58,9 +58,7 @@
 		IFeedbackHandlerPtr spHandler = m_spFeedbackFactory->Create();
 		ISerializerPtr spSerializer = m_spSerializerFactory->CreateTaskSerializer(tTaskDefinition.GetTaskName());
 
-		TTaskPtr spTask(new TTask(spSerializer, spHandler));
-		spTask->SetLogPath(CreateTaskLogPath(tTaskDefinition.GetTaskName()));
-		spTask->SetTaskDefinition(tTaskDefinition);
+		TTaskPtr spTask(new TTask(spSerializer, spHandler, tTaskDefinition, CreateTaskLogPath(tTaskDefinition.GetTaskName())));
 
 		spTask->Store(true);
 
@@ -524,8 +522,7 @@
 			if (!spSerializer)
 				spSerializer = std::make_shared<TFakeFileSerializer>(rInfo.second);
 
-			TTaskPtr spTask(new TTask(spSerializer, spHandler));
-			spTask->Load();
+			TTaskPtr spTask = TTask::Load(spSerializer, spHandler);
 
 			boost::unique_lock<boost::shared_mutex> lock(m_lock);
 
Index: src/libchcore/libchcore.vc140.vcxproj
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/libchcore.vc140.vcxproj	(.../libchcore.vc140.vcxproj)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/libchcore.vc140.vcxproj	(.../libchcore.vc140.vcxproj)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -190,6 +190,7 @@
       <SDLCheck>true</SDLCheck>
       <AdditionalIncludeDirectories>../../ext</AdditionalIncludeDirectories>
       <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <DisableSpecificWarnings>4512;4714</DisableSpecificWarnings>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -213,6 +214,7 @@
       <SDLCheck>true</SDLCheck>
       <AdditionalIncludeDirectories>..\..\ext\googletest\googletest\include;..\..\ext\googletest\googlemock\include;../../ext</AdditionalIncludeDirectories>
       <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <DisableSpecificWarnings>4512;4714</DisableSpecificWarnings>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -253,7 +255,7 @@
       <WarningLevel>Level4</WarningLevel>
       <TreatWarningAsError>false</TreatWarningAsError>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <DisableSpecificWarnings>4996</DisableSpecificWarnings>
+      <DisableSpecificWarnings>4512;4714</DisableSpecificWarnings>
       <EnablePREfast>false</EnablePREfast>
       <SDLCheck>true</SDLCheck>
       <AdditionalIncludeDirectories>../../ext</AdditionalIncludeDirectories>
@@ -280,7 +282,7 @@
       <WarningLevel>Level4</WarningLevel>
       <TreatWarningAsError>false</TreatWarningAsError>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <DisableSpecificWarnings>4996</DisableSpecificWarnings>
+      <DisableSpecificWarnings>4512;4714</DisableSpecificWarnings>
       <EnablePREfast>false</EnablePREfast>
       <SDLCheck>true</SDLCheck>
       <AdditionalIncludeDirectories>..\..\ext\googletest\googletest\include;..\..\ext\googletest\googlemock\include;../../ext</AdditionalIncludeDirectories>
@@ -324,6 +326,7 @@
       <SDLCheck>true</SDLCheck>
       <AdditionalIncludeDirectories>../../ext</AdditionalIncludeDirectories>
       <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <DisableSpecificWarnings>4512;4714</DisableSpecificWarnings>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -349,6 +352,7 @@
       <SDLCheck>true</SDLCheck>
       <AdditionalIncludeDirectories>..\..\ext\googletest\googletest\include;..\..\ext\googletest\googlemock\include;../../ext</AdditionalIncludeDirectories>
       <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
+      <DisableSpecificWarnings>4512;4714</DisableSpecificWarnings>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -393,6 +397,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <SDLCheck>true</SDLCheck>
       <AdditionalIncludeDirectories>../../ext</AdditionalIncludeDirectories>
+      <DisableSpecificWarnings>4512;4714</DisableSpecificWarnings>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -420,6 +425,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <SDLCheck>true</SDLCheck>
       <AdditionalIncludeDirectories>..\..\ext\googletest\googletest\include;..\..\ext\googletest\googlemock\include;../../ext</AdditionalIncludeDirectories>
+      <DisableSpecificWarnings>4512;4714</DisableSpecificWarnings>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -449,6 +455,8 @@
     </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="..\common\TLogger.h" />
+    <ClInclude Include="..\common\TLoggerInitializer.h" />
     <ClInclude Include="CommonDataTypes.h" />
     <ClInclude Include="ConfigNode.h" />
     <ClInclude Include="ConfigNodeContainer.h" />
@@ -472,7 +480,6 @@
     <ClInclude Include="ISerializerRowReader.h" />
     <ClInclude Include="ISQLiteSerializerSchema.h" />
     <ClInclude Include="ITimestampProvider.h" />
-    <ClInclude Include="log.h" />
     <ClInclude Include="MathFunctions.h" />
     <ClInclude Include="RoundingFunctions.h" />
     <ClInclude Include="SerializerDataTypes.h" />
@@ -482,6 +489,7 @@
     <ClInclude Include="TBasePathDataFwd.h" />
     <ClInclude Include="TConfigArray.h" />
     <ClInclude Include="TConfigNotifier.h" />
+    <ClInclude Include="TCoreEngine.h" />
     <ClInclude Include="TCoreStdException.h" />
     <ClInclude Include="TCoreWin32Exception.h" />
     <ClInclude Include="TDestinationPathProvider.h" />
@@ -497,6 +505,7 @@
     <ClInclude Include="TFileException.h" />
     <ClInclude Include="TLocalFilesystemFile.h" />
     <ClInclude Include="TLocalFilesystemFind.h" />
+    <ClInclude Include="TLoggerInfo.h" />
     <ClInclude Include="TModificationTracker.h" />
     <ClInclude Include="TModPathContainer.h" />
     <ClInclude Include="TObsoleteFiles.h" />
@@ -562,7 +571,6 @@
     <ClInclude Include="TConfigSerializers.h" />
     <ClInclude Include="TCoreException.h" />
     <ClInclude Include="TDateTime.h" />
-    <ClInclude Include="TLogger.h" />
     <ClInclude Include="TPath.h" />
     <ClInclude Include="TSharedMemory.h" />
     <ClInclude Include="TString.h" />
@@ -591,6 +599,8 @@
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Testing Debug|x64'">NotUsing</PrecompiledHeader>
     </ClCompile>
+    <ClCompile Include="..\common\TLogger.cpp" />
+    <ClCompile Include="..\common\TLoggerInitializer.cpp" />
     <ClCompile Include="ConfigNode.cpp" />
     <ClCompile Include="ConfigNodeContainer.cpp" />
     <ClCompile Include="IColumnsDefinition.cpp" />
@@ -607,11 +617,11 @@
     <ClCompile Include="ISerializerRowData.cpp" />
     <ClCompile Include="ISerializerRowReader.cpp" />
     <ClCompile Include="ISQLiteSerializerSchema.cpp" />
-    <ClCompile Include="log.cpp" />
     <ClCompile Include="MathFunctions.cpp" />
     <ClCompile Include="TBaseException.cpp" />
     <ClCompile Include="TConfigArray.cpp" />
     <ClCompile Include="TConfigNotifier.cpp" />
+    <ClCompile Include="TCoreEngine.cpp" />
     <ClCompile Include="TCoreStdException.cpp" />
     <ClCompile Include="TCoreWin32Exception.cpp" />
     <ClCompile Include="TDestinationPathProvider.cpp" />
@@ -740,6 +750,7 @@
     <ClCompile Include="TFileException.cpp" />
     <ClCompile Include="TLocalFilesystemFile.cpp" />
     <ClCompile Include="TLocalFilesystemFind.cpp" />
+    <ClCompile Include="TLoggerInfo.cpp" />
     <ClCompile Include="TModPathContainer.cpp" />
     <ClCompile Include="TObsoleteFiles.cpp" />
     <ClCompile Include="TOverlappedDataBufferQueue.cpp" />
@@ -799,7 +810,6 @@
     <ClCompile Include="TConfig.cpp" />
     <ClCompile Include="TCoreException.cpp" />
     <ClCompile Include="TDateTime.cpp" />
-    <ClCompile Include="TLogger.cpp" />
     <ClCompile Include="TPath.cpp" />
     <ClCompile Include="TSharedMemory.cpp" />
     <ClCompile Include="TString.cpp" />
Index: src/libchcore/libchcore.vc140.vcxproj.filters
===================================================================
diff -u -N -rd18db617f4727a237c94b59af9b4328f829eda16 -r6f8b891b60eb0f33199fd29db75d4d9f4a22c248
--- src/libchcore/libchcore.vc140.vcxproj.filters	(.../libchcore.vc140.vcxproj.filters)	(revision d18db617f4727a237c94b59af9b4328f829eda16)
+++ src/libchcore/libchcore.vc140.vcxproj.filters	(.../libchcore.vc140.vcxproj.filters)	(revision 6f8b891b60eb0f33199fd29db75d4d9f4a22c248)
@@ -78,12 +78,18 @@
     <Filter Include="Source Files\Filesystems\Exceptions">
       <UniqueIdentifier>{b5e932b3-5a5a-465b-8ade-3354c81e1996}</UniqueIdentifier>
     </Filter>
-    <Filter Include="Source Files\Tools\Logging">
-      <UniqueIdentifier>{4a321c2c-525d-4a77-bad6-d01210bba74c}</UniqueIdentifier>
-    </Filter>
     <Filter Include="Tests\TaskConfig">
       <UniqueIdentifier>{953a12ea-2aa5-4c7a-a310-a461ce8b962f}</UniqueIdentifier>
     </Filter>
+    <Filter Include="Source Files\Shared">
+      <UniqueIdentifier>{0bd6a559-b992-4f1d-abe6-f8105a9d5f50}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Source Files\Shared\Logging">
+      <UniqueIdentifier>{4a321c2c-525d-4a77-bad6-d01210bba74c}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Source Files\Tools\Logging">
+      <UniqueIdentifier>{0e547635-8b67-4a9e-9ade-40d3d7ffc5fc}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="ESubTaskTypes.h">
@@ -452,18 +458,24 @@
     <ClInclude Include="TFeedbackResult.h">
       <Filter>Source Files\Feedback</Filter>
     </ClInclude>
-    <ClInclude Include="TLogger.h">
-      <Filter>Source Files\Tools\Logging</Filter>
-    </ClInclude>
-    <ClInclude Include="log.h">
-      <Filter>Source Files\Tools\Logging</Filter>
-    </ClInclude>
     <ClInclude Include="TDestinationPathProvider.h">
       <Filter>Source Files\SubTasks</Filter>
     </ClInclude>
     <ClInclude Include="TTaskConfigVerifier.h">
       <Filter>Source Files\Task Config</Filter>
     </ClInclude>
+    <ClInclude Include="..\common\TLogger.h">
+      <Filter>Source Files\Shared\Logging</Filter>
+    </ClInclude>
+    <ClInclude Include="..\common\TLoggerInitializer.h">
+      <Filter>Source Files\Shared\Logging</Filter>
+    </ClInclude>
+    <ClInclude Include="TLoggerInfo.h">
+      <Filter>Source Files\Tools\Logging</Filter>
+    </ClInclude>
+    <ClInclude Include="TCoreEngine.h">
+      <Filter>Source Files\Library files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="TSubTaskArray.cpp">
@@ -832,12 +844,6 @@
     <ClCompile Include="TFeedbackResult.cpp">
       <Filter>Source Files\Feedback</Filter>
     </ClCompile>
-    <ClCompile Include="TLogger.cpp">
-      <Filter>Source Files\Tools\Logging</Filter>
-    </ClCompile>
-    <ClCompile Include="log.cpp">
-      <Filter>Source Files\Tools\Logging</Filter>
-    </ClCompile>
     <ClCompile Include="TDestinationPathProvider.cpp">
       <Filter>Source Files\SubTasks</Filter>
     </ClCompile>
@@ -850,5 +856,17 @@
     <ClCompile Include="Tests\TestsTTaskConfigVerifier.cpp">
       <Filter>Tests\TaskConfig</Filter>
     </ClCompile>
+    <ClCompile Include="..\common\TLogger.cpp">
+      <Filter>Source Files\Shared\Logging</Filter>
+    </ClCompile>
+    <ClCompile Include="..\common\TLoggerInitializer.cpp">
+      <Filter>Source Files\Shared\Logging</Filter>
+    </ClCompile>
+    <ClCompile Include="TLoggerInfo.cpp">
+      <Filter>Source Files\Tools\Logging</Filter>
+    </ClCompile>
+    <ClCompile Include="TCoreEngine.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file
Index: src/libchcore/log.cpp
===================================================================
diff -u -N
--- src/libchcore/log.cpp	(revision 8068e0c351055554340ac9755d1bc846893bf2b8)
+++ src/libchcore/log.cpp	(revision 0)
@@ -1,671 +0,0 @@
-/***************************************************************************
-*   Copyright (C) 2001-2008 by J�zef 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 log.cpp
- *  \brief Contains the implamentation of a log class.
- */
-#include "stdafx.h"
-#include "log.h"
-#include <boost/assert.hpp>
-#include <string.h>
-#include <stdio.h>
-#include <time.h>
-#include <assert.h>
-
-#include <stdlib.h>
-#include <fcntl.h>
-#include <windows.h>
-#include "TCoreException.h"
-#include "ErrorCodes.h"
-#include <boost/algorithm/string/trim.hpp>
-
-namespace chcore
-{
-	/// Table of strings representing the log message types
-	const wchar_t* __logtype_str[] = { _T("debug"), _T("info"), _T("warning"), _T("error") };
-
-	/** Constructs a log_file object.
-	 * \param[in] bGlobal - states if this should be treates as a global instance of the log_file.
-	 *						Only one global log_file instance could exist in the application.
-	 */
-	log_file::log_file() :
-		m_pszPath(nullptr),
-		m_iMaxSize(262144),
-		m_bLogStd(false),
-		m_iLogLevel(level_debug),
-		m_lock()
-	{
-		_set_fmode(_O_BINARY);
-	}
-
-	/** Standard destructor
-	 */
-	log_file::~log_file()
-	{
-		delete[] m_pszPath;
-	}
-
-	/** Initializes the constructed log file.
-	 * \param[in] pszPath - path to a log file to write to
-	 * \param[in] iMaxSize - maximum size of a log file
-	 * \param[in] iLogLevel - minimum log level of the messages to log
-	 * \param[in] bLogStd - log the messages also to stdout/stderr
-	 * \param[in] bClean - cleans the log file upon opening
-	 */
-	void log_file::init(const wchar_t* pszPath, int iMaxSize, int iLogLevel, bool bLogStd, bool bClean)
-	{
-		// store the path and other params
-		delete[] m_pszPath;
-		size_t stInLen = _tcslen(pszPath);
-		m_pszPath = new wchar_t[stInLen + 1];
-		_tcsncpy_s(m_pszPath, stInLen + 1, pszPath, _TRUNCATE);
-
-		m_iMaxSize = iMaxSize;
-		m_bLogStd = bLogStd;
-		m_iLogLevel = iLogLevel;
-
-		// try to open a file
-		FILE* pFile = _tfopen(pszPath, bClean ? _T("w") : _T("a"));
-		if (pFile == nullptr)
-			throw TCoreException(eErr_CannotOpenFile, L"Could not open the specified file", LOCATION);
-
-		fclose(pFile);
-	}
-
-	// ============================================================================
-	/// log_file::is_initialized
-	/// @date 2009/05/19
-	///
-	/// @brief     Checks is the log_file object has been initialized.
-	/// @return    True if it has been initialized, false otherwise.
-	// ============================================================================
-	bool log_file::is_initialized() const throw()
-	{
-		return m_pszPath != 0;
-	}
-
-	// ============================================================================
-	/// log_file::set_log_level
-	/// @date 2009/05/23
-	///
-	/// @brief     Changes the log level for this class.
-	/// @param[in] iLogLevel      New log level.
-	// ============================================================================
-	void log_file::set_log_level(int iLogLevel) throw()
-	{
-		m_iLogLevel = iLogLevel;
-	}
-
-	// ============================================================================
-	/// log_file::set_max_size
-	/// @date 2009/05/23
-	///
-	/// @brief     Sets the max size of the log file.
-	/// @param[in] iMaxSize	Max size of the log file.
-	// ============================================================================
-	void log_file::set_max_size(int iMaxSize) throw()
-	{
-		BOOST_ASSERT(iMaxSize > 0);
-		if (iMaxSize > 0)
-			m_iMaxSize = iMaxSize;
-	}
-
-	/** Retrieves the current size of a log file.
-	 *  Quite slow function - have to access the file by opening and closing it.
-	 * \return Current file size.
-	 */
-	int log_file::size() const
-	{
-		assert(m_pszPath);
-		if (!m_pszPath)
-			return -1;
-
-		int iSize = -1;
-		FILE* pFile = _tfopen(m_pszPath, _T("r"));
-		if (pFile != nullptr)
-		{
-			if (fseek(pFile, 0, SEEK_END) == 0)
-				iSize = ftell(pFile);
-
-			fclose(pFile);
-		}
-
-		return iSize;
-	}
-
-	/** Truncates the current log file content so when adding some new text the
-	 *  file size won't exceed the maximum size specified in init().
-	 * \param[in] iAdd - size of the new string to be added to the log file
-	 * \return True if truncate succeeded or false if not.
-	 */
-	bool log_file::truncate(int iAdd) const
-	{
-		assert(m_pszPath);
-		if (!m_pszPath)
-			return false;
-
-		// if we doesn't need to truncate anything
-		if (m_iMaxSize <= 0)
-			return true;
-
-		// make some checks
-		int iSize = size();
-		if (iSize <= 0 || iSize + iAdd < m_iMaxSize)
-			return false;
-
-		// establish the new file size (1/3rd of the current size or max_size-add_size)
-		int iNewSize = std::min((int)(iSize*0.66), m_iMaxSize - iAdd) & ~1;
-
-#ifdef _WIN32
-		// win32 does not have the ftruncate function, so we have to make some API calls
-		HANDLE hFile = CreateFile(m_pszPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
-		if (hFile != INVALID_HANDLE_VALUE)
-		{
-			// seek
-			if (SetFilePointer(hFile, iSize - iNewSize, nullptr, FILE_BEGIN) != INVALID_SET_FILE_POINTER)
-			{
-				// read the string to the eol
-				DWORD dwRD;
-				wchar_t szBuffer[4096 / sizeof(wchar_t)];
-				if (ReadFile(hFile, szBuffer, 4096, &dwRD, nullptr))
-				{
-					dwRD /= sizeof(wchar_t);
-					szBuffer[(dwRD > 0) ? dwRD - 1 : 0] = _T('\0');
-
-					// replace the /r and /n in the log to the \0
-					for (DWORD i = 0; i < dwRD; i++)
-					{
-						if (szBuffer[i] == _T('\r') || szBuffer[i] == _T('\n'))
-						{
-							szBuffer[i] = _T('\0');
-							break;
-						}
-					}
-
-					iNewSize -= (int)(_tcslen(szBuffer) + 1)*sizeof(wchar_t);			// new size correction
-
-					if (SetFilePointer(hFile, iSize - iNewSize, nullptr, FILE_BEGIN) != INVALID_SET_FILE_POINTER)
-					{
-						long lSrc = (long)SetFilePointer(hFile, 0, nullptr, FILE_CURRENT);
-						long lDst = 0;
-						DWORD tRD, tWR;
-
-						do
-						{
-							// seek to src
-							SetFilePointer(hFile, lSrc, nullptr, FILE_BEGIN);
-
-							// read 4k chars from source offset
-							if (ReadFile(hFile, szBuffer, 4096, &tRD, nullptr))
-							{
-								// seek to the dst
-								SetFilePointer(hFile, lDst, nullptr, FILE_BEGIN);
-
-								FlushFileBuffers(hFile);
-								// write the buffer to the dest offset
-								WriteFile(hFile, szBuffer, tRD, &tWR, nullptr);
-								lDst += (long)tWR;
-							}
-
-							lSrc += (long)tRD;
-						} while (tRD != 0);
-
-						// now truncate the file to the needed size
-						SetEndOfFile(hFile);
-					}
-				}
-
-				CloseHandle(hFile);
-				return true;
-			}
-
-			CloseHandle(hFile);
-		}
-#else
-		FILE* pFile = fopen(m_pszPath, _T("r+"));
-		if (pFile)
-		{
-			// seek
-			if (fseek(pFile, iSize - iNewSize, SEEK_SET) == 0)
-			{
-				// read the string to the eol
-				wchar_t szBuffer[4096];
-				fgets(szBuffer, 4096, pFile);
-
-				int iSrc = ftell(pFile);
-				int iDst = 0;
-				size_t tRD, tWR;
-
-				do
-				{
-					// seek to src
-					fseek(pFile, iSrc, SEEK_SET);
-
-					// read 4k chars from source offset
-					tRD = fread(szBuffer, 1, 4096, pFile);
-					if (tRD > 0)
-					{
-						// seek to the dst
-						fseek(pFile, iDst, SEEK_SET);
-
-						fflush(pFile);
-						// write the buffer to the dest offset
-						tWR = fwrite(szBuffer, 1, tRD, pFile);
-						iDst += tWR;
-					}
-
-					iSrc += tRD;
-				} while (tRD != 0);
-
-				// now truncate the file to the needed size
-				ftruncate(fileno(pFile), iDst);
-
-				fclose(pFile);
-				return true;
-			}
-
-			fclose(pFile);
-		}
-#endif
-
-		return false;
-	}
-
-	/** Logs a formatted message to a log file.
-	 * \param[in] iType - type of the log message (LT_*)
-	 * \param[in] bStd - log also to stdout/stderr if true
-	 * \param[in] pszStr - format string for the following parameters
-	 */
-	void log_file::log(int iType, bool bStd, const wchar_t* pszStr, ...)
-	{
-		if (iType < m_iLogLevel)
-			return;
-
-		va_list va;
-		va_start(va, pszStr);
-		logv(iType, bStd, pszStr, va);
-		va_end(va);
-	}
-
-	/** Logs a formatted message to a log file.
-	 * \param[in] iType - type of the log message (LT_*)
-	 * \param[in] bStd - log also to stdout/stderr if true
-	 * \param[in] pszStr - format string for the following parameters
-	 * \param[in] va - variable argument list
-	 */
-	void log_file::logv(int iType, bool bStd, const wchar_t* pszStr, va_list va)
-	{
-		if (iType < m_iLogLevel)
-			return;
-
-		wchar_t szBuf1[2048];
-		_vsntprintf(szBuf1, 2048, pszStr, va);		// user passed stuff
-
-		logs(iType, bStd, szBuf1);
-	}
-
-	/** Logs an unformatted message to a log file.
-	 * \param[in] iType - type of the log message (LT_*)
-	 * \param[in] bStd - log also to stdout/stderr if true
-	 * \param[in] pszStr - message string
-	 */
-	void log_file::logs(int iType, bool bStd, const wchar_t* pszStr)
-	{
-		assert(m_pszPath);
-		if (!m_pszPath)
-			return;
-
-		if (iType < m_iLogLevel || iType < 0 || iType >= (sizeof(__logtype_str) / sizeof(wchar_t*)))
-			return;
-
-		// log time
-		time_t t = time(nullptr);
-		std::wstring strTime = _tctime(&t);
-		boost::trim_right_if(strTime, boost::is_any_of(L"\n"));
-
-		m_lock.lock();
-
-		// check the size constraints
-		truncate((int)(_tcslen(pszStr) + 1));
-#if defined(UNICODE) && (defined(_WIN32) || defined(_WIN64))
-		FILE* pFile = _tfopen(m_pszPath, _T("ab"));
-#else
-		FILE* pFile = _tfopen(m_pszPath, _T("at"));
-#endif
-		bool bFailed = false;
-		if (pFile)
-		{
-			if (_ftprintf(pFile, _T("[%s] [%s] %s\r\n"), strTime.c_str(), __logtype_str[iType], pszStr) < 0)
-				bFailed = true;
-			fclose(pFile);
-		}
-		else
-			bFailed = true;
-		if (bFailed || (m_bLogStd && !bStd))
-		{
-			switch (iType)
-			{
-			case level_error:
-				_ftprintf(stderr, _T("[%s] [%s] %s\r\n"), strTime.c_str(), __logtype_str[iType], pszStr);
-				break;
-			default:
-				_ftprintf(stdout, _T("[%s] [%s] %s\r\n"), strTime.c_str(), __logtype_str[iType], pszStr);
-			}
-		}
-		else if (bStd)
-		{
-			switch (iType)
-			{
-			case level_error:
-				_ftprintf(stderr, _T("%s: %s\r\n"), __logtype_str[iType], pszStr);
-				break;
-			case level_info:
-				_ftprintf(stdout, _T("%s\r\n"), pszStr);
-				break;
-			default:
-				_ftprintf(stdout, _T("%s: %s\r\n"), __logtype_str[iType], pszStr);
-			}
-		}
-
-		m_lock.unlock();
-	}
-
-#ifndef SKIP_LEVEL_DEBUG
-	/** Logs a formatted debug message to a log file.
-	 * \param[in] pszStr - format string for the given parameters
-	 */
-	void log_file::logd(const wchar_t* pszStr)
-	{
-		if (m_iLogLevel > level_debug)
-			return;
-
-		logs(level_debug, false, pszStr);
-	}
-
-	/** Logs a formatted debug message to a log file.
-	* \param[in] pszStr - format string for the given parameters
-	*/
-	void log_file::logdv(const wchar_t* pszStr, ...)
-	{
-		if (m_iLogLevel > level_debug)
-			return;
-
-		va_list va;
-		va_start(va, pszStr);
-		logv(level_debug, false, pszStr, va);
-		va_end(va);
-	}
-
-	/** Logs a formatted debug message to a log file(also outputs to stdout).
-	 * \param[in] pszStr - format string for the given parameters
-	 */
-	void log_file::logds(const wchar_t* pszStr, ...)
-	{
-		if (m_iLogLevel > level_debug)
-			return;
-
-		va_list va;
-		va_start(va, pszStr);
-		logv(level_debug, true, pszStr, va);
-		va_end(va);
-	}
-
-#else
-	void log_file::logd(const wchar_t* /*pszStr*/)
-	{
-	}
-
-	void log_file::logdv(const wchar_t* /*pszStr*/, ...)
-	{
-	}
-
-	void log_file::logds(const wchar_t* /*pszStr*/, ...)
-	{
-	}
-#endif
-
-#ifndef SKIP_LEVEL_INFO
-	/** Logs a formatted informational message to a log file.
-	 * \param[in] pszStr - format string for the given parameters
-	 */
-	void log_file::logi(const wchar_t* pszStr)
-	{
-		if (m_iLogLevel > level_info)
-			return;
-
-		logs(level_info, false, pszStr);
-	}
-
-	/** Logs a formatted informational message to a log file.
-	* \param[in] pszStr - format string for the given parameters
-	*/
-	void log_file::logiv(const wchar_t* pszStr, ...)
-	{
-		if (m_iLogLevel > level_info)
-			return;
-
-		va_list va;
-		va_start(va, pszStr);
-		logv(level_info, false, pszStr, va);
-		va_end(va);
-	}
-
-	/** Logs a formatted informational message to a log file(also outputs to stdout).
-	 * \param[in] pszStr - format string for the given parameters
-	 */
-	void log_file::logis(const wchar_t* pszStr, ...)
-	{
-		if (m_iLogLevel > level_info)
-			return;
-
-		va_list va;
-		va_start(va, pszStr);
-		logv(level_info, true, pszStr, va);
-		va_end(va);
-	}
-#else
-	void log_file::logi(const wchar_t* /*pszStr*/)
-	{
-	}
-
-	void log_file::logiv(const wchar_t* /*pszStr*/, ...)
-	{
-	}
-
-	void log_file::logis(const wchar_t* /*pszStr*/, ...)
-	{
-	}
-
-#endif
-
-#ifndef SKIP_LEVEL_WARNING
-	/** Logs a formatted warning message to a log file.
-	 * \param[in] pszStr - format string for the given parameters
-	 */
-	void log_file::logw(const wchar_t* pszStr)
-	{
-		if (m_iLogLevel > level_warning)
-			return;
-
-		logs(level_warning, false, pszStr);
-	}
-
-	/** Logs a formatted warning message to a log file.
-	* \param[in] pszStr - format string for the given parameters
-	*/
-	void log_file::logwv(const wchar_t* pszStr, ...)
-	{
-		if (m_iLogLevel > level_warning)
-			return;
-
-		va_list va;
-		va_start(va, pszStr);
-		logv(level_warning, false, pszStr, va);
-		va_end(va);
-	}
-
-	/** Logs a formatted warning message to a log file(also outputs to stdout).
-	 * \param[in] pszStr - format string for the given parameters
-	 */
-	void log_file::logws(const wchar_t* pszStr, ...)
-	{
-		if (m_iLogLevel > level_warning)
-			return;
-		va_list va;
-		va_start(va, pszStr);
-		logv(level_warning, true, pszStr, va);
-		va_end(va);
-	}
-
-#else
-	void log_file::logw(const wchar_t* /*pszStr*/)
-	{
-	}
-
-	void log_file::logwv(const wchar_t* /*pszStr*/, ...)
-	{
-	}
-
-	void log_file::logws(const wchar_t* /*pszStr*/, ...)
-	{
-	}
-
-#endif
-
-	/** Logs a formatted error message to a log file.
-	 * \param[in] pszStr - format string for the given parameters
-	 */
-	void log_file::loge(const wchar_t* pszStr)
-	{
-		logs(level_error, false, pszStr);
-	}
-
-	/** Logs a formatted error message to a log file.
-	* \param[in] pszStr - format string for the given parameters
-	*/
-	void log_file::logev(const wchar_t* pszStr, ...)
-	{
-		va_list va;
-		va_start(va, pszStr);
-		logv(level_error, false, pszStr, va);
-		va_end(va);
-	}
-
-	/** Logs a formatted error message to a log file(also outputs to stderr).
-	 * \param[in] pszStr - format string for the given parameters
-	 */
-	void log_file::loges(const wchar_t* pszStr, ...)
-	{
-		va_list va;
-		va_start(va, pszStr);
-		logv(level_error, true, pszStr, va);
-		va_end(va);
-	}
-
-	/** Logs a formatted error message to a log file(also outputs to stderr).
-	 *  As an addition the first string %err is replaced with a given error
-	 *  followed by the error description (system-based).
-	 * \param[in] pszStr - format string for the given parameters
-	 * \param[in] iSysErr - system error to be shown
-	 */
-	void log_file::logerr(const wchar_t* pszStr, int iSysErr, ...)
-	{
-		wchar_t szNewFmt[2048];
-		if (prepare_fmt(pszStr, iSysErr, szNewFmt))
-		{
-			va_list va;
-			va_start(va, iSysErr);
-			logv(level_error, false, szNewFmt, va);
-			va_end(va);
-		}
-		else
-		{
-			va_list va;
-			va_start(va, iSysErr);
-			logv(level_error, false, pszStr, va);
-			va_end(va);
-		}
-	}
-
-	/** Logs a formatted error message to a log file(also outputs to stderr).
-	 *  As an addition the first string %err is replaced with a given error
-	 *  followed by the error description (system-based).
-	 *  This function differ from logerr() with logging the output string
-	 *  also to the stderr.
-	 * \param[in] pszStr - format string for the given parameters
-	 * \param[in] iSysErr - system error to be shown
-	 */
-	void log_file::logerrs(const wchar_t* pszStr, int iSysErr, ...)
-	{
-		wchar_t szNewFmt[2048];
-		if (prepare_fmt(pszStr, iSysErr, szNewFmt))
-		{
-			va_list va;
-			va_start(va, iSysErr);
-			logv(level_error, true, szNewFmt, va);
-			va_end(va);
-		}
-		else
-		{
-			va_list va;
-			va_start(va, iSysErr);
-			logv(level_error, true, pszStr, va);
-			va_end(va);
-		}
-	}
-
-	/** Function prepares a format string with error number and an error message
-	 *  for use with logerr() and logerrs() functions.
-	 * \param[in] pszStr - input format string (%err will be replaced with a 0x%lx (error message)
-	 * \param[in] iSysError - system error to parse
-	 * \param[out] pszOut - pointer to a buffer that will receive the data (must be 2048 bytes in size)
-	 * \return If the %err string was found and replaced within a given format string.
-	 */
-	bool log_file::prepare_fmt(const wchar_t* pszStr, int iSysErr, wchar_t* pszOut) const
-	{
-		// find the %err in pszStr
-		const wchar_t* pszFnd = _tcsstr(pszStr, _T("%err"));
-		if (pszFnd)
-		{
-			// find an error description for the error
-			wchar_t* pszErrDesc = nullptr;
-#ifdef _WIN32
-			wchar_t szErrDesc[512];
-			FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, (DWORD)iSysErr, 0, szErrDesc, 512, nullptr);
-			pszErrDesc = szErrDesc;
-#else
-			pszErrDesc = strerror(iSysErr);
-#endif
-
-			// format a string with err no and desc
-			wchar_t szError[1024];
-			_sntprintf(szError, 1023, _T("0x%lx (%s)"), iSysErr, pszErrDesc);
-			szError[1023] = _T('\0');
-
-			// replace %err with the new data
-			pszOut[0] = _T('\0');
-			_tcsncat(pszOut, pszStr, (size_t)(pszFnd - pszStr));
-			_tcscat(pszOut, szError);
-			_tcscat(pszOut, pszFnd + 4);
-
-			return true;
-		}
-		else
-			return false;
-	}
-}
Index: src/libchcore/log.h
===================================================================
diff -u -N
--- src/libchcore/log.h	(revision a27d1acf1bda3c25b6dcce0d0eb0278009ce63ae)
+++ src/libchcore/log.h	(revision 0)
@@ -1,116 +0,0 @@
-/***************************************************************************
-*   Copyright (C) 2001-2008 by J�zef 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 log.h
- *  \brief Contains the log class.
- */
-#ifndef __LOG_H__
-#define __LOG_H__
-
-#include <stdarg.h>
-#include "libchcore.h"
-
-namespace chcore
-{
-	/** \brief Class provides the message logging capability.
-	 *
-	 *  Class used to perform message logging to the external file. Provides a possibility
-	 *  of limiting the max size of a file and to cut the log message types below a specific
-	 *  level.
-	 *  Class is thread safe (is it? most of the methods does not seem to be thread safe).
-	 */
-	class LIBCHCORE_API log_file
-	{
-	public:
-		/// Supported log levels
-		enum log_levels
-		{
-			level_debug,		/// Debug level (the most detailed one)
-			level_info,			/// Informational level
-			level_warning,		/// Warning level
-			level_error			/// Error level (the least detailed one)
-		};
-
-	public:
-		/** \name Construction/destruction */
-		/**@{*/
-		explicit log_file();		///< Standard constructor
-		~log_file();				///< Standard destructor
-	/**@}*/
-
-	/** \name Initialization */
-	/**@{*/
-		void init(const wchar_t* pszPath, int iMaxSize, int iLogLevel, bool bLogStd, bool bClean);	///< Initializes the logging object
-		bool is_initialized() const throw();
-
-		void set_log_level(int iLogLevel) throw();		///< Sets the log level
-		void set_max_size(int iMaxSize) throw();			///< Sets the max size
-
-	/**@}*/
-
-	/** \name Logging functions */
-	/**@{*/
-		void logs(int iType, bool bStd, const wchar_t* pszStr);				///< Logs a string without formatting
-		void log(int iType, bool bStd, const wchar_t* pszStr, ...);			///< Logs a string with formatting
-		void logv(int iType, bool bStd, const wchar_t* pszStr, va_list va);	///< Logs a string using va_list
-
-		void logd(const wchar_t* pszStr);			///< Logs a debug message with formatting
-		void logdv(const wchar_t* pszStr, ...);		///< Logs a debug message with formatting
-		void logds(const wchar_t* pszStr, ...);		///< Logs a debug message with formatting (also prints to stdout)
-
-		void logi(const wchar_t* pszStr);			///< Logs an informational message with formatting
-		void logiv(const wchar_t* pszStr, ...);		///< Logs an informational message with formatting
-		void logis(const wchar_t* pszStr, ...);		///< Logs an informational message with formatting(also prints to stdout)
-
-		void logw(const wchar_t* pszStr);			///< Logs a warning message with formatting
-		void logwv(const wchar_t* pszStr, ...);		///< Logs a warning message with formatting
-		void logws(const wchar_t* pszStr, ...);		///< Logs a warning message with formatting(also prints to stdout)
-
-		void loge(const wchar_t* pszStr);			///< Logs an error message with formatting
-		void logev(const wchar_t* pszStr, ...);		///< Logs an error message with formatting
-		void loges(const wchar_t* pszStr, ...);		///< Logs an error message with formatting(also prints to stderr)
-
-		void logerr(const wchar_t* pszStr, int iSysErr, ...);	///< Logs an error message with system error number and error description
-		void logerrs(const wchar_t* pszStr, int iSysErr, ...);	///< Logs an error message with system error number and error description (also prints to stderr)
-	/**@}*/
-
-	protected:
-		/// Truncates a log file not to exceed the max file size
-		bool truncate(int iAdd) const;
-		/// Returns the size of a log file
-		int size() const;
-
-	private:
-		/// Prepares a new format string for logerr(s) functions
-		bool prepare_fmt(const wchar_t* pszStr, int iSysErr, wchar_t* pszOut) const;
-
-	protected:
-		wchar_t* m_pszPath;	///< Path to the log file
-		int m_iMaxSize;	///< Maximum size of the log file
-		bool m_bLogStd;		///< Log also to stdout/stderr
-		int m_iLogLevel;	///< Log level (similar to the _LOG_LEVEL, but changeable after compilation)
-
-	protected:
-#pragma warning(push)
-#pragma warning(disable: 4251)
-		mutable boost::shared_mutex m_lock;
-#pragma warning(pop)
-	};
-}
-
-#endif