Index: src/ch/AppHelper.cpp
===================================================================
diff -u -raa6bff57279b9f9cfc276e9adab2763e2900878d -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/AppHelper.cpp	(.../AppHelper.cpp)	(revision aa6bff57279b9f9cfc276e9adab2763e2900878d)
+++ src/ch/AppHelper.cpp	(.../AppHelper.cpp)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -229,13 +229,13 @@
 		rStrPath += _T('\\');
 
 	// make sure to create the required directories if they does not exist
-	rStrPath += _T("\\Copy Handler");
+	rStrPath += _T("Copy Handler");
 	if(!CreateDirectory(rStrPath, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
 		return false;
 
 	// create directory for tasks
-	rStrPath += _T("\\Tasks");
-	if(!CreateDirectory(rStrPath, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
+//	rStrPath += _T("\\Tasks");
+	if(!CreateDirectory(rStrPath + _T("\\Tasks"), NULL) && GetLastError() != ERROR_ALREADY_EXISTS)
 		return false;
 
 	return true;
Index: src/ch/CfgProperties.cpp
===================================================================
diff -u -rf34d204b8eecd6817dbe4a1c3b3541cf9a8794b0 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/CfgProperties.cpp	(.../CfgProperties.cpp)	(revision f34d204b8eecd6817dbe4a1c3b3541cf9a8794b0)
+++ src/ch/CfgProperties.cpp	(.../CfgProperties.cpp)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -100,12 +100,9 @@
 	pManager->register_bool(_t("Buffer/Use no buffering for large files"), true);
 	pManager->register_signed_num(_t("Buffer/Large files lower boundary limit"), 2097152, 1, 0xffffffff);
 
-	pManager->register_string(_t("Log file/Path to main log file"), _t("<APPDATA>\\ch.log"));
 	pManager->register_bool(_t("Log file/Enable logging"), true);
-	pManager->register_bool(_t("Log file/Enable log size limitation"), true);
-	pManager->register_signed_num(_t("Log file/Max log size limit"), 65535, 1024, 0xffffffff);
-	pManager->register_bool(_t("Log file/Precise log size limiting"), false);
-	pManager->register_signed_num(_t("Log file/Truncation buffer size"), 65535, 1024, 0xffffffff);
+	pManager->register_signed_num(_t("Log file/Max log size limit"), 512384, 1024, 0xffffffff);
+	pManager->register_unsigned_num(_t("Log file/Logging level"), 1, 0, 3);		// 0=debug, 1=info, 2=warning, 3=error
 
 	pManager->register_bool(_t("Sounds/Play sounds"), true);
 	pManager->register_string(_t("Sounds/Error sound path"), _t("<WINDOWS>\\media\\chord.wav"), icpf::property::flag_path);
Index: src/ch/CfgProperties.h
===================================================================
diff -u -rf34d204b8eecd6817dbe4a1c3b3541cf9a8794b0 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/CfgProperties.h	(.../CfgProperties.h)	(revision f34d204b8eecd6817dbe4a1c3b3541cf9a8794b0)
+++ src/ch/CfgProperties.h	(.../CfgProperties.h)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -95,12 +95,9 @@
 	PP_BFUSENOBUFFERING,
 	PP_BFBOUNDARYLIMIT,
 
-	PP_LOGPATH,
 	PP_LOGENABLELOGGING,
-	PP_LOGLIMITATION,
-	PP_LOGMAXLIMIT,
-	PP_LOGPRECISELIMITING,
-	PP_LOGTRUNCBUFFERSIZE,
+	PP_LOGMAXSIZE,
+	PP_LOGLEVEL,
 
 	PP_SNDPLAYSOUNDS,
 	PP_SNDERRORSOUNDPATH,
Index: src/ch/ClipboardMonitor.cpp
===================================================================
diff -u -rbfe720fda9529e7a77b4fb6410b4d4945b69188b -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/ClipboardMonitor.cpp	(.../ClipboardMonitor.cpp)	(revision bfe720fda9529e7a77b4fb6410b4d4945b69188b)
+++ src/ch/ClipboardMonitor.cpp	(.../ClipboardMonitor.cpp)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -23,7 +23,6 @@
 #include "ClipboardMonitor.h"
 #include "ch.h"
 #include "task.h"
-#include "../libchcore/EngineCfg.h"
 #include "CfgProperties.h"
 #include "charvect.h"
 #include "FolderDialog.h"
@@ -106,7 +105,7 @@
 	LONG lFinished=0;
 	bool bEnd=false;
 
-	chcore::engine_config& rConfig = chcore::engine_config::Acquire();
+	chcore::TCoreConfig& rConfig = chcore::TCoreConfig::Acquire();
 	for(;;)
 	{
 		if (uiCounter == 0 && rConfig.get_bool(PP_PCLIPBOARDMONITORING) && IsClipboardFormatAvailable(CF_HDROP))
Index: src/ch/MainWnd.cpp
===================================================================
diff -u -rf34d204b8eecd6817dbe4a1c3b3541cf9a8794b0 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/MainWnd.cpp	(.../MainWnd.cpp)	(revision f34d204b8eecd6817dbe4a1c3b3541cf9a8794b0)
+++ src/ch/MainWnd.cpp	(.../MainWnd.cpp)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -169,7 +169,7 @@
 	// load last state
 	CString strPath;
 	GetApp().GetProgramDataPath(strPath);
-	strPath += _T("\\tasks");
+	strPath += _T("\\Tasks\\");
 	m_tasks.SetTasksDir(strPath);
 	m_tasks.LoadDataProgress();
 	m_tasks.TasksRetryProcessing();
Index: src/ch/OptionsDlg.cpp
===================================================================
diff -u -r17059054c69cd5726f4c7d35357f3b9556471783 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/OptionsDlg.cpp	(.../OptionsDlg.cpp)	(revision 17059054c69cd5726f4c7d35357f3b9556471783)
+++ src/ch/OptionsDlg.cpp	(.../OptionsDlg.cpp)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -64,28 +64,28 @@
 
 // properties handling macros
 #define PROP_SEPARATOR(text)\
-	m_ctlProperties.AddString(text);
+	m_ctlProperties.AddString(text)
 
 #define PROP_BOOL(text, value)\
-	m_ctlProperties.AddString(text, ID_PROPERTY_COMBO_LIST, IDS_BOOLTEXT_STRING, (value));
+	m_ctlProperties.AddString(text, ID_PROPERTY_COMBO_LIST, IDS_BOOLTEXT_STRING, (value))
 
 #define PROP_UINT(text, value)\
-	m_ctlProperties.AddString(text, ID_PROPERTY_TEXT, _itot((int)(value), m_szBuffer, 10), 0);
+	m_ctlProperties.AddString(text, ID_PROPERTY_TEXT, _itot((int)(value), m_szBuffer, 10), 0)
 
 #define PROP_COMBO(text, prop_text, value)\
-	m_ctlProperties.AddString(text, ID_PROPERTY_COMBO_LIST, prop_text, (int)((value)));
+	m_ctlProperties.AddString(text, ID_PROPERTY_COMBO_LIST, prop_text, (int)((value)))
 
 #define PROP_DIR(text, prop_text, value)\
-	m_ctlProperties.AddString(text, ID_PROPERTY_DIR, (value)+CString(GetResManager().LoadString(prop_text)), 0);
+	m_ctlProperties.AddString(text, ID_PROPERTY_DIR, (value)+CString(GetResManager().LoadString(prop_text)), 0)
 
 #define PROP_PATH(text, prop_text, value)\
-	m_ctlProperties.AddString(text, ID_PROPERTY_PATH, (value)+CString(GetResManager().LoadString(prop_text)), 0);
+	m_ctlProperties.AddString(text, ID_PROPERTY_PATH, (value)+CString(GetResManager().LoadString(prop_text)), 0)
 
 #define PROP_CUSTOM_UINT(text, value, callback, param)\
-	m_ctlProperties.AddString(text, ID_PROPERTY_CUSTOM, CString(_itot((int)(value), m_szBuffer, 10)), callback, this, param, 0);
+	m_ctlProperties.AddString(text, ID_PROPERTY_CUSTOM, CString(_itot((int)(value), m_szBuffer, 10)), callback, this, param, 0)
 
 #define SKIP_SEPARATOR(pos)\
-	pos++;
+	pos++
 
 BOOL COptionsDlg::OnInitDialog() 
 {
@@ -192,7 +192,7 @@
 		TCHAR szBuf[32];
 		PROPERTYITEM* pItem;
 		pItem = (PROPERTYITEM*)pList->GetAt(pList->FindIndex(iIndex));
-		pItem->csProperties.SetAt(0, _itot(pDlg->m_cvShortcuts.size(), szBuf, 10));
+		pItem->csProperties.SetAt(0, _ui64tot(pDlg->m_cvShortcuts.size(), szBuf, 10));
 	}
 }
 
@@ -212,7 +212,7 @@
 		TCHAR szBuf[32];
 		PROPERTYITEM* pItem;
 		pItem = (PROPERTYITEM*)pList->GetAt(pList->FindIndex(iIndex));
-		pItem->csProperties.SetAt(0, _itot(pDlg->m_cvRecent.size(), szBuf, 10));
+		pItem->csProperties.SetAt(0, _ui64tot(pDlg->m_cvRecent.size(), szBuf, 10));
 	}
 }
 
@@ -232,120 +232,117 @@
 	CString strPath;
 
 	// load settings
-	PROP_SEPARATOR(IDS_PROGRAM_STRING)
-	PROP_BOOL(IDS_CLIPBOARDMONITORING_STRING, GetConfig().get_bool(PP_PCLIPBOARDMONITORING))
-	PROP_UINT(IDS_CLIPBOARDINTERVAL_STRING, GetConfig().get_signed_num(PP_PMONITORSCANINTERVAL))
-	PROP_BOOL(IDS_AUTORUNPROGRAM_STRING, GetConfig().get_bool(PP_PRELOADAFTERRESTART))
-	PROP_BOOL(IDS_CFG_CHECK_FOR_UPDATES_AT_STARTUP, GetConfig().get_bool(PP_PCHECK_FOR_UPDATES_AT_STARTUP))
-	PROP_BOOL(IDS_CFG_UPDATE_CHECK_FOR_BETA, GetConfig().get_bool(PP_PUPDATE_CHECK_FOR_BETA))
-	PROP_BOOL(IDS_AUTOSHUTDOWN_STRING, GetConfig().get_bool(PP_PSHUTDOWNAFTREFINISHED))
-	PROP_UINT(IDS_SHUTDOWNTIME_STRING, GetConfig().get_signed_num(PP_PTIMEBEFORESHUTDOWN))
-	PROP_COMBO(IDS_FORCESHUTDOWN_STRING, IDS_FORCESHUTDOWNVALUES_STRING, GetConfig().get_bool(PP_PFORCESHUTDOWN))
-	PROP_UINT(IDS_AUTOSAVEINTERVAL_STRING, GetConfig().get_signed_num(PP_PAUTOSAVEINTERVAL))
-	PROP_COMBO(IDS_CFGPRIORITYCLASS_STRING, IDS_CFGPRIORITYCLASSITEMS_STRING, PriorityClassToIndex(GetConfig().get_signed_num(PP_PPROCESSPRIORITYCLASS)))
-	PROP_DIR(IDS_TEMPFOLDER_STRING, IDS_TEMPFOLDERCHOOSE_STRING, strPath)
+	PROP_SEPARATOR(IDS_PROGRAM_STRING);
+	PROP_BOOL(IDS_CLIPBOARDMONITORING_STRING, GetConfig().get_bool(PP_PCLIPBOARDMONITORING));
+	PROP_UINT(IDS_CLIPBOARDINTERVAL_STRING, GetConfig().get_signed_num(PP_PMONITORSCANINTERVAL));
+	PROP_BOOL(IDS_AUTORUNPROGRAM_STRING, GetConfig().get_bool(PP_PRELOADAFTERRESTART));
+	PROP_BOOL(IDS_CFG_CHECK_FOR_UPDATES_AT_STARTUP, GetConfig().get_bool(PP_PCHECK_FOR_UPDATES_AT_STARTUP));
+	PROP_BOOL(IDS_CFG_UPDATE_CHECK_FOR_BETA, GetConfig().get_bool(PP_PUPDATE_CHECK_FOR_BETA));
+	PROP_BOOL(IDS_AUTOSHUTDOWN_STRING, GetConfig().get_bool(PP_PSHUTDOWNAFTREFINISHED));
+	PROP_UINT(IDS_SHUTDOWNTIME_STRING, GetConfig().get_signed_num(PP_PTIMEBEFORESHUTDOWN));
+	PROP_COMBO(IDS_FORCESHUTDOWN_STRING, IDS_FORCESHUTDOWNVALUES_STRING, GetConfig().get_bool(PP_PFORCESHUTDOWN));
+	PROP_UINT(IDS_AUTOSAVEINTERVAL_STRING, GetConfig().get_signed_num(PP_PAUTOSAVEINTERVAL));
+	PROP_COMBO(IDS_CFGPRIORITYCLASS_STRING, IDS_CFGPRIORITYCLASSITEMS_STRING, PriorityClassToIndex((int)GetConfig().get_signed_num(PP_PPROCESSPRIORITYCLASS)));
+	PROP_DIR(IDS_TEMPFOLDER_STRING, IDS_TEMPFOLDERCHOOSE_STRING, strPath);
 
 	// lang
 	CString strLangs;
-	UINT uiIndex=0;
+	size_t stIndex=0;
 	for (vector<ictranslate::CLangData>::iterator it=m_vld.begin();it != m_vld.end();it++)
 	{
 		strLangs+=(*it).GetLangName();
 		strLangs+=_T("!");
 		if (_tcsicmp((*it).GetFilename(true), GetResManager().m_ld.GetFilename(true)) == 0)
-			uiIndex=it-m_vld.begin();
+			stIndex = it - m_vld.begin();
 	}
 	strLangs.TrimRight(_T('!'));
 
-	PROP_COMBO(IDS_LANGUAGE_STRING, strLangs, uiIndex)
+	PROP_COMBO(IDS_LANGUAGE_STRING, strLangs, stIndex);
 
 	/////////////////
 	PROP_SEPARATOR(IDS_STATUSWINDOW_STRING);
-	PROP_UINT(IDS_REFRESHSTATUSINTERVAL_STRING, GetConfig().get_signed_num(PP_STATUSREFRESHINTERVAL))
-	PROP_BOOL(IDS_STATUSSHOWDETAILS_STRING, GetConfig().get_bool(PP_STATUSSHOWDETAILS))
-	PROP_BOOL(IDS_STATUSAUTOREMOVE_STRING, GetConfig().get_bool(PP_STATUSAUTOREMOVEFINISHED))
+	PROP_UINT(IDS_REFRESHSTATUSINTERVAL_STRING, GetConfig().get_signed_num(PP_STATUSREFRESHINTERVAL));
+	PROP_BOOL(IDS_STATUSSHOWDETAILS_STRING, GetConfig().get_bool(PP_STATUSSHOWDETAILS));
+	PROP_BOOL(IDS_STATUSAUTOREMOVE_STRING, GetConfig().get_bool(PP_STATUSAUTOREMOVEFINISHED));
 
-	PROP_SEPARATOR(IDS_MINIVIEW_STRING)
-	PROP_BOOL(IDS_SHOWFILENAMES_STRING, GetConfig().get_bool(PP_MVSHOWFILENAMES))
-	PROP_BOOL(IDS_SHOWSINGLETASKS_STRING, GetConfig().get_bool(PP_MVSHOWSINGLETASKS))
-	PROP_UINT(IDS_MINIVIEWREFRESHINTERVAL_STRING, GetConfig().get_signed_num(PP_MVREFRESHINTERVAL))
-	PROP_BOOL(IDS_MINIVIEWSHOWAFTERSTART_STRING, GetConfig().get_bool(PP_MVAUTOSHOWWHENRUN))
-	PROP_BOOL(IDS_MINIVIEWAUTOHIDE_STRING, GetConfig().get_bool(PP_MVAUTOHIDEWHENEMPTY))
-	PROP_BOOL(IDS_MINIVIEWSMOOTHPROGRESS_STRING, GetConfig().get_bool(PP_MVUSESMOOTHPROGRESS))
+	PROP_SEPARATOR(IDS_MINIVIEW_STRING);
+	PROP_BOOL(IDS_SHOWFILENAMES_STRING, GetConfig().get_bool(PP_MVSHOWFILENAMES));
+	PROP_BOOL(IDS_SHOWSINGLETASKS_STRING, GetConfig().get_bool(PP_MVSHOWSINGLETASKS));
+	PROP_UINT(IDS_MINIVIEWREFRESHINTERVAL_STRING, GetConfig().get_signed_num(PP_MVREFRESHINTERVAL));
+	PROP_BOOL(IDS_MINIVIEWSHOWAFTERSTART_STRING, GetConfig().get_bool(PP_MVAUTOSHOWWHENRUN));
+	PROP_BOOL(IDS_MINIVIEWAUTOHIDE_STRING, GetConfig().get_bool(PP_MVAUTOHIDEWHENEMPTY));
+	PROP_BOOL(IDS_MINIVIEWSMOOTHPROGRESS_STRING, GetConfig().get_bool(PP_MVUSESMOOTHPROGRESS));
 
-	PROP_SEPARATOR(IDS_CFGFOLDERDIALOG_STRING)
-	PROP_BOOL(IDS_CFGFDEXTVIEW_STRING, GetConfig().get_bool(PP_FDEXTENDEDVIEW))
-	PROP_UINT(IDS_CFGFDWIDTH_STRING, GetConfig().get_signed_num(PP_FDWIDTH))
-	PROP_UINT(IDS_CFGFDHEIGHT_STRING, GetConfig().get_signed_num(PP_FDHEIGHT))
-	PROP_COMBO(IDS_CFGFDSHORTCUTS_STRING, IDS_CFGFDSHORTCUTSSTYLES_STRING, GetConfig().get_signed_num(PP_FDSHORTCUTLISTSTYLE))
-	PROP_BOOL(IDS_CFGFDIGNOREDIALOGS_STRING, GetConfig().get_bool(PP_FDIGNORESHELLDIALOGS))
+	PROP_SEPARATOR(IDS_CFGFOLDERDIALOG_STRING);
+	PROP_BOOL(IDS_CFGFDEXTVIEW_STRING, GetConfig().get_bool(PP_FDEXTENDEDVIEW));
+	PROP_UINT(IDS_CFGFDWIDTH_STRING, GetConfig().get_signed_num(PP_FDWIDTH));
+	PROP_UINT(IDS_CFGFDHEIGHT_STRING, GetConfig().get_signed_num(PP_FDHEIGHT));
+	PROP_COMBO(IDS_CFGFDSHORTCUTS_STRING, IDS_CFGFDSHORTCUTSSTYLES_STRING, GetConfig().get_signed_num(PP_FDSHORTCUTLISTSTYLE));
+	PROP_BOOL(IDS_CFGFDIGNOREDIALOGS_STRING, GetConfig().get_bool(PP_FDIGNORESHELLDIALOGS));
 
-	PROP_SEPARATOR(IDS_CFGSHELL_STRING)
-	PROP_BOOL(IDS_CFGSHCOPY_STRING, GetConfig().get_bool(PP_SHSHOWCOPY))
-	PROP_BOOL(IDS_CFGSHMOVE_STRING, GetConfig().get_bool(PP_SHSHOWMOVE))
-	PROP_BOOL(IDS_CFGSHCMSPECIAL_STRING, GetConfig().get_bool(PP_SHSHOWCOPYMOVE))
-	PROP_BOOL(IDS_CFGSHPASTE_STRING, GetConfig().get_bool(PP_SHSHOWPASTE))
-	PROP_BOOL(IDS_CFGSHPASTESPECIAL_STRING, GetConfig().get_bool(PP_SHSHOWPASTESPECIAL))
-	PROP_BOOL(IDS_CFGSHCOPYTO_STRING, GetConfig().get_bool(PP_SHSHOWCOPYTO))
-	PROP_BOOL(IDS_CFGSHMOVETO_STRING, GetConfig().get_bool(PP_SHSHOWMOVETO))
-	PROP_BOOL(IDS_CFGSHCMTOSPECIAL_STRING, GetConfig().get_bool(PP_SHSHOWCOPYMOVETO))
-	PROP_BOOL(IDS_CFGSHSHOWFREESPACE_STRING, GetConfig().get_bool(PP_SHSHOWFREESPACE))
-	PROP_BOOL(IDS_CFGSHSHOWICONS_STRING, GetConfig().get_bool(PP_SHSHOWSHELLICONS))
-	PROP_BOOL(IDS_CFGSHINTERCEPTDRAG_STRING, GetConfig().get_bool(PP_SHINTERCEPTDRAGDROP))
+	PROP_SEPARATOR(IDS_CFGSHELL_STRING);
+	PROP_BOOL(IDS_CFGSHCOPY_STRING, GetConfig().get_bool(PP_SHSHOWCOPY));
+	PROP_BOOL(IDS_CFGSHMOVE_STRING, GetConfig().get_bool(PP_SHSHOWMOVE));
+	PROP_BOOL(IDS_CFGSHCMSPECIAL_STRING, GetConfig().get_bool(PP_SHSHOWCOPYMOVE));
+	PROP_BOOL(IDS_CFGSHPASTE_STRING, GetConfig().get_bool(PP_SHSHOWPASTE));
+	PROP_BOOL(IDS_CFGSHPASTESPECIAL_STRING, GetConfig().get_bool(PP_SHSHOWPASTESPECIAL));
+	PROP_BOOL(IDS_CFGSHCOPYTO_STRING, GetConfig().get_bool(PP_SHSHOWCOPYTO));
+	PROP_BOOL(IDS_CFGSHMOVETO_STRING, GetConfig().get_bool(PP_SHSHOWMOVETO));
+	PROP_BOOL(IDS_CFGSHCMTOSPECIAL_STRING, GetConfig().get_bool(PP_SHSHOWCOPYMOVETO));
+	PROP_BOOL(IDS_CFGSHSHOWFREESPACE_STRING, GetConfig().get_bool(PP_SHSHOWFREESPACE));
+	PROP_BOOL(IDS_CFGSHSHOWICONS_STRING, GetConfig().get_bool(PP_SHSHOWSHELLICONS));
+	PROP_BOOL(IDS_CFGSHINTERCEPTDRAG_STRING, GetConfig().get_bool(PP_SHINTERCEPTDRAGDROP));
 	PROP_BOOL(IDS_CFGINTERCEPTKEYACTION_STRING, GetConfig().get_bool(PP_SHINTERCEPTKEYACTIONS));
 	PROP_BOOL(IDS_CFGINTERCEPTCONTEXTMENU_STRING, GetConfig().get_bool(PP_SHINTERCEPTCTXMENUACTIONS));
 
-	PROP_SEPARATOR(IDS_PROCESSINGTHREAD_STRING)
-	PROP_BOOL(IDS_AUTOCOPYREST_STRING, GetConfig().get_bool(PP_CMUSEAUTOCOMPLETEFILES))
-	PROP_BOOL(IDS_SETDESTATTRIB_STRING, GetConfig().get_bool(PP_CMSETDESTATTRIBUTES))
-	PROP_BOOL(IDS_SETDESTTIME_STRING, GetConfig().get_bool(PP_CMSETDESTDATE))
-	PROP_BOOL(IDS_PROTECTROFILES_STRING, GetConfig().get_bool(PP_CMPROTECTROFILES))
-	PROP_UINT(IDS_LIMITOPERATIONS_STRING, GetConfig().get_signed_num(PP_CMLIMITMAXOPERATIONS))
-	PROP_BOOL(IDS_READSIZEBEFOREBLOCK_STRING, GetConfig().get_bool(PP_CMREADSIZEBEFOREBLOCKING))
-	PROP_COMBO(IDS_SHOWVISUALFEEDBACK_STRING, IDS_FEEDBACKTYPE_STRING, GetConfig().get_signed_num(PP_CMSHOWVISUALFEEDBACK))
-	PROP_BOOL(IDS_USETIMEDDIALOGS_STRING, GetConfig().get_bool(PP_CMUSETIMEDFEEDBACK))
-	PROP_UINT(IDS_TIMEDDIALOGINTERVAL_STRING, GetConfig().get_signed_num(PP_CMFEEDBACKTIME))
-	PROP_BOOL(IDS_AUTORETRYONERROR_STRING, GetConfig().get_bool(PP_CMAUTORETRYONERROR))
-	PROP_UINT(IDS_AUTORETRYINTERVAL_STRING, GetConfig().get_signed_num(PP_CMAUTORETRYINTERVAL))
-	PROP_COMBO(IDS_DEFAULTPRIORITY_STRING, MakeCompoundString(IDS_PRIORITY0_STRING, 7, _T("!")), PriorityToIndex(GetConfig().get_signed_num(PP_CMDEFAULTPRIORITY)))
-	PROP_BOOL(IDS_CFGDISABLEPRIORITYBOOST_STRING, GetConfig().get_bool(PP_CMDISABLEPRIORITYBOOST))
-	PROP_BOOL(IDS_DELETEAFTERFINISHED_STRING, GetConfig().get_bool(PP_CMDELETEAFTERFINISHED))
-	PROP_BOOL(IDS_CREATELOGFILES_STRING, GetConfig().get_bool(PP_CMCREATELOG))
+	PROP_SEPARATOR(IDS_PROCESSINGTHREAD_STRING);
+	PROP_BOOL(IDS_AUTOCOPYREST_STRING, GetConfig().get_bool(PP_CMUSEAUTOCOMPLETEFILES));
+	PROP_BOOL(IDS_SETDESTATTRIB_STRING, GetConfig().get_bool(PP_CMSETDESTATTRIBUTES));
+	PROP_BOOL(IDS_SETDESTTIME_STRING, GetConfig().get_bool(PP_CMSETDESTDATE));
+	PROP_BOOL(IDS_PROTECTROFILES_STRING, GetConfig().get_bool(PP_CMPROTECTROFILES));
+	PROP_UINT(IDS_LIMITOPERATIONS_STRING, GetConfig().get_signed_num(PP_CMLIMITMAXOPERATIONS));
+	PROP_BOOL(IDS_READSIZEBEFOREBLOCK_STRING, GetConfig().get_bool(PP_CMREADSIZEBEFOREBLOCKING));
+	PROP_COMBO(IDS_SHOWVISUALFEEDBACK_STRING, IDS_FEEDBACKTYPE_STRING, GetConfig().get_signed_num(PP_CMSHOWVISUALFEEDBACK));
+	PROP_BOOL(IDS_USETIMEDDIALOGS_STRING, GetConfig().get_bool(PP_CMUSETIMEDFEEDBACK));
+	PROP_UINT(IDS_TIMEDDIALOGINTERVAL_STRING, GetConfig().get_signed_num(PP_CMFEEDBACKTIME));
+	PROP_BOOL(IDS_AUTORETRYONERROR_STRING, GetConfig().get_bool(PP_CMAUTORETRYONERROR));
+	PROP_UINT(IDS_AUTORETRYINTERVAL_STRING, GetConfig().get_signed_num(PP_CMAUTORETRYINTERVAL));
+	PROP_COMBO(IDS_DEFAULTPRIORITY_STRING, MakeCompoundString(IDS_PRIORITY0_STRING, 7, _T("!")), PriorityToIndex((int)GetConfig().get_signed_num(PP_CMDEFAULTPRIORITY)));
+	PROP_BOOL(IDS_CFGDISABLEPRIORITYBOOST_STRING, GetConfig().get_bool(PP_CMDISABLEPRIORITYBOOST));
+	PROP_BOOL(IDS_DELETEAFTERFINISHED_STRING, GetConfig().get_bool(PP_CMDELETEAFTERFINISHED));
+	PROP_BOOL(IDS_CREATELOGFILES_STRING, GetConfig().get_bool(PP_CMCREATELOG));
 
 	// Buffer
-	PROP_SEPARATOR(IDS_OPTIONSBUFFER_STRING)
-	PROP_BOOL(IDS_AUTODETECTBUFFERSIZE_STRING, GetConfig().get_bool(PP_BFUSEONLYDEFAULT))
-	PROP_CUSTOM_UINT(IDS_DEFAULTBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFDEFAULT), &CustomPropertyCallbackProc, 0)
-	PROP_CUSTOM_UINT(IDS_ONEDISKBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFONEDISK), &CustomPropertyCallbackProc, 1)
-	PROP_CUSTOM_UINT(IDS_TWODISKSBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFTWODISKS), &CustomPropertyCallbackProc, 2)
-	PROP_CUSTOM_UINT(IDS_CDBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFCD), &CustomPropertyCallbackProc, 3)
-	PROP_CUSTOM_UINT(IDS_LANBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFLAN), &CustomPropertyCallbackProc, 4)
-	PROP_BOOL(IDS_USENOBUFFERING_STRING, GetConfig().get_bool(PP_BFUSENOBUFFERING))
-	PROP_UINT(IDS_LARGEFILESMINSIZE_STRING, GetConfig().get_signed_num(PP_BFBOUNDARYLIMIT))
+	PROP_SEPARATOR(IDS_OPTIONSBUFFER_STRING);
+	PROP_BOOL(IDS_AUTODETECTBUFFERSIZE_STRING, GetConfig().get_bool(PP_BFUSEONLYDEFAULT));
+	PROP_CUSTOM_UINT(IDS_DEFAULTBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFDEFAULT), &CustomPropertyCallbackProc, 0);
+	PROP_CUSTOM_UINT(IDS_ONEDISKBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFONEDISK), &CustomPropertyCallbackProc, 1);
+	PROP_CUSTOM_UINT(IDS_TWODISKSBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFTWODISKS), &CustomPropertyCallbackProc, 2);
+	PROP_CUSTOM_UINT(IDS_CDBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFCD), &CustomPropertyCallbackProc, 3);
+	PROP_CUSTOM_UINT(IDS_LANBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_BFLAN), &CustomPropertyCallbackProc, 4);
+	PROP_BOOL(IDS_USENOBUFFERING_STRING, GetConfig().get_bool(PP_BFUSENOBUFFERING));
+	PROP_UINT(IDS_LARGEFILESMINSIZE_STRING, GetConfig().get_signed_num(PP_BFBOUNDARYLIMIT));
 
+	PROP_SEPARATOR(IDS_CFGLOGFILE_STRING);
+	PROP_BOOL(IDS_CFGENABLELOGGING_STRING, GetConfig().get_bool(PP_LOGENABLELOGGING));
+	PROP_UINT(IDS_CFGMAXLIMIT_STRING, GetConfig().get_signed_num(PP_LOGMAXSIZE));
+	PROP_COMBO(IDS_CFGLOGLEVEL, IDS_CFGLOGLEVEL_VALUES, GetConfig().get_unsigned_num(PP_LOGLEVEL));
 
 	// Sounds
-	PROP_SEPARATOR(IDS_SOUNDS_STRING)
-	PROP_BOOL(IDS_PLAYSOUNDS_STRING, GetConfig().get_bool(PP_SNDPLAYSOUNDS))
+	PROP_SEPARATOR(IDS_SOUNDS_STRING);
+	PROP_BOOL(IDS_PLAYSOUNDS_STRING, GetConfig().get_bool(PP_SNDPLAYSOUNDS));
 	GetConfig().get_string(PP_SNDERRORSOUNDPATH, strPath.GetBuffer(_MAX_PATH), _MAX_PATH);
 	strPath.ReleaseBuffer();
-	PROP_PATH(IDS_SOUNDONERROR_STRING, IDS_SOUNDSWAVFILTER_STRING, strPath)
+	PROP_PATH(IDS_SOUNDONERROR_STRING, IDS_SOUNDSWAVFILTER_STRING, strPath);
 	GetConfig().get_string(PP_SNDFINISHEDSOUNDPATH, strPath.GetBuffer(_MAX_PATH), _MAX_PATH);
 	strPath.ReleaseBuffer();
-	PROP_PATH(IDS_SOUNDONFINISH_STRING, IDS_SOUNDSWAVFILTER_STRING, strPath)
+	PROP_PATH(IDS_SOUNDONFINISH_STRING, IDS_SOUNDSWAVFILTER_STRING, strPath);
 
-	PROP_SEPARATOR(IDS_CFGSHORTCUTS_STRING)
-	PROP_CUSTOM_UINT(IDS_CFGSCCOUNT_STRING, m_cvShortcuts.size(), &ShortcutsPropertyCallbackProc, 0)
+	PROP_SEPARATOR(IDS_CFGSHORTCUTS_STRING);
+	PROP_CUSTOM_UINT(IDS_CFGSCCOUNT_STRING, m_cvShortcuts.size(), &ShortcutsPropertyCallbackProc, 0);
 
-	PROP_SEPARATOR(IDS_CFGRECENT_STRING)
-	PROP_CUSTOM_UINT(IDS_CFGRPCOUNT_STRING, m_cvRecent.size(), &RecentPropertyCallbackProc, 0)
-
- /*	PROP_SEPARATOR(IDS_CFGLOGFILE_STRING)
-	PROP_BOOL(IDS_CFGENABLELOGGING_STRING, GetConfig().get_bool(PP_LOGENABLELOGGING))
-	PROP_BOOL(IDS_CFGLIMITATION_STRING, GetConfig().get_bool(PP_LOGLIMITATION))
-	PROP_UINT(IDS_CFGMAXLIMIT_STRING, GetConfig().get_signed_num(PP_LOGMAXLIMIT))
-	PROP_BOOL(IDS_CFGLOGPRECISELIMITING_STRING, GetConfig().get_bool(PP_LOGPRECISELIMITING))
-	PROP_UINT(IDS_CFGTRUNCBUFFERSIZE_STRING, GetConfig().get_signed_num(PP_LOGTRUNCBUFFERSIZE))*/
+	PROP_SEPARATOR(IDS_CFGRECENT_STRING);
+	PROP_CUSTOM_UINT(IDS_CFGRPCOUNT_STRING, m_cvRecent.size(), &RecentPropertyCallbackProc, 0);
 }
 
 void COptionsDlg::ApplyProperties()
@@ -355,7 +352,7 @@
 
 	icpf::config& rConfig = GetConfig();
 
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.set_bool(PP_PCLIPBOARDMONITORING, GetBoolProp(iPosition++));
 	rConfig.set_signed_num(PP_PMONITORSCANINTERVAL, GetUintProp(iPosition++));
 	rConfig.set_bool(PP_PRELOADAFTERRESTART, GetBoolProp(iPosition++));
@@ -378,27 +375,27 @@
 	else
 		rConfig.set_string(PP_PLANGUAGE, pszSrc);
 
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.set_signed_num(PP_STATUSREFRESHINTERVAL, GetUintProp(iPosition++));
 	rConfig.set_bool(PP_STATUSSHOWDETAILS, GetBoolProp(iPosition++));
 	rConfig.set_bool(PP_STATUSAUTOREMOVEFINISHED, GetBoolProp(iPosition++));
 
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.set_bool(PP_MVSHOWFILENAMES, GetBoolProp(iPosition++));
 	rConfig.set_bool(PP_MVSHOWSINGLETASKS, GetBoolProp(iPosition++));
 	rConfig.set_signed_num(PP_MVREFRESHINTERVAL, GetUintProp(iPosition++));
 	rConfig.set_bool(PP_MVAUTOSHOWWHENRUN, GetBoolProp(iPosition++));
 	rConfig.set_bool(PP_MVAUTOHIDEWHENEMPTY, GetBoolProp(iPosition++));
 	rConfig.set_bool(PP_MVUSESMOOTHPROGRESS, GetBoolProp(iPosition++));
 
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.set_bool(PP_FDEXTENDEDVIEW, GetBoolProp(iPosition++));
 	rConfig.set_signed_num(PP_FDWIDTH, GetUintProp(iPosition++));
 	rConfig.set_signed_num(PP_FDHEIGHT, GetUintProp(iPosition++));
 	rConfig.set_signed_num(PP_FDSHORTCUTLISTSTYLE, GetIndexProp(iPosition++));
 	rConfig.set_bool(PP_FDIGNORESHELLDIALOGS, GetBoolProp(iPosition++));
 
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.set_bool(PP_SHSHOWCOPY, GetBoolProp(iPosition++));
 	rConfig.set_bool(PP_SHSHOWMOVE, GetBoolProp(iPosition++));
 	rConfig.set_bool(PP_SHSHOWCOPYMOVE, GetBoolProp(iPosition++));
@@ -413,7 +410,7 @@
 	rConfig.set_bool(PP_SHINTERCEPTKEYACTIONS, GetBoolProp(iPosition++));
 	rConfig.set_bool(PP_SHINTERCEPTCTXMENUACTIONS, GetBoolProp(iPosition++));
 
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.set_bool(PP_CMUSEAUTOCOMPLETEFILES, GetBoolProp(iPosition++));
 	rConfig.set_bool(PP_CMSETDESTATTRIBUTES, GetBoolProp(iPosition++));
 	rConfig.set_bool(PP_CMSETDESTDATE, GetBoolProp(iPosition++));
@@ -431,7 +428,7 @@
 	rConfig.set_bool(PP_CMCREATELOG, GetBoolProp(iPosition++));
 
 	// Buffer
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.set_bool(PP_BFUSEONLYDEFAULT, GetBoolProp(iPosition++));
 	rConfig.set_signed_num(PP_BFDEFAULT, GetUintProp(iPosition++));
 	rConfig.set_signed_num(PP_BFONEDISK, GetUintProp(iPosition++));
@@ -442,28 +439,26 @@
 	rConfig.set_signed_num(PP_BFBOUNDARYLIMIT, GetUintProp(iPosition++));
 
 	// log file
-/*	SKIP_SEPARATOR(iPosition)
-	pConfig->set_bool(PP_LOGENABLELOGGING, GetBoolProp(iPosition++));
-	pConfig->set_bool(PP_LOGLIMITATION, GetBoolProp(iPosition++));
-	pConfig->set_signed_num(PP_LOGMAXLIMIT, GetUintProp(iPosition++));
-	pConfig->set_bool(PP_LOGPRECISELIMITING, GetBoolProp(iPosition++));
-	pConfig->set_signed_num(PP_LOGTRUNCBUFFERSIZE, GetUintProp(iPosition++));*/
+	SKIP_SEPARATOR(iPosition);
+	rConfig.set_bool(PP_LOGENABLELOGGING, GetBoolProp(iPosition++));
+	rConfig.set_signed_num(PP_LOGMAXSIZE, GetUintProp(iPosition++));
+	rConfig.set_unsigned_num(PP_LOGLEVEL, GetIndexProp(iPosition++));
 
 	// Sounds
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.set_bool(PP_SNDPLAYSOUNDS, GetBoolProp(iPosition++));
 	rConfig.set_string(PP_SNDERRORSOUNDPATH, GetStringProp(iPosition++));
 	rConfig.set_string(PP_SNDFINISHEDSOUNDPATH, GetStringProp(iPosition++));
 
 	// shortcuts & recent paths
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.clear_array_values(PP_SHORTCUTS);
 	for(char_vector::iterator it = m_cvShortcuts.begin(); it != m_cvShortcuts.end(); it++)
 	{
 		rConfig.set_string(PP_SHORTCUTS, (*it), icpf::property::action_add);
 	}
 	
-	SKIP_SEPARATOR(iPosition)
+	SKIP_SEPARATOR(iPosition);
 	rConfig.clear_array_values(PP_RECENTPATHS);
 	for(char_vector::iterator it = m_cvRecent.begin(); it != m_cvRecent.end(); it++)
 	{
Index: src/ch/Stdafx.h
===================================================================
diff -u -rf34d204b8eecd6817dbe4a1c3b3541cf9a8794b0 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/Stdafx.h	(.../Stdafx.h)	(revision f34d204b8eecd6817dbe4a1c3b3541cf9a8794b0)
+++ src/ch/Stdafx.h	(.../Stdafx.h)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -39,6 +39,7 @@
 #include "../libictranslate/LanguageDialog.h"
 #include <boost/assert.hpp>
 #include "../common/ErrorConstants.h"
+#include "../libchcore/TLogger.h"
 
 #ifdef _UNICODE
 #if defined _M_IX86
Index: src/ch/UpdateChecker.cpp
===================================================================
diff -u -rf34d204b8eecd6817dbe4a1c3b3541cf9a8794b0 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/UpdateChecker.cpp	(.../UpdateChecker.cpp)	(revision f34d204b8eecd6817dbe4a1c3b3541cf9a8794b0)
+++ src/ch/UpdateChecker.cpp	(.../UpdateChecker.cpp)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -299,9 +299,13 @@
 /// @param[in] lpvStatusInformation		Additional status information.
 /// @param[in] dwStatusInformationLength Length of lpvStatusInformation.
 // ============================================================================
-void CAsyncHttpFile::InternetStatusCallback(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD /*dwStatusInformationLength*/)
+void CAsyncHttpFile::InternetStatusCallback(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength)
 {
-	TRACE(_T("[InternetStatusCallback] hInternet: %p, dwInternetStatus: %lu\n"), hInternet, dwInternetStatus);
+	CString strMsg;
+	strMsg.Format(_T("[CAsyncHttpFile::InternetStatusCallback] hInternet: %p, dwContext: %lu, dwInternetStatus: %lu, lpvStatusInformation: %p, dwStatusInformationLength: %lu\n"),
+		hInternet, dwContext, dwInternetStatus, lpvStatusInformation, dwStatusInformationLength);
+	LOG_DEBUG(strMsg);
+
 	CAsyncHttpFile* pAsyncHttpFile = (CAsyncHttpFile*)dwContext;
 	BOOST_ASSERT(pAsyncHttpFile);
 	if(!pAsyncHttpFile)
Index: src/ch/ch.cpp
===================================================================
diff -u -rbfe720fda9529e7a77b4fb6410b4d4945b69188b -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/ch.cpp	(.../ch.cpp)	(revision bfe720fda9529e7a77b4fb6410b4d4945b69188b)
+++ src/ch/ch.cpp	(.../ch.cpp)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -83,11 +83,10 @@
 }
 
 CCopyHandlerApp::CCopyHandlerApp() :
-	m_lfLog(),
-	m_piShellExtControl(NULL)
+	m_piShellExtControl(NULL),
+	m_hMapObject(NULL),
+	m_pMainWindow(NULL)
 {
-	m_pMainWindow=NULL;
-
 	// this is the one-instance application
 	InitProtection();
 }
@@ -124,9 +123,9 @@
 	return ictranslate::CResourceManager::Acquire();
 }
 
-chcore::engine_config& GetConfig()
+chcore::TCoreConfig& GetConfig()
 {
-	return chcore::engine_config::Acquire();
+	return chcore::TCoreConfig::Acquire();
 }
 
 int MsgBox(UINT uiID, UINT nType, UINT nIDHelp)
@@ -210,76 +209,91 @@
 
 BOOL CCopyHandlerApp::InitInstance()
 {
-	// set the exception handler to catch the crash dumps
+	// ================================= Crash handling =======================================
 	SetUnhandledExceptionFilter(&MyUnhandledExceptionFilter);
 
-	HRESULT hResult = CoInitializeEx(NULL, COINIT_MULTITHREADED);
-	if(FAILED(hResult))
-		AfxMessageBox(_T("Cannot initialize COM, the application will now exit."), MB_ICONERROR | MB_OK);
+	// ================================= Configuration ========================================
+	CString strPath;
+	CString strCfgPath;
+	CString strLogPath;
 
-	// InitCommonControlsEx() is required on Windows XP if an application
-	// manifest specifies use of ComCtl32.dll version 6 or later to enable
-	// visual styles.  Otherwise, any window creation will fail.
-	INITCOMMONCONTROLSEX InitCtrls;
-	InitCtrls.dwSize = sizeof(InitCtrls);
-	// Set this to include all the common control classes you want to use
-	// in your application.
-	InitCtrls.dwICC = ICC_WIN95_CLASSES;
-	InitCommonControlsEx(&InitCtrls);
+	// note that the GetProgramDataPath() below should create a directory; ExpandPath() could
+	// depend on the directory to be created earlier
+	if(!GetProgramDataPath(strPath))
+	{
+		AfxMessageBox(_T("Cannot initialize Copy Handler (data path cannot be established)."), MB_ICONERROR | MB_OK);
+		return FALSE;
+	}
 
-	EnableHtmlHelp();
-	//SetHelpMode(afxHTMLHelp);
+	strCfgPath = strPath + _T("\\ch.ini");
 
-	CWinApp::InitInstance();
-
-	m_hMapObject = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(CSharedConfigStruct), _T("CHLMFile"));
-	if (m_hMapObject == NULL)
-		return FALSE; 
-	
-	// Get a pointer to the file-mapped shared memory.
-	g_pscsShared=(CSharedConfigStruct*)MapViewOfFile(m_hMapObject, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
-	if (g_pscsShared == NULL) 
-		return FALSE; 
-	
-	chcore::engine_config& rConfig = chcore::engine_config::Acquire();
-	ictranslate::CResourceManager& rResManager = ictranslate::CResourceManager::Acquire();
-
-	// load configuration
+	// initialize configuration file
+	chcore::TCoreConfig& rConfig = chcore::TCoreConfig::Acquire();
 	rConfig.set_callback(ConfigPropertyChangedCallback, NULL);
-	CString strPath;
-	// note that the GetProgramDataPath() below should create a directory; ExpandPath() could
-	// depend on the directory to be created earlier
-	if(GetProgramDataPath(strPath))
+
+	// read the configuration
+	try
 	{
-		strPath += _T("\\ch.ini");
-		try
-		{
-			rConfig.read(strPath);
-		}
-		catch(...)
-		{
-		}
+		rConfig.read(strCfgPath);
 	}
+	catch(...)
+	{
+	}
 
 	// set working dir for the engine
-	rConfig.set_base_path(strPath);
+	rConfig.SetBasePath(strPath);
 	// register all properties
 	RegisterProperties(&rConfig);
 
-	// set this process class
-	HANDLE hProcess=GetCurrentProcess();
-	::SetPriorityClass(hProcess, (DWORD)rConfig.get_signed_num(PP_PPROCESSPRIORITYCLASS));
+	// ================================= Logging ========================================
+	// initialize the global log file if it is requested by configuration file
+	strLogPath = strPath +  + _T("\\ch.log");
 
+	chcore::TLogger& rLogger = chcore::TLogger::Acquire();
+	try
+	{
+		rLogger.init(strLogPath, (int_t)rConfig.get_signed_num(PP_LOGMAXSIZE), (int_t)rConfig.get_unsigned_num(PP_LOGLEVEL), false, false);
+		rLogger.Enable(rConfig.get_bool(PP_LOGENABLELOGGING));
+	}
+	catch(...)
+	{
+		BOOST_ASSERT(false);
+	}
+
+	LOG_INFO(_T("============================ Initializing Copy Handler ============================"));
+	LOG_INFO(_T(""));
+
+	// ================================= COM ========================================
+	LOG_INFO(_T("Initializing COM"));
+
+	HRESULT hResult = CoInitializeEx(NULL, 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);
+		AfxMessageBox(strMsg, MB_ICONERROR | MB_OK);
+		return FALSE;
+	}
+
+	// ================================= Resource manager ========================================
+	LOG_INFO(_T("Initializing resource manager..."));
+
+	ictranslate::CResourceManager& rResManager = ictranslate::CResourceManager::Acquire();
+
 	// set current language
 	TCHAR szPath[_MAX_PATH];
+
 	rResManager.Init(AfxGetInstanceHandle());
 	rResManager.SetCallback(ResManCallback);
 	rConfig.get_string(PP_PLANGUAGE, szPath, _MAX_PATH);
 	TRACE(_T("Help path=%s\n"), szPath);
-	if (!rResManager.SetLanguage(ExpandPath(szPath)))
+	if(!rResManager.SetLanguage(ExpandPath(szPath)))
 	{
 		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."), szPath);
+		LOG_ERROR(szData);
 		AfxMessageBox(szData, MB_ICONSTOP | MB_OK);
 		return FALSE;
 	}
@@ -289,31 +303,47 @@
 	// for dialogs
 	ictranslate::CLanguageDialog::SetResManager(&rResManager);
 
-	// initialize log file
-	rConfig.get_string(PP_LOGPATH, szPath, _MAX_PATH);
-	m_lfLog.init(ExpandPath(szPath), (int_t)rConfig.get_signed_num(PP_LOGMAXLIMIT), icpf::log_file::level_debug, false, false);
+	EnableHtmlHelp();
 
-	// TODO: remove unused properties from configuration
-/*	m_lfLog.EnableLogging(m_cfgManager.GetBoolValue(PP_LOGENABLELOGGING));
-	m_lfLog.SetPreciseLimiting(m_cfgManager.GetBoolValue(PP_LOGPRECISELIMITING));
-	m_lfLog.SetSizeLimit(m_cfgManager.GetBoolValue(PP_LOGLIMITATION), m_cfgManager.GetIntValue(PP_LOGMAXLIMIT));
-	m_lfLog.SetTruncateBufferSize(m_cfgManager.GetIntValue(PP_LOGTRUNCBUFFERSIZE));
-	m_lfLog.Init(ExpandPath(szPath), GetResManager());*/
-
-#ifndef _DEBUG		// for easier writing the program - doesn't collide with std CH
-	// set "run with system" registry settings
-	SetAutorun(rConfig.get_bool(PP_PRELOADAFTERRESTART));
-#endif
-
+	// ================================= Checking for running instances of CH ========================================
 	// check instance - return false if it's the second one
-	if (!IsFirstInstance())
+	LOG_INFO(_T("Checking for other running instances of Copy Handler"));
+	if(!IsFirstInstance())
 	{
+		LOG_WARNING(_T("Other instance of Copy Handler is already running. Exiting."));
 		MsgBox(IDS_ONECOPY_STRING);
 		return FALSE;
 	}
 
+	// ================================= Common controls ========================================
+	LOG_INFO(_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
+	// visual styles.  Otherwise, any window creation will fail.
+	INITCOMMONCONTROLSEX InitCtrls;
+	InitCtrls.dwSize = sizeof(InitCtrls);
+	// Set this to include all the common control classes you want to use
+	// in your application.
+	InitCtrls.dwICC = ICC_WIN95_CLASSES;
+	InitCommonControlsEx(&InitCtrls);
+
+	// ================================= Shell extension ========================================
+	LOG_INFO(_T("Initializing shared memory for communication with shell extension"));
+
+	m_hMapObject = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(CSharedConfigStruct), _T("CHLMFile"));
+	if (m_hMapObject == NULL)
+		return FALSE; 
+	
+	// Get a pointer to the file-mapped shared memory.
+	g_pscsShared=(CSharedConfigStruct*)MapViewOfFile(m_hMapObject, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
+	if (g_pscsShared == NULL) 
+		return FALSE; 
+
+	LOG_INFO(_T("Checking shell extension compatibility"));
+
 	// calculate ch version
-	LONG lCHVersion = PRODUCT_VERSION1 << 24 | PRODUCT_VERSION2 << 16 | PRODUCT_VERSION3 << 8 | PRODUCT_VERSION4;
+	long lCHVersion = PRODUCT_VERSION1 << 24 | PRODUCT_VERSION2 << 16 | PRODUCT_VERSION3 << 8 | PRODUCT_VERSION4;
 
 	// check the version of shell extension
 	LONG lVersion = 0;
@@ -328,6 +358,10 @@
 		hResult = m_piShellExtControl->SetFlags(eShellExt_Enabled, eShellExt_Enabled);
 	if(FAILED(hResult) || lCHVersion != lVersion)
 	{
+		CString strMsg;
+		strMsg.Format(_T("Shell extension has different version (0x%lx) than Copy Handler (0x%lx). Shell extension will be disabled."), lVersion, lCHVersion);
+
+		LOG_WARNING(strMsg);
 		MsgBox(IDS_SHELL_EXTENSION_MISMATCH_STRING);
 
 		if(m_piShellExtControl)
@@ -337,13 +371,30 @@
 	if(bstrVersion)
 		::SysFreeString(bstrVersion);
 
+	// ================================= Initial settings ========================================
+	LOG_INFO(_T("Applying initial settings"));
+
+	// set this process priority class
+	HANDLE hProcess=GetCurrentProcess();
+	::SetPriorityClass(hProcess, (DWORD)rConfig.get_signed_num(PP_PPROCESSPRIORITYCLASS));
+
+#ifndef _DEBUG		// for easier writing the program - doesn't collide with std CH
+	// set "run with system" registry settings
+	SetAutorun(rConfig.get_bool(PP_PRELOADAFTERRESTART));
+#endif
+
+	// ================================= Main window ========================================
+	LOG_INFO(_T("Creating main application window"));
 	// create main window
 	m_pMainWindow=new CMainWnd;
 	if (!((CMainWnd*)m_pMainWindow)->Create())
 		return FALSE;				// will be deleted at destructor
 
 	m_pMainWnd = m_pMainWindow;
+	CWinApp::InitInstance();
 
+	LOG_INFO(_T("Copy Handler initialized successfully"));
+
 	return TRUE;
 }
 
@@ -362,12 +413,37 @@
 void CCopyHandlerApp::OnConfigNotify(uint_t uiPropID)
 {
 	// is this language
-	if(uiPropID == PP_PLANGUAGE)
+	switch(uiPropID)
 	{
-		// update language in resource manager
-		TCHAR szPath[_MAX_PATH];
-		GetConfig().get_string(PP_PLANGUAGE, szPath, _MAX_PATH);
-		GetResManager().SetLanguage(ExpandPath(szPath));
+	case PP_PLANGUAGE:
+		{
+			// update language in resource manager
+			TCHAR szPath[_MAX_PATH];
+			GetConfig().get_string(PP_PLANGUAGE, szPath, _MAX_PATH);
+			GetResManager().SetLanguage(ExpandPath(szPath));
+			break;
+		}
+	case PP_LOGENABLELOGGING:
+		{
+			chcore::TLogger& rLogger = chcore::TLogger::Acquire();
+
+			rLogger.Enable(GetConfig().get_bool(PP_LOGENABLELOGGING));
+			break;
+		}
+	case PP_LOGLEVEL:
+		{
+			chcore::TLogger& rLogger = chcore::TLogger::Acquire();
+
+			rLogger.set_log_level((int_t)GetConfig().get_unsigned_num(PP_LOGLEVEL));
+			break;
+		}
+	case PP_LOGMAXSIZE:
+		{
+			chcore::TLogger& rLogger = chcore::TLogger::Acquire();
+
+			rLogger.set_max_size((int_t)GetConfig().get_signed_num(PP_LOGMAXSIZE));
+			break;
+		}
 	}
 }
 
@@ -381,7 +457,7 @@
 	}
 }
 
-HWND CCopyHandlerApp::HHelp(HWND hwndCaller, LPCTSTR pszFile, UINT uCommand, DWORD dwData)
+HWND CCopyHandlerApp::HHelp(HWND hwndCaller, LPCTSTR pszFile, UINT uCommand, DWORD_PTR dwData)
 {
 	PCTSTR pszPath=NULL;
 	WIN32_FIND_DATA wfd;
@@ -452,12 +528,17 @@
 
 int CCopyHandlerApp::ExitInstance()
 {
+	LOG_INFO(_T("Pre-exit step - releasing shell extension"));
 	if(m_piShellExtControl)
 	{
 		m_piShellExtControl->Release();
 		m_piShellExtControl = NULL;
 	}
+
+	LOG_INFO(_T("Pre-exit step - uninitializing COM"));
 	CoUninitialize();
 
+	LOG_INFO(_T("============================ Leaving Copy Handler ============================"));
+
 	return __super::ExitInstance();
 }
Index: src/ch/ch.h
===================================================================
diff -u -r17059054c69cd5726f4c7d35357f3b9556471783 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/ch.h	(.../ch.h)	(revision 17059054c69cd5726f4c7d35357f3b9556471783)
+++ src/ch/ch.h	(.../ch.h)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -28,8 +28,8 @@
 #include "CfgProperties.h"
 #include "../chext/chext.h"
 #include "../libicpf/log.h"
-#include "../libchcore/EngineCfg.h"
 #include "../libictranslate/ResourceManager.h"
+#include "../libchcore/TCoreConfig.h"
 
 using namespace std;
 
@@ -44,50 +44,36 @@
 	CCopyHandlerApp();
 	~CCopyHandlerApp();
 
-// Overrides
-public:
 	virtual BOOL InitInstance();
+	virtual int ExitInstance();
 
-
 	virtual void HtmlHelp(DWORD_PTR dwData, UINT nCmd);
 
 	PCTSTR GetHelpPath() const { return m_pszHelpFilePath; };
 
-	friend LRESULT MainRouter(ULONGLONG ullDst, UINT uiMsg, WPARAM wParam, LPARAM lParam);
 	friend int MsgBox(UINT uiID, UINT nType=MB_OK, UINT nIDHelp=0);
+
+	friend LRESULT MainRouter(ULONGLONG ullDst, UINT uiMsg, WPARAM wParam, LPARAM lParam);
 	friend CCopyHandlerApp& GetApp();
 	friend ictranslate::CResourceManager& GetResManager();
-	friend chcore::engine_config& GetConfig();
-//	friend CLogFile* GetLog();
+	friend chcore::TCoreConfig& GetConfig();
 
 	bool IsShellExtEnabled() const;
 
 	void OnConfigNotify(uint_t uiPropID);
 	void OnResManNotify(UINT uiType);
+
 protected:
 	bool UpdateHelpPaths();
-	HWND HHelp(HWND hwndCaller, LPCTSTR pszFile, UINT uCommand, DWORD dwData);
+	HWND HHelp(HWND hwndCaller, LPCTSTR pszFile, UINT uCommand, DWORD_PTR dwData);
 
-public:
-	icpf::log_file m_lfLog;
-
+protected:
+	HANDLE m_hMapObject;
 	IShellExtControl* m_piShellExtControl;
 
 	CWnd *m_pMainWindow;
-	// currently opened dialogs
-//	list<CWnd*> m_lhDialogs;
 
-protected:
-// Implementation
-	HANDLE m_hMapObject;
-	//TCHAR m_szHelpPath[_MAX_PATH];	// full file path to the help file
-//	CString m_strCrashInfo;			// crash info text
-
-	//{{AFX_MSG(CCopyHandlerApp)
-	//}}AFX_MSG
 	DECLARE_MESSAGE_MAP()
-public:
-	virtual int ExitInstance();
 };
 
 
Index: src/ch/ch.rc
===================================================================
diff -u -r17059054c69cd5726f4c7d35357f3b9556471783 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/ch.rc	(.../ch.rc)	(revision 17059054c69cd5726f4c7d35357f3b9556471783)
+++ src/ch/ch.rc	(.../ch.rc)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -1011,18 +1011,17 @@
     IDS_CFGPRIORITYCLASSITEMS_STRING "Idle!Normal!High!Real-time"
     IDS_PLUGSFOLDER_STRING  "Folder with plugins"
     IDS_PLUGSFOLDERCHOOSE_STRING "!Choose folder with plugins"
-    IDS_CFGLOGFILE_STRING   "Main log file"
+    IDS_CFGLOGFILE_STRING   "Debugging"
     IDS_CFGENABLELOGGING_STRING "Enable logging"
-    IDS_CFGLIMITATION_STRING "Use log file size limit"
-    IDS_CFGMAXLIMIT_STRING  "Maximum size of the limited log file"
-    IDS_CFGLOGPRECISELIMITING_STRING "Use precise limiting of a log file"
-    IDS_CFGTRUNCBUFFERSIZE_STRING "Truncate buffer size"
+    IDS_CFGMAXLIMIT_STRING  "Maximum size of the log file"
     IDS_CFGHELPDIR_STRING   "Directory with help files"
     IDS_CFGHELPDIRCHOOSE_STRING "!Choose folder with program's help files"
     IDS_LANGUAGESFOLDER_STRING "Directory with language files"
     IDS_LANGSFOLDERCHOOSE_STRING "!Choose folder with language files"
     IDS_ABOUT_LANGUAGE_STRING 
                             "Current language: %langname, Author(s): %authors"
+	IDS_CFGLOGLEVEL "Log level"
+	IDS_CFGLOGLEVEL_VALUES "Debug!Info!Warning!Error"
 END
 
 STRINGTABLE 
Index: src/ch/resource.h
===================================================================
diff -u -rf34d204b8eecd6817dbe4a1c3b3541cf9a8794b0 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/resource.h	(.../resource.h)	(revision f34d204b8eecd6817dbe4a1c3b3541cf9a8794b0)
+++ src/ch/resource.h	(.../resource.h)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -414,10 +414,7 @@
 #define IDS_PLUGSFOLDERCHOOSE_STRING    8084
 #define IDS_CFGLOGFILE_STRING           8085
 #define IDS_CFGENABLELOGGING_STRING     8086
-#define IDS_CFGLIMITATION_STRING        8087
 #define IDS_CFGMAXLIMIT_STRING          8088
-#define IDS_CFGLOGPRECISELIMITING_STRING 8089
-#define IDS_CFGTRUNCBUFFERSIZE_STRING   8090
 #define IDS_CFGHELPDIR_STRING           8091
 #define IDS_CFGHELPDIRCHOOSE_STRING     8092
 #define IDS_LANGUAGESFOLDER_STRING      8093
@@ -426,6 +423,8 @@
 #define IDS_CFGINTERCEPTCONTEXTMENU_STRING 8096
 #define IDS_CFG_CHECK_FOR_UPDATES_AT_STARTUP 8097
 #define IDS_CFG_UPDATE_CHECK_FOR_BETA 8098
+#define IDS_CFGLOGLEVEL				  8099
+#define IDS_CFGLOGLEVEL_VALUES		  8100
 #define IDS_MENUCOPY_STRING             9000
 #define IDS_MENUMOVE_STRING             9001
 #define IDS_MENUCOPYMOVESPECIAL_STRING  9002
Index: src/ch/task.cpp
===================================================================
diff -u -r003e0baad9604efc422ecb3746154e4ff9f40156 -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/task.cpp	(.../task.cpp)	(revision 003e0baad9604efc422ecb3746154e4ff9f40156)
+++ src/ch/task.cpp	(.../task.cpp)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -1497,6 +1497,11 @@
 	return bFlag;
 }
 
+void CTaskArray::SetTasksDir(const tchar_t* pszPath)
+{
+	m_strTasksDir = pszPath;
+}
+
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // case insensitive replacement
 void CTask::ReplaceNoCase(CString& rString, CString strOld, CString strNew)
Index: src/ch/task.h
===================================================================
diff -u -rf6706e71721e6828e4e3be894caec6808e27630b -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/ch/task.h	(.../task.h)	(revision f6706e71721e6828e4e3be894caec6808e27630b)
+++ src/ch/task.h	(.../task.h)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -414,7 +414,7 @@
 
 	bool IsFinished();
 
-	void SetTasksDir(const tchar_t* pszPath) { m_strTasksDir = pszPath; }
+	void SetTasksDir(const tchar_t* pszPath);
 
 public:
 	__int64 m_uhRange, m_uhPosition;
Fisheye: tag d791f35daa46db295cc0b1ebc54763e23879a351 is not in file src/libchcore/TCoreConfig.cpp
Fisheye: Tag 2457755b4084e3d1c80a8e7c77c9f0996312941b refers to a dead (removed) revision in file `src/libchcore/EngineCfg.cpp'.
Fisheye: No comparison available.  Pass `N' to diff?
Fisheye: tag d791f35daa46db295cc0b1ebc54763e23879a351 is not in file src/libchcore/TCoreConfig.h
Fisheye: Tag 2457755b4084e3d1c80a8e7c77c9f0996312941b refers to a dead (removed) revision in file `src/libchcore/EngineCfg.h'.
Fisheye: No comparison available.  Pass `N' to diff?
Index: src/libchcore/TLogger.cpp
===================================================================
diff -u
--- src/libchcore/TLogger.cpp	(revision 0)
+++ src/libchcore/TLogger.cpp	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -0,0 +1,126 @@
+// ============================================================================
+//  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 
+// ============================================================================
+#include "stdafx.h"
+#include "libchcore.h"
+#include "TLogger.h"
+
+BEGIN_CHCORE_NAMESPACE
+
+TLogger TLogger::S_Logger;
+
+// ============================================================================
+/// chcore::TLogger::TLogger
+/// @date 2009/05/23
+///
+/// @brief     Constructs the TLogger object.
+// ============================================================================
+TLogger::TLogger() :
+	m_bEnabled(false)
+{
+}
+
+// ============================================================================
+/// chcore::TLogger::Acquire
+/// @date 2009/05/20
+///
+/// @brief     Acquires logger object.
+/// @return    Reference to the logger object.
+// ============================================================================
+TLogger& TLogger::Acquire()
+{
+	return S_Logger;
+}
+
+// ============================================================================
+/// chcore::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 tchar_t* pszText)
+{
+	BOOST_ASSERT(pszText);
+	if(!pszText)
+		return;
+
+	TLogger& rLogger = Acquire();
+	if(rLogger.m_bEnabled && rLogger.is_initialized())
+		rLogger.logd(pszText);
+}
+
+// ============================================================================
+/// chcore::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 tchar_t* pszText)
+{
+	BOOST_ASSERT(pszText);
+	if(!pszText)
+		return;
+
+	TLogger& rLogger = Acquire();
+	if(rLogger.m_bEnabled && rLogger.is_initialized())
+		rLogger.logi(pszText);
+}
+
+// ============================================================================
+/// chcore::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 tchar_t* pszText)
+{
+	BOOST_ASSERT(pszText);
+	if(!pszText)
+		return;
+
+	TLogger& rLogger = Acquire();
+	if(rLogger.m_bEnabled && rLogger.is_initialized())
+		rLogger.logw(pszText);
+}
+
+// ============================================================================
+/// chcore::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 tchar_t* pszText)
+{
+	BOOST_ASSERT(pszText);
+	if(!pszText)
+		return;
+
+	TLogger& rLogger = Acquire();
+	if(rLogger.m_bEnabled && rLogger.is_initialized())
+		rLogger.loge(pszText);
+}
+
+END_CHCORE_NAMESPACE
Index: src/libchcore/TLogger.h
===================================================================
diff -u
--- src/libchcore/TLogger.h	(revision 0)
+++ src/libchcore/TLogger.h	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -0,0 +1,68 @@
+// ============================================================================
+//  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 Class contains 
+// ============================================================================
+#ifndef __LOGGER_H__
+#define __LOGGER_H__
+
+#include "libchcore.h"
+#include "../libicpf/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)
+
+BEGIN_CHCORE_NAMESPACE
+
+// Class manages logging of informations to a file.
+class LIBCHCORE_API TLogger : public icpf::log_file
+{
+public:
+	TLogger();
+
+	// Retrieving global object instance
+	static TLogger& Acquire();		///< Acquires the Logger object
+
+	// Logging
+	static void LogDebug(const tchar_t* pszText);
+	static void LogInfo(const tchar_t* pszText);
+	static void LogWarning(const tchar_t* pszText);
+	static void LogError(const tchar_t* pszText);
+
+	// Initialization/settings
+	void Enable(bool bEnable) throw() { m_bEnabled = bEnable; }
+
+protected:
+	static TLogger S_Logger;
+	bool m_bEnabled;		// logging enabled?
+};
+
+END_CHCORE_NAMESPACE
+
+#endif
Index: src/libchcore/libchcore.vc90.vcproj
===================================================================
diff -u -rcaa71fb57fcfdd3b3731ed038cecc280ff69a78e -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/libchcore/libchcore.vc90.vcproj	(.../libchcore.vc90.vcproj)	(revision caa71fb57fcfdd3b3731ed038cecc280ff69a78e)
+++ src/libchcore/libchcore.vc90.vcproj	(.../libchcore.vc90.vcproj)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -327,111 +327,117 @@
 			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
 			>
 			<File
-				RelativePath=".\dllmain.cpp"
+				RelativePath=".\FeedbackHandlerBase.h"
 				>
-				<FileConfiguration
-					Name="Debug-Unicode|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Debug-Unicode|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release-Unicode|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release-Unicode|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
 			</File>
 			<File
-				RelativePath=".\EngineCfg.cpp"
+				RelativePath=".\TCoreConfig.cpp"
 				>
 			</File>
 			<File
-				RelativePath=".\libchcore.cpp"
+				RelativePath=".\TCoreConfig.h"
 				>
 			</File>
 			<File
-				RelativePath=".\stdafx.cpp"
+				RelativePath=".\TLogger.cpp"
 				>
-				<FileConfiguration
-					Name="Debug-Unicode|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Debug-Unicode|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release-Unicode|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release-Unicode|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
 			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
 			<File
-				RelativePath=".\EngineCfg.h"
+				RelativePath=".\TLogger.h"
 				>
 			</File>
-			<File
-				RelativePath=".\FeedbackHandlerBase.h"
+			<Filter
+				Name="Core"
 				>
-			</File>
-			<File
-				RelativePath=".\libchcore.h"
-				>
-			</File>
-			<File
-				RelativePath=".\stdafx.h"
-				>
-			</File>
+				<File
+					RelativePath=".\dllmain.cpp"
+					>
+					<FileConfiguration
+						Name="Debug-Unicode|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+							CompileAsManaged="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug-Unicode|x64"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+							CompileAsManaged="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release-Unicode|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+							CompileAsManaged="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release-Unicode|x64"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+							CompileAsManaged="0"
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath=".\libchcore.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\libchcore.h"
+					>
+				</File>
+				<File
+					RelativePath=".\stdafx.cpp"
+					>
+					<FileConfiguration
+						Name="Debug-Unicode|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="1"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug-Unicode|x64"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="1"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release-Unicode|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="1"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release-Unicode|x64"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="1"
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath=".\stdafx.h"
+					>
+				</File>
+			</Filter>
 		</Filter>
 		<Filter
 			Name="Resource Files"
Index: src/libchcore/stdafx.h
===================================================================
diff -u -rcaa71fb57fcfdd3b3731ed038cecc280ff69a78e -r2457755b4084e3d1c80a8e7c77c9f0996312941b
--- src/libchcore/stdafx.h	(.../stdafx.h)	(revision caa71fb57fcfdd3b3731ed038cecc280ff69a78e)
+++ src/libchcore/stdafx.h	(.../stdafx.h)	(revision 2457755b4084e3d1c80a8e7c77c9f0996312941b)
@@ -11,6 +11,4 @@
 // Windows Header Files:
 #include <windows.h>
 
-
-
-// TODO: reference additional headers your program requires here
+#include <boost/assert.hpp>