From c992cb2fdc11f1cac4bc5cbce26e8e2bb3b57da0 Mon Sep 17 00:00:00 2001
From: George Hazan <george.hazan@gmail.com>
Date: Tue, 26 Jun 2012 16:50:14 +0000
Subject: - microkernel addded; - version bumped to 0.92.2

git-svn-id: http://svn.miranda-ng.org/main/trunk@641 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
---
 src/core/commonheaders.h                  |   5 +-
 src/core/miranda.cpp                      | 396 ++-----------------
 src/core/miranda.h                        | 109 +-----
 src/core/modules.cpp                      | 632 +-----------------------------
 src/miranda32_10.vcxproj.filters          |  27 +-
 src/modules/addcontact/addcontact.cpp     |  14 +-
 src/modules/autoaway/autoaway.cpp         |   4 +-
 src/modules/button/button.cpp             |   2 +-
 src/modules/clist/clc.cpp                 |   4 +-
 src/modules/clist/clcfiledrop.cpp         |   2 +-
 src/modules/clist/clistmenus.cpp          |  22 +-
 src/modules/clist/clistmod.cpp            |   2 +-
 src/modules/clist/clisttray.cpp           |  22 +-
 src/modules/clist/clui.cpp                |  10 +-
 src/modules/clist/cluiservices.cpp        |   2 +-
 src/modules/clist/genmenu.cpp             |   2 +-
 src/modules/clist/genmenuopt.cpp          |   2 +-
 src/modules/contacts/contacts.cpp         |  12 +-
 src/modules/database/database.cpp         |   6 +-
 src/modules/database/dbini.cpp            |  27 +-
 src/modules/database/dbutils.cpp          |   2 +-
 src/modules/database/profilemanager.cpp   |  12 +-
 src/modules/findadd/findadd.cpp           |  38 +-
 src/modules/findadd/searchresults.cpp     |  14 +-
 src/modules/fonts/FontOptions.cpp         |  14 +-
 src/modules/fonts/FontService.h           |   6 +-
 src/modules/fonts/services.cpp            |  38 +-
 src/modules/help/about.cpp                |   6 +-
 src/modules/help/help.cpp                 |   2 +-
 src/modules/history/history.cpp           |   6 +-
 src/modules/icolib/IcoLib.h               |   2 +-
 src/modules/icolib/skin2icons.cpp         |   6 +-
 src/modules/icolib/skin2opts.cpp          |  10 +-
 src/modules/idle/idle.cpp                 |   4 +-
 src/modules/ignore/ignore.cpp             |   8 +-
 src/modules/langpack/lpservices.cpp       | 143 ++-----
 src/modules/netlib/netliblog.cpp          |  22 +-
 src/modules/netlib/netlibopts.cpp         |   2 +-
 src/modules/netlib/netlibsock.cpp         |  11 +-
 src/modules/options/descbutton.cpp        |   2 +-
 src/modules/options/filter.cpp            |   2 +-
 src/modules/options/filter.h              |   5 -
 src/modules/options/headerbar.cpp         |   2 +-
 src/modules/options/iconheader.cpp        |   2 +-
 src/modules/options/options.cpp           |  18 +-
 src/modules/plugins/newplugins.cpp        |  98 ++---
 src/modules/plugins/pluginopts.cpp        |   2 +-
 src/modules/plugins/plugins.h             |   2 +-
 src/modules/protocols/protoaccs.cpp       |   6 +-
 src/modules/protocols/protochains.cpp     |   4 +-
 src/modules/protocols/protocols.cpp       | 381 +++++++++---------
 src/modules/protocols/protoopts.cpp       |  10 +-
 src/modules/skin/hotkey_opts.cpp          |   2 +-
 src/modules/skin/hotkeys.cpp              |   4 +-
 src/modules/skin/skin.h                   |   4 +-
 src/modules/skin/skinicons.cpp            |   8 +-
 src/modules/skin/sounds.cpp               |  14 +-
 src/modules/srauth/auth.cpp               |   4 +-
 src/modules/srauth/authdialogs.cpp        |  16 +-
 src/modules/srawaymsg/awaymsg.cpp         |   6 +-
 src/modules/srawaymsg/sendmsg.cpp         |  20 +-
 src/modules/srfile/file.cpp               |  14 +-
 src/modules/srfile/fileexistsdlg.cpp      |   2 +-
 src/modules/srfile/fileopts.cpp           |   2 +-
 src/modules/srfile/filerecvdlg.cpp        |   2 +-
 src/modules/srfile/filesenddlg.cpp        |   2 +-
 src/modules/srfile/filexferdlg.cpp        |  16 +-
 src/modules/srfile/ftmanager.cpp          |   8 +-
 src/modules/srurl/url.cpp                 |   6 +-
 src/modules/srurl/urldialogs.cpp          |   6 +-
 src/modules/updatenotify/updatenotify.cpp |   6 +-
 src/modules/userinfo/contactinfo.cpp      |   6 +-
 src/modules/userinfo/stdinfo.cpp          |   8 +-
 src/modules/userinfo/userinfo.cpp         |   4 +-
 src/modules/utils/bmpfilter.cpp           |   4 +-
 src/modules/utils/colourpicker.cpp        |   4 +-
 src/modules/utils/hyperlink.cpp           |   2 +-
 src/modules/utils/path.cpp                | 205 +---------
 src/modules/utils/timezones.cpp           |   6 +-
 src/modules/utils/utils.cpp               |  94 +----
 src/modules/visibility/visibility.cpp     |   4 +-
 81 files changed, 594 insertions(+), 2067 deletions(-)

(limited to 'src')

diff --git a/src/core/commonheaders.h b/src/core/commonheaders.h
index e47ba25fb3..5e6c25da62 100644
--- a/src/core/commonheaders.h
+++ b/src/core/commonheaders.h
@@ -56,10 +56,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include <win2k.h>
 
-#include "modules.h"
-
 #include <m_system.h>
 #include <m_system_cpp.h>
+#include <m_core.h>
 #include <newpluginapi.h>
 #include <m_database.h>
 #include <m_clc.h>
@@ -94,8 +93,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <m_timezones.h>
 
 #include "miranda.h"
-#include "forkthread.h"
-#include "../modules/database/dblists.h"
 
 #include <m_ssl.h>
 #include <m_netlib.h>
diff --git a/src/core/miranda.cpp b/src/core/miranda.cpp
index 8678524411..baf786a8d3 100644
--- a/src/core/miranda.cpp
+++ b/src/core/miranda.cpp
@@ -27,15 +27,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define MMI_SIZE_V1 (4*sizeof(void*))
 #define MMI_SIZE_V2 (7*sizeof(void*))
 
-int InitPathUtils(void);
-int InitialiseModularEngine(void);
 int LoadDefaultModules(void);
-void DestroyModularEngine(void);
 void UnloadNewPluginsModule(void);
 void UnloadDefaultModules(void);
-void RecalculateTime(void);
-
-HINSTANCE GetInstByAddress(void* codePtr);
 
 pfnMyMonitorFromPoint MyMonitorFromPoint;
 pfnMyMonitorFromRect MyMonitorFromRect;
@@ -84,106 +78,31 @@ LPFN_WSAADDRESSTOSTRINGA MyWSAAddressToString;
 
 ITaskbarList3 * pTaskbarInterface;
 
-static DWORD MsgWaitForMultipleObjectsExWorkaround(DWORD nCount, const HANDLE *pHandles, 
-	DWORD dwMsecs, DWORD dwWakeMask, DWORD dwFlags);
-
 HANDLE hOkToExitEvent, hModulesLoadedEvent;
 HANDLE hShutdownEvent, hPreShutdownEvent;
 static HANDLE hWaitObjects[MAXIMUM_WAIT_OBJECTS-1];
 static char *pszWaitServices[MAXIMUM_WAIT_OBJECTS-1];
 static int waitObjectCount = 0;
-HANDLE hStackMutex, hMirandaShutdown, hThreadQueueEmpty;
-HINSTANCE hMirandaInst;
+HANDLE hMirandaShutdown, hThreadQueueEmpty;
+HINSTANCE hInst;
 int hLangpack = 0;
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // exception handling
 
-static DWORD __cdecl sttDefaultFilter(DWORD, EXCEPTION_POINTERS*)
-{
-	return EXCEPTION_EXECUTE_HANDLER;
-}
-
-pfnExceptionFilter pMirandaExceptFilter = sttDefaultFilter;
-
-static INT_PTR GetExceptionFilter(WPARAM, LPARAM)
+static INT_PTR srvGetExceptionFilter(WPARAM, LPARAM)
 {
-	return (INT_PTR)pMirandaExceptFilter;
+	return (INT_PTR)GetExceptionFilter();
 }
 
-static INT_PTR SetExceptionFilter(WPARAM, LPARAM lParam)
+static INT_PTR srvSetExceptionFilter(WPARAM, LPARAM lParam)
 {
-	pfnExceptionFilter oldOne = pMirandaExceptFilter;
-	if (lParam != 0)
-		pMirandaExceptFilter = (pfnExceptionFilter)lParam;
-	return (INT_PTR)oldOne;
+	return (INT_PTR)SetExceptionFilter((pfnExceptionFilter)lParam);
 }
 
-/////////////////////////////////////////////////////////////////////////////////////////
-// thread support functions
-
-typedef struct
-{
-	DWORD dwThreadId;	// valid if hThread isn't signalled
-	HANDLE hThread;
-	HINSTANCE hOwner;
-	void* pObject;
-	PVOID addr;
-}
-THREAD_WAIT_ENTRY;
-
-static LIST<THREAD_WAIT_ENTRY> threads(10, NumericKeySortT);
-
-struct FORK_ARG {
-	HANDLE hEvent;
-	pThreadFunc threadcode;
-	pThreadFuncEx threadcodeex;
-	void *arg, *owner;
-};
-
 /////////////////////////////////////////////////////////////////////////////////////////
 // forkthread - starts a new thread
 
-void __cdecl forkthread_r(void * arg)
-{
-	struct FORK_ARG * fa = (struct FORK_ARG *) arg;
-	void (*callercode)(void*)=fa->threadcode;
-	void * cookie=fa->arg;
-	CallService(MS_SYSTEM_THREAD_PUSH, 0, (LPARAM)callercode);
-	SetEvent(fa->hEvent);
-	__try
-	{
-		callercode(cookie);
-	}
-	__except(pMirandaExceptFilter(GetExceptionCode(), GetExceptionInformation()))
-	{
-		Netlib_Logf(NULL, "Unhandled exception in thread %x", GetCurrentThreadId());
-	}
-
-	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
-	CallService(MS_SYSTEM_THREAD_POP, 0, 0);
-	return;
-}
-
-UINT_PTR forkthread (
-	void (__cdecl *threadcode)(void*), 
-	unsigned long stacksize, 
-	void *arg
-	)
-{
-	UINT_PTR rc;
-	struct FORK_ARG fa;
-	fa.hEvent=CreateEvent(NULL, FALSE, FALSE, NULL);
-	fa.threadcode=threadcode;
-	fa.arg=arg;
-	rc=_beginthread(forkthread_r, stacksize, &fa);
-	if ((UINT_PTR)-1L != rc)
-		WaitForSingleObject(fa.hEvent, INFINITE);
-
-	CloseHandle(fa.hEvent);
-	return rc;
-}
-
 static INT_PTR ForkThreadService(WPARAM wParam, LPARAM lParam)
 {
 	return (INT_PTR)forkthread((pThreadFunc)wParam, 0, (void*)lParam);
@@ -192,56 +111,6 @@ static INT_PTR ForkThreadService(WPARAM wParam, LPARAM lParam)
 /////////////////////////////////////////////////////////////////////////////////////////
 // forkthreadex - starts a new thread with the extended info and returns the thread id
 
-unsigned __stdcall forkthreadex_r(void * arg)
-{
-	struct FORK_ARG *fa = (struct FORK_ARG *)arg;
-	pThreadFuncEx threadcode = fa->threadcodeex;
-	pThreadFuncOwner threadcodeex = (pThreadFuncOwner)fa->threadcodeex;
-	void *cookie = fa->arg;
-	void *owner = fa->owner;
-	unsigned long rc = 0;
-
-	CallService(MS_SYSTEM_THREAD_PUSH, (WPARAM)fa->owner, (LPARAM)threadcode);
-	SetEvent(fa->hEvent);
-	__try
-	{
-		if (owner)
-			rc = threadcodeex(owner, cookie);
-		else
-			rc = threadcode(cookie);
-	}
-	__except(pMirandaExceptFilter(GetExceptionCode(), GetExceptionInformation()))
-	{
-		Netlib_Logf(NULL, "Unhandled exception in thread %x", GetCurrentThreadId());
-	}
-
-	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
-	CallService(MS_SYSTEM_THREAD_POP, 0, 0);
-	return rc;
-}
-
-UINT_PTR forkthreadex(
-	void *sec, 
-	unsigned stacksize, 
-	unsigned (__stdcall *threadcode)(void*), 
-	void* owner, 
-	void *arg, 
-	unsigned *thraddr)
-{
-	UINT_PTR rc;
-	struct FORK_ARG fa = { 0 };
-	fa.threadcodeex = threadcode;
-	fa.arg = arg;
-	fa.owner = owner;
-	fa.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-	rc = _beginthreadex(sec, stacksize, forkthreadex_r, (void *)&fa, 0, thraddr);
-	if (rc)
-		WaitForSingleObject(fa.hEvent, INFINITE);
-
-	CloseHandle(fa.hEvent);
-	return rc;
-}
-
 static INT_PTR ForkThreadServiceEx(WPARAM wParam, LPARAM lParam)
 {
 	FORK_THREADEX_PARAMS* params = (FORK_THREADEX_PARAMS*)lParam;
@@ -252,108 +121,6 @@ static INT_PTR ForkThreadServiceEx(WPARAM wParam, LPARAM lParam)
 	return forkthreadex(NULL, params->iStackSize, params->pFunc, (void*)wParam, params->arg, params->threadID ? params->threadID : &threadID);
 }
 
-/////////////////////////////////////////////////////////////////////////////////////////
-// APC and mutex functions
-
-static void __stdcall DummyAPCFunc(ULONG_PTR)
-{
-	/* called in the context of thread that cleared it's APC queue */
-	return;
-}
-
-static int MirandaWaitForMutex(HANDLE hEvent)
-{
-	for (;;) {
-		// will get WAIT_IO_COMPLETE for QueueUserAPC() which isnt a result
-		DWORD rc = MsgWaitForMultipleObjectsExWorkaround(1, &hEvent, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE);
-		if (rc == WAIT_OBJECT_0 + 1) {
-			MSG msg;
-			while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
-				if (IsDialogMessage(msg.hwnd, &msg)) continue;
-				TranslateMessage(&msg);
-				DispatchMessage(&msg);
-			}
-		} else if (rc == WAIT_OBJECT_0) {
-			// got object
-			return 1;
-		} else if (rc == WAIT_ABANDONED_0 || rc == WAIT_FAILED) return 0;
-	}
-}
-
-VOID CALLBACK KillAllThreads(HWND, UINT, UINT_PTR, DWORD)
-{
-	if ( MirandaWaitForMutex(hStackMutex)) {
-		for (int j=0; j < threads.getCount(); j++) {
-			THREAD_WAIT_ENTRY* p = threads[j];
-			char szModuleName[ MAX_PATH ];
-			GetModuleFileNameA(p->hOwner, szModuleName, sizeof(szModuleName));
-			Netlib_Logf(NULL, "Thread %p was abnormally terminated because module '%s' didn't release it. Entry point: %p", 
-				p->hThread, szModuleName, p->addr);
-			TerminateThread(p->hThread, 9999);
-			CloseHandle(p->hThread);
-			mir_free(p);
-		}
-
-		threads.destroy();
-
-		ReleaseMutex(hStackMutex);
-		SetEvent(hThreadQueueEmpty);
-	}	
-}
-
-void KillObjectThreads(void* owner)
-{
-	if (owner == NULL)
-		return;
-
-	WaitForSingleObject(hStackMutex, INFINITE);
-
-	HANDLE* threadPool = (HANDLE*)alloca(threads.getCount()*sizeof(HANDLE));
-	int threadCount = 0;
-
-	for (int j = threads.getCount(); j--;) {
-		THREAD_WAIT_ENTRY* p = threads[j];
-		if (p->pObject == owner)
-			threadPool[ threadCount++ ] = p->hThread;
-	}
-	ReleaseMutex(hStackMutex); 
-
-	// is there anything to kill?
-	if (threadCount > 0) {
-		if ( WaitForMultipleObjects(threadCount, threadPool, TRUE, 5000) == WAIT_TIMEOUT) {
-			// forcibly kill all remaining threads after 5 secs
-			WaitForSingleObject(hStackMutex, INFINITE);
-			for (int j = threads.getCount()-1; j >= 0; j--) {
-				THREAD_WAIT_ENTRY* p = threads[j];
-				if (p->pObject == owner) {
-					TerminateThread(p->hThread, 9999);
-					CloseHandle(p->hThread);
-					threads.remove(j);
-					mir_free(p);
-				}
-			}
-			ReleaseMutex(hStackMutex);
-		}
-	}
-}
-
-static void UnwindThreadWait(void)
-{
-	// acquire the list and wake up any alertable threads
-	if ( MirandaWaitForMutex(hStackMutex)) {
-		int j;
-		for (j=0; j < threads.getCount(); j++)
-			QueueUserAPC(DummyAPCFunc, threads[j]->hThread, 0);
-		ReleaseMutex(hStackMutex);
-	}
-
-	// give all unclosed threads 5 seconds to close
-	SetTimer(NULL, 0, 5000, KillAllThreads);
-
-	// wait til the thread list is empty
-	MirandaWaitForMutex(hThreadQueueEmpty);
-}
-
 /////////////////////////////////////////////////////////////////////////////////////////
 
 typedef LONG (WINAPI *pNtQIT)(HANDLE, LONG, PVOID, ULONG, PULONG);
@@ -380,55 +147,6 @@ void* GetCurrentThreadEntryPoint()
 	return (void*)dwStartAddress;
 }
 
-INT_PTR UnwindThreadPush(WPARAM wParam, LPARAM lParam)
-{
-	ResetEvent(hThreadQueueEmpty); // thread list is not empty
-	if ( WaitForSingleObject(hStackMutex, INFINITE) == WAIT_OBJECT_0) {
-		THREAD_WAIT_ENTRY* p = (THREAD_WAIT_ENTRY*)mir_calloc(sizeof(THREAD_WAIT_ENTRY));
-
-		DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &p->hThread, 0, FALSE, DUPLICATE_SAME_ACCESS);
-		p->dwThreadId = GetCurrentThreadId();
-		p->pObject = (void*)wParam;
-		p->hOwner = GetInstByAddress((void*)lParam);
-		p->addr = (void*)lParam;
-		threads.insert(p);
-
-		//Netlib_Logf(NULL, "*** pushing thread %x[%x] (%d)", hThread, GetCurrentThreadId(), threads.count);
-		ReleaseMutex(hStackMutex);
-	} //if
-	return 0;
-}
-
-INT_PTR UnwindThreadPop(WPARAM, LPARAM)
-{
-	if ( WaitForSingleObject(hStackMutex, INFINITE) == WAIT_OBJECT_0) {
-		DWORD dwThreadId=GetCurrentThreadId();
-		int j;
-		//Netlib_Logf(NULL, "*** popping thread %x, %d threads left", dwThreadId, threads.count);
-		for (j=0; j < threads.getCount(); j++) {
-			THREAD_WAIT_ENTRY* p = threads[j];
-			if (p->dwThreadId == dwThreadId) {
-				SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
-				CloseHandle(p->hThread);
-				threads.remove(j);
-				mir_free(p);
-
-				if ( !threads.getCount()) {
-					threads.destroy();
-					ReleaseMutex(hStackMutex);
-					SetEvent(hThreadQueueEmpty); // thread list is empty now
-					return 0;
-				} 
-
-				ReleaseMutex(hStackMutex);
-				return 0;
-			} //if
-		} //for
-		ReleaseMutex(hStackMutex);
-	} //if
-	return 1;
-}
-
 INT_PTR MirandaIsTerminated(WPARAM, LPARAM)
 {
 	return WaitForSingleObject(hMirandaShutdown, 0) == WAIT_OBJECT_0;
@@ -449,14 +167,6 @@ static void __cdecl compactHeapsThread(void*)
 	} //while
 }
 
-LRESULT CALLBACK APCWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
-	if (msg == WM_NULL) SleepEx(0, TRUE);
-	if (msg == WM_TIMECHANGE) RecalculateTime();
-	return DefWindowProc(hwnd, msg, wParam, lParam);
-}
-
-HWND hAPCWindow=NULL;
 void (*SetIdleCallback) (void)=NULL;
 
 static INT_PTR SystemSetIdleCallback(WPARAM, LPARAM lParam)
@@ -485,17 +195,6 @@ static INT_PTR SystemGetIdle(WPARAM, LPARAM lParam)
 	return 0;
 }
 
-static DWORD MsgWaitForMultipleObjectsExWorkaround(DWORD nCount, const HANDLE *pHandles, 
-	DWORD dwMsecs, DWORD dwWakeMask, DWORD dwFlags)
-{
-	DWORD rc;
-	if (msgWaitForMultipleObjectsEx != NULL)
-		return msgWaitForMultipleObjectsEx(nCount, pHandles, dwMsecs, dwWakeMask, dwFlags);
-	rc=MsgWaitForMultipleObjects(nCount, pHandles, FALSE, 50, QS_ALLINPUT);
-	if (rc == WAIT_TIMEOUT) rc=WaitForMultipleObjectsEx(nCount, pHandles, FALSE, 20, TRUE);
-	return rc;
-}
-
 static int SystemShutdownProc(WPARAM, LPARAM)
 {
 	UnloadDefaultModules();
@@ -545,7 +244,7 @@ void ParseCommandLine()
 	if (p) {
 		HANDLE hProcess = OpenProcess(SYNCHRONIZE, FALSE, atol(p+9));
 		if (hProcess) {
-			DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_WAITRESTART), NULL, WaitForProcessDlgProc, (LPARAM)hProcess);
+			DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_WAITRESTART), NULL, WaitForProcessDlgProc, (LPARAM)hProcess);
 			CloseHandle(hProcess);
 		}	
 	}	
@@ -558,7 +257,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
 	HMODULE hUser32, hThemeAPI, hDwmApi, hShFolder = NULL;
 	int result = 0;
 
-	hMirandaInst = hInstance;
+	hInst = hInstance;
 
 	setlocale(LC_ALL, "");
 
@@ -635,9 +334,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
 	if ( IsWinVer7Plus())
 		CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3, (void**)&pTaskbarInterface);
 
-	InitialiseModularEngine();
-//	ParseCommandLine();
-
 	if ( LoadDefaultModules()) {
 		NotifyEventHooks(hShutdownEvent, 0, 0);
 		UnloadDefaultModules();
@@ -659,7 +355,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
 		MSG msg;
 		DWORD rc;
 		BOOL dying=FALSE;
-		rc=MsgWaitForMultipleObjectsExWorkaround(waitObjectCount, hWaitObjects, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE);
+		rc = MsgWaitForMultipleObjectsEx(waitObjectCount, hWaitObjects, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE);
 		if (rc >= WAIT_OBJECT_0 && rc < WAIT_OBJECT_0 + waitObjectCount) {
 			rc -= WAIT_OBJECT_0;
 			CallService(pszWaitServices[rc], (WPARAM) hWaitObjects[rc], 0);
@@ -697,11 +393,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
 
 exit:
 	UnloadNewPluginsModule();
-	DestroyModularEngine();
-	CloseHandle(hStackMutex);
 	CloseHandle(hMirandaShutdown);
 	CloseHandle(hThreadQueueEmpty);
-	DestroyWindow(hAPCWindow);
 
 	if (pTaskbarInterface)
 		pTaskbarInterface->Release();
@@ -769,7 +462,7 @@ static INT_PTR GetMirandaVersionText(WPARAM wParam, LPARAM lParam)
 
 INT_PTR WaitOnHandle(WPARAM wParam, LPARAM lParam)
 {
-	if (waitObjectCount>=MAXIMUM_WAIT_OBJECTS-1)
+	if (waitObjectCount >= MAXIMUM_WAIT_OBJECTS-1)
 		return 1;
 	
 	hWaitObjects[waitObjectCount] = (HANDLE)wParam;
@@ -842,26 +535,18 @@ INT_PTR GetListInterface(WPARAM, LPARAM lParam)
 	if (li == NULL)
 		return 1;
 
-	switch(li->cbSize) {
-	case LIST_INTERFACE_V3_SIZE:
-		li->List_Copy      = List_Copy;
-		li->List_ObjCopy   = List_ObjCopy;
-
-	case LIST_INTERFACE_V2_SIZE:
-		li->List_InsertPtr = List_InsertPtr;
-		li->List_RemovePtr = List_RemovePtr;
-
-	case LIST_INTERFACE_V1_SIZE:
-		li->List_Create   = List_Create;
-		li->List_Destroy  = List_Destroy;
-		li->List_Find     = List_Find;
-		li->List_GetIndex = List_GetIndex;
-		li->List_Insert   = List_Insert;
-		li->List_Remove   = List_Remove;
-		li->List_IndexOf  = List_IndexOf;
-		return 0;
-	}
-	return 1;
+	li->List_Copy      = List_Copy;
+	li->List_ObjCopy   = List_ObjCopy;
+	li->List_InsertPtr = List_InsertPtr;
+	li->List_RemovePtr = List_RemovePtr;
+	li->List_Create   = List_Create;
+	li->List_Destroy  = List_Destroy;
+	li->List_Find     = List_Find;
+	li->List_GetIndex = List_GetIndex;
+	li->List_Insert   = List_Insert;
+	li->List_Remove   = List_Remove;
+	li->List_IndexOf  = List_IndexOf;
+	return 0;
 }
 
 INT_PTR GetUtfInterface(WPARAM, LPARAM lParam)
@@ -884,9 +569,9 @@ INT_PTR GetUtfInterface(WPARAM, LPARAM lParam)
 	utfi->utf8_decodecp = Utf8DecodeCP;
 	utfi->utf8_encode   = Utf8Encode;
 	utfi->utf8_encodecp = Utf8EncodeCP;
-	utfi->utf8_encodeW  = Utf8EncodeUcs2;
+	utfi->utf8_encodeW  = Utf8EncodeW;
 	if (utfi->cbSize > UTF8_INTERFACE_SIZEOF_V1)
-		utfi->utf8_decodeW = Utf8DecodeUcs2;
+		utfi->utf8_decodeW = Utf8DecodeW;
 	if (utfi->cbSize > UTF8_INTERFACE_SIZEOF_V2)
 		utfi->utf8_lenW = Ucs2toUtf8Len;
 
@@ -895,28 +580,13 @@ INT_PTR GetUtfInterface(WPARAM, LPARAM lParam)
 
 int LoadSystemModule(void)
 {
-	INITCOMMONCONTROLSEX icce = {0};
-	icce.dwSize = sizeof(icce);
-	icce.dwICC = ICC_WIN95_CLASSES | ICC_USEREX_CLASSES;
-	InitCommonControlsEx(&icce);
+	hMirandaShutdown = CreateEvent(NULL, TRUE, FALSE, NULL);
+	hThreadQueueEmpty = CreateEvent(NULL, TRUE, TRUE, NULL);
 
-	if ( IsWinVerXPPlus()) {
-		hAPCWindow=CreateWindowEx(0, _T("ComboLBox"), NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
-		SetClassLongPtr(hAPCWindow, GCL_STYLE, GetClassLongPtr(hAPCWindow, GCL_STYLE) | CS_DROPSHADOW);
-		DestroyWindow(hAPCWindow);
-		hAPCWindow = NULL;
-	}
-
-	hAPCWindow=CreateWindowEx(0, _T("STATIC"), NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL); // lame
-	SetWindowLongPtr(hAPCWindow, GWLP_WNDPROC, (LONG_PTR)APCWndProc);
-	hStackMutex=CreateMutex(NULL, FALSE, NULL);
-	hMirandaShutdown=CreateEvent(NULL, TRUE, FALSE, NULL);
-	hThreadQueueEmpty=CreateEvent(NULL, TRUE, TRUE, NULL);
-
-	hShutdownEvent=CreateHookableEvent(ME_SYSTEM_SHUTDOWN);
-	hPreShutdownEvent=CreateHookableEvent(ME_SYSTEM_PRESHUTDOWN);
-	hModulesLoadedEvent=CreateHookableEvent(ME_SYSTEM_MODULESLOADED);
-	hOkToExitEvent=CreateHookableEvent(ME_SYSTEM_OKTOEXIT);
+	hShutdownEvent = CreateHookableEvent(ME_SYSTEM_SHUTDOWN);
+	hPreShutdownEvent = CreateHookableEvent(ME_SYSTEM_PRESHUTDOWN);
+	hModulesLoadedEvent = CreateHookableEvent(ME_SYSTEM_MODULESLOADED);
+	hOkToExitEvent = CreateHookableEvent(ME_SYSTEM_OKTOEXIT);
 
 	CreateServiceFunction(MS_SYSTEM_FORK_THREAD, ForkThreadService);
 	CreateServiceFunction(MS_SYSTEM_FORK_THREAD_EX, ForkThreadServiceEx);
@@ -931,9 +601,7 @@ int LoadSystemModule(void)
 	CreateServiceFunction(MS_SYSTEM_GET_LI, GetListInterface);
 	CreateServiceFunction(MS_SYSTEM_GET_MMI, GetMemoryManagerInterface);
 	CreateServiceFunction(MS_SYSTEM_GET_UTFI, GetUtfInterface);
-	CreateServiceFunction(MS_SYSTEM_GETEXCEPTFILTER, GetExceptionFilter);
-	CreateServiceFunction(MS_SYSTEM_SETEXCEPTFILTER, SetExceptionFilter);
-
-	InitPathUtils();
+	CreateServiceFunction(MS_SYSTEM_GETEXCEPTFILTER, srvGetExceptionFilter);
+	CreateServiceFunction(MS_SYSTEM_SETEXCEPTFILTER, srvSetExceptionFilter);
 	return 0;
 }
diff --git a/src/core/miranda.h b/src/core/miranda.h
index 40329e5013..7dfba64a66 100644
--- a/src/core/miranda.h
+++ b/src/core/miranda.h
@@ -115,51 +115,13 @@ extern LPFN_WSAADDRESSTOSTRINGA MyWSAAddressToString;
 
 void PushFileEvent(HANDLE hContact, HANDLE hdbe, LPARAM lParam);
 
-/**** memory.cpp ***********************************************************************/
-
-#ifdef _STATIC
-void*  mir_alloc(size_t);
-void*  mir_calloc(size_t);
-void*  mir_realloc(void* ptr, size_t);
-void   mir_free(void* ptr);
-char*  mir_strdup(const char* str);
-WCHAR* mir_wstrdup(const WCHAR* str);
-char* mir_strndup(const char* str, size_t len);
-
-int    mir_snprintf(char *buffer, size_t count, const char* fmt, ...);
-int    mir_sntprintf(TCHAR *buffer, size_t count, const TCHAR* fmt, ...);
-int    mir_vsnprintf(char *buffer, size_t count, const char* fmt, va_list va);
-int    mir_vsntprintf(TCHAR *buffer, size_t count, const TCHAR* fmt, va_list va);
-
-WCHAR* mir_a2u_cp(const char* src, int codepage);
-WCHAR* mir_a2u(const char* src);
-char*  mir_u2a_cp(const wchar_t* src, int codepage);
-char*  mir_u2a(const wchar_t* src);
-#endif
-
 /**** miranda.cpp **********************************************************************/
 
-extern HINSTANCE hMirandaInst;
+extern HINSTANCE hInst;
 extern HANDLE hOkToExitEvent, hModulesLoadedEvent;
-extern pfnExceptionFilter pMirandaExceptFilter;
-
-/**** modules.cpp **********************************************************************/
-
-int  CallPluginEventHook(HINSTANCE hInst, HANDLE hEvent, WPARAM wParam, LPARAM lParam);
-void KillModuleEventHooks(HINSTANCE);
-void KillModuleServices(HINSTANCE);
-
-void KillObjectEventHooks(void* pObject);
-void KillObjectServices(void* pObject);
-void KillObjectThreads(void* pObject);
 
 /**** utf.cpp **************************************************************************/
 
-char* Utf8Decode(char* str, wchar_t** ucs2);
-char* Utf8DecodeCP(char* str, int codepage, wchar_t** ucs2);
-
-wchar_t* Utf8DecodeUcs2(const char* str);
-
 __forceinline char* Utf8DecodeA(const char* src)
 {
     char* tmp = mir_strdup(src);
@@ -167,62 +129,12 @@ __forceinline char* Utf8DecodeA(const char* src)
     return tmp;
 }
 
-
-char* Utf8Encode(const char* str);
-char* Utf8EncodeCP(const char* src, int codepage);
-
-char* Utf8EncodeUcs2(const wchar_t* str);
-
-int   Ucs2toUtf8Len(const wchar_t *src);
-
-#define Utf8DecodeT Utf8DecodeUcs2
-#define Utf8EncodeT Utf8EncodeUcs2
-
-/**** langpack.cpp *********************************************************************/
-
-int    LangPackGetDefaultCodePage();
-int    LangPackGetDefaultLocale();
-TCHAR* LangPackPcharToTchar(const char* pszStr);
-char*  LangPackTranslateString(struct LangPackMuuid* pUuid, const char *szEnglish, const int W);
-TCHAR* LangPackTranslateStringT(int hLangpack, const TCHAR* tszEnglish);
-
-unsigned int __fastcall hash(const void * key, unsigned int len);
-
-#pragma optimize("gt", on)
-__inline unsigned int hashstr(const char * key)
-{
-	if (key == NULL) return 0;
-	const unsigned int len = (unsigned int)strlen((const char*)key);
-	return hash(key, len);
-}
-
-__inline unsigned int hashstr(const wchar_t * key)
-{
-	if (key == NULL) return 0;
-	const unsigned int len = (unsigned int)wcslen((const wchar_t*)key);
-	return hash(key, len * sizeof(wchar_t));
-}
 #pragma optimize("", on)
 
 /**** options.cpp **********************************************************************/
 
 HTREEITEM FindNamedTreeItemAtRoot(HWND hwndTree, const TCHAR* name);
 
-/**** path.cpp *************************************************************************/
-
-void CreatePathToFile(char* wszFilePath);
-void CreatePathToFileW(WCHAR* wszFilePath);
-
-int CreateDirectoryTree(const char *szDir);
-int CreateDirectoryTreeW(const WCHAR *szDir);
-
-int pathToAbsolute(const char *pSrc, char *pOut, char* base);
-int pathToAbsoluteW(const TCHAR *pSrc, TCHAR *pOut, TCHAR* base);
-
-#define pathToAbsoluteT pathToAbsoluteW
-#define CreatePathToFileT CreatePathToFileW
-#define CreateDirectoryTreeT CreateDirectoryTreeW
-
 /**** skin2icons.cpp *******************************************************************/
 
 HANDLE IcoLib_AddNewIcon(int hLangpack, SKINICONDESC* sid);
@@ -294,25 +206,10 @@ void OpenAccountOptions(PROTOACCOUNT* pa);
 void LoadDbAccounts(void);
 void WriteDbAccounts(void);
 
-INT_PTR CallProtoServiceInt(HANDLE hContact, const char* szModule, const char* szService, WPARAM, LPARAM);
-INT_PTR CallContactService(HANDLE hContact, const char *szProtoService, WPARAM, LPARAM);
-
-__inline static INT_PTR CallProtoService(const char* szModule, const char* szService, WPARAM wParam, LPARAM lParam)
-{
-	return CallProtoServiceInt(NULL, szModule, szService, wParam, lParam);
-}
+INT_PTR CallProtoServiceInt(HANDLE hContact, const char* szModule, const char* szService, WPARAM wParam, LPARAM lParam);
 
 /**** utils.cpp ************************************************************************/
 
-char*  __fastcall rtrim(char* str);
-TCHAR* __fastcall rtrim(TCHAR* str);
-char*  __fastcall ltrim(char* str);
-char* __fastcall ltrimp(char* str);
-__inline char* lrtrim(char* str) { return ltrim(rtrim(str)); };
-__inline char* lrtrimp(char* str) { return ltrimp(rtrim(str)); };
-
-bool __fastcall wildcmp(char * name, char * mask);
-
 void HotkeyToName(TCHAR *buf, int size, BYTE shift, BYTE key);
 WORD GetHotkeyValue(INT_PTR idHotkey);
 
@@ -350,5 +247,3 @@ public:
 #define StrConvTu(x) x
 #define StrConvA(x) StrConvAT(x)
 #define StrConvU(x) x
-
-
diff --git a/src/core/modules.cpp b/src/core/modules.cpp
index ba846d0fd4..11e93f1354 100644
--- a/src/core/modules.cpp
+++ b/src/core/modules.cpp
@@ -2,7 +2,7 @@
 
 Miranda IM: the free IM client for Microsoft* Windows*
 
-Copyright 2000-2009 Miranda ICQ/IM project, 
+Copyright 2000-2009 Miranda ICQ/IM project,
 all portions of this codebase are copyrighted to the people
 listed in contributors.txt.
 
@@ -11,7 +11,7 @@ modify it under the terms of the GNU General Public License
 as published by the Free Software Foundation; either version 2
 of the License, or (at your option) any later version.
 
-This program is distributed in the hope that it will be useful, 
+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.
@@ -23,66 +23,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "commonheaders.h"
 #include <m_plugins.h>
 
-// list of hooks
-
-static int compareHooks(const THook* p1, const THook* p2)
-{
-	return strcmp(p1->name, p2->name);
-}
-
-static LIST<THook> hooks(50, compareHooks);
-
-struct THookToMainThreadItem
-{
-	THook* hook;
-	HANDLE hDoneEvent;
-	WPARAM wParam;
-	LPARAM lParam;
-	int result;
-};
-
-// list of services
-
-struct TService
-{
-	DWORD nameHash;
-	HINSTANCE hOwner;
-	union {
-		MIRANDASERVICE pfnService;
-		MIRANDASERVICEPARAM pfnServiceParam;
-		MIRANDASERVICEOBJ pfnServiceObj;
-		MIRANDASERVICEOBJPARAM pfnServiceObjParam;
-	};
-	int flags;
-	LPARAM lParam;
-	void* object;
-	char name[1];
-};
-
-LIST<TService> services(100, NumericKeySortT);
-
-typedef struct
-{
-	HANDLE hDoneEvent;
-	WPARAM wParam;
-	LPARAM lParam;
-	int result;
-	const char *name;
-}
-	TServiceToMainThreadItem;
-
 // other static variables
 static BOOL bServiceMode = FALSE;
-static CRITICAL_SECTION csHooks, csServices;
 static DWORD  mainThreadId;
-static int    hookId = 1;
 static HANDLE hMainThread;
 static HANDLE hMissingService;
-static THook *pLastHook = NULL;
-
-HINSTANCE GetInstByAddress(void* codePtr);
-
-void LangPackDropUnusedItems(void);
 
 void ParseCommandLine();		// core: IDD_WAITRESTART
 int LoadSystemModule(void);		// core: m_system.h services
@@ -134,7 +79,6 @@ void UnloadClcModule(void);
 void UnloadContactListModule(void);
 void UnloadEventsModule(void);
 void UnloadIdleModule(void);
-void UnloadLangPackModule(void);
 void UnloadSslModule(void);
 void UnloadNetlibModule(void);
 void UnloadNewPlugins(void);
@@ -236,576 +180,4 @@ void UnloadDefaultModules(void)
 	UnloadUpdateNotifyModule();
 	UnloadNetlibModule();
 	UnloadSslModule();
-	UnloadLangPackModule();
-}
-
-int InitialiseModularEngine(void)
-{
-	InitializeCriticalSection(&csHooks);
-	InitializeCriticalSection(&csServices);
-
-	mainThreadId=GetCurrentThreadId();
-	DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &hMainThread, 0, FALSE, DUPLICATE_SAME_ACCESS);
-
-	hMissingService = CreateHookableEvent(ME_SYSTEM_MISSINGSERVICE);
-	return 0;
-}
-
-void DestroyModularEngine(void)
-{
-	int i;
-	THook* p;
-	EnterCriticalSection(&csHooks);
-	for (i=0; i < hooks.getCount(); i++) {
-		p = hooks[i];
- 		if (p->subscriberCount)
-			mir_free(p->subscriber);
-		DeleteCriticalSection(&p->csHook);
-		mir_free(p);
-	}
-	hooks.destroy();
-	LeaveCriticalSection(&csHooks);
-	DeleteCriticalSection(&csHooks);
-
-	EnterCriticalSection(&csServices);
-	for (i=0; i < services.getCount(); i++)
-		mir_free(services[i]);
-
-	services.destroy();
-	LeaveCriticalSection(&csServices);
- 	DeleteCriticalSection(&csServices);
-	CloseHandle(hMainThread);
-}
-
-///////////////////////////////HOOKS
-
-HANDLE CreateHookableEvent(const char *name)
-{
-	THook* ret;
-	int    idx;
-
-	if (name == NULL)
-		return NULL;
-
-	EnterCriticalSection(&csHooks);
-	if ((idx = hooks.getIndex((THook*)name)) != -1) {
-		LeaveCriticalSection(&csHooks);
-		return NULL;
-	}
-
-	ret = (THook*)mir_alloc(sizeof(THook));
-	strncpy(ret->name, name, sizeof(ret->name)); ret->name[ MAXMODULELABELLENGTH-1 ] = 0;
-	ret->id = hookId++;
-	ret->subscriberCount = 0;
-	ret->subscriber = NULL;
-	ret->pfnHook = NULL;
-	InitializeCriticalSection(&ret->csHook);
-	hooks.insert(ret);
-
-	LeaveCriticalSection(&csHooks);
-	return (HANDLE)ret;
-}
-
-int DestroyHookableEvent(HANDLE hEvent)
-{
-	int idx;
-	THook* p;
-
-	EnterCriticalSection(&csHooks);
-	if (pLastHook == (THook*)hEvent)
-		pLastHook = NULL;
-
-	if ((idx = hooks.getIndex((THook*)hEvent)) == -1) {
-      LeaveCriticalSection(&csHooks);
-		return 1;
-	}
-	p = hooks[idx];
-	if (p->subscriberCount) {
-		mir_free(p->subscriber);
-		p->subscriber = NULL;
-		p->subscriberCount = 0;
-	}
-	hooks.remove(idx);
-	DeleteCriticalSection(&p->csHook);
-	mir_free(p);
-
-	LeaveCriticalSection(&csHooks);
-	return 0;
-}
-
-int SetHookDefaultForHookableEvent(HANDLE hEvent, MIRANDAHOOK pfnHook)
-{
-	THook* p = (THook*)hEvent;
-
-	EnterCriticalSection(&csHooks);
-	if (hooks.getIndex(p) != -1)
-		p->pfnHook = pfnHook;
-	LeaveCriticalSection(&csHooks);
-	return 0;
-}
-
-int CallPluginEventHook(HINSTANCE hInst, HANDLE hEvent, WPARAM wParam, LPARAM lParam)
-{
-	int returnVal = 0;
-	THook* p = (THook*)hEvent;
-	if (p == NULL)
-		return -1;
-
-	EnterCriticalSection(&p->csHook);
-	for (int i = 0; i < p->subscriberCount; i++) {
-		THookSubscriber* s = &p->subscriber[i];
-		if (s->hOwner != hInst)
-			continue;
-
-		switch (s->type) {
-			case 1:	returnVal = s->pfnHook(wParam, lParam);	break;
-			case 2:	returnVal = s->pfnHookParam(wParam, lParam, s->lParam); break;
-			case 3:	returnVal = s->pfnHookObj(s->object, wParam, lParam); break;
-			case 4:	returnVal = s->pfnHookObjParam(s->object, wParam, lParam, s->lParam); break;
-			case 5:	returnVal = SendMessage(s->hwnd, s->message, wParam, lParam); break;
-			default: continue;
-		}
-		if (returnVal)
-			break;
-	}
-
-	if (p->subscriberCount == 0 && p->pfnHook != 0)
-		returnVal = p->pfnHook(wParam, lParam);
-
-	LeaveCriticalSection(&p->csHook);
-	return returnVal;
-}
-
-int CallHookSubscribers(HANDLE hEvent, WPARAM wParam, LPARAM lParam)
-{
-	int returnVal = 0;
-	THook* p = (THook*)hEvent;
-	if (p == NULL)
-		return -1;
-
-	EnterCriticalSection(&p->csHook);
-
-	// NOTE: We've got the critical section while all this lot are called. That's mostly safe, though.
-	for (int i = 0; i < p->subscriberCount; i++) {
-		THookSubscriber* s = &p->subscriber[i];
-		switch (s->type) {
-			case 1:	returnVal = s->pfnHook(wParam, lParam);	break;
-			case 2:	returnVal = s->pfnHookParam(wParam, lParam, s->lParam); break;
-			case 3:	returnVal = s->pfnHookObj(s->object, wParam, lParam); break;
-			case 4:	returnVal = s->pfnHookObjParam(s->object, wParam, lParam, s->lParam); break;
-			case 5:	returnVal = SendMessage(s->hwnd, s->message, wParam, lParam); break;
-			default: continue;
-		}
-		if (returnVal)
-			break;
-	}
-
-	// check for no hooks and call the default hook if any
-	if (p->subscriberCount == 0 && p->pfnHook != 0)
-		returnVal = p->pfnHook(wParam, lParam);
-
-	LeaveCriticalSection(&p->csHook);
-	return returnVal;
-}
-
-static int checkHook(HANDLE hHook)
-{
-	if (hHook == NULL)
-		return -1;
-
-	EnterCriticalSection(&csHooks);
-	if (pLastHook != hHook || !pLastHook) {
-		if (hooks.getIndex((THook*)hHook) == -1) {
-			LeaveCriticalSection(&csHooks);
-			return -1;
-		}
-		pLastHook = (THook*)hHook;
-	}
-	LeaveCriticalSection(&csHooks);
-	return 0;
-}
-
-static void CALLBACK HookToMainAPCFunc(ULONG_PTR dwParam)
-{
-	THookToMainThreadItem* item = (THookToMainThreadItem*)dwParam;
-
-	if (checkHook(item->hook) == -1)
-		item->result = -1;
-	else
-		item->result = CallHookSubscribers(item->hook, item->wParam, item->lParam);
-	SetEvent(item->hDoneEvent);
-}
-
-int NotifyEventHooks(HANDLE hEvent, WPARAM wParam, LPARAM lParam)
-{
-	extern HWND hAPCWindow;
-
-	if ( GetCurrentThreadId() != mainThreadId) {
-		THookToMainThreadItem item;
-
-		item.hDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-		item.hook = (THook*)hEvent;
-		item.wParam = wParam;
-		item.lParam = lParam;
-
-		QueueUserAPC(HookToMainAPCFunc, hMainThread, (ULONG_PTR)&item);
-		PostMessage(hAPCWindow, WM_NULL, 0, 0); // let it process APC even if we're in a common dialog
-		WaitForSingleObject(item.hDoneEvent, INFINITE);
-		CloseHandle(item.hDoneEvent);
-		return item.result;
-	}
-
-	return (checkHook(hEvent) == -1) ? -1 : CallHookSubscribers(hEvent, wParam, lParam);
-}
-
-static HANDLE HookEventInt(int type, const char* name, MIRANDAHOOK hookProc, void* object, LPARAM lParam)
-{
-	int idx;
-	THook* p;
-	HANDLE ret;
-
-	EnterCriticalSection(&csHooks);
-	if ((idx = hooks.getIndex((THook*)name)) == -1) {
-		#ifdef _DEBUG
-			OutputDebugStringA("Attempt to hook: \t");
-			OutputDebugStringA(name);
-			OutputDebugStringA("\n");
-		#endif
-		LeaveCriticalSection(&csHooks);
-		return NULL;
-	}
-
-	p = hooks[ idx ];
-	p->subscriber = (THookSubscriber*)mir_realloc(p->subscriber, sizeof(THookSubscriber)*(p->subscriberCount+1));
-	p->subscriber[ p->subscriberCount ].type = type;
-	p->subscriber[ p->subscriberCount ].pfnHook = hookProc;
-	p->subscriber[ p->subscriberCount ].object = object;
-	p->subscriber[ p->subscriberCount ].lParam = lParam;
-	p->subscriber[ p->subscriberCount ].hOwner  = GetInstByAddress(hookProc);
-	p->subscriberCount++;
-
-	ret = (HANDLE)((p->id << 16) | p->subscriberCount);
-	LeaveCriticalSection(&csHooks);
-	return ret;
-}
-
-HANDLE HookEvent(const char* name, MIRANDAHOOK hookProc)
-{
-	return HookEventInt(1, name, hookProc, 0, 0);
-}
-
-HANDLE HookEventParam(const char* name, MIRANDAHOOKPARAM hookProc, LPARAM lParam)
-{
-	return HookEventInt(2, name, (MIRANDAHOOK)hookProc, 0, lParam);
-}
-
-HANDLE HookEventObj(const char* name, MIRANDAHOOKOBJ hookProc, void* object)
-{
-	return HookEventInt(3, name, (MIRANDAHOOK)hookProc, object, 0);
-}
-
-HANDLE HookEventObjParam(const char* name, MIRANDAHOOKOBJPARAM hookProc, void* object, LPARAM lParam)
-{
-	return HookEventInt(4, name, (MIRANDAHOOK)hookProc, object, lParam);
-}
-
-HANDLE HookEventMessage(const char* name, HWND hwnd, UINT message)
-{
-	int idx;
-	THook* p;
-	HANDLE ret;
-
-	EnterCriticalSection(&csHooks);
-	if ((idx = hooks.getIndex((THook*)name)) == -1) {
-		#ifdef _DEBUG
-			MessageBoxA(NULL, "Attempt to hook non-existant event", name, MB_OK);
-		#endif
-		LeaveCriticalSection(&csHooks);
-		return NULL;
-	}
-
-	p = hooks[ idx ];
-	p->subscriber = (THookSubscriber*)mir_realloc(p->subscriber, sizeof(THookSubscriber)*(p->subscriberCount+1));
-	p->subscriber[ p->subscriberCount ].type = 5;
-	p->subscriber[ p->subscriberCount ].hwnd = hwnd;
-	p->subscriber[ p->subscriberCount ].message = message;
-	p->subscriberCount++;
-
-	ret = (HANDLE)((p->id << 16) | p->subscriberCount);
-	LeaveCriticalSection(&csHooks);
-	return ret;
-}
-
-int UnhookEvent(HANDLE hHook)
-{
-	int i;
-	THook* p = NULL;
-
-	int hookId = (int)hHook >> 16;
-	int subscriberId = ((int)hHook & 0xFFFF) - 1;
-
-	if (hHook == NULL) return 0;
-
-	EnterCriticalSection(&csHooks);
-	for (i = 0; i < hooks.getCount(); i++) {
-		if (hooks[i]->id == hookId) {
-			p = hooks[i];
-			break;
-	}	}
-
-	if (p == NULL) {
-		LeaveCriticalSection(&csHooks);
-		return 1;
-	}
-
-	if (subscriberId >= p->subscriberCount || subscriberId < 0) {
-		LeaveCriticalSection(&csHooks);
-		return 1;
-	}
-
-	p->subscriber[subscriberId].type    = 0;
-	p->subscriber[subscriberId].pfnHook = NULL;
-	p->subscriber[subscriberId].hOwner  = NULL;
-	while (p->subscriberCount && p->subscriber[p->subscriberCount-1].type == 0)
-		p->subscriberCount--;
-	if (p->subscriberCount == 0) {
-		if (p->subscriber) mir_free(p->subscriber);
-		p->subscriber = NULL;
-	}
-	LeaveCriticalSection(&csHooks);
-	return 0;
-}
-
-void KillModuleEventHooks(HINSTANCE hInst)
-{
-	int i, j;
-
-	EnterCriticalSection(&csHooks);
-	for (i = hooks.getCount()-1; i >= 0; i--) {
-		if (hooks[i]->subscriberCount == 0)
-			continue;
-
-		for (j = hooks[i]->subscriberCount-1; j >= 0; j--) {
-			if (hooks[i]->subscriber[j].hOwner == hInst) {
-				char szModuleName[ MAX_PATH ];
-				GetModuleFileNameA(hooks[i]->subscriber[j].hOwner, szModuleName, sizeof(szModuleName));
-				Netlib_Logf(NULL, "A hook %08x for event '%s' was abnormally deleted because module '%s' didn't released it", 
-					hooks[i]->subscriber[j].pfnHook, hooks[i]->name, szModuleName);
-				UnhookEvent((HANDLE)((hooks[i]->id << 16) + j + 1));
-				if (hooks[i]->subscriberCount == 0)
-					break;
-	}	}	}
-
-	LeaveCriticalSection(&csHooks);
-}
-
-void KillObjectEventHooks(void* pObject)
-{
-	int i, j;
-
-	EnterCriticalSection(&csHooks);
-	for (i = hooks.getCount()-1; i >= 0; i--) {
-		if (hooks[i]->subscriberCount == 0)
-			continue;
-
-		for (j = hooks[i]->subscriberCount-1; j >= 0; j--) {
-			if (hooks[i]->subscriber[j].object == pObject) {
-				UnhookEvent((HANDLE)((hooks[i]->id << 16) + j + 1));
-				if (hooks[i]->subscriberCount == 0)
-					break;
-	}	}	}
-
-	LeaveCriticalSection(&csHooks);
-}
-
-/////////////////////SERVICES
-
-static __inline TService* FindServiceByName(const char *name)
-{
-	unsigned hash = hashstr(name);
-	return services.find((TService*)&hash);
-}
-
-static HANDLE CreateServiceInt(int type, const char *name, MIRANDASERVICE serviceProc, void* object, LPARAM lParam)
-{
-	if (name == NULL)
-		return NULL;
-
-	TService tmp;
-	tmp.nameHash = hashstr(name);
-
-	EnterCriticalSection(&csServices);
-
-	if (services.getIndex(&tmp) != -1) {
-		LeaveCriticalSection(&csServices);
-		return NULL;
-	}
-
-	TService* p = (TService*)mir_alloc(sizeof(*p) + strlen(name));
-	strcpy(p->name, name);
-	p->nameHash   = tmp.nameHash;
-	p->pfnService = serviceProc;
-	p->hOwner     = GetInstByAddress(serviceProc);
-	p->flags      = type;
-	p->lParam     = lParam;
-	p->object     = object;
-	services.insert(p);
-
-	LeaveCriticalSection(&csServices);
-	return (HANDLE)tmp.nameHash;
-}
-
-HANDLE CreateServiceFunction(const char *name, MIRANDASERVICE serviceProc)
-{
-	return CreateServiceInt(0, name, serviceProc, 0, 0);
-}
-
-HANDLE CreateServiceFunctionParam(const char *name, MIRANDASERVICEPARAM serviceProc, LPARAM lParam)
-{
-	return CreateServiceInt(1, name, (MIRANDASERVICE)serviceProc, 0, lParam);
-}
-
-HANDLE CreateServiceFunctionObj(const char *name, MIRANDASERVICEOBJ serviceProc, void* object)
-{
-	return CreateServiceInt(2, name, (MIRANDASERVICE)serviceProc, object, 0);
-}
-
-HANDLE CreateServiceFunctionObjParam(const char *name, MIRANDASERVICEOBJPARAM serviceProc, void* object, LPARAM lParam)
-{
-	return CreateServiceInt(3, name, (MIRANDASERVICE)serviceProc, object, lParam);
-}
-
-int DestroyServiceFunction(HANDLE hService)
-{
-	int idx;
-
-	EnterCriticalSection(&csServices);
-	if ((idx = services.getIndex((TService*)&hService)) != -1) {
-		mir_free(services[idx]);
-		services.remove(idx);
-	}
-
-	LeaveCriticalSection(&csServices);
-	return 0;
-}
-
-int ServiceExists(const char *name)
-{
-	if (name == NULL)
-		return FALSE;
-
-	EnterCriticalSection(&csServices);
-	int ret = FindServiceByName(name) != NULL;
-	LeaveCriticalSection(&csServices);
-	return ret;
-}
-
-INT_PTR CallService(const char *name, WPARAM wParam, LPARAM lParam)
-{
-	#ifdef _DEBUG
-		if (name == NULL) {
-			MessageBoxA(0, "Someone tried to CallService(NULL, ..) see stack trace for details", "", 0);
-			DebugBreak();
-			return CALLSERVICE_NOTFOUND;
-		}
-	#else
-		if (name == NULL) return CALLSERVICE_NOTFOUND;
-	#endif
-
-	EnterCriticalSection(&csServices);
-	TService *pService = FindServiceByName(name);
-	if (pService == NULL) {
-		LeaveCriticalSection(&csServices);
-		#ifdef _DEBUG
-			//MessageBoxA(NULL, "Attempt to call non-existant service", name, MB_OK);
-			OutputDebugStringA("Missing service called: \t");
-			OutputDebugStringA(name);
-			OutputDebugStringA("\n");
-		#endif
-/*		{	MISSING_SERVICE_PARAMS params = { name, wParam, lParam };
-			int result = NotifyEventHooks(hMissingService, 0, (LPARAM)&params);
-			if (result != 0)
-				return params.lParam;
-		} */
-		return CALLSERVICE_NOTFOUND;
-	}
-
-	MIRANDASERVICE pfnService = pService->pfnService;
-	int flags = pService->flags;
-	LPARAM fnParam = pService->lParam;
-	void* object = pService->object;
-	LeaveCriticalSection(&csServices);
-	switch(flags) {
-		case 1:  return ((MIRANDASERVICEPARAM)pfnService)(wParam, lParam, fnParam);
-		case 2:  return ((MIRANDASERVICEOBJ)pfnService)(object, wParam, lParam);
-		case 3:  return ((MIRANDASERVICEOBJPARAM)pfnService)(object, wParam, lParam, fnParam);
-		default: return pfnService(wParam, lParam);
-}	}
-
-static void CALLBACK CallServiceToMainAPCFunc(ULONG_PTR dwParam)
-{
-	TServiceToMainThreadItem *item = (TServiceToMainThreadItem*) dwParam;
-	item->result = CallService(item->name, item->wParam, item->lParam);
-	SetEvent(item->hDoneEvent);
-}
-
-INT_PTR CallServiceSync(const char *name, WPARAM wParam, LPARAM lParam)
-{
-	extern HWND hAPCWindow;
-
-	if (name == NULL) return CALLSERVICE_NOTFOUND;
-	// the service is looked up within the main thread, since the time it takes
-	// for the APC queue to clear the service being called maybe removed.
-	// even thou it may exists before the call, the critsec can't be locked between calls.
-	if (GetCurrentThreadId() != mainThreadId) {
-		TServiceToMainThreadItem item;
-		item.wParam = wParam;
-		item.lParam = lParam;
-		item.name = name;
-		item.hDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-		QueueUserAPC(CallServiceToMainAPCFunc, hMainThread, (ULONG_PTR) &item);
-		PostMessage(hAPCWindow, WM_NULL, 0, 0); // let this get processed in its own time
-		WaitForSingleObject(item.hDoneEvent, INFINITE);
-		CloseHandle(item.hDoneEvent);
-		return item.result;
-	}
-
-   return CallService(name, wParam, lParam);
-}
-
-int CallFunctionAsync(void (__stdcall *func)(void *), void *arg)
-{
-	extern HWND hAPCWindow;
-	int r = QueueUserAPC((void (__stdcall *)(ULONG_PTR))func, hMainThread, (ULONG_PTR)arg);
-	PostMessage(hAPCWindow, WM_NULL, 0, 0);
-	return r;
-}
-
-void KillModuleServices(HINSTANCE hInst)
-{
-	int i;
-
-	EnterCriticalSection(&csServices);
-	for (i = services.getCount()-1; i >= 0; i--) {
-		if (services[i]->hOwner == hInst) {
-			char szModuleName[ MAX_PATH ];
-			GetModuleFileNameA(services[i]->hOwner, szModuleName, sizeof(szModuleName));
-			Netlib_Logf(NULL, "A service function '%s' was abnormally deleted because module '%s' didn't released it", 
-				services[i]->name, szModuleName);
-			DestroyServiceFunction((HANDLE)services[i]->nameHash);
-	}	}
-
-	LeaveCriticalSection(&csServices);
-}
-
-void KillObjectServices(void* pObject)
-{
-	int i;
-
-	EnterCriticalSection(&csServices);
-	for (i = services.getCount()-1; i >= 0; i--)
-		if (services[i]->object == pObject)
-			DestroyServiceFunction((HANDLE)services[i]->nameHash);
-
-	LeaveCriticalSection(&csServices);
 }
diff --git a/src/miranda32_10.vcxproj.filters b/src/miranda32_10.vcxproj.filters
index a0ba3df139..ce44b856ae 100644
--- a/src/miranda32_10.vcxproj.filters
+++ b/src/miranda32_10.vcxproj.filters
@@ -219,18 +219,9 @@
     <ClInclude Include="core\commonheaders.h">
       <Filter>Core</Filter>
     </ClInclude>
-    <ClInclude Include="core\forkthread.h">
-      <Filter>Core</Filter>
-    </ClInclude>
     <ClInclude Include="core\miranda.h">
       <Filter>Core</Filter>
     </ClInclude>
-    <ClInclude Include="core\modules.h">
-      <Filter>Core</Filter>
-    </ClInclude>
-    <ClInclude Include="modules\database\dblists.h">
-      <Filter>Modules\database</Filter>
-    </ClInclude>
     <ClInclude Include="modules\database\profilemanager.h">
       <Filter>Modules\database</Filter>
     </ClInclude>
@@ -323,9 +314,6 @@
     <ClCompile Include="core\commonheaders.cpp">
       <Filter>Core</Filter>
     </ClCompile>
-    <ClCompile Include="core\memory.cpp">
-      <Filter>Core</Filter>
-    </ClCompile>
     <ClCompile Include="core\miranda.cpp">
       <Filter>Core</Filter>
     </ClCompile>
@@ -350,9 +338,6 @@
     <ClCompile Include="modules\database\dbini.cpp">
       <Filter>Modules\database</Filter>
     </ClCompile>
-    <ClCompile Include="modules\database\dblists.cpp">
-      <Filter>Modules\database</Filter>
-    </ClCompile>
     <ClCompile Include="modules\database\dbutils.cpp">
       <Filter>Modules\database</Filter>
     </ClCompile>
@@ -380,9 +365,6 @@
     <ClCompile Include="modules\ignore\ignore.cpp">
       <Filter>Modules\ignore</Filter>
     </ClCompile>
-    <ClCompile Include="modules\langpack\langpack.cpp">
-      <Filter>Modules\langpack</Filter>
-    </ClCompile>
     <ClCompile Include="modules\langpack\lpservices.cpp">
       <Filter>Modules\langpack</Filter>
     </ClCompile>
@@ -548,12 +530,6 @@
     <ClCompile Include="modules\utils\sha1.cpp">
       <Filter>Modules\utils</Filter>
     </ClCompile>
-    <ClCompile Include="modules\utils\utf.cpp">
-      <Filter>Modules\utils</Filter>
-    </ClCompile>
-    <ClCompile Include="modules\utils\utils.cpp">
-      <Filter>Modules\utils</Filter>
-    </ClCompile>
     <ClCompile Include="modules\utils\windowlist.cpp">
       <Filter>Modules\utils</Filter>
     </ClCompile>
@@ -701,6 +677,9 @@
     <ClCompile Include="modules\json\json.cpp">
       <Filter>Modules\json</Filter>
     </ClCompile>
+    <ClCompile Include="modules\utils\utils.cpp">
+      <Filter>Modules\utils</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="res\_blank.ico">
diff --git a/src/modules/addcontact/addcontact.cpp b/src/modules/addcontact/addcontact.cpp
index f1a2e6330d..ce03278281 100644
--- a/src/modules/addcontact/addcontact.cpp
+++ b/src/modules/addcontact/addcontact.cpp
@@ -107,7 +107,7 @@ INT_PTR CALLBACK AddContactDlgProc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lp
 			CheckDlgButton(hdlg, IDC_ADDED, BST_CHECKED);
 			CheckDlgButton(hdlg, IDC_AUTH, BST_CHECKED);
 
-			DWORD flags = (acs->szProto) ? CallProtoService(acs->szProto, PS_GETCAPS, PFLAGNUM_4, 0) : 0;
+			DWORD flags = (acs->szProto) ? CallProtoServiceInt(NULL,acs->szProto, PS_GETCAPS, PFLAGNUM_4, 0) : 0;
 			if (flags&PF4_FORCEADDED) { // force you were added requests for this protocol
 				EnableWindow(GetDlgItem(hdlg, IDC_ADDED), FALSE);
 			}
@@ -133,7 +133,7 @@ INT_PTR CALLBACK AddContactDlgProc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lp
 		{
 		case IDC_AUTH:
 			{
-				DWORD flags = CallProtoService(acs->szProto, PS_GETCAPS, PFLAGNUM_4, 0);
+				DWORD flags = CallProtoServiceInt(NULL,acs->szProto, PS_GETCAPS, PFLAGNUM_4, 0);
 				if (flags & PF4_NOCUSTOMAUTH) {
 					EnableWindow(GetDlgItem(hdlg, IDC_AUTHREQ), FALSE);
 					EnableWindow(GetDlgItem(hdlg, IDC_AUTHGB), FALSE);
@@ -154,12 +154,12 @@ INT_PTR CALLBACK AddContactDlgProc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lp
 						DBEVENTINFO dbei = { 0 };
 						dbei.cbSize = sizeof(dbei);
 						CallService(MS_DB_EVENT_GET, (WPARAM)acs->handle, (LPARAM)&dbei);
-						hContact = (HANDLE)CallProtoService(dbei.szModule, PS_ADDTOLISTBYEVENT, 0, (LPARAM)acs->handle);
+						hContact = (HANDLE)CallProtoServiceInt(NULL,dbei.szModule, PS_ADDTOLISTBYEVENT, 0, (LPARAM)acs->handle);
 					}
 					break;
 
 				case HANDLE_SEARCHRESULT:
-					hContact = (HANDLE)CallProtoService(acs->szProto, PS_ADDTOLIST, 0, (LPARAM)acs->psr);
+					hContact = (HANDLE)CallProtoServiceInt(NULL,acs->szProto, PS_ADDTOLIST, 0, (LPARAM)acs->psr);
 					break;
 
 				case HANDLE_CONTACT:
@@ -188,7 +188,7 @@ INT_PTR CALLBACK AddContactDlgProc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lp
 
 				if (IsDlgButtonChecked(hdlg, IDC_AUTH)) 
 				{
-					DWORD flags = CallProtoService(acs->szProto, PS_GETCAPS, PFLAGNUM_4, 0);
+					DWORD flags = CallProtoServiceInt(NULL,acs->szProto, PS_GETCAPS, PFLAGNUM_4, 0);
 					if (flags & PF4_NOCUSTOMAUTH)
 						CallContactService(hContact, PSS_AUTHREQUESTT, 0, 0);
 					else 
@@ -256,9 +256,9 @@ INT_PTR AddContactDialog(WPARAM wParam, LPARAM lParam)
 		}
 
 		if (wParam)
-			DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_ADDCONTACT), (HWND)wParam, AddContactDlgProc, (LPARAM)acs);
+			DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_ADDCONTACT), (HWND)wParam, AddContactDlgProc, (LPARAM)acs);
 		else
-			CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_ADDCONTACT), (HWND)wParam, AddContactDlgProc, (LPARAM)acs);
+			CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ADDCONTACT), (HWND)wParam, AddContactDlgProc, (LPARAM)acs);
 		return 0;
 	}
 	return 1;
diff --git a/src/modules/autoaway/autoaway.cpp b/src/modules/autoaway/autoaway.cpp
index 767800d014..764cd3e965 100644
--- a/src/modules/autoaway/autoaway.cpp
+++ b/src/modules/autoaway/autoaway.cpp
@@ -41,8 +41,8 @@ static int AutoAwayEvent(WPARAM, LPARAM lParam)
 
 		if ( !Proto_IsAccountEnabled(pa) || Proto_IsAccountLocked(pa)) continue;
 
-		int statusbits = CallProtoService(pa->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0);
-		int currentstatus = CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0);
+		int statusbits = CallProtoServiceInt(NULL,pa->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0);
+		int currentstatus = CallProtoServiceInt(NULL,pa->szModuleName, PS_GETSTATUS, 0, 0);
 		int status = mii.aaStatus;
 		if ( !(statusbits & Proto_Status2Flag(status))) {
 			// the protocol doesnt support the given status
diff --git a/src/modules/button/button.cpp b/src/modules/button/button.cpp
index 756740eefa..8889af9bf5 100644
--- a/src/modules/button/button.cpp
+++ b/src/modules/button/button.cpp
@@ -495,7 +495,7 @@ static LRESULT CALLBACK MButtonWndProc(HWND hwndDlg, UINT msg,  WPARAM wParam, L
 				else {
 					TTooltips *ptt = (TTooltips*)mir_alloc(sizeof(TTooltips));
 					ptt->ThreadId = tt.ThreadId;
-					ptt->hwnd = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, _T(""), TTS_ALWAYSTIP, 0, 0, 0, 0, NULL, NULL, hMirandaInst, NULL);
+					ptt->hwnd = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, _T(""), TTS_ALWAYSTIP, 0, 0, 0, 0, NULL, NULL, hInst, NULL);
 					lToolTips.insert(ptt);
 					bct->hwndToolTips = ptt->hwnd;
 				}
diff --git a/src/modules/clist/clc.cpp b/src/modules/clist/clc.cpp
index d68ad5a9b8..8a50469245 100644
--- a/src/modules/clist/clc.cpp
+++ b/src/modules/clist/clc.cpp
@@ -99,7 +99,7 @@ static int ClcSettingChanged(WPARAM wParam, LPARAM lParam)
 			// something is being written to a protocol module
 			if ( !strcmp(szProto, cws->szModule)) {
 				// was a unique setting key written?
-				id = (char *) CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
+				id = (char *) CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
 				if ((INT_PTR) id != CALLSERVICE_NOTFOUND && id != NULL && !strcmp(id, cws->szSetting))
 					cli.pfnClcBroadcast(INTM_PROTOCHANGED, wParam, lParam);
 			}
@@ -129,7 +129,7 @@ static int ClcAccountsChanged(WPARAM, LPARAM)
 	for (i = 0, cnt = 0; i < accounts.getCount(); ++i) {
 		if (Proto_IsAccountEnabled(accounts[i])) {
 			cli.clcProto[cnt].szProto = accounts[i]->szModuleName;
-			cli.clcProto[cnt].dwStatus = CallProtoService(accounts[i]->szModuleName, PS_GETSTATUS, 0, 0);
+			cli.clcProto[cnt].dwStatus = CallProtoServiceInt(NULL,accounts[i]->szModuleName, PS_GETSTATUS, 0, 0);
 			++cnt;
 		}
 	}
diff --git a/src/modules/clist/clcfiledrop.cpp b/src/modules/clist/clcfiledrop.cpp
index 8af901284b..5c64082215 100644
--- a/src/modules/clist/clcfiledrop.cpp
+++ b/src/modules/clist/clcfiledrop.cpp
@@ -82,7 +82,7 @@ static HANDLE HContactFromPoint(HWND hwnd, struct ClcData *dat, int x, int y, in
 	szProto = (char *) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) contact->hContact, 0);
 	if (szProto == NULL)
 		return NULL;
-	protoCaps = CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0);
+	protoCaps = CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0);
 	if ( !(protoCaps & PF1_FILESEND))
 		return NULL;
 	if (ID_STATUS_OFFLINE == DBGetContactSettingWord(contact->hContact, szProto, "Status", ID_STATUS_OFFLINE))
diff --git a/src/modules/clist/clistmenus.cpp b/src/modules/clist/clistmenus.cpp
index f05f9c13ae..dc9c4a69e2 100644
--- a/src/modules/clist/clistmenus.cpp
+++ b/src/modules/clist/clistmenus.cpp
@@ -171,8 +171,8 @@ int GetAverageMode(int* pNetProtoCount = NULL)
 		netProtoCount++;
 
 		if (averageMode == 0)
-			averageMode = CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0);
-		else if (averageMode > 0 && averageMode != CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0)) {
+			averageMode = CallProtoServiceInt(NULL,pa->szModuleName, PS_GETSTATUS, 0, 0);
+		else if (averageMode > 0 && averageMode != CallProtoServiceInt(NULL,pa->szModuleName, PS_GETSTATUS, 0, 0)) {
 			averageMode = -1;
             if (pNetProtoCount == NULL) break;
 	    }	
@@ -449,12 +449,12 @@ INT_PTR StatusMenuCheckService(WPARAM wParam, LPARAM)
 	StatusMenuExecParam *smep = (StatusMenuExecParam*)pcpp->MenuItemOwnerData;
 	if (smep && !smep->status && smep->custom) {
 		if (wildcmp(smep->svc, "*XStatus*")) {
-			int XStatus = CallProtoService(smep->proto, "/GetXStatus", 0, 0);
+			int XStatus = CallProtoServiceInt(NULL,smep->proto, "/GetXStatus", 0, 0);
 			char buf[255];
 			mir_snprintf(buf, sizeof(buf), "*XStatus%d", XStatus);
 
-			bool check = wildcmp(smep->svc, buf);
-			bool reset = wildcmp(smep->svc, "*XStatus0");
+			bool check = wildcmp(smep->svc, buf) != 0;
+			bool reset = wildcmp(smep->svc, "*XStatus0") != 0;
 
 			if (check)
 				timi->mi.flags |= CMIF_CHECKED;
@@ -467,7 +467,7 @@ INT_PTR StatusMenuCheckService(WPARAM wParam, LPARAM)
 					CLISTMENUITEM mi2 = {0};
 					mi2.cbSize = sizeof(mi2);
 					mi2.flags = CMIM_NAME | CMIF_TCHAR;
-					mi2.ptszName = LangPackTranslateStringT(timi->mi.hLangpack, timi->mi.hIcon ? timi->mi.ptszName : LPGENT("Custom status"));
+					mi2.ptszName = TranslateTH(timi->mi.hLangpack, timi->mi.hIcon ? timi->mi.ptszName : LPGENT("Custom status"));
 
 					timiParent = MO_GetIntMenuItem(timi->mi.root);
 
@@ -510,7 +510,7 @@ INT_PTR StatusMenuCheckService(WPARAM wParam, LPARAM)
 		}	}	}
 	}
 	else if (smep && smep->status && !smep->custom) {
-		int curProtoStatus = (smep->proto) ? CallProtoService(smep->proto, PS_GETSTATUS, 0, 0) : GetAverageMode();
+		int curProtoStatus = (smep->proto) ? CallProtoServiceInt(NULL,smep->proto, PS_GETSTATUS, 0, 0) : GetAverageMode();
 		if (smep->status == curProtoStatus)
 			timi->mi.flags |= CMIF_CHECKED;
 		else
@@ -531,13 +531,13 @@ INT_PTR StatusMenuCheckService(WPARAM wParam, LPARAM)
 		if (Proto_GetAccount(prot) == NULL)
 			return TRUE;
 
-		if ((curProtoStatus = CallProtoService(prot, PS_GETSTATUS, 0, 0)) == CALLSERVICE_NOTFOUND)
+		if ((curProtoStatus = CallProtoServiceInt(NULL,prot, PS_GETSTATUS, 0, 0)) == CALLSERVICE_NOTFOUND)
 			curProtoStatus = 0;
 
 		if (curProtoStatus >= ID_STATUS_OFFLINE && curProtoStatus < ID_STATUS_IDLE)
 			timi->mi.hIcon = LoadSkinProtoIcon(prot, curProtoStatus);
 		else {
-			timi->mi.hIcon=(HICON)CallProtoService(prot, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
+			timi->mi.hIcon=(HICON)CallProtoServiceInt(NULL,prot, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
 			if (timi->mi.hIcon == (HICON)CALLSERVICE_NOTFOUND)
 				timi->mi.hIcon = NULL;
 			else
@@ -574,7 +574,7 @@ INT_PTR StatusMenuExecService(WPARAM wParam, LPARAM)
 				int i=(DBGetContactSettingByte(NULL, prot, "LockMainStatus", 0)?0:1);
 				DBWriteContactSettingByte(NULL, prot, "LockMainStatus", (BYTE)i);
 
-				CallProtoService(smep->proto, PS_GETNAME, (WPARAM)SIZEOF(szHumanName), (LPARAM)szHumanName);
+				CallProtoServiceInt(NULL,smep->proto, PS_GETNAME, (WPARAM)SIZEOF(szHumanName), (LPARAM)szHumanName);
 				pimi = MO_GetIntMenuItem((HGENMENU)smep->protoindex);
 				PMO_IntMenuItem root = (PMO_IntMenuItem)pimi->mi.root;
 				mir_free(pimi->mi.pszName);
@@ -874,7 +874,7 @@ void RebuildMenuOrder(void)
 		tmi.cbSize = sizeof(tmi);
 		tmi.flags = CMIF_TCHAR | CMIF_ROOTHANDLE | CMIF_KEEPUNTRANSLATED;
 		tmi.position = pos++;
-		tmi.hIcon = ic = (HICON)CallProtoService(pa->szModuleName, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0);
+		tmi.hIcon = ic = (HICON)CallProtoServiceInt(NULL,pa->szModuleName, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0);
 
 		if (Proto_IsAccountLocked(pa) && cli.bDisplayLocked) {
 			mir_sntprintf(tbuf, SIZEOF(tbuf), LPGENT("%s (locked)"), pa->tszAccountName);
diff --git a/src/modules/clist/clistmod.cpp b/src/modules/clist/clistmod.cpp
index 26ad72ae7c..84d587db97 100644
--- a/src/modules/clist/clistmod.cpp
+++ b/src/modules/clist/clistmod.cpp
@@ -146,7 +146,7 @@ static int ProtocolAck(WPARAM, LPARAM lParam)
 
 	if ((int) ack->hProcess < ID_STATUS_ONLINE && ack->lParam >= ID_STATUS_ONLINE) {
 		DWORD caps;
-		caps = (DWORD) CallProtoService(ack->szModule, PS_GETCAPS, PFLAGNUM_1, 0);
+		caps = (DWORD) CallProtoServiceInt(NULL,ack->szModule, PS_GETCAPS, PFLAGNUM_1, 0);
 		if (caps & PF1_SERVERCLIST) {
 			HANDLE hContact;
 			char *szProto;
diff --git a/src/modules/clist/clisttray.cpp b/src/modules/clist/clisttray.cpp
index 608f692028..013a639168 100644
--- a/src/modules/clist/clisttray.cpp
+++ b/src/modules/clist/clisttray.cpp
@@ -53,13 +53,13 @@ static TCHAR* sttGetXStatus(const char* szProto)
 {
 	TCHAR* result = NULL;
 
-	if (CallProtoService(szProto, PS_GETSTATUS, 0, 0) > ID_STATUS_OFFLINE) {
+	if (CallProtoServiceInt(NULL,szProto, PS_GETSTATUS, 0, 0) > ID_STATUS_OFFLINE) {
 		char str[MAXMODULELABELLENGTH];
 		mir_snprintf(str, sizeof(str), "%s/GetXStatus", szProto);
 		if (ServiceExists(str)) {
 			char* dbTitle = "XStatusName";
 			char* dbTitle2 = NULL;
-			int xstatus = CallProtoService(szProto, "/GetXStatus", (WPARAM)&dbTitle, (LPARAM)&dbTitle2);
+			int xstatus = CallProtoServiceInt(NULL,szProto, "/GetXStatus", (WPARAM)&dbTitle, (LPARAM)&dbTitle2);
 			if (dbTitle && xstatus) {
 				DBVARIANT dbv={0};
 				if ( !DBGetContactSettingTString(NULL, szProto, dbTitle, &dbv)) {
@@ -123,7 +123,7 @@ TCHAR* fnTrayIconMakeTooltip(const TCHAR *szPrefix, const char *szProto)
 			if ( !cli.pfnGetProtocolVisibility(pa->szModuleName))
 				continue;
 
-			szStatus = cli.pfnGetStatusModeDescription(CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0), 0);
+			szStatus = cli.pfnGetStatusModeDescription(CallProtoServiceInt(NULL,pa->szModuleName, PS_GETSTATUS, 0, 0), 0);
 			if ( !szStatus)
 				continue;
 
@@ -156,7 +156,7 @@ TCHAR* fnTrayIconMakeTooltip(const TCHAR *szPrefix, const char *szProto)
 	else {
 		if ((pa = Proto_GetAccount(szProto)) != NULL) {
 			ProtoXStatus = sttGetXStatus(szProto);
-			szStatus = cli.pfnGetStatusModeDescription(CallProtoService(szProto, PS_GETSTATUS, 0, 0), 0);
+			szStatus = cli.pfnGetStatusModeDescription(CallProtoServiceInt(NULL,szProto, PS_GETSTATUS, 0, 0), 0);
 			if (szPrefix && szPrefix[0]) {
 				if (DBGetContactSettingByte(NULL, "CList", "AlwaysStatus", SETTING_ALWAYSSTATUS_DEFAULT)) {
 					if (mToolTipTrayTips) {
@@ -281,7 +281,7 @@ int fnTrayIconInit(HWND hwnd)
 		    else
 			    szProto = NULL;
 
-		    cli.pfnTrayIconAdd(hwnd, NULL, szProto, szProto ? CallProtoService(szProto, PS_GETSTATUS, 0, 0) : CallService(MS_CLIST_GETSTATUSMODE, 0, 0));
+		    cli.pfnTrayIconAdd(hwnd, NULL, szProto, szProto ? CallProtoServiceInt(NULL,szProto, PS_GETSTATUS, 0, 0) : CallService(MS_CLIST_GETSTATUSMODE, 0, 0));
 		    DBFreeVariant(&dbv);
 	    }
 	    else if (trayIconSetting == SETTING_TRAYICON_MULTI &&
@@ -295,7 +295,7 @@ int fnTrayIconInit(HWND hwnd)
                 {
 				    PROTOACCOUNT* pa = accounts[j];
 				    if (cli.pfnGetProtocolVisibility(pa->szModuleName))
-					    cli.pfnTrayIconAdd(hwnd, pa->szModuleName, NULL, CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0));
+					    cli.pfnTrayIconAdd(hwnd, pa->szModuleName, NULL, CallProtoServiceInt(NULL,pa->szModuleName, PS_GETSTATUS, 0, 0));
 		        }	
             }
 	    }	
@@ -498,7 +498,7 @@ VOID CALLBACK fnTrayCycleTimerProc(HWND, UINT, UINT_PTR, DWORD)
     {
         DestroyIcon(cli.trayIcon[0].hBaseIcon);
         cli.trayIcon[0].hBaseIcon = cli.pfnGetIconFromStatusMode(NULL, accounts[cycleStep]->szModuleName, 
-	        CallProtoService(accounts[cycleStep]->szModuleName, PS_GETSTATUS, 0, 0));
+	        CallProtoServiceInt(NULL,accounts[cycleStep]->szModuleName, PS_GETSTATUS, 0, 0));
         if (cli.trayIcon[0].isBase)
 	        cli.pfnTrayIconUpdate(cli.trayIcon[0].hBaseIcon, NULL, NULL, 1);
     }
@@ -534,7 +534,7 @@ void fnTrayIconUpdateBase(const char *szChangedProto)
 			if (trayIconSetting == SETTING_TRAYICON_MULTI) {
 				if (DBGetContactSettingByte(NULL, "CList", "AlwaysMulti", SETTING_ALWAYSMULTI_DEFAULT))
 					//changed = cli.pfnTrayIconSetBaseInfo(cli.pfnGetIconFromStatusMode((char*)szChangedProto, NULL, averageMode), (char*)szChangedProto);
-					changed = cli.pfnTrayIconSetBaseInfo(cli.pfnGetIconFromStatusMode(NULL, szChangedProto, CallProtoService(szChangedProto, PS_GETSTATUS, 0, 0)), (char*)szChangedProto);
+					changed = cli.pfnTrayIconSetBaseInfo(cli.pfnGetIconFromStatusMode(NULL, szChangedProto, CallProtoServiceInt(NULL,szChangedProto, PS_GETSTATUS, 0, 0)), (char*)szChangedProto);
 				else if (cli.trayIcon && cli.trayIcon[0].szProto != NULL) {
 					cli.pfnTrayIconDestroy(hwnd);
 					cli.pfnTrayIconInit(hwnd);
@@ -555,7 +555,7 @@ void fnTrayIconUpdateBase(const char *szChangedProto)
 						szProto = NULL;
 					else
 						szProto = dbv.pszVal;
-					changed = cli.pfnTrayIconSetBaseInfo(cli.pfnGetIconFromStatusMode(NULL, szProto, szProto ? CallProtoService(szProto, PS_GETSTATUS, 0, 0) : CallService(MS_CLIST_GETSTATUSMODE, 0, 0)), szProto);
+					changed = cli.pfnTrayIconSetBaseInfo(cli.pfnGetIconFromStatusMode(NULL, szProto, szProto ? CallProtoServiceInt(NULL,szProto, PS_GETSTATUS, 0, 0) : CallService(MS_CLIST_GETSTATUSMODE, 0, 0)), szProto);
 					DBFreeVariant(&dbv);
 					break;
 				}
@@ -564,7 +564,7 @@ void fnTrayIconUpdateBase(const char *szChangedProto)
 					SetTimer(NULL, 0, DBGetContactSettingWord(NULL, "CList", "CycleTime", SETTING_CYCLETIME_DEFAULT) * 1000, cli.pfnTrayCycleTimerProc);
 				changed =
 					cli.pfnTrayIconSetBaseInfo(ImageList_GetIcon
-					(hCListImages, cli.pfnIconFromStatusMode(szChangedProto, CallProtoService(szChangedProto, PS_GETSTATUS, 0, 0), NULL), 
+					(hCListImages, cli.pfnIconFromStatusMode(szChangedProto, CallProtoServiceInt(NULL,szChangedProto, PS_GETSTATUS, 0, 0), NULL), 
 					ILD_NORMAL), NULL);
 				break;
 			case SETTING_TRAYICON_MULTI:
@@ -572,7 +572,7 @@ void fnTrayIconUpdateBase(const char *szChangedProto)
 					cli.pfnTrayIconRemove(NULL, NULL);
 				}
 				else if ((cli.trayIconCount > 1 || netProtoCount == 1) || DBGetContactSettingByte(NULL, "CList", "AlwaysMulti", SETTING_ALWAYSMULTI_DEFAULT))
-					changed = cli.pfnTrayIconSetBaseInfo(cli.pfnGetIconFromStatusMode(NULL, szChangedProto, CallProtoService(szChangedProto, PS_GETSTATUS, 0, 0)), (char*)szChangedProto);
+					changed = cli.pfnTrayIconSetBaseInfo(cli.pfnGetIconFromStatusMode(NULL, szChangedProto, CallProtoServiceInt(NULL,szChangedProto, PS_GETSTATUS, 0, 0)), (char*)szChangedProto);
 				else {
 					cli.pfnTrayIconDestroy(hwnd);
 					cli.pfnTrayIconInit(hwnd);
diff --git a/src/modules/clist/clui.cpp b/src/modules/clist/clui.cpp
index 78ed09174d..8524a4cf3a 100644
--- a/src/modules/clist/clui.cpp
+++ b/src/modules/clist/clui.cpp
@@ -76,7 +76,7 @@ static void DisconnectAll()
 {
 	int nProto;
 	for (nProto = 0; nProto < accounts.getCount(); nProto++)
-		CallProtoService(accounts[nProto]->szModuleName, PS_SETSTATUS, ID_STATUS_OFFLINE, 0);
+		CallProtoServiceInt(NULL,accounts[nProto]->szModuleName, PS_SETSTATUS, ID_STATUS_OFFLINE, 0);
 }
 
 static int CluiIconsChanged(WPARAM, LPARAM)
@@ -183,7 +183,7 @@ static INT_PTR MenuItem_DeleteContact(WPARAM wParam, LPARAM lParam)
 	if (DBGetContactSettingByte(NULL, "CList", "ConfirmDelete", SETTING_CONFIRMDELETE_DEFAULT) &&
 		!(GetKeyState(VK_SHIFT)&0x8000))
 		// Ask user for confirmation, and if the contact should be archived (hidden, not deleted)
-		action = DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_DELETECONTACT), (HWND) lParam, AskForConfirmationDlgProc, wParam);
+		action = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DELETECONTACT), (HWND) lParam, AskForConfirmationDlgProc, wParam);
 	else
 		action = IDYES;
 
@@ -197,11 +197,11 @@ static INT_PTR MenuItem_DeleteContact(WPARAM wParam, LPARAM lParam)
 				// Check if protocol uses server side lists
 				DWORD caps;
 
-				caps = (DWORD) CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0);
+				caps = (DWORD) CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0);
 				if (caps & PF1_SERVERCLIST) {
 					int status;
 
-					status = CallProtoService(szProto, PS_GETSTATUS, 0, 0);
+					status = CallProtoServiceInt(NULL,szProto, PS_GETSTATUS, 0, 0);
 					if (status == ID_STATUS_OFFLINE || (status >= ID_STATUS_CONNECTING && status < ID_STATUS_CONNECTING + MAX_CONNECT_RETRIES)) {
 						// Set a flag so we remember to delete the contact when the protocol goes online the next time
 						DBWriteContactSettingByte((HANDLE) wParam, "CList", "Delete", 1);
@@ -1042,7 +1042,7 @@ LRESULT CALLBACK fnContactListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
 				int status, x;
 				SIZE textSize;
 				BYTE showOpts = DBGetContactSettingByte(NULL, "CLUI", "SBarShow", 1);
-				status = CallProtoService(szProto, PS_GETSTATUS, 0, 0);
+				status = CallProtoServiceInt(NULL,szProto, PS_GETSTATUS, 0, 0);
 				SetBkMode(dis->hDC, TRANSPARENT);
 				x = dis->rcItem.left;
 				if (showOpts & 1) {
diff --git a/src/modules/clist/cluiservices.cpp b/src/modules/clist/cluiservices.cpp
index e1123ecd05..30f1a55322 100644
--- a/src/modules/clist/cluiservices.cpp
+++ b/src/modules/clist/cluiservices.cpp
@@ -199,7 +199,7 @@ void fnCluiProtocolStatusChanged(int, const char*)
 				x += GetSystemMetrics(SM_CXBORDER) * 4; // The SB panel doesnt allocate enough room
 			}
 			if (showOpts & 4) {
-				TCHAR* modeDescr = cli.pfnGetStatusModeDescription(CallProtoService(cli.menuProtos[i].szProto, PS_GETSTATUS, 0, 0), 0);
+				TCHAR* modeDescr = cli.pfnGetStatusModeDescription(CallProtoServiceInt(NULL,cli.menuProtos[i].szProto, PS_GETSTATUS, 0, 0), 0);
 				GetTextExtentPoint32(hdc, modeDescr, lstrlen(modeDescr), &textSize);
 				x += textSize.cx;
 				x += GetSystemMetrics(SM_CXBORDER) * 4; // The SB panel doesnt allocate enough room
diff --git a/src/modules/clist/genmenu.cpp b/src/modules/clist/genmenu.cpp
index b6f78c80ef..ff6ead1d75 100644
--- a/src/modules/clist/genmenu.cpp
+++ b/src/modules/clist/genmenu.cpp
@@ -77,7 +77,7 @@ LPTSTR GetMenuItemText(PMO_IntMenuItem pimi)
 	if (pimi->mi.flags & CMIF_KEEPUNTRANSLATED)
 		return pimi->mi.ptszName;
 		
-	return LangPackTranslateStringT(pimi->mi.hLangpack, pimi->mi.ptszName);
+	return TranslateTH(pimi->mi.hLangpack, pimi->mi.ptszName);
 }
 
 PMO_IntMenuItem MO_RecursiveWalkMenu(PMO_IntMenuItem parent, pfnWalkFunc func, void* param)
diff --git a/src/modules/clist/genmenuopt.cpp b/src/modules/clist/genmenuopt.cpp
index e16fd49d18..c2ecc3f18b 100644
--- a/src/modules/clist/genmenuopt.cpp
+++ b/src/modules/clist/genmenuopt.cpp
@@ -849,7 +849,7 @@ int GenMenuOptInit(WPARAM wParam, LPARAM)
 {
 	OPTIONSDIALOGPAGE odp = { 0 };
 	odp.cbSize=sizeof(odp);
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszGroup = LPGEN("Customize");
 
 	odp.position = -1000000000;
diff --git a/src/modules/contacts/contacts.cpp b/src/modules/contacts/contacts.cpp
index f6cbc2c889..096725972a 100644
--- a/src/modules/contacts/contacts.cpp
+++ b/src/modules/contacts/contacts.cpp
@@ -34,12 +34,12 @@ BYTE nameOrder[NAMEORDERCOUNT];
 
 static int GetDatabaseString(CONTACTINFO *ci, const char* setting, DBVARIANT* dbv)
 {
-    if (strcmp(ci->szProto, "CList") && CallProtoService(ci->szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC)
+    if (strcmp(ci->szProto, "CList") && CallProtoServiceInt(NULL,ci->szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC)
     {
         DBCONTACTGETSETTING cgs = { ci->szProto, setting, dbv };
         dbv->type = (ci->dwFlag & CNF_UNICODE) ? DBVT_WCHAR : DBVT_ASCIIZ;
 
-        int res = CallProtoService(ci->szProto, PS_GETINFOSETTING, (WPARAM)ci->hContact, (LPARAM)&cgs);
+        int res = CallProtoServiceInt(NULL,ci->szProto, PS_GETINFOSETTING, (WPARAM)ci->hContact, (LPARAM)&cgs);
         if (res != CALLSERVICE_NOTFOUND) return res;
     }
 
@@ -197,7 +197,7 @@ static INT_PTR GetContactInfo(WPARAM, LPARAM lParam) {
 
 		case CNF_UNIQUEID:
 		{
-			char *uid = (char*)CallProtoService(ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
+			char *uid = (char*)CallProtoServiceInt(NULL,ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
 			if ((INT_PTR)uid != CALLSERVICE_NOTFOUND && uid)
 				if ( !ProcessDatabaseValueDefault(ci, uid))
 					return 0;
@@ -208,7 +208,7 @@ static INT_PTR GetContactInfo(WPARAM, LPARAM lParam) {
 		{
 			if ( !ProcessDatabaseValueDefault(ci, "display_uid"))
 				return 0;
-			char *uid = (char*)CallProtoService(ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
+			char *uid = (char*)CallProtoServiceInt(NULL,ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
 			if ((INT_PTR)uid != CALLSERVICE_NOTFOUND && uid)
 				if ( !ProcessDatabaseValueDefault(ci, uid))
 					return 0;
@@ -252,7 +252,7 @@ static INT_PTR GetContactInfo(WPARAM, LPARAM lParam) {
 					case 5: // Unique id
 					{
 						// protocol must define a PFLAG_UNIQUEIDSETTING
-						char *uid = (char*)CallProtoService(ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
+						char *uid = (char*)CallProtoServiceInt(NULL,ci->szProto, PS_GETCAPS, PFLAG_UNIQUEIDSETTING, 0);
 						if ((INT_PTR)uid != CALLSERVICE_NOTFOUND && uid) {
 							if ( !GetDatabaseString(ci, uid, &dbv)) {
 								if (dbv.type == DBVT_BYTE || dbv.type == DBVT_WORD || dbv.type == DBVT_DWORD) {
@@ -482,7 +482,7 @@ static int ContactOptInit(WPARAM wParam, LPARAM)
 	OPTIONSDIALOGPAGE odp = { 0 };
 	odp.cbSize = sizeof(odp);
 	odp.position = -1000000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_CONTACT);
 	odp.pszGroup = LPGEN("Customize");
 	odp.pszTitle = LPGEN("Contacts");
diff --git a/src/modules/database/database.cpp b/src/modules/database/database.cpp
index 407cc4b4b2..c8743b3b30 100644
--- a/src/modules/database/database.cpp
+++ b/src/modules/database/database.cpp
@@ -77,7 +77,7 @@ int getProfilePath(TCHAR * buf, size_t cch)
 		_tcscpy(profiledir, _T("%miranda_path%\\Profiles"));
 
 	TCHAR* exprofiledir = Utils_ReplaceVarsT(profiledir);
-	size_t len = pathToAbsoluteT(exprofiledir, buf, NULL);
+	size_t len = PathToAbsoluteT(exprofiledir, buf, NULL);
 	mir_free(exprofiledir);
 
 	if (buf[len-1] == '/' || buf[len-1] == '\\')
@@ -184,7 +184,7 @@ void getProfileCmdLine(TCHAR * szProfile, size_t cch, TCHAR * profiledir)
 		p = _tcsrchr(profileName, '.'); if (p) *p = 0; 
 
 		mir_sntprintf(newProfileDir, cch, _T("%s\\%s\\"), profiledir, profileName);
-		pathToAbsoluteT(buf, szProfile, newProfileDir);
+		PathToAbsoluteT(buf, szProfile, newProfileDir);
 
 		if (_tcschr(buf, '\\')) 
 		{
@@ -511,7 +511,7 @@ static int FindMirandaForProfile(TCHAR * szProfile)
 int LoadDatabaseModule(void)
 {
 	TCHAR szProfile[MAX_PATH];
-	pathToAbsoluteT(_T("."), szProfile, NULL);
+	PathToAbsoluteT(_T("."), szProfile, NULL);
 	_tchdir(szProfile);
 	szProfile[0] = 0;
 
diff --git a/src/modules/database/dbini.cpp b/src/modules/database/dbini.cpp
index e8836114c1..af15390857 100644
--- a/src/modules/database/dbini.cpp
+++ b/src/modules/database/dbini.cpp
@@ -193,7 +193,20 @@ int SettingsEnumProc(const char *szSetting, LPARAM lParam)
 	return 0;
 }
 
-void ConvertBackslashes(char *, UINT);
+static void ConvertBackslashes(char *str, UINT fileCp)
+{
+	char *pstr;
+	for (pstr = str; *pstr; pstr = CharNextExA(fileCp, pstr, 0)) {
+		if (*pstr == '\\') {
+			switch(pstr[1]) {
+			case 'n': *pstr = '\n'; break;
+			case 't': *pstr = '\t'; break;
+			case 'r': *pstr = '\r'; break;
+			default:  *pstr = pstr[1]; break;
+			}
+			memmove(pstr+1, pstr+2, strlen(pstr+2) + 1);
+}	}	}
+
 static void ProcessIniFile(TCHAR* szIniPath, char *szSafeSections, char *szUnsafeSections, int secur, bool secFN)
 {
 	FILE *fp = _tfopen(szIniPath, _T("rt"));
@@ -286,7 +299,7 @@ static void ProcessIniFile(TCHAR* szIniPath, char *szSafeSections, char *szUnsaf
 			warnInfo.szValue=szValue;
 			warnInfo.warnNoMore=0;
 			warnInfo.cancel=0;
-			if (warnThisSection && IDNO == DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_WARNINICHANGE), NULL, WarnIniChangeDlgProc, (LPARAM)&warnInfo))
+			if (warnThisSection && IDNO == DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_WARNINICHANGE), NULL, WarnIniChangeDlgProc, (LPARAM)&warnInfo))
 				continue;
 			if (warnInfo.cancel)
 				break;
@@ -392,14 +405,14 @@ static void DoAutoExec(void)
     
 	if (dbCreated && szOnCreateFilename[0]) {
 		str2 = Utils_ReplaceVarsT(szOnCreateFilename);
-		pathToAbsoluteT(str2, szIniPath, NULL);
+		PathToAbsoluteT(str2, szIniPath, NULL);
 		mir_free(str2);
 
 		ProcessIniFile(szIniPath, szSafeSections, szUnsafeSections, 0, 1);
 	}
 
 	str2 = Utils_ReplaceVarsT(szFindPath);
-	pathToAbsoluteT(str2, szFindPath, NULL);
+	PathToAbsoluteT(str2, szFindPath, NULL);
 	mir_free(str2);
 
 	WIN32_FIND_DATA fd;
@@ -419,7 +432,7 @@ static void DoAutoExec(void)
 
 		mir_sntprintf(szIniPath, SIZEOF(szIniPath), _T("%s%s"), szFindPath, fd.cFileName);
 		if ( !lstrcmpi(szUse, _T("prompt")) && !secFN) {
-			int result=DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_INSTALLINI), NULL, InstallIniDlgProc, (LPARAM)szIniPath);
+			int result=DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_INSTALLINI), NULL, InstallIniDlgProc, (LPARAM)szIniPath);
 			if (result == IDC_NOTOALL) break;
 			if (result == IDCANCEL) continue;
 		}
@@ -451,7 +464,7 @@ static void DoAutoExec(void)
 				MoveFile(szIniPath, szNewPath);
 			}
 			else if ( !lstrcmpi(szOnCompletion, _T("ask")))
-				DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_INIIMPORTDONE), NULL, IniImportDoneDlgProc, (LPARAM)szIniPath);
+				DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_INIIMPORTDONE), NULL, IniImportDoneDlgProc, (LPARAM)szIniPath);
 		}
 	} while (FindNextFile(hFind, &fd));
 	FindClose(hFind);
@@ -473,7 +486,7 @@ int InitIni(void)
 	bModuleInitialized = true;
 
 	DoAutoExec();
-	pathToAbsoluteT(_T("."), szMirandaDir, NULL);
+	PathToAbsoluteT(_T("."), szMirandaDir, NULL);
 	hIniChangeNotification=FindFirstChangeNotification(szMirandaDir, 0, FILE_NOTIFY_CHANGE_FILE_NAME);
 	if (hIniChangeNotification != INVALID_HANDLE_VALUE) {
 		CreateServiceFunction("DB/Ini/CheckImportNow", CheckIniImportNow);
diff --git a/src/modules/database/dbutils.cpp b/src/modules/database/dbutils.cpp
index dede30691b..54b352bb4d 100644
--- a/src/modules/database/dbutils.cpp
+++ b/src/modules/database/dbutils.cpp
@@ -207,7 +207,7 @@ static INT_PTR DbEventGetStringT(WPARAM wParam, LPARAM lParam)
 	char* string = (char*)lParam;
 
 	if (dbei->flags & DBEF_UTF)
-		return (INT_PTR)Utf8DecodeUcs2(string);
+		return (INT_PTR)Utf8DecodeW(string);
 
 	return (INT_PTR)mir_a2t(string);
 }
diff --git a/src/modules/database/profilemanager.cpp b/src/modules/database/profilemanager.cpp
index 1ddccf0c95..898fc323d6 100644
--- a/src/modules/database/profilemanager.cpp
+++ b/src/modules/database/profilemanager.cpp
@@ -312,11 +312,11 @@ BOOL EnumProfilesForList(TCHAR * fullpath, TCHAR * profile, LPARAM lParam)
 		}	}
 
 		item2.iSubItem = 3;
-		item2.pszText = rtrim(_tctime(&statbuf.st_ctime));
+		item2.pszText = trtrim(_tctime(&statbuf.st_ctime));
 		SendMessage(hwndList, LVM_SETITEMTEXT, iItem, (LPARAM)&item2);
 
 		item2.iSubItem = 4;
-		item2.pszText = rtrim(_tctime(&statbuf.st_mtime));
+		item2.pszText = trtrim(_tctime(&statbuf.st_mtime));
 		SendMessage(hwndList, LVM_SETITEMTEXT, iItem, (LPARAM)&item2);
 	}
 	return TRUE;
@@ -537,8 +537,8 @@ static INT_PTR CALLBACK DlgProfileManager(HWND hwndDlg, UINT msg, WPARAM wParam,
 		struct DlgProfData * prof = (struct DlgProfData *)lParam;
 		PROPSHEETHEADER *psh = prof->psh;
 		TranslateDialogDefault(hwndDlg);
-		SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadImage(hMirandaInst, MAKEINTRESOURCE(IDI_USERDETAILS), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
-		SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadImage(hMirandaInst, MAKEINTRESOURCE(IDI_USERDETAILS), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 0));
+		SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadImage(hInst, MAKEINTRESOURCE(IDI_USERDETAILS), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0));
+		SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadImage(hInst, MAKEINTRESOURCE(IDI_USERDETAILS), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 0));
 		dat = (struct DetailsData*)mir_alloc(sizeof(struct DetailsData));
 		dat->prof = prof;
 		prof->hwndOK = GetDlgItem(hwndDlg, IDOK);
@@ -805,7 +805,7 @@ int getProfileManager(PROFILEMANAGERDATA * pd)
 		odp.pszTitle    = LPGEN("My Profiles");
 		odp.pfnDlgProc  = DlgProfileSelect;
 		odp.pszTemplate = MAKEINTRESOURCEA(IDD_PROFILE_SELECTION);
-		odp.hInstance   = hMirandaInst;
+		odp.hInstance   = hInst;
 		AddProfileManagerPage(&opi, &odp);
 
 		odp.pszTitle    = LPGEN("New Profile");
@@ -825,7 +825,7 @@ int getProfileManager(PROFILEMANAGERDATA * pd)
 	DlgProfData prof;
 	prof.pd  = pd;
 	prof.psh = &psh;
-	int rc = DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_PROFILEMANAGER), NULL, DlgProfileManager, (LPARAM)&prof);
+	int rc = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PROFILEMANAGER), NULL, DlgProfileManager, (LPARAM)&prof);
 
 	if (rc != -1)
 		for (int i=0; i < opi.pageCount; i++) {
diff --git a/src/modules/findadd/findadd.cpp b/src/modules/findadd/findadd.cpp
index 4763836180..297b418067 100644
--- a/src/modules/findadd/findadd.cpp
+++ b/src/modules/findadd/findadd.cpp
@@ -194,7 +194,7 @@ static void ShowAdvancedSearchDlg(HWND hwndDlg, struct FindAddDlgData *dat)
 	if (szProto == NULL) return;
 	if (dat->hwndAdvSearch == NULL) {
 		RECT rc;
-		dat->hwndAdvSearch=(HWND)CallProtoService(szProto, PS_CREATEADVSEARCHUI, 0, (LPARAM)hwndDlg);
+		dat->hwndAdvSearch=(HWND)CallProtoServiceInt(NULL,szProto, PS_CREATEADVSEARCHUI, 0, (LPARAM)hwndDlg);
 		GetWindowRect(GetDlgItem(hwndDlg, IDC_RESULTS), &rc);
 		SetWindowPos(dat->hwndAdvSearch, 0, rc.left, rc.top, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
 	}
@@ -225,7 +225,7 @@ static void ShowTinySearchDlg(HWND hwndDlg, struct FindAddDlgData *dat)
 	char *szProto=(char*)SendDlgItemMessage(hwndDlg, IDC_PROTOLIST, CB_GETITEMDATA, SendDlgItemMessage(hwndDlg, IDC_PROTOLIST, CB_GETCURSEL, 0, 0), 0);
 	if (szProto == NULL) return;
 	if (dat->hwndTinySearch == NULL) {
-		dat->hwndTinySearch=(HWND)CallProtoService(szProto, PS_CREATEADVSEARCHUI, 0, (LPARAM)/*GetDlgItem(*/hwndDlg/*, IDC_TINYEXTENDEDGROUP)*/);
+		dat->hwndTinySearch=(HWND)CallProtoServiceInt(NULL,szProto, PS_CREATEADVSEARCHUI, 0, (LPARAM)/*GetDlgItem(*/hwndDlg/*, IDC_TINYEXTENDEDGROUP)*/);
 		if (dat->hwndTinySearch)
 			ReposTinySearchDlg(hwndDlg, dat);
 		else
@@ -291,8 +291,8 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 			dat->notSearchedYet=1;
 			dat->iLastColumnSortIndex=1;
 			dat->bSortAscending=1;
-			dat->hBmpSortUp=(HBITMAP)LoadImage(hMirandaInst, MAKEINTRESOURCE(IDB_SORTCOLUP), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
-			dat->hBmpSortDown=(HBITMAP)LoadImage(hMirandaInst, MAKEINTRESOURCE(IDB_SORTCOLDOWN), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
+			dat->hBmpSortUp=(HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDB_SORTCOLUP), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
+			dat->hBmpSortDown=(HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDB_SORTCOLDOWN), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
 			SendDlgItemMessage(hwndDlg, IDC_MOREOPTIONS, BUTTONSETARROW, 1, 0);
 			ListView_SetExtendedListViewStyle(hwndList, LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
 
@@ -344,7 +344,7 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 				
 				for (i=0, netProtoCount=0; i < accounts.getCount(); i++) {
 					if ( !Proto_IsAccountEnabled(accounts[i])) continue;
-					DWORD caps = (DWORD)CallProtoService(accounts[i]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
+					DWORD caps = (DWORD)CallProtoServiceInt(NULL,accounts[i]->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
 					if (caps & PF1_BASICSEARCH || caps & PF1_EXTSEARCH || caps & PF1_SEARCHBYEMAIL || caps & PF1_SEARCHBYNAME)
 						netProtoCount++;
 				}
@@ -366,14 +366,14 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 				for (i=0; i < accounts.getCount(); i++) {
 					PROTOACCOUNT* pa = accounts[i];
 					if ( !Proto_IsAccountEnabled(pa)) continue;
-					DWORD caps=(DWORD)CallProtoService(pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
+					DWORD caps=(DWORD)CallProtoServiceInt(NULL,pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
 					if ( !(caps&PF1_BASICSEARCH) && !(caps&PF1_EXTSEARCH) && !(caps&PF1_SEARCHBYEMAIL) && !(caps&PF1_SEARCHBYNAME))
 						continue;
 					
 					cbei.pszText = pa->tszAccountName;
 					GetTextExtentPoint32(hdc, cbei.pszText, lstrlen(cbei.pszText), &textSize);
 					if (textSize.cx>cbwidth) cbwidth = textSize.cx;
-					hIcon=(HICON)CallProtoService(pa->szModuleName, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
+					hIcon=(HICON)CallProtoServiceInt(NULL,pa->szModuleName, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
 					cbei.iImage=cbei.iSelectedImage=ImageList_AddIcon(dat->himlComboIcons, hIcon);
 					DestroyIcon(hIcon);
 					cbei.lParam=(LPARAM)pa->szModuleName;
@@ -398,7 +398,7 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 		{	UTILRESIZEDIALOG urd={0};
 			urd.cbSize=sizeof(urd);
 			urd.hwndDlg=hwndDlg;
-			urd.hInstance=hMirandaInst;
+			urd.hInstance=hInst;
 			urd.lpTemplate=MAKEINTRESOURCEA(IDD_FINDADD);
 			urd.lParam=(LPARAM)dat;
 			urd.pfnResizer=FindAddDlgResizer;
@@ -452,13 +452,13 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 				for (i=0; i < accounts.getCount(); i++) {
 					PROTOACCOUNT* pa = accounts[i];
 					if ( !Proto_IsAccountEnabled(pa)) continue;
-					protoCaps=(DWORD)CallProtoService(pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
+					protoCaps=(DWORD)CallProtoServiceInt(NULL,pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
 					if (protoCaps&PF1_SEARCHBYEMAIL) dat->showEmail=1;
 					if (protoCaps&PF1_SEARCHBYNAME) dat->showName=1;
 				}
 			}
 			else {
-				protoCaps=(DWORD)CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0);
+				protoCaps=(DWORD)CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0);
 				if (protoCaps&PF1_BASICSEARCH) dat->showProtoId=1;
 				if (protoCaps&PF1_SEARCHBYEMAIL) dat->showEmail=1;
 				if (protoCaps&PF1_SEARCHBYNAME) dat->showName=1;
@@ -467,7 +467,7 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 				if (protoCaps&PF1_USERIDISEMAIL && dat->showProtoId) {dat->showProtoId=0; dat->showEmail=1;}
 				if (dat->showProtoId) {
 					char *szUniqueId;
-					szUniqueId=(char*)CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0);
+					szUniqueId=(char*)CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0);
 					if (szUniqueId) {
 						#if defined(_UNICODE)
 							TCHAR* p = mir_a2u(szUniqueId);
@@ -518,7 +518,8 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 			SendMessage(hwndDlg, WM_SIZE, 0, 0);
 			SendMessage(hwndDlg, WM_GETMINMAXINFO, 0, (LPARAM)&mmi);
 			GetWindowRect(hwndDlg, &rc);
-			if (rc.bottom-rc.top<mmi.ptMinTrackSize.y) SetWindowPos(hwndDlg, 0, 0, 0, rc.right-rc.left, mmi.ptMinTrackSize.y, SWP_NOZORDER|SWP_NOMOVE);
+			if (rc.bottom-rc.top<mmi.ptMinTrackSize.y)
+				SetWindowPos(hwndDlg, 0, 0, 0, rc.right-rc.left, mmi.ptMinTrackSize.y, SWP_NOZORDER|SWP_NOMOVE);
 			break;
 		}
 		case WM_TIMER:
@@ -657,7 +658,7 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 					else if (IsDlgButtonChecked(hwndDlg, IDC_BYPROTOID)) {
 						TCHAR str[256];
 						GetDlgItemText(hwndDlg, IDC_PROTOID, str, SIZEOF(str));
-						rtrim(str);
+						trtrim(str);
 						if (str[0] == 0)
 							MessageBox(hwndDlg, sttErrMsg, sttErrTitle, MB_OK);
 						else
@@ -666,7 +667,7 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 					else if (IsDlgButtonChecked(hwndDlg, IDC_BYEMAIL)) {
 						TCHAR str[256];
 						GetDlgItemText(hwndDlg, IDC_EMAIL, str, SIZEOF(str));
-						rtrim(str);
+						trtrim(str);
 						if (str[0] == 0)
 							MessageBox(hwndDlg, sttErrMsg, sttErrTitle, MB_OK);
 						else
@@ -726,7 +727,8 @@ static INT_PTR CALLBACK DlgProcFindAdd(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 					{
 						TCHAR str[256];
 						GetDlgItemText(hwndDlg, IDC_PROTOID, str, SIZEOF(str));
-						if (*rtrim(str) == 0) break;
+						if (*trtrim(str) == 0)
+							break;
 
 						PROTOSEARCHRESULT psr = {0};
 						psr.cbSize = sizeof(psr);
@@ -975,12 +977,12 @@ static INT_PTR FindAddCommand(WPARAM, LPARAM)
 		for (i=0, netProtoCount=0; i < accounts.getCount(); i++) {
 			PROTOACCOUNT* pa = accounts[i];
 			if ( !Proto_IsAccountEnabled(pa)) continue;
-			int protoCaps=CallProtoService(pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
+			int protoCaps=CallProtoServiceInt(NULL,pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
 			if (protoCaps&PF1_BASICSEARCH || protoCaps&PF1_SEARCHBYEMAIL || protoCaps&PF1_SEARCHBYNAME
 				 ||  protoCaps&PF1_EXTSEARCHUI) netProtoCount++;
 		}
 		if (netProtoCount > 0)
-			hwndFindAdd=CreateDialog(hMirandaInst, MAKEINTRESOURCE(IDD_FINDADD), NULL, DlgProcFindAdd);
+			hwndFindAdd=CreateDialog(hInst, MAKEINTRESOURCE(IDD_FINDADD), NULL, DlgProcFindAdd);
 	}
 	return 0;
 }
@@ -1018,7 +1020,7 @@ static int OnSystemModulesLoaded(WPARAM, LPARAM)
 	// Make sure we have some networks to search on.
 	for (i=0, netProtoCount=0; i < accounts.getCount(); i++) {
 		PROTOACCOUNT* pa = accounts[i];
-		int protoCaps = CallProtoService(pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
+		int protoCaps = CallProtoServiceInt(NULL,pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
 		if (protoCaps & (PF1_BASICSEARCH | PF1_SEARCHBYEMAIL | PF1_SEARCHBYNAME | PF1_EXTSEARCHUI))
 			netProtoCount++;
 	}
diff --git a/src/modules/findadd/searchresults.cpp b/src/modules/findadd/searchresults.cpp
index 2422f262d1..5352bfd6a7 100644
--- a/src/modules/findadd/searchresults.cpp
+++ b/src/modules/findadd/searchresults.cpp
@@ -87,7 +87,7 @@ void LoadColumnSizes(HWND hwndResults, const char *szProto)
 				if (szProto)
 				{
 					bNeedsFree = TRUE;
-					lvc.pszText = mir_a2t((char*)CallProtoService(szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0));
+					lvc.pszText = mir_a2t((char*)CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0));
 				}
 				else
 					lvc.pszText = _T("ID");
@@ -215,9 +215,9 @@ int BeginSearch(HWND, struct FindAddDlgData *dat, const char *szProto, const cha
 		for (i=0; i < accounts.getCount();i++) {
 			PROTOACCOUNT* pa = accounts[i];
 			if ( !Proto_IsAccountEnabled(pa)) continue;
-			DWORD caps=(DWORD)CallProtoService(pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
+			DWORD caps=(DWORD)CallProtoServiceInt(NULL,pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0);
 			if ( !(caps&requiredCapability)) continue;
-			dat->search[dat->searchCount].hProcess = (HANDLE)CallProtoService(pa->szModuleName, szSearchService, 0, (LPARAM)pvSearchParams);
+			dat->search[dat->searchCount].hProcess = (HANDLE)CallProtoServiceInt(NULL,pa->szModuleName, szSearchService, 0, (LPARAM)pvSearchParams);
 			dat->search[dat->searchCount].szProto = pa->szModuleName;
 			if (dat->search[dat->searchCount].hProcess == NULL) failures++;
 			else dat->searchCount++;
@@ -234,7 +234,7 @@ int BeginSearch(HWND, struct FindAddDlgData *dat, const char *szProto, const cha
 	else {
 		dat->search=(struct ProtoSearchInfo*)mir_alloc(sizeof(struct ProtoSearchInfo));
 		dat->searchCount=1;
-		dat->search[0].hProcess=(HANDLE)CallProtoService(szProto, szSearchService, 0, (LPARAM)pvSearchParams);
+		dat->search[0].hProcess=(HANDLE)CallProtoServiceInt(NULL,szProto, szSearchService, 0, (LPARAM)pvSearchParams);
 		dat->search[0].szProto=szProto;
 		if (dat->search[0].hProcess == NULL) {
 			//infuriatingly vague error message. fixme.
@@ -358,7 +358,7 @@ void ShowMoreOptionsMenu(HWND hwndDlg, int x, int y)
 		lsr=(struct ListSearchResult*)lvi.lParam;
 	}
 
-	hMenu=LoadMenu(hMirandaInst, MAKEINTRESOURCE(IDR_CONTEXT));
+	hMenu=LoadMenu(hInst, MAKEINTRESOURCE(IDR_CONTEXT));
 	hPopupMenu=GetSubMenu(hMenu, 4);
 	TranslateMenu(hPopupMenu);
 	commandId=TrackPopupMenu(hPopupMenu, TPM_RIGHTBUTTON|TPM_RETURNCMD, x, y, 0, hwndDlg, NULL);
@@ -375,13 +375,13 @@ void ShowMoreOptionsMenu(HWND hwndDlg, int x, int y)
 		}
 		case IDC_DETAILS:
 		{	HANDLE hContact;
-			hContact=(HANDLE)CallProtoService(lsr->szProto, PS_ADDTOLIST, PALF_TEMPORARY, (LPARAM)&lsr->psr);
+			hContact=(HANDLE)CallProtoServiceInt(NULL,lsr->szProto, PS_ADDTOLIST, PALF_TEMPORARY, (LPARAM)&lsr->psr);
 			CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)hContact, 0);
 			break;
 		}
 		case IDC_SENDMESSAGE:
 		{	HANDLE hContact;
-			hContact=(HANDLE)CallProtoService(lsr->szProto, PS_ADDTOLIST, PALF_TEMPORARY, (LPARAM)&lsr->psr);
+			hContact=(HANDLE)CallProtoServiceInt(NULL,lsr->szProto, PS_ADDTOLIST, PALF_TEMPORARY, (LPARAM)&lsr->psr);
 			CallService(MS_MSG_SENDMESSAGE, (WPARAM)hContact, (LPARAM)(const char*)NULL);
 			break;
 		}
diff --git a/src/modules/fonts/FontOptions.cpp b/src/modules/fonts/FontOptions.cpp
index c026e26d72..8c82f5ac91 100644
--- a/src/modules/fonts/FontOptions.cpp
+++ b/src/modules/fonts/FontOptions.cpp
@@ -371,7 +371,7 @@ static void sttFsuiCreateSettingsTreeNode(HWND hwndTree, const TCHAR *groupName,
 		if (sectionName = _tcschr(sectionName, '/'))
 			*sectionName = 0;
 
-		pItemName = LangPackTranslateStringT(hLangpack, pItemName);
+		pItemName = TranslateTH(hLangpack, pItemName);
 
 		hItem = sttFindNamedTreeItemAt(hwndTree, hSection, pItemName);
 		if ( !sectionName || !hItem) {
@@ -528,7 +528,7 @@ static INT_PTR CALLBACK ChooseEffectDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wPar
 
 static BOOL ChooseEffectDialog(HWND hwndParent, FONTEFFECT * es)
 {
-	return (DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_CHOOSE_FONT_EFFECT), hwndParent, ChooseEffectDlgProc, (LPARAM) es) == IDOK);
+	return (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_CHOOSE_FONT_EFFECT), hwndParent, ChooseEffectDlgProc, (LPARAM) es) == IDOK);
 }
 
 static void sttSaveFontData(HWND hwndDlg, FontInternal &F)
@@ -1014,14 +1014,14 @@ static INT_PTR CALLBACK DlgProcLogOptions(HWND hwndDlg, UINT msg, WPARAM wParam,
 					{
 						cf.Flags = CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS | CF_EFFECTS | CF_ENABLETEMPLATE | CF_ENABLEHOOK;
 						// use custom font dialog to disable colour selection
-						cf.hInstance = hMirandaInst;
+						cf.hInstance = hInst;
 						cf.lpTemplateName = MAKEINTRESOURCE(IDD_CUSTOM_FONT);
 						cf.lpfnHook = CFHookProc;
 					}
 					else if (F.flags & FIDF_DISABLESTYLES) {		// no style selection, mutually exclusive with FIDF_ALLOWEFFECTS
 						cf.Flags = CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS | CF_ENABLETEMPLATE | CF_ENABLEHOOK | CF_TTONLY | CF_NOOEMFONTS;
 						cf.lCustData = F.flags;
-						cf.hInstance = hMirandaInst;
+						cf.hInstance = hInst;
 						cf.lpTemplateName = MAKEINTRESOURCE(IDD_CUSTOM_FONT);
 						cf.lpfnHook = CFHookProc;
 						lf.lfWeight = FW_NORMAL;
@@ -1284,7 +1284,7 @@ int OptInit(WPARAM wParam, LPARAM)
 	OPTIONSDIALOGPAGE odp = {0};
 	odp.cbSize = sizeof(odp);
 	odp.position = -790000000;
-	odp.hInstance = hMirandaInst;;
+	odp.hInstance = hInst;;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_FONTS);
 	odp.pszTitle = LPGEN("Fonts & Colors");
 	odp.pszGroup = LPGEN("Customize");
@@ -1390,7 +1390,7 @@ static INT_PTR CALLBACK DlgProcModernOptions(HWND hwndDlg, UINT msg, WPARAM wPar
 				if (pf->flags & FIDF_ALLOWEFFECTS) {
 					cf.Flags |= CF_EFFECTS | CF_ENABLETEMPLATE | CF_ENABLEHOOK;
 					// use custom font dialog to disable colour selection
-					cf.hInstance = hMirandaInst;
+					cf.hInstance = hInst;
 					cf.lpTemplateName = MAKEINTRESOURCE(IDD_CUSTOM_FONT);
 					cf.lpfnHook = CFHookProc;
 				}
@@ -1452,7 +1452,7 @@ int FontsModernOptInit(WPARAM wParam, LPARAM lParam)
 	obj.cbSize = sizeof(obj);
 	obj.dwFlags = MODEROPT_FLG_TCHAR|MODEROPT_FLG_NORESIZE;
 	obj.hIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA);
-	obj.hInstance = hMirandaInst;
+	obj.hInstance = hInst;
 	obj.iSection = MODERNOPT_PAGE_SKINS;
 	obj.iType = MODERNOPT_TYPE_SUBSECTIONPAGE;
 	obj.iBoldControls = iBoldControls;
diff --git a/src/modules/fonts/FontService.h b/src/modules/fonts/FontService.h
index 8042d668bf..578649f13b 100644
--- a/src/modules/fonts/FontService.h
+++ b/src/modules/fonts/FontService.h
@@ -30,7 +30,7 @@ struct FontInternal : public FontIDT
 	FontSettingsT value;
 	int hLangpack;
 
-	__inline TCHAR* getName() const { return LangPackTranslateStringT(hLangpack, name); }
+	__inline TCHAR* getName() const { return TranslateTH(hLangpack, name); }
 
 	__inline bool isHeader() const
 	{
@@ -46,7 +46,7 @@ struct FontInternal : public FontIDT
 
 struct ColourInternal : public ColourIDT
 {
-	__inline TCHAR* getName() const { return LangPackTranslateStringT(hLangpack, name); }
+	__inline TCHAR* getName() const { return TranslateTH(hLangpack, name); }
 
 	COLORREF value;
 	int hLangpack;
@@ -54,7 +54,7 @@ struct ColourInternal : public ColourIDT
 
 struct EffectInternal : public EffectIDT
 {
-	__inline TCHAR* getName() const { return LangPackTranslateStringT(hLangpack, name); }
+	__inline TCHAR* getName() const { return TranslateTH(hLangpack, name); }
 
 	int hLangpack;
 };
diff --git a/src/modules/fonts/services.cpp b/src/modules/fonts/services.cpp
index 09ac106fb5..adc5d216f2 100644
--- a/src/modules/fonts/services.cpp
+++ b/src/modules/fonts/services.cpp
@@ -297,22 +297,21 @@ static int sttRegisterFontWorker(FontIDW* font_id, int hLangpack)
 	char idstr[256];
 	mir_snprintf(idstr, SIZEOF(idstr), "%sFlags", font_id->prefix);
 	DBWriteContactSettingDword(0, font_id->dbSettingsGroup, idstr, font_id->flags);
-	{
-		FontInternal* newItem = new FontInternal;
-		memset(newItem, 0, sizeof(FontIDW));
-		memcpy(newItem, font_id, font_id->cbSize);
-
-		if ( !lstrcmp(newItem->deffontsettings.szFace, _T("MS Shell Dlg"))) {
-			LOGFONT lf;
-			SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, FALSE);
-			lstrcpyn(newItem->deffontsettings.szFace, lf.lfFaceName, SIZEOF(newItem->deffontsettings.szFace));
-			if ( !newItem->deffontsettings.size)
-				newItem->deffontsettings.size = lf.lfHeight;
-		}
-
-		UpdateFontSettings(font_id, &newItem->value);
-		font_id_list.insert(newItem);
+	
+	FontInternal* newItem = new FontInternal;
+	memset(newItem, 0, sizeof(FontIDW));
+	memcpy(newItem, font_id, font_id->cbSize);
+
+	if ( !lstrcmp(newItem->deffontsettings.szFace, _T("MS Shell Dlg"))) {
+		LOGFONT lf;
+		SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, FALSE);
+		lstrcpyn(newItem->deffontsettings.szFace, lf.lfFaceName, SIZEOF(newItem->deffontsettings.szFace));
+		if ( !newItem->deffontsettings.size)
+			newItem->deffontsettings.size = lf.lfHeight;
 	}
+
+	UpdateFontSettings(font_id, &newItem->value);
+	font_id_list.insert(newItem);
 	return 0;
 }
 
@@ -344,7 +343,8 @@ static INT_PTR sttGetFontWorker(FontIDW* font_id, LOGFONT* lf)
 			}
 
 			return colour;
-	}	}
+		}
+	}
 
 	GetDefaultFontSetting(lf, &colour);
 	return colour;
@@ -358,9 +358,10 @@ INT_PTR GetFontW(WPARAM wParam, LPARAM lParam)
 INT_PTR GetFont(WPARAM wParam, LPARAM lParam)
 {
 	FontIDW temp;
-	LOGFONT lftemp;
-	if ( !ConvertFontID((FontID*)wParam, &temp)) return -1;
+	if ( !ConvertFontID((FontID*)wParam, &temp))
+		return -1;
 
+	LOGFONT lftemp;
 	int ret = sttGetFontWorker(&temp, &lftemp);
 	ConvertLOGFONT(&lftemp, (LOGFONTA*)lParam);
 	return ret;
@@ -436,7 +437,6 @@ INT_PTR GetColour(WPARAM wParam, LPARAM)
 void UpdateEffectSettings(EffectIDW* effect_id, FONTEFFECT* effectsettings)
 {
 	char str[256];
-
 	mir_snprintf(str, SIZEOF(str), "%sEffect", effect_id->setting);
 	effectsettings->effectIndex = DBGetContactSettingByte(NULL, effect_id->dbSettingsGroup, str, effect_id->defeffect.effectIndex);
 
diff --git a/src/modules/help/about.cpp b/src/modules/help/about.cpp
index 2d7616c0ed..93f869466a 100644
--- a/src/modules/help/about.cpp
+++ b/src/modules/help/about.cpp
@@ -67,9 +67,9 @@ INT_PTR CALLBACK DlgProcAbout(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
 		}
 		ShowWindow(GetDlgItem(hwndDlg, IDC_CREDITSFILE), SW_HIDE);
 		{	
-			HRSRC   hResInfo  = FindResource(hMirandaInst, MAKEINTRESOURCE(IDR_CREDITS), _T("TEXT"));
-			DWORD   ResSize   = SizeofResource(hMirandaInst, hResInfo);
-			HGLOBAL hRes      = LoadResource(hMirandaInst, hResInfo);
+			HRSRC   hResInfo  = FindResource(hInst, MAKEINTRESOURCE(IDR_CREDITS), _T("TEXT"));
+			DWORD   ResSize   = SizeofResource(hInst, hResInfo);
+			HGLOBAL hRes      = LoadResource(hInst, hResInfo);
 			char*   pszMsg    = (char*)LockResource(hRes);
 			if (pszMsg)
 			{
diff --git a/src/modules/help/help.cpp b/src/modules/help/help.cpp
index 33b37e86b0..a1984ca32e 100644
--- a/src/modules/help/help.cpp
+++ b/src/modules/help/help.cpp
@@ -34,7 +34,7 @@ static INT_PTR AboutCommand(WPARAM wParam, LPARAM)
 		SetFocus(hAboutDlg);
 		return 0;
 	}
-	hAboutDlg=CreateDialog(hMirandaInst, MAKEINTRESOURCE(IDD_ABOUT), (HWND)wParam, DlgProcAbout);
+	hAboutDlg=CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUT), (HWND)wParam, DlgProcAbout);
 	return 0;
 }
 
diff --git a/src/modules/history/history.cpp b/src/modules/history/history.cpp
index 8e759f471c..218b040d01 100644
--- a/src/modules/history/history.cpp
+++ b/src/modules/history/history.cpp
@@ -39,7 +39,7 @@ static INT_PTR UserHistoryCommand(WPARAM wParam, LPARAM)
 		SetFocus(hwnd);
 		return 0;
 	}
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_HISTORY), NULL, DlgProcHistory, wParam);
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_HISTORY), NULL, DlgProcHistory, wParam);
 	return 0;
 }
 
@@ -290,7 +290,7 @@ static INT_PTR CALLBACK DlgProcHistory(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 			UTILRESIZEDIALOG urd={0};
 			urd.cbSize=sizeof(urd);
 			urd.hwndDlg=hwndDlg;
-			urd.hInstance=hMirandaInst;
+			urd.hInstance=hInst;
 			urd.lpTemplate=MAKEINTRESOURCEA(IDD_HISTORY);
 			urd.lParam=(LPARAM)NULL;
 			urd.pfnResizer=HistoryDlgResizer;
@@ -305,7 +305,7 @@ static INT_PTR CALLBACK DlgProcHistory(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 			return TRUE;
 
 		case IDC_FIND:
-			ShowWindow(CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_HISTORY_FIND), hwndDlg, DlgProcHistoryFind, (LPARAM)hwndDlg), SW_SHOW);
+			ShowWindow(CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_HISTORY_FIND), hwndDlg, DlgProcHistoryFind, (LPARAM)hwndDlg), SW_SHOW);
 			return TRUE;
 
 		case IDC_DELETEHISTORY:
diff --git a/src/modules/icolib/IcoLib.h b/src/modules/icolib/IcoLib.h
index 30121729a8..550de7ad9b 100644
--- a/src/modules/icolib/IcoLib.h
+++ b/src/modules/icolib/IcoLib.h
@@ -75,7 +75,7 @@ struct IconItem
 	HICON        temp_icon;
 	BOOL         temp_reset;
 
-	__inline TCHAR* getDescr() const { return LangPackTranslateStringT(hLangpack, description); }
+	__inline TCHAR* getDescr() const { return TranslateTH(hLangpack, description); }
 };
 
 // extracticon.c
diff --git a/src/modules/icolib/skin2icons.cpp b/src/modules/icolib/skin2icons.cpp
index 2d6d9ab9cd..7001bbae3b 100644
--- a/src/modules/icolib/skin2icons.cpp
+++ b/src/modules/icolib/skin2icons.cpp
@@ -112,7 +112,7 @@ IconSourceFile* IconSourceFile_Get(const TCHAR* file, bool isPath)
 		return NULL;
 
     if (isPath)
-		 pathToAbsoluteT(file, fileFull, NULL);
+		 PathToAbsoluteT(file, fileFull, NULL);
 		 /// TODO: convert path to long - eliminate duplicate items
 	 else
 		 _tcscpy(fileFull, file);
@@ -534,9 +534,9 @@ HANDLE IcoLib_AddNewIcon(int hLangpack, SKINICONDESC* sid)
 	if (sid->pszDefaultFile) {
 		WCHAR fileFull[ MAX_PATH ];
 		if (utf_path)
-			pathToAbsoluteT(sid->pwszDefaultFile, fileFull, NULL);
+			PathToAbsoluteT(sid->pwszDefaultFile, fileFull, NULL);
 		else
-			pathToAbsoluteT( StrConvT(sid->pszDefaultFile), fileFull, NULL);
+			PathToAbsoluteT( StrConvT(sid->pszDefaultFile), fileFull, NULL);
 		item->default_file = mir_wstrdup(fileFull);
 	}
 	item->default_indx = sid->iDefaultIndex;
diff --git a/src/modules/icolib/skin2opts.cpp b/src/modules/icolib/skin2opts.cpp
index 0d230d7930..9c6f3f2a41 100644
--- a/src/modules/icolib/skin2opts.cpp
+++ b/src/modules/icolib/skin2opts.cpp
@@ -56,7 +56,7 @@ static HICON ExtractIconFromPath(const TCHAR *path, int cxIcon, int cyIcon)
 		n = _ttoi(comma+1);
 		*comma = 0;
 	}
-	pathToAbsoluteT(file, fileFull, NULL);
+	PathToAbsoluteT(file, fileFull, NULL);
 	hIcon = NULL;
 
 	//SHOULD BE REPLACED WITH GOOD ENOUGH FUNCTION
@@ -242,7 +242,7 @@ static int OpenPopupMenu(HWND hwndDlg)
 	int cmd;
 
 	GetCursorPos(&pt);
-	hMenu = LoadMenu(hMirandaInst, MAKEINTRESOURCE(IDR_ICOLIB_CONTEXT));
+	hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_ICOLIB_CONTEXT));
 	hPopup = GetSubMenu(hMenu, 0);
 	TranslateMenu(hPopup);
 	cmd = TrackPopupMenu(hPopup, TPM_RIGHTBUTTON|TPM_RETURNCMD, pt.x,  pt.y, 0, hwndDlg, NULL);
@@ -586,7 +586,7 @@ INT_PTR CALLBACK DlgProcIconImport(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM
 		if ( !IsIconic(hwndDlg)) { 
 			UTILRESIZEDIALOG urd = {0};
 			urd.cbSize = sizeof(urd);
-			urd.hInstance = hMirandaInst;
+			urd.hInstance = hInst;
 			urd.hwndDlg = hwndDlg;
 			urd.lParam = 0; // user-defined
 			urd.lpTemplate = MAKEINTRESOURCEA(IDD_ICOLIB_IMPORT);
@@ -856,7 +856,7 @@ INT_PTR CALLBACK DlgProcIcoLibOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM
 
 	case WM_COMMAND:
 		if (LOWORD(wParam) == IDC_IMPORT) {
-			dat->hwndIndex = CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_ICOLIB_IMPORT), GetParent(hwndDlg), DlgProcIconImport, (LPARAM)hwndDlg);
+			dat->hwndIndex = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ICOLIB_IMPORT), GetParent(hwndDlg), DlgProcIconImport, (LPARAM)hwndDlg);
 			EnableWindow((HWND)lParam, FALSE);
 		}
 		else if (LOWORD(wParam) == IDC_GETMORE) {
@@ -1037,7 +1037,7 @@ int SkinOptionsInit(WPARAM wParam, LPARAM)
 {
 	OPTIONSDIALOGPAGE odp = {0};
 	odp.cbSize = sizeof(odp);
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.flags = ODPF_BOLDGROUPS;
 	odp.position = -180000000;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_ICOLIB);
diff --git a/src/modules/idle/idle.cpp b/src/modules/idle/idle.cpp
index d502e99e13..2577812207 100644
--- a/src/modules/idle/idle.cpp
+++ b/src/modules/idle/idle.cpp
@@ -441,7 +441,7 @@ static int IdleOptInit(WPARAM wParam, LPARAM)
 	OPTIONSDIALOGPAGE odp = { 0 };
 	odp.cbSize = sizeof(odp);
 	odp.position = 100000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_IDLE);
 	odp.pszGroup = LPGEN("Status");
 	odp.pszTitle = LPGEN("Idle");
@@ -477,7 +477,7 @@ static int IdleModernOptInit(WPARAM wParam, LPARAM)
 
 	MODERNOPTOBJECT obj = {0};
 	obj.cbSize = sizeof(obj);
-	obj.hInstance = hMirandaInst;
+	obj.hInstance = hInst;
 	obj.dwFlags = MODEROPT_FLG_TCHAR | MODEROPT_FLG_NORESIZE;
 	obj.iSection = MODERNOPT_PAGE_STATUS;
 	obj.iType = MODERNOPT_TYPE_SECTIONPAGE;
diff --git a/src/modules/ignore/ignore.cpp b/src/modules/ignore/ignore.cpp
index bc9cf143f8..b5b88343d0 100644
--- a/src/modules/ignore/ignore.cpp
+++ b/src/modules/ignore/ignore.cpp
@@ -178,8 +178,8 @@ static void SetAllContactIcons(HWND hwndList)
 			szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
 			if (szProto == NULL) proto1Caps=proto4Caps=0;
 			else {
-                proto1Caps=CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0);
-                proto4Caps=CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0);
+                proto1Caps=CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0);
+                proto4Caps=CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_4, 0);
             }
 			InitialiseItem(hwndList, hContact, hItem, proto1Caps, proto4Caps);
 			if ( !DBGetContactSettingByte(hContact, "CList", "Hidden", 0))
@@ -345,7 +345,7 @@ static int IgnoreOptInitialise(WPARAM wParam, LPARAM)
 	OPTIONSDIALOGPAGE odp = { 0 };
 	odp.cbSize = sizeof(odp);
 	odp.position = 900000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_IGNORE);
 	odp.pszTitle = LPGEN("Ignore");
 	odp.pszGroup = LPGEN("Events");
@@ -437,7 +437,7 @@ static int IgnoreModernOptInit(WPARAM wParam, LPARAM)
 
 	MODERNOPTOBJECT obj = {0};
 	obj.cbSize = sizeof(obj);
-	obj.hInstance = hMirandaInst;
+	obj.hInstance = hInst;
 	obj.dwFlags = MODEROPT_FLG_TCHAR;
 	obj.iSection = MODERNOPT_PAGE_IGNORE;
 	obj.iType = MODERNOPT_TYPE_SECTIONPAGE;
diff --git a/src/modules/langpack/lpservices.cpp b/src/modules/langpack/lpservices.cpp
index 983d069fda..af4262783c 100644
--- a/src/modules/langpack/lpservices.cpp
+++ b/src/modules/langpack/lpservices.cpp
@@ -2,8 +2,8 @@
 
 Miranda IM: the free IM client for Microsoft* Windows*
 
-Copyright 2000-2009 Miranda ICQ/IM project, 
-all portions of this codebase are copyrighted to the people 
+Copyright 2000-2009 Miranda ICQ/IM project,
+all portions of this codebase are copyrighted to the people
 listed in contributors.txt.
 
 This program is free software; you can redistribute it and/or
@@ -11,7 +11,7 @@ modify it under the terms of the GNU General Public License
 as published by the Free Software Foundation; either version 2
 of the License, or (at your option) any later version.
 
-This program is distributed in the hope that it will be useful, 
+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.
@@ -22,104 +22,28 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
 #include "..\..\core\commonheaders.h"
 
-#define FLAGS LANG_UNICODE
-
-LangPackMuuid* __fastcall LangPackLookupUuid(WPARAM);
-int LangPackMarkPluginLoaded(PLUGININFOEX* pInfo);
+MIR_CORE_DLL(int) LangPackMarkPluginLoaded(PLUGININFOEX* pInfo);
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-static INT_PTR TranslateString(WPARAM wParam, LPARAM lParam)
-{
-	return (INT_PTR)LangPackTranslateString(LangPackLookupUuid(wParam), (const char *)lParam, (wParam & LANG_UNICODE) ? 1 : 0);
-}
-
-TCHAR* LangPackTranslateStringT(int hLangpack, const TCHAR* tszEnglish)
+static INT_PTR srvTranslateString(WPARAM wParam, LPARAM lParam)
 {
-	LangPackMuuid* pUuid = (hLangpack) ? LangPackLookupUuid(hLangpack) : 0;
-	return (TCHAR*)LangPackTranslateString(pUuid, (LPCSTR)tszEnglish, 1);
+	if (wParam & LANG_UNICODE)
+		return (INT_PTR)TranslateW_LP((const WCHAR*)lParam, wParam);
+	return (INT_PTR)TranslateA_LP((const char *)lParam, wParam);
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-static INT_PTR TranslateMenu(WPARAM wParam, LPARAM lParam)
-{
-	HMENU hMenu = (HMENU)wParam;
-	LangPackMuuid* uuid = LangPackLookupUuid(lParam);
-
-	MENUITEMINFO mii;
-	mii.cbSize = MENUITEMINFO_V4_SIZE;
-	for (int i = GetMenuItemCount(hMenu)-1; i >= 0; i--) {
-		TCHAR str[256];
-		mii.fMask = MIIM_TYPE|MIIM_SUBMENU;
-		mii.dwTypeData = (TCHAR*)str;
-		mii.cch = SIZEOF(str);
-		GetMenuItemInfo(hMenu, i, TRUE, &mii);
-
-		if (mii.cch && mii.dwTypeData) {
-			TCHAR* result = (TCHAR*)LangPackTranslateString(uuid, (const char*)mii.dwTypeData, FLAGS);
-			if (result != mii.dwTypeData) {
-				mii.dwTypeData = result;
-				mii.fMask = MIIM_TYPE;
-				SetMenuItemInfo(hMenu, i, TRUE, &mii);
-		}	}
-
-		if (mii.hSubMenu != NULL) TranslateMenu((WPARAM)mii.hSubMenu, lParam);
-	}
-	return 0;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static void TranslateWindow(LangPackMuuid* pUuid, HWND hwnd)
-{
-	TCHAR title[2048];
-	GetWindowText(hwnd, title, SIZEOF(title));
-	{
-		TCHAR* result = (TCHAR*)LangPackTranslateString(pUuid, (const char*)title, FLAGS);
-		if (result != title)
-			SetWindowText(hwnd, result);
-}	}
-
-static BOOL CALLBACK TranslateDialogEnumProc(HWND hwnd, LPARAM lParam)
-{
-	LANGPACKTRANSLATEDIALOG *lptd = (LANGPACKTRANSLATEDIALOG*)lParam;
-	TCHAR szClass[32];
-	int i, id = GetDlgCtrlID(hwnd);
-
-	if (lptd->ignoreControls != NULL)
-		for (i=0; lptd->ignoreControls[i]; i++)
-			if (lptd->ignoreControls[i] == id)
-				return TRUE;
-
-	LangPackMuuid* uuid = LangPackLookupUuid(lptd->flags);
-
-	GetClassName(hwnd, szClass, SIZEOF(szClass));
-	if ( !lstrcmpi(szClass, _T("static")) || !lstrcmpi(szClass, _T("hyperlink")) || !lstrcmpi(szClass, _T("button")) || !lstrcmpi(szClass, _T("MButtonClass")) || !lstrcmpi(szClass, _T("MHeaderbarCtrl")))
-		TranslateWindow(uuid, hwnd);
-	else if ( !lstrcmpi(szClass, _T("edit"))) {
-		if (lptd->flags & LPTDF_NOIGNOREEDIT || GetWindowLongPtr(hwnd, GWL_STYLE) & ES_READONLY)
-			TranslateWindow(uuid, hwnd);
-	}
-	return TRUE;
-}
-
-static INT_PTR TranslateDialog(WPARAM wParam, LPARAM lParam)
+static INT_PTR srvTranslateMenu(WPARAM wParam, LPARAM lParam)
 {
-	LANGPACKTRANSLATEDIALOG *lptd = (LANGPACKTRANSLATEDIALOG*)lParam;
-	if (lptd == NULL || lptd->cbSize != sizeof(LANGPACKTRANSLATEDIALOG))
-		return 1;
-
-	if ( !(lptd->flags & LPTDF_NOTITLE))
-		TranslateWindow(LangPackLookupUuid(lptd->flags), lptd->hwndDlg);
-
-	EnumChildWindows(lptd->hwndDlg, TranslateDialogEnumProc, lParam);
+	TranslateMenu_LP((HMENU)wParam, lParam);
 	return 0;
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-static INT_PTR LPRegister(WPARAM wParam, LPARAM lParam)
+static INT_PTR srvRegisterLP(WPARAM wParam, LPARAM lParam)
 {
 	*(int*)wParam = LangPackMarkPluginLoaded((PLUGININFOEX*)lParam);
 	return 0;
@@ -127,50 +51,51 @@ static INT_PTR LPRegister(WPARAM wParam, LPARAM lParam)
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-static INT_PTR GetDefaultCodePage(WPARAM, LPARAM)
+static INT_PTR srvGetDefaultCodePage(WPARAM, LPARAM)
 {
 	return LangPackGetDefaultCodePage();
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-static INT_PTR GetDefaultLocale(WPARAM, LPARAM)
+static INT_PTR srvGetDefaultLocale(WPARAM, LPARAM)
 {
 	return LangPackGetDefaultLocale();
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-static INT_PTR PcharToTchar(WPARAM wParam, LPARAM lParam)
+static INT_PTR srvPcharToTchar(WPARAM wParam, LPARAM lParam)
 {
 	char* pszStr = (char*)lParam;
 	if (pszStr == NULL)
 		return NULL;
 
-	LangPackMuuid* uuid = LangPackLookupUuid(wParam);
-
-	{	int len = (int)strlen(pszStr);
-		TCHAR* result = (TCHAR*)alloca((len+1)*sizeof(TCHAR));
-		MultiByteToWideChar(LangPackGetDefaultCodePage(), 0, pszStr, -1, result, len);
-		result[len] = 0;
-		return (INT_PTR)mir_wstrdup((wchar_t*)LangPackTranslateString(uuid, (char*)result, 1));
-	}
+	int len = (int)strlen(pszStr);
+	TCHAR* result = (TCHAR*)alloca((len+1)*sizeof(TCHAR));
+	MultiByteToWideChar(LangPackGetDefaultCodePage(), 0, pszStr, -1, result, len);
+	result[len] = 0;
+	return (INT_PTR)mir_wstrdup( TranslateW_LP(result, wParam));
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-INT_PTR ReloadLangpack(WPARAM wParam, LPARAM lParam);
+INT_PTR srvReloadLangpack(WPARAM wParam, LPARAM lParam)
+{	
+	ReloadLangpack(( TCHAR* )lParam);
+	return 0;
+}
 
-int LoadLangPackServices(void)
+/////////////////////////////////////////////////////////////////////////////////////////
+
+int LoadLangPackModule(void)
 {
-	CreateServiceFunction(MS_LANGPACK_TRANSLATESTRING, TranslateString);
-	CreateServiceFunction(MS_LANGPACK_TRANSLATEMENU, TranslateMenu);
-	CreateServiceFunction(MS_LANGPACK_TRANSLATEDIALOG, TranslateDialog);
-	CreateServiceFunction(MS_LANGPACK_GETCODEPAGE, GetDefaultCodePage);
-	CreateServiceFunction(MS_LANGPACK_GETLOCALE, GetDefaultLocale);
-	CreateServiceFunction(MS_LANGPACK_PCHARTOTCHAR, PcharToTchar);
-	CreateServiceFunction(MS_LANGPACK_REGISTER, LPRegister);
-	CreateServiceFunction(MS_LANGPACK_RELOAD, ReloadLangpack);
+	CreateServiceFunction(MS_LANGPACK_TRANSLATESTRING, srvTranslateString);
+	CreateServiceFunction(MS_LANGPACK_TRANSLATEMENU, srvTranslateMenu);
+	CreateServiceFunction(MS_LANGPACK_GETCODEPAGE, srvGetDefaultCodePage);
+	CreateServiceFunction(MS_LANGPACK_GETLOCALE, srvGetDefaultLocale);
+	CreateServiceFunction(MS_LANGPACK_PCHARTOTCHAR, srvPcharToTchar);
+	CreateServiceFunction(MS_LANGPACK_REGISTER, srvRegisterLP);
+	CreateServiceFunction(MS_LANGPACK_RELOAD, srvReloadLangpack);
 	return 0;
 }
-
diff --git a/src/modules/netlib/netliblog.cpp b/src/modules/netlib/netliblog.cpp
index 5c4656fd90..3e1265d4dd 100644
--- a/src/modules/netlib/netliblog.cpp
+++ b/src/modules/netlib/netliblog.cpp
@@ -146,7 +146,7 @@ static INT_PTR CALLBACK LogOptionsDlgProc(HWND hwndDlg, UINT message, WPARAM wPa
 				GetWindowText((HWND)lParam, path, MAX_PATH);
 
 				TCHAR *pszNewPath = Utils_ReplaceVarsT(path);
-				pathToAbsoluteT(pszNewPath, path, NULL);
+				PathToAbsoluteT(pszNewPath, path, NULL);
 				SetDlgItemText(hwndDlg, IDC_PATH, path);
 				mir_free(pszNewPath);
 			}
@@ -299,7 +299,7 @@ static INT_PTR CALLBACK LogOptionsDlgProc(HWND hwndDlg, UINT message, WPARAM wPa
 void NetlibLogShowOptions(void)
 {
 	if (logOptions.hwndOpts == NULL)
-		logOptions.hwndOpts=CreateDialog(hMirandaInst, MAKEINTRESOURCE(IDD_NETLIBLOGOPTS), NULL, LogOptionsDlgProc);
+		logOptions.hwndOpts=CreateDialog(hInst, MAKEINTRESOURCE(IDD_NETLIBLOGOPTS), NULL, LogOptionsDlgProc);
 	SetForegroundWindow(logOptions.hwndOpts);
 }
 
@@ -397,11 +397,8 @@ static INT_PTR NetlibLog(WPARAM wParam, LPARAM lParam)
 		LeaveCriticalSection(&logOptions.cs);
 	}
 
-	if (((THook*)hLogEvent)->subscriberCount) 
-	{
-		LOGMSG logMsg = { szHead, pszMsg };
-		CallHookSubscribers(hLogEvent, (WPARAM)nlu, (LPARAM)&logMsg);
-	}
+	LOGMSG logMsg = { szHead, pszMsg };
+	CallHookSubscribers(hLogEvent, (WPARAM)nlu, (LPARAM)&logMsg);
 
 	SetLastError(dwOriginalLastError);
 	return 1;
@@ -410,7 +407,7 @@ static INT_PTR NetlibLog(WPARAM wParam, LPARAM lParam)
 static INT_PTR NetlibLogW(WPARAM wParam, LPARAM lParam)
 {
 	const wchar_t *pszMsg = (const wchar_t*)lParam;
-	char* szMsg = Utf8EncodeUcs2(pszMsg);
+	char* szMsg = Utf8EncodeW(pszMsg);
 	INT_PTR res = NetlibLog(wParam, (LPARAM)szMsg);
 	mir_free(szMsg);
 	return res;
@@ -454,12 +451,9 @@ void NetlibDumpData(struct NetlibConnection *nlc, PBYTE buf, int len, int sent,
 		return;
 
 	// Check user's log settings
-	if ( !(logOptions.toOutputDebugString  || 
-		((THook*)hLogEvent)->subscriberCount  || 
-		(logOptions.toFile && logOptions.szFile[0])))
+	if ( !(logOptions.toOutputDebugString || (logOptions.toFile && logOptions.szFile[0])))
 		return;
-	if ((sent && !logOptions.dumpSent)  || 
-		( !sent && !logOptions.dumpRecv))
+	if ((sent && !logOptions.dumpSent) || (!sent && !logOptions.dumpRecv))
 		return;
 	if ((flags & MSG_DUMPPROXY) && !logOptions.dumpProxy)
 		return;
@@ -593,7 +587,7 @@ void NetlibLogInit(void)
 		TCHAR *pszNewPath = Utils_ReplaceVarsT(dbv.ptszVal);
 
 		TCHAR path[MAX_PATH];
-		pathToAbsoluteT(pszNewPath, path, NULL);
+		PathToAbsoluteT(pszNewPath, path, NULL);
 		logOptions.szFile = mir_tstrdup(path);
 
 		mir_free(pszNewPath);
diff --git a/src/modules/netlib/netlibopts.cpp b/src/modules/netlib/netlibopts.cpp
index 20e90d9932..34a07d6df7 100644
--- a/src/modules/netlib/netlibopts.cpp
+++ b/src/modules/netlib/netlibopts.cpp
@@ -546,7 +546,7 @@ int NetlibOptInitialise(WPARAM wParam, LPARAM)
 
 	odp.cbSize = sizeof(odp);
 	odp.position = 900000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_NETLIB);
 	odp.pszTitle = LPGEN("Network");
 	odp.pfnDlgProc = DlgProcNetlibOpts;
diff --git a/src/modules/netlib/netlibsock.cpp b/src/modules/netlib/netlibsock.cpp
index eabbc79484..30db9ce256 100644
--- a/src/modules/netlib/netlibsock.cpp
+++ b/src/modules/netlib/netlibsock.cpp
@@ -58,11 +58,9 @@ INT_PTR NetlibSend(WPARAM wParam, LPARAM lParam)
 	}
 	NetlibLeaveNestedCS(&nlc->ncsSend);
 
-	if (((THook*)hSendEvent)->subscriberCount)
-	{
-		NETLIBNOTIFY nln = { nlb, result };
-		CallHookSubscribers(hSendEvent, (WPARAM)&nln, (LPARAM)&nlc->nlu->user);
-	}
+	NETLIBNOTIFY nln = { nlb, result };
+	CallHookSubscribers(hSendEvent, (WPARAM)&nln, (LPARAM)&nlc->nlu->user);
+
 	return result;
 }
 
@@ -95,8 +93,7 @@ INT_PTR NetlibRecv(WPARAM wParam, LPARAM lParam)
 
 	NetlibDumpData(nlc, (PBYTE)nlb->buf, recvResult, 0, nlb->flags);
 
-	if ((nlb->flags & MSG_PEEK) == 0 && ((THook*)hRecvEvent)->subscriberCount)
-	{
+	if ((nlb->flags & MSG_PEEK) == 0) {
 		NETLIBNOTIFY nln = { nlb, recvResult };
 		CallHookSubscribers(hRecvEvent, (WPARAM)&nln, (LPARAM)&nlc->nlu->user);
 	}
diff --git a/src/modules/options/descbutton.cpp b/src/modules/options/descbutton.cpp
index d4ceed2d44..813779f375 100644
--- a/src/modules/options/descbutton.cpp
+++ b/src/modules/options/descbutton.cpp
@@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "..\..\core\commonheaders.h"
 #include "m_descbutton.h"
 
-extern HINSTANCE hMirandaInst;
+extern HINSTANCE hInst;
 
 ////////////////////////////////////////////////////////////////////////////////////
 // Internals
diff --git a/src/modules/options/filter.cpp b/src/modules/options/filter.cpp
index 2ea0aa4752..8b72f4e67d 100644
--- a/src/modules/options/filter.cpp
+++ b/src/modules/options/filter.cpp
@@ -192,7 +192,7 @@ static int OnOptionsInitialise(WPARAM wParam, LPARAM)
 
 	odp.cbSize = sizeof(odp);
 	odp.position = -190000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_KEYWORDFILTER);
 	odp.pszTitle = LPGEN("Options search");
 	odp.pszGroup = LPGEN("Customize");
diff --git a/src/modules/options/filter.h b/src/modules/options/filter.h
index d64801eee5..ced8845b95 100644
--- a/src/modules/options/filter.h
+++ b/src/modules/options/filter.h
@@ -98,10 +98,5 @@ public:
 	~CPageList() {};
 };
 
-
-
-int LangPackGetDefaultLocale();
-
-
 #endif //M_OPTIONS_FILTERING_H
 
diff --git a/src/modules/options/headerbar.cpp b/src/modules/options/headerbar.cpp
index 66661b9983..44a729089d 100644
--- a/src/modules/options/headerbar.cpp
+++ b/src/modules/options/headerbar.cpp
@@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "..\..\core\commonheaders.h"
 #include "m_iconheader.h"
 
-extern HINSTANCE hMirandaInst;
+extern HINSTANCE hInst;
 
 
 static BOOL IsAeroMode()
diff --git a/src/modules/options/iconheader.cpp b/src/modules/options/iconheader.cpp
index 01a3bc99bf..e3f27c8289 100644
--- a/src/modules/options/iconheader.cpp
+++ b/src/modules/options/iconheader.cpp
@@ -27,7 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "m_iconheader.h"
 
 
-extern HINSTANCE hMirandaInst;
+extern HINSTANCE hInst;
 
 static BOOL IsAeroMode()
 {
diff --git a/src/modules/options/options.cpp b/src/modules/options/options.cpp
index aa6180a972..e949ff31c5 100644
--- a/src/modules/options/options.cpp
+++ b/src/modules/options/options.cpp
@@ -236,7 +236,7 @@ static TCHAR *GetPluginName(HINSTANCE hInstance, TCHAR *buffer, int size)
 
 PageHash GetPluginPageHash(const OptionsPageData *page)
 {
-	return hashstr(page->ptszGroup) + hashstr(page->ptszTitle) + hashstr(page->ptszTab);
+	return mir_hashstrT(page->ptszGroup) + mir_hashstrT(page->ptszTitle) + mir_hashstrT(page->ptszTab);
 }
 
 static void FindFilterStrings(int enableKeywordFiltering, int current, HWND hWndParent, const OptionsPageData *page)
@@ -497,7 +497,7 @@ static void FillFilterCombo(int enableKeywordFiltering, HWND hDlg, OptionsDlgDat
 	int index = SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT) CB_ADDSTRING, (WPARAM)0, (LPARAM)TranslateTS(ALL_MODULES_FILTER));
 	SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT) CB_SETITEMDATA, (WPARAM)index, (LPARAM)NULL);
 	index = SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT) CB_ADDSTRING, (WPARAM)0, (LPARAM)TranslateTS(CORE_MODULES_FILTER));
-	SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT) CB_SETITEMDATA, (WPARAM)index, (LPARAM)hMirandaInst);
+	SendDlgItemMessage(hDlg, IDC_KEYWORD_FILTER, (UINT) CB_SETITEMDATA, (WPARAM)index, (LPARAM)hInst);
 	TCHAR* tszModuleName = (TCHAR*)alloca(MAX_PATH*sizeof(TCHAR));
 	for (int i = 0; i < dat->arOpd.getCount(); i++) {		
 		TCHAR * dllName = NULL;
@@ -507,7 +507,7 @@ static void FillFilterCombo(int enableKeywordFiltering, HWND hDlg, OptionsDlgDat
 		if ( !enableKeywordFiltering)
 			FindFilterStrings(enableKeywordFiltering, FALSE, hDlg, dat->arOpd[i]); // only modules name (fast enougth)
 		
-		if (inst == hMirandaInst) continue;
+		if (inst == hInst) continue;
 		for (j = 0; j<countKnownInst; j++)
 			if (KnownInstances[j] == inst) break;
 		if (j != countKnownInst) continue;
@@ -839,9 +839,9 @@ static INT_PTR CALLBACK OptionsDlgProc(HWND hdlg, UINT message, WPARAM wParam, L
 					continue;
 
 				OptionsPageData* opd = dat->arOpd[i];
-				TCHAR* ptszGroup = LangPackTranslateStringT(opd->hLangpack, opd->ptszGroup);
-				TCHAR* ptszTitle = LangPackTranslateStringT(opd->hLangpack, opd->ptszTitle);
-				TCHAR* ptszTab   = LangPackTranslateStringT(opd->hLangpack, opd->ptszTab);
+				TCHAR* ptszGroup = TranslateTH(opd->hLangpack, opd->ptszGroup);
+				TCHAR* ptszTitle = TranslateTH(opd->hLangpack, opd->ptszTitle);
+				TCHAR* ptszTab   = TranslateTH(opd->hLangpack, opd->ptszTab);
 
 				tvis.hParent = NULL;
 				if (FilterInst != NULL) {
@@ -1089,7 +1089,7 @@ static INT_PTR CALLBACK OptionsDlgProc(HWND hdlg, UINT message, WPARAM wParam, L
 								if ( lstrcmp(opd->ptszTitle, p->ptszTitle) || lstrcmpnull(opd->ptszGroup, p->ptszGroup))
 									continue;
 
-								tie.pszText = LangPackTranslateStringT(opd->hLangpack, opd->ptszTab);
+								tie.pszText = TranslateTH(opd->hLangpack, opd->ptszTab);
 								tie.lParam = i;
 								TabCtrl_InsertItem(hwndTab, pages, &tie);
 								if ( !lstrcmp(opd->ptszTab, p->ptszTab))
@@ -1390,7 +1390,7 @@ void OpenAccountOptions(PROTOACCOUNT* pa)
 		psh.pStartPage = (LPCTSTR)&ood;
 		psh.pszCaption = tszTitle;
 		psh.ppsp = (PROPSHEETPAGE*)opi.odp;
-		hwndOptions = CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_OPTIONSPAGE), NULL, OptionsDlgProc, (LPARAM)&psh);
+		hwndOptions = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_OPTIONSPAGE), NULL, OptionsDlgProc, (LPARAM)&psh);
 		mir_free((void*)ood.pszPage);
 		FreeOptionsData(&opi);
 }	}
@@ -1436,7 +1436,7 @@ static void OpenOptionsNow(const char *pszGroup, const char *pszPage, const char
 			psh.pszCaption = TranslateT("Miranda IM Options");
 			psh.ppsp = (PROPSHEETPAGE*)opi.odp;		  //blatent misuse of the structure, but what the hell
 
-			hwndOptions = CreateDialogParam(hMirandaInst, 
+			hwndOptions = CreateDialogParam(hInst, 
 				MAKEINTRESOURCE(bSinglePage ? IDD_OPTIONSPAGE : IDD_OPTIONS), 
 				NULL, OptionsDlgProc, (LPARAM)&psh);
 
diff --git a/src/modules/plugins/newplugins.cpp b/src/modules/plugins/newplugins.cpp
index 64eff30f5b..391e76408d 100644
--- a/src/modules/plugins/newplugins.cpp
+++ b/src/modules/plugins/newplugins.cpp
@@ -2,7 +2,7 @@
 
 Miranda IM: the free IM client for Microsoft* Windows*
 
-Copyright 2000-2010 Miranda ICQ/IM project, 
+Copyright 2000-2010 Miranda ICQ/IM project,
 all portions of this codebase are copyrighted to the people
 listed in contributors.txt.
 
@@ -11,7 +11,7 @@ modify it under the terms of the GNU General Public License
 as published by the Free Software Foundation; either version 2
 of the License, or (at your option) any later version.
 
-This program is distributed in the hope that it will be useful, 
+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.
@@ -23,19 +23,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "..\..\core\commonheaders.h"
 #include "plugins.h"
 
-static int sttComparePlugins(const pluginEntry* p1, const pluginEntry* p2)
-{	
-	if (p1->bpi.hInst == p2->bpi.hInst)
-		return 0;
-
-	return (p1->bpi.hInst < p2->bpi.hInst) ? -1 : 1;
-}
-
 static int sttComparePluginsByName(const pluginEntry* p1, const pluginEntry* p2)
 {	return lstrcmp(p1->pluginname, p2->pluginname);
 }
 
-LIST<pluginEntry> pluginList(10, sttComparePluginsByName), pluginListAddr(10, sttComparePlugins);
+LIST<pluginEntry> pluginList(10, sttComparePluginsByName);
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
@@ -44,8 +36,8 @@ LIST<pluginEntry> pluginList(10, sttComparePluginsByName), pluginListAddr(10, st
 struct PluginUUIDList {
     MUUID uuid;
     DWORD maxVersion;
-} 
-static const pluginBannedList[] = 
+}
+static const pluginBannedList[] =
 {
 	{{0x7f65393b, 0x7771, 0x4f3f, { 0xa9, 0xeb, 0x5d, 0xba, 0xf2, 0xb3, 0x61, 0xf1 }}, MAX_MIR_VER}, // png2dib
 	{{0xe00f1643, 0x263c, 0x4599, { 0xb8, 0x4b, 0x05, 0x3e, 0x5c, 0x51, 0x1d, 0x28 }}, MAX_MIR_VER}, // loadavatars (unicode)
@@ -73,8 +65,6 @@ void UninitIni(void);
 
 #define PLUGINDISABLELIST "PluginDisable"
 
-int CallHookSubscribers(HANDLE hEvent, WPARAM wParam, LPARAM lParam);
-
 int LoadDatabaseModule(void);
 
 char* GetPluginNameByInstance(HINSTANCE hInstance)
@@ -89,29 +79,6 @@ char* GetPluginNameByInstance(HINSTANCE hInstance)
 	return NULL;
 }
 
-HINSTANCE GetInstByAddress(void* codePtr)
-{
-	int idx;
-	HINSTANCE result;
-	pluginEntry p; p.bpi.hInst = (HINSTANCE)codePtr;
-
-	if (pluginListAddr.getCount() == 0)
-		return NULL;
-
-	List_GetIndex((SortedList*)&pluginListAddr, &p, &idx);
-	if (idx > 0)
-		idx--;
-
-	result = pluginListAddr[idx]->bpi.hInst;
-
-	if (result < hMirandaInst && codePtr > hMirandaInst)
-		result = hMirandaInst;
-	else if (idx == 0 && codePtr < (void*)result)
-		result = NULL;
-
-	return result;
-}
-
 int equalUUID(const MUUID& u1, const MUUID& u2)
 {
 	return memcmp(&u1, &u2, sizeof(MUUID))?0:1;
@@ -159,22 +126,22 @@ static int isPluginBanned(MUUID u1, DWORD dwVersion)
  * historyeditor added by nightwish - plugin is problematic and can ruin database as it does not understand UTF-8 message
  * storage
  */
-     
-static const TCHAR* modulesToSkip[] = 
-{ 
-	_T("autoloadavatars.dll"), _T("multiwindow.dll"), _T("fontservice.dll"), 
-	_T("icolib.dll"), _T("historyeditor.dll") 
+
+static const TCHAR* modulesToSkip[] =
+{
+	_T("autoloadavatars.dll"), _T("multiwindow.dll"), _T("fontservice.dll"),
+	_T("icolib.dll"), _T("historyeditor.dll")
 };
 
 // The following plugins will be checked for a valid MUUID or they will not be loaded
-static const TCHAR* expiredModulesToSkip[] = 
-{ 
-	_T("scriver.dll"), _T("nconvers.dll"), _T("tabsrmm.dll"), _T("nhistory.dll"), 
-	_T("historypp.dll"), _T("help.dll"), _T("loadavatars.dll"), _T("tabsrmm_unicode.dll"), 
-	_T("clist_nicer_plus.dll"), _T("changeinfo.dll"), _T("png2dib.dll"), _T("dbx_mmap.dll"), 
-	_T("dbx_3x.dll"), _T("sramm.dll"), _T("srmm_mod.dll"), _T("srmm_mod (no Unicode).dll"), 
-	_T("singlemodeSRMM.dll"), _T("msg_export.dll"), _T("clist_modern.dll"), 
-	_T("clist_nicer.dll") 
+static const TCHAR* expiredModulesToSkip[] =
+{
+	_T("scriver.dll"), _T("nconvers.dll"), _T("tabsrmm.dll"), _T("nhistory.dll"),
+	_T("historypp.dll"), _T("help.dll"), _T("loadavatars.dll"), _T("tabsrmm_unicode.dll"),
+	_T("clist_nicer_plus.dll"), _T("changeinfo.dll"), _T("png2dib.dll"), _T("dbx_mmap.dll"),
+	_T("dbx_3x.dll"), _T("sramm.dll"), _T("srmm_mod.dll"), _T("srmm_mod (no Unicode).dll"),
+	_T("singlemodeSRMM.dll"), _T("msg_export.dll"), _T("clist_modern.dll"),
+	_T("clist_nicer.dll")
 };
 
 static int checkPI(BASIC_PLUGIN_INFO* bpi, PLUGININFOEX* pi)
@@ -191,16 +158,16 @@ static int checkPI(BASIC_PLUGIN_INFO* bpi, PLUGININFOEX* pi)
 
 		bHasValidInfo = TRUE;
 	}
-	
+
 	if ( !bHasValidInfo)
 		return FALSE;
 
-	if (pi->shortName == NULL || pi->description == NULL || pi->author == NULL  || 
+	if (pi->shortName == NULL || pi->description == NULL || pi->author == NULL  ||
 		  pi->authorEmail == NULL || pi->copyright == NULL || pi->homepage == NULL)
 		return FALSE;
 
-	if (pi->replacesDefaultModule > DEFMOD_HIGHEST  || 
-		  pi->replacesDefaultModule == DEFMOD_REMOVED_UIPLUGINOPTS  || 
+	if (pi->replacesDefaultModule > DEFMOD_HIGHEST  ||
+		  pi->replacesDefaultModule == DEFMOD_REMOVED_UIPLUGINOPTS  ||
 		  pi->replacesDefaultModule == DEFMOD_REMOVED_PROTOCOLNETLIB)
 		return FALSE;
 
@@ -342,8 +309,8 @@ void Plugin_Uninit(pluginEntry* p, bool bDynamic)
 		FreeLibrary(p->bpi.hInst);
 		ZeroMemory(&p->bpi, sizeof(p->bpi));
 	}
+	UnregisterModule(p->bpi.hInst);
 	pluginList.remove(p);
-	pluginListAddr.remove(p);
 }
 
 void enumPlugins(SCAN_PLUGINS_CALLBACK cb, WPARAM wParam, LPARAM lParam)
@@ -494,7 +461,7 @@ int isPluginOnWhiteList(const TCHAR* pluginname)
 		if (MessageBox(NULL, buf, TranslateT("Re-enable Miranda plugin?"), MB_YESNO | MB_ICONQUESTION) == IDYES) {
 			SetPluginOnWhiteList(pluginname, 1);
 			rc = 0;
-		}	
+		}
 	}
 
 	return rc == 0;
@@ -526,16 +493,16 @@ bool TryLoadPlugin(pluginEntry *p, bool bDynamic)
 				return false;
 			}
 
-			pluginListAddr.insert(p);
+			RegisterModule(p->bpi.hInst);
 			if (bpi.Load(&pluginCoreLink) != 0)
 				return false;
-						
+
 			p->pclass |= PCLASS_LOADED;
 			if (rm) pluginDefModList[rm]=p;
 		}
 	}
 	else if (p->bpi.hInst != NULL) {
-		pluginListAddr.insert(p);
+		RegisterModule(p->bpi.hInst);
 		p->pclass |= PCLASS_LOADED;
 	}
 	return true;
@@ -552,7 +519,7 @@ static pluginEntry* getCListModule(TCHAR * exe, TCHAR * slice, int useWhiteList)
 			if (checkAPI(exe, &bpi, mirandaVersion, CHECKAPI_CLIST)) {
 				p->bpi = bpi;
 				p->pclass |= PCLASS_LAST | PCLASS_OK | PCLASS_BASICAPI;
-				pluginListAddr.insert(p);
+				RegisterModule(p->bpi.hInst);
 				if (bpi.clistlink(&pluginCoreLink) == 0) {
 					p->bpi = bpi;
 					p->pclass |= PCLASS_LOADED;
@@ -575,7 +542,7 @@ int UnloadPlugin(TCHAR* buf, int bufLen)
 			GetModuleFileName(p->bpi.hInst, buf, bufLen);
 			Plugin_Uninit(p);
 			return TRUE;
-		}	
+		}
 	}
 
 	return FALSE;
@@ -625,7 +592,7 @@ int LoadServiceModePlugin(void)
 				p->pclass |= PCLASS_LOADED;
 				if (CallService(MS_SERVICEMODE_LAUNCH, 0, 0) != CALLSERVICE_NOTFOUND)
 					return 1;
-				
+
 				MessageBox(NULL, TranslateT("Unable to load plugin in Service Mode!"), p->pluginname, 0);
 				return -1;
 			}
@@ -672,7 +639,7 @@ int LoadNewPluginsModule(void)
 	askAboutIgnoredPlugins=(UINT) GetPrivateProfileInt(_T("PluginLoader"), _T("AskAboutIgnoredPlugins"), 0, mirandabootini);
 
 	// if Crash Dumper is present, load it to provide Crash Reports
-	if (pluginList_crshdmp != NULL && isPluginOnWhiteList(pluginList_crshdmp->pluginname)) 
+	if (pluginList_crshdmp != NULL && isPluginOnWhiteList(pluginList_crshdmp->pluginname))
     {
 		if (pluginList_crshdmp->bpi.Load(&pluginCoreLink) == 0)
 			pluginList_crshdmp->pclass |= PCLASS_LOADED | PCLASS_LAST;
@@ -775,7 +742,7 @@ int LoadNewPluginsModuleInfos(void)
 	pluginCoreLink.KillObjectEventHooks           = KillObjectEventHooks;
 
 	// remember where the mirandaboot.ini goes
-	pathToAbsoluteT(_T("mirandaboot.ini"), mirandabootini, NULL);
+	PathToAbsoluteT(_T("mirandaboot.ini"), mirandabootini, NULL);
 	// look for all *.dll's
 	enumPlugins(scanPluginsDir, 0, 0);
 	// the database will select which db plugin to use, or fail if no profile is selected
@@ -817,6 +784,5 @@ void UnloadNewPluginsModule(void)
 	hPluginListHeap=0;
 
 	pluginList.destroy();
-	pluginListAddr.destroy();
 	UninitIni();
 }
diff --git a/src/modules/plugins/pluginopts.cpp b/src/modules/plugins/pluginopts.cpp
index b87c86b8e5..a62dc08378 100644
--- a/src/modules/plugins/pluginopts.cpp
+++ b/src/modules/plugins/pluginopts.cpp
@@ -403,7 +403,7 @@ int PluginOptionsInit(WPARAM wParam, LPARAM)
 {
 	OPTIONSDIALOGPAGE odp = { 0 };
 	odp.cbSize = sizeof(odp);
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pfnDlgProc = DlgPluginOpt;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_PLUGINS);
 	odp.position = 1300000000;
diff --git a/src/modules/plugins/plugins.h b/src/modules/plugins/plugins.h
index 6b03fad7c0..fe6de60b8c 100644
--- a/src/modules/plugins/plugins.h
+++ b/src/modules/plugins/plugins.h
@@ -50,7 +50,7 @@ struct pluginEntry
 	pluginEntry* nextclass;
 };
 
-extern LIST<pluginEntry> pluginList, pluginListAddr;
+extern LIST<pluginEntry> pluginList;
 extern MUUID miid_last;
 
 int PluginOptionsInit(WPARAM, LPARAM);
diff --git a/src/modules/protocols/protoaccs.cpp b/src/modules/protocols/protoaccs.cpp
index 891474baed..4846d84b87 100644
--- a/src/modules/protocols/protoaccs.cpp
+++ b/src/modules/protocols/protoaccs.cpp
@@ -375,7 +375,7 @@ static INT_PTR stub43(PROTO_INTERFACE* ppi, WPARAM wParam, LPARAM lParam)
 	PROTO_AVATAR_INFORMATIONW tmp = { 0 };
 	tmp.cbSize = sizeof(tmp);
 	tmp.hContact = p->hContact;
-	int result = CallProtoService(ppi->m_szModuleName, PS_GETAVATARINFOW, wParam, (LPARAM)&tmp);
+	int result = CallProtoServiceInt(NULL,ppi->m_szModuleName, PS_GETAVATARINFOW, wParam, (LPARAM)&tmp);
 
 	p->format = tmp.format;
 
@@ -390,7 +390,7 @@ static INT_PTR stub43(PROTO_INTERFACE* ppi, WPARAM wParam, LPARAM lParam)
 static INT_PTR stub44(PROTO_INTERFACE* ppi, WPARAM wParam, LPARAM lParam)
 {	
 	wchar_t* buf = (wchar_t*)_alloca(sizeof(wchar_t) * (lParam + 1));
-	int result = CallProtoService(ppi->m_szModuleName, PS_GETMYAVATARW, WPARAM(buf), lParam);
+	int result = CallProtoServiceInt(NULL,ppi->m_szModuleName, PS_GETMYAVATARW, WPARAM(buf), lParam);
 	if (result == 0)
 	{
 		wchar_t* filename = (wchar_t*)_alloca(sizeof(wchar_t) * (lParam + 1));
@@ -405,7 +405,7 @@ static INT_PTR stub44(PROTO_INTERFACE* ppi, WPARAM wParam, LPARAM lParam)
 
 static INT_PTR stub45(PROTO_INTERFACE* ppi, WPARAM wParam, LPARAM lParam)
 {	
-	return CallProtoService(ppi->m_szModuleName, PS_SETMYAVATARW, wParam, (LPARAM)(LPCTSTR)StrConvT((char*)lParam));
+	return CallProtoServiceInt(NULL,ppi->m_szModuleName, PS_SETMYAVATARW, wParam, (LPARAM)(LPCTSTR)StrConvT((char*)lParam));
 }
 
 
diff --git a/src/modules/protocols/protochains.cpp b/src/modules/protocols/protochains.cpp
index 73a12d2bd5..05d39b07e4 100644
--- a/src/modules/protocols/protochains.cpp
+++ b/src/modules/protocols/protochains.cpp
@@ -42,7 +42,7 @@ INT_PTR Proto_CallContactService(WPARAM wParam, LPARAM lParam)
 		if (DBGetContactSettingString(ccs->hContact, "_Filter", str, &dbv))
 			break;
 
-		if ((ret = CallProtoService(dbv.pszVal, ccs->szProtoService, i+1, lParam)) != CALLSERVICE_NOTFOUND) {
+		if ((ret = CallProtoServiceInt(NULL,dbv.pszVal, ccs->szProtoService, i+1, lParam)) != CALLSERVICE_NOTFOUND) {
 			//chain was started, exit
 			mir_free(dbv.pszVal);
 			return ret;
@@ -93,7 +93,7 @@ static INT_PTR CallRecvChain(WPARAM wParam, LPARAM lParam)
 		if (DBGetContactSettingString(ccs->hContact, "_Filter", str, &dbv))  //never happens
 			return 1;
 
-		if ((ret = CallProtoService(dbv.pszVal, ccs->szProtoService, i+1, lParam)) != CALLSERVICE_NOTFOUND) {
+		if ((ret = CallProtoServiceInt(NULL,dbv.pszVal, ccs->szProtoService, i+1, lParam)) != CALLSERVICE_NOTFOUND) {
 			//chain was started, exit
 			mir_free(dbv.pszVal);
 			return ret;
diff --git a/src/modules/protocols/protocols.cpp b/src/modules/protocols/protocols.cpp
index 1ec4872e23..69f3c846cd 100644
--- a/src/modules/protocols/protocols.cpp
+++ b/src/modules/protocols/protocols.cpp
@@ -262,7 +262,7 @@ static int Proto_ValidTypingContact(HANDLE hContact, char *szProto)
 	if ( !hContact || !szProto)
 		return 0;
 
-	return (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_SUPPORTTYPING) ? 1 : 0;
+	return (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_SUPPORTTYPING) ? 1 : 0;
 }
 
 static INT_PTR Proto_SelfIsTyping(WPARAM wParam, LPARAM lParam)
@@ -273,7 +273,7 @@ static INT_PTR Proto_SelfIsTyping(WPARAM wParam, LPARAM lParam)
 			return 0;
 
 		if (Proto_ValidTypingContact((HANDLE)wParam, szProto))
-			CallProtoService(szProto, PSS_USERISTYPING, wParam, lParam);
+			CallProtoServiceInt(NULL,szProto, PSS_USERISTYPING, wParam, lParam);
 	}
 
 	return 0;
@@ -300,7 +300,7 @@ static INT_PTR Proto_ContactIsTyping(WPARAM wParam, LPARAM lParam)
 
 void Proto_SetStatus(const char* szProto, unsigned status)
 {
-	if (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) 
+	if (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) 
 	{
 		TCHAR* awayMsg = (TCHAR*)CallService(MS_AWAYMSG_GETSTATUSMSGW, (WPARAM) status, (LPARAM) szProto);
 		if ((INT_PTR)awayMsg == CALLSERVICE_NOTFOUND) 
@@ -314,10 +314,10 @@ void Proto_SetStatus(const char* szProto, unsigned status)
 		}
 		if ((INT_PTR)awayMsg != CALLSERVICE_NOTFOUND) 
 		{
-			CallProtoService(szProto, PS_SETAWAYMSGT, status, (LPARAM) awayMsg);
+			CallProtoServiceInt(NULL,szProto, PS_SETAWAYMSGT, status, (LPARAM) awayMsg);
 			mir_free(awayMsg);
 	}	}
-	CallProtoService(szProto, PS_SETSTATUS, status, 0);
+	CallProtoServiceInt(NULL,szProto, PS_SETSTATUS, status, 0);
 }
 
 
@@ -398,6 +398,11 @@ static INT_PTR srvProto_IsAccountLocked(WPARAM, LPARAM lParam)
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
+INT_PTR CallProtoService(const char* szModule, const char* szService, WPARAM wParam, LPARAM lParam)
+{
+	return CallProtoServiceInt(NULL, szModule, szService, wParam, lParam);
+}
+
 INT_PTR CallProtoServiceInt(HANDLE hContact, const char *szModule, const char *szService, WPARAM wParam, LPARAM lParam)
 {
 	PROTOACCOUNT* pa = Proto_GetAccount(szModule);
@@ -405,196 +410,186 @@ INT_PTR CallProtoServiceInt(HANDLE hContact, const char *szModule, const char *s
 		PROTO_INTERFACE* ppi;
 		if ((ppi = pa->ppro) == NULL)
 			return CALLSERVICE_NOTFOUND;
-		else {
-			TServiceListItem *item = serviceItems.find((TServiceListItem*)&szService);
-			if (item) {
-				switch(item->id) {
-					case  1: 
-
-						if (ppi->m_iVersion > 1 || !(((PROTOSEARCHRESULT*)lParam)->flags & PSR_UNICODE))
-							return (INT_PTR)ppi->AddToList(wParam, (PROTOSEARCHRESULT*)lParam); 
-						else {
-							PROTOSEARCHRESULT *psr = (PROTOSEARCHRESULT*)lParam;
-							PROTOSEARCHRESULT *psra =(PROTOSEARCHRESULT*)mir_alloc(psr->cbSize);
-							memcpy(psra, psr, psr->cbSize);
-							psra->nick      = (PROTOCHAR*)mir_u2a(psr->nick);
-							psra->firstName = (PROTOCHAR*)mir_u2a(psr->firstName);
-							psra->lastName  = (PROTOCHAR*)mir_u2a(psr->lastName);
-							psra->email     = (PROTOCHAR*)mir_u2a(psr->email);
+
+		TServiceListItem *item = serviceItems.find((TServiceListItem*)&szService);
+		if (item) {
+			switch(item->id) {
+			case  1: 
+				if (ppi->m_iVersion > 1 || !(((PROTOSEARCHRESULT*)lParam)->flags & PSR_UNICODE))
+					return (INT_PTR)ppi->AddToList(wParam, (PROTOSEARCHRESULT*)lParam); 
+				else {
+					PROTOSEARCHRESULT *psr = (PROTOSEARCHRESULT*)lParam;
+					PROTOSEARCHRESULT *psra =(PROTOSEARCHRESULT*)mir_alloc(psr->cbSize);
+					memcpy(psra, psr, psr->cbSize);
+					psra->nick      = (PROTOCHAR*)mir_u2a(psr->nick);
+					psra->firstName = (PROTOCHAR*)mir_u2a(psr->firstName);
+					psra->lastName  = (PROTOCHAR*)mir_u2a(psr->lastName);
+					psra->email     = (PROTOCHAR*)mir_u2a(psr->email);
 							
-							INT_PTR res = (INT_PTR)ppi->AddToList(wParam, psra);
+					INT_PTR res = (INT_PTR)ppi->AddToList(wParam, psra);
 							
-							mir_free(psra->nick);
-							mir_free(psra->firstName);
-							mir_free(psra->lastName);
-							mir_free(psra->email);
-							mir_free(psra);
+					mir_free(psra->nick);
+					mir_free(psra->firstName);
+					mir_free(psra->lastName);
+					mir_free(psra->email);
+					mir_free(psra);
 							
-							return res;
-						}
-
-					case  2: return (INT_PTR)ppi->AddToListByEvent(LOWORD(wParam), HIWORD(wParam), (HANDLE)lParam); 
-					case  3: return (INT_PTR)ppi->Authorize((HANDLE)wParam); 
-					case  4:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->AuthDeny((HANDLE)wParam,  StrConvT((char*)lParam)); 
-						else
-							return (INT_PTR)ppi->AuthDeny((HANDLE)wParam, (PROTOCHAR*)lParam); 
-					case  5: return (INT_PTR)ppi->AuthRecv(hContact, (PROTORECVEVENT*)lParam); 
-					case  6:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->AuthRequest(hContact,  StrConvT((char*)lParam)); 
-						else
-							return (INT_PTR)ppi->AuthRequest(hContact, (PROTOCHAR*)lParam); 
-					case  7: return (INT_PTR)ppi->ChangeInfo(wParam, (void*)lParam); 
-					case  8:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam,  StrConvT((char*)lParam)); 
-						else
-							return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam, (PROTOCHAR*)lParam); 
-					case  9: return (INT_PTR)ppi->FileCancel(hContact, (HANDLE)wParam); 
-					case  10:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam,  StrConvT((char*)lParam)); 
-						else
-							return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam, (PROTOCHAR*)lParam); 
-					case 11: {
-						PROTOFILERESUME* pfr = (PROTOFILERESUME*)lParam;
-
-						if (ppi->m_iVersion > 1) {
-							PROTOCHAR* szFname = mir_a2t((char*)pfr->szFilename);
-							INT_PTR res = (INT_PTR)ppi->FileResume((HANDLE)wParam, &pfr->action, 
-								(const PROTOCHAR**)&szFname);
-							mir_free((PROTOCHAR*)pfr->szFilename); 
-							pfr->szFilename = (PROTOCHAR*)mir_t2a(szFname); mir_free(szFname); 
-						}
-						else
-
-							return (INT_PTR)ppi->FileResume((HANDLE)wParam, &pfr->action, 
-								(const PROTOCHAR**)&pfr->szFilename);
-					}
-					case 12: return (INT_PTR)ppi->GetCaps(wParam, (HANDLE)lParam);
-					case 13: return (INT_PTR)ppi->GetIcon(wParam);
-					case 14: return (INT_PTR)ppi->GetInfo(hContact, wParam);;
-					case 15: 
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->SearchBasic(StrConvT((char*)lParam));
-						else
-							return (INT_PTR)ppi->SearchBasic((TCHAR*)lParam); 
-					case 16: 
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->SearchByEmail(StrConvT((char*)lParam));
-						else
-							return (INT_PTR)ppi->SearchByEmail((TCHAR*)lParam); 
-					case 17: {
-						PROTOSEARCHBYNAME* psbn = (PROTOSEARCHBYNAME*)lParam;
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->SearchByName(StrConvT((char*)psbn->pszNick), 
-								StrConvT((char*)psbn->pszFirstName), StrConvT((char*)psbn->pszLastName));
-						else
-							return (INT_PTR)ppi->SearchByName(psbn->pszNick, psbn->pszFirstName, psbn->pszLastName); 
-					}
-					case 18: return (INT_PTR)ppi->SearchAdvanced((HWND)lParam); 
-					case 19: return (INT_PTR)ppi->CreateExtendedSearchUI ((HWND)lParam); 
-					case 20: return (INT_PTR)ppi->RecvContacts(hContact, (PROTORECVEVENT*)lParam); 
-					case 21: return (INT_PTR)ppi->RecvFile(hContact, (PROTOFILEEVENT*)lParam); 
-					case 22: return (INT_PTR)ppi->RecvMsg(hContact, (PROTORECVEVENT*)lParam); 
-					case 23: return (INT_PTR)ppi->RecvUrl(hContact, (PROTORECVEVENT*)lParam); 
-					case 24: return (INT_PTR)ppi->SendContacts(hContact, LOWORD(wParam), HIWORD(wParam), 
-								 (HANDLE*)lParam); 
-					case 25:
-
-						if (ppi->m_iVersion > 1) {
-							TCHAR** files = Proto_FilesMatrixU((char**)lParam);
-							INT_PTR res = (INT_PTR)ppi->SendFile(hContact, StrConvT((char*)wParam), (TCHAR**)files); 
-							if (res == 0) FreeFilesMatrix(&files);
-							return res;
-						}
-						else
-
-							return (INT_PTR)ppi->SendFile(hContact, (TCHAR*)wParam, (TCHAR**)lParam);
-					case 26: return (INT_PTR)ppi->SendMsg(hContact, wParam, (const char*)lParam); 
-					case 27: return (INT_PTR)ppi->SendUrl(hContact, wParam, (const char*)lParam); 
-					case 28: return (INT_PTR)ppi->SetApparentMode(hContact, wParam); 
-					case 29: return (INT_PTR)ppi->SetStatus(wParam); 
-					case 30: return (INT_PTR)ppi->GetAwayMsg(hContact); 
-					case 31: return (INT_PTR)ppi->RecvAwayMsg(hContact, wParam, (PROTORECVEVENT*)lParam); 
-					case 32: return (INT_PTR)ppi->SendAwayMsg(hContact, (HANDLE)wParam, (const char*)lParam); 
-					case 33: 
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->SetAwayMsg(wParam, StrConvT((char*)lParam));
-						else
-							return (INT_PTR)ppi->SetAwayMsg(wParam, (TCHAR*)lParam); 
-					case 34: return (INT_PTR)ppi->UserIsTyping((HANDLE)wParam, lParam); 
-					case 35: lstrcpynA((char*)lParam, ppi->m_szModuleName, wParam); return 0; 
-					case 36: return ppi->m_iStatus; 
-					
-
-					case 100:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->SetAwayMsg(wParam, (TCHAR*)lParam);
-						else
-							return (INT_PTR)ppi->SetAwayMsg(wParam, StrConvA((TCHAR*)lParam)); 
-					case 102:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->SendFile(hContact, (TCHAR*)wParam, (TCHAR**)lParam);
-						else {
-							char** files = Proto_FilesMatrixA((TCHAR**)lParam);
-							INT_PTR res = (INT_PTR)ppi->SendFile(hContact, StrConvA((TCHAR*)wParam), (TCHAR**)files); 
-							if (res == 0) FreeFilesMatrix((TCHAR***)&files);
-							return res;
-						}
-					case 103:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam, (TCHAR*)lParam);
-						else
-							return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam, StrConvA((TCHAR*)lParam)); 
-					case 104:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam, (TCHAR*)lParam);
-						else
-							return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam, StrConvA((TCHAR*)lParam)); 
-					case 105: {
-						PROTOFILERESUME* pfr = (PROTOFILERESUME*)lParam;
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->FileResume((HANDLE)wParam, &pfr->action, 
-								(const PROTOCHAR**)&pfr->szFilename);
-						else {
-							char* szFname = mir_t2a(pfr->szFilename);
-							INT_PTR res = (INT_PTR)ppi->FileResume((HANDLE)wParam, &pfr->action, 
-								(const PROTOCHAR**)&szFname);
-							mir_free(szFname);
-					}	}
-					case 106:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->AuthRequest(hContact, (const TCHAR*)lParam);
-						else
-							return (INT_PTR)ppi->AuthRequest(hContact, StrConvA((const TCHAR*)lParam)); 
-					case 107:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->AuthDeny((HANDLE)wParam, (const TCHAR*)lParam);
-						else
-							return (INT_PTR)ppi->AuthDeny((HANDLE)wParam, StrConvA((const TCHAR*)lParam)); 
-					case 108:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->SearchBasic((const TCHAR*)lParam);
-						else
-							return (INT_PTR)ppi->SearchBasic(StrConvA((const TCHAR*)lParam)); 
-					case 109: {
-						PROTOSEARCHBYNAME* psbn = (PROTOSEARCHBYNAME*)lParam;
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->SearchByName(psbn->pszNick, psbn->pszFirstName, psbn->pszLastName); 
-						else
-							return (INT_PTR)ppi->SearchByName(StrConvA((TCHAR*)psbn->pszNick), 
-								StrConvA((TCHAR*)psbn->pszFirstName), StrConvA((TCHAR*)psbn->pszLastName));
-					}
-					case 110:
-						if (ppi->m_iVersion > 1)
-							return (INT_PTR)ppi->SearchByEmail((const TCHAR*)lParam);
-						else
-							return (INT_PTR)ppi->SearchByEmail(StrConvA((const TCHAR*)lParam)); 
-
-	}	}	}	}
+					return res;
+				}
+
+			case  2: return (INT_PTR)ppi->AddToListByEvent(LOWORD(wParam), HIWORD(wParam), (HANDLE)lParam); 
+			case  3: return (INT_PTR)ppi->Authorize((HANDLE)wParam); 
+			case  4:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->AuthDeny((HANDLE)wParam,  StrConvT((char*)lParam)); 
+				else
+					return (INT_PTR)ppi->AuthDeny((HANDLE)wParam, (PROTOCHAR*)lParam); 
+			case  5: return (INT_PTR)ppi->AuthRecv(hContact, (PROTORECVEVENT*)lParam); 
+			case  6:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->AuthRequest(hContact,  StrConvT((char*)lParam)); 
+				else
+					return (INT_PTR)ppi->AuthRequest(hContact, (PROTOCHAR*)lParam); 
+			case  7: return (INT_PTR)ppi->ChangeInfo(wParam, (void*)lParam); 
+			case  8:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam,  StrConvT((char*)lParam)); 
+				else
+					return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam, (PROTOCHAR*)lParam); 
+			case  9: return (INT_PTR)ppi->FileCancel(hContact, (HANDLE)wParam); 
+			case  10:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam,  StrConvT((char*)lParam)); 
+				else
+					return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam, (PROTOCHAR*)lParam); 
+			case 11: {
+				PROTOFILERESUME* pfr = (PROTOFILERESUME*)lParam;
+				if (ppi->m_iVersion > 1) {
+					PROTOCHAR* szFname = mir_a2t((char*)pfr->szFilename);
+					INT_PTR res = (INT_PTR)ppi->FileResume((HANDLE)wParam, &pfr->action, (const PROTOCHAR**)&szFname);
+					mir_free((PROTOCHAR*)pfr->szFilename); 
+					pfr->szFilename = (PROTOCHAR*)mir_t2a(szFname); mir_free(szFname); 
+				}
+				else
+					return (INT_PTR)ppi->FileResume((HANDLE)wParam, &pfr->action, (const PROTOCHAR**)&pfr->szFilename);
+			}
+			case 12: return (INT_PTR)ppi->GetCaps(wParam, (HANDLE)lParam);
+			case 13: return (INT_PTR)ppi->GetIcon(wParam);
+			case 14: return (INT_PTR)ppi->GetInfo(hContact, wParam);;
+			case 15: 
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->SearchBasic(StrConvT((char*)lParam));
+				else
+					return (INT_PTR)ppi->SearchBasic((TCHAR*)lParam); 
+			case 16: 
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->SearchByEmail(StrConvT((char*)lParam));
+				else
+					return (INT_PTR)ppi->SearchByEmail((TCHAR*)lParam); 
+			case 17: {
+				PROTOSEARCHBYNAME* psbn = (PROTOSEARCHBYNAME*)lParam;
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->SearchByName(StrConvT((char*)psbn->pszNick), 
+						StrConvT((char*)psbn->pszFirstName), StrConvT((char*)psbn->pszLastName));
+				else
+					return (INT_PTR)ppi->SearchByName(psbn->pszNick, psbn->pszFirstName, psbn->pszLastName); 
+			}
+			case 18: return (INT_PTR)ppi->SearchAdvanced((HWND)lParam); 
+			case 19: return (INT_PTR)ppi->CreateExtendedSearchUI ((HWND)lParam); 
+			case 20: return (INT_PTR)ppi->RecvContacts(hContact, (PROTORECVEVENT*)lParam); 
+			case 21: return (INT_PTR)ppi->RecvFile(hContact, (PROTOFILEEVENT*)lParam); 
+			case 22: return (INT_PTR)ppi->RecvMsg(hContact, (PROTORECVEVENT*)lParam); 
+			case 23: return (INT_PTR)ppi->RecvUrl(hContact, (PROTORECVEVENT*)lParam); 
+			case 24: return (INT_PTR)ppi->SendContacts(hContact, LOWORD(wParam), HIWORD(wParam), (HANDLE*)lParam); 
+			case 25:
+				if (ppi->m_iVersion > 1) {
+					TCHAR** files = Proto_FilesMatrixU((char**)lParam);
+					INT_PTR res = (INT_PTR)ppi->SendFile(hContact, StrConvT((char*)wParam), (TCHAR**)files); 
+					if (res == 0) FreeFilesMatrix(&files);
+					return res;
+				}
+				else return (INT_PTR)ppi->SendFile(hContact, (TCHAR*)wParam, (TCHAR**)lParam);
+
+			case 26: return (INT_PTR)ppi->SendMsg(hContact, wParam, (const char*)lParam); 
+			case 27: return (INT_PTR)ppi->SendUrl(hContact, wParam, (const char*)lParam); 
+			case 28: return (INT_PTR)ppi->SetApparentMode(hContact, wParam); 
+			case 29: return (INT_PTR)ppi->SetStatus(wParam); 
+			case 30: return (INT_PTR)ppi->GetAwayMsg(hContact); 
+			case 31: return (INT_PTR)ppi->RecvAwayMsg(hContact, wParam, (PROTORECVEVENT*)lParam); 
+			case 32: return (INT_PTR)ppi->SendAwayMsg(hContact, (HANDLE)wParam, (const char*)lParam); 
+			case 33: 
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->SetAwayMsg(wParam, StrConvT((char*)lParam));
+				else
+					return (INT_PTR)ppi->SetAwayMsg(wParam, (TCHAR*)lParam); 
+			case 34: return (INT_PTR)ppi->UserIsTyping((HANDLE)wParam, lParam); 
+			case 35: lstrcpynA((char*)lParam, ppi->m_szModuleName, wParam); return 0; 
+			case 36: return ppi->m_iStatus; 
+
+			case 100:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->SetAwayMsg(wParam, (TCHAR*)lParam);
+				else
+					return (INT_PTR)ppi->SetAwayMsg(wParam, StrConvA((TCHAR*)lParam)); 
+			case 102:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->SendFile(hContact, (TCHAR*)wParam, (TCHAR**)lParam);
+				else {
+					char** files = Proto_FilesMatrixA((TCHAR**)lParam);
+					INT_PTR res = (INT_PTR)ppi->SendFile(hContact, StrConvA((TCHAR*)wParam), (TCHAR**)files); 
+					if (res == 0) FreeFilesMatrix((TCHAR***)&files);
+					return res;
+				}
+			case 103:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam, (TCHAR*)lParam);
+				else
+					return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam, StrConvA((TCHAR*)lParam)); 
+			case 104:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam, (TCHAR*)lParam);
+				else
+					return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam, StrConvA((TCHAR*)lParam)); 
+			case 105: {
+				PROTOFILERESUME* pfr = (PROTOFILERESUME*)lParam;
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->FileResume((HANDLE)wParam, &pfr->action, 
+						(const PROTOCHAR**)&pfr->szFilename);
+				else {
+					char* szFname = mir_t2a(pfr->szFilename);
+					INT_PTR res = (INT_PTR)ppi->FileResume((HANDLE)wParam, &pfr->action, 
+						(const PROTOCHAR**)&szFname);
+					mir_free(szFname);
+			}	}
+			case 106:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->AuthRequest(hContact, (const TCHAR*)lParam);
+				else
+					return (INT_PTR)ppi->AuthRequest(hContact, StrConvA((const TCHAR*)lParam)); 
+			case 107:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->AuthDeny((HANDLE)wParam, (const TCHAR*)lParam);
+				else
+					return (INT_PTR)ppi->AuthDeny((HANDLE)wParam, StrConvA((const TCHAR*)lParam)); 
+			case 108:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->SearchBasic((const TCHAR*)lParam);
+				else
+					return (INT_PTR)ppi->SearchBasic(StrConvA((const TCHAR*)lParam)); 
+			case 109: {
+				PROTOSEARCHBYNAME* psbn = (PROTOSEARCHBYNAME*)lParam;
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->SearchByName(psbn->pszNick, psbn->pszFirstName, psbn->pszLastName); 
+				else
+					return (INT_PTR)ppi->SearchByName(StrConvA((TCHAR*)psbn->pszNick), 
+						StrConvA((TCHAR*)psbn->pszFirstName), StrConvA((TCHAR*)psbn->pszLastName));
+			}
+			case 110:
+				if (ppi->m_iVersion > 1)
+					return (INT_PTR)ppi->SearchByEmail((const TCHAR*)lParam);
+				else
+					return (INT_PTR)ppi->SearchByEmail(StrConvA((const TCHAR*)lParam)); 
+	}	}	}
 
 
 	if ( !strcmp(szService, PS_ADDTOLIST)) {
@@ -618,10 +613,8 @@ INT_PTR CallProtoServiceInt(HANDLE hContact, const char *szModule, const char *s
 		}		
 	}
 
-
 	INT_PTR res = MyCallProtoService(szModule, szService, wParam, lParam);
 
-
 	if (res == CALLSERVICE_NOTFOUND && pa && pa->bOldProto && pa->ppro && strchr(szService, 'W')) {
 		TServiceListItem *item = serviceItems.find((TServiceListItem*)&szService);
 		if ( !item) return res;
diff --git a/src/modules/protocols/protoopts.cpp b/src/modules/protocols/protoopts.cpp
index 9339c1e282..007e827388 100644
--- a/src/modules/protocols/protoopts.cpp
+++ b/src/modules/protocols/protoopts.cpp
@@ -339,7 +339,7 @@ static LRESULT CALLBACK AccListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARA
 			rc.bottom = rc.top + max(GetSystemMetrics(SM_CXSMICON), parentDat->titleHeight) + 4 - 1;
 			++rc.top; --rc.right;
 
-			dat->hwndEdit = CreateWindow(_T("EDIT"), pa->tszAccountName, WS_CHILD|WS_BORDER|ES_AUTOHSCROLL, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, hwnd, NULL, hMirandaInst, NULL);
+			dat->hwndEdit = CreateWindow(_T("EDIT"), pa->tszAccountName, WS_CHILD|WS_BORDER|ES_AUTOHSCROLL, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, hwnd, NULL, hInst, NULL);
 			SetWindowLongPtr(dat->hwndEdit, GWLP_USERDATA, SetWindowLongPtr(dat->hwndEdit, GWLP_WNDPROC, (LONG_PTR)sttEditSubclassProc));
 			SendMessage(dat->hwndEdit, WM_SETFONT, (WPARAM)parentDat->hfntTitle, 0);
 			SendMessage(dat->hwndEdit, EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN|EC_USEFONTINFO, 0);
@@ -781,7 +781,7 @@ INT_PTR CALLBACK AccMgrDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
 								}
 								else pa->type = PROTOTYPE_DISPROTO;							}
 							else {
-								DWORD dwStatus = CallProtoService(pa->szModuleName, PS_GETSTATUS, 0, 0);
+								DWORD dwStatus = CallProtoServiceInt(NULL,pa->szModuleName, PS_GETSTATUS, 0, 0);
 								if (dwStatus >= ID_STATUS_ONLINE) {
 									if (IDCANCEL == ::MessageBox(hwndDlg, 
 										                  TranslateT("Account is online. Disable account?"), 
@@ -829,7 +829,7 @@ INT_PTR CALLBACK AccMgrDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
 		case IDC_ADD:
 			{
 				AccFormDlgParam param = { PRAC_ADDED, NULL };
-				if (IDOK == DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_ACCFORM), hwndDlg, AccFormDlgProc, (LPARAM)&param))
+				if (IDOK == DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_ACCFORM), hwndDlg, AccFormDlgProc, (LPARAM)&param))
 					SendMessage(hwndDlg, WM_MY_REFRESH, 0, 0);
 			}
 			break;
@@ -904,7 +904,7 @@ INT_PTR CALLBACK AccMgrDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
 				int idx = ListBox_GetCurSel(hList);
 				if (idx != -1) {
 					AccFormDlgParam param = { PRAC_UPGRADED, (PROTOACCOUNT*)ListBox_GetItemData(hList, idx) };
-					DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_ACCFORM), hwndDlg, AccFormDlgProc, (LPARAM)&param);
+					DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_ACCFORM), hwndDlg, AccFormDlgProc, (LPARAM)&param);
 			}	}
 			break;
 
@@ -1024,7 +1024,7 @@ INT_PTR CALLBACK AccMgrDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM
 static INT_PTR OptProtosShow(WPARAM, LPARAM)
 {
 	if ( !hAccMgr)
-		hAccMgr = CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_ACCMGR), NULL, AccMgrDlgProc, 0);
+		hAccMgr = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ACCMGR), NULL, AccMgrDlgProc, 0);
 
 	ShowWindow(hAccMgr, SW_RESTORE);
 	SetForegroundWindow(hAccMgr);
diff --git a/src/modules/skin/hotkey_opts.cpp b/src/modules/skin/hotkey_opts.cpp
index 929bb8be74..6bebcdc273 100644
--- a/src/modules/skin/hotkey_opts.cpp
+++ b/src/modules/skin/hotkey_opts.cpp
@@ -1005,7 +1005,7 @@ int HotkeyOptionsInit(WPARAM wParam, LPARAM)
 {
 	OPTIONSDIALOGPAGE odp = {0};
 	odp.cbSize = sizeof(odp);
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.flags = ODPF_BOLDGROUPS;
 	odp.position = -180000000;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_HOTKEYS);
diff --git a/src/modules/skin/hotkeys.cpp b/src/modules/skin/hotkeys.cpp
index 76a31b6f2e..a36dd152d1 100644
--- a/src/modules/skin/hotkeys.cpp
+++ b/src/modules/skin/hotkeys.cpp
@@ -332,7 +332,7 @@ int LoadSkinHotkeys(void)
 	wcl.style = 0;
 	wcl.cbClsExtra = 0;
 	wcl.cbWndExtra = 0;
-	wcl.hInstance = hMirandaInst;
+	wcl.hInstance = hInst;
 	wcl.hIcon = NULL;
 	wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
 	wcl.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
@@ -343,7 +343,7 @@ int LoadSkinHotkeys(void)
 
 	g_pid = GetCurrentProcessId();
 
-	g_hwndHotkeyHost = CreateWindow(_T("MirandaHotkeyHostWnd"), NULL, 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hMirandaInst, NULL);
+	g_hwndHotkeyHost = CreateWindow(_T("MirandaHotkeyHostWnd"), NULL, 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInst, NULL);
 	SetWindowPos(g_hwndHotkeyHost, 0, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_DEFERERASE|SWP_NOSENDCHANGING|SWP_HIDEWINDOW);
 
 	hhkKeyboard = SetWindowsHookEx(WH_KEYBOARD, sttKeyboardProc, NULL, GetCurrentThreadId());
diff --git a/src/modules/skin/skin.h b/src/modules/skin/skin.h
index 274b0d82df..bd8783e17d 100644
--- a/src/modules/skin/skin.h
+++ b/src/modules/skin/skin.h
@@ -56,8 +56,8 @@ struct THotkeyItem
 
 	bool         UnregisterHotkey;	// valid only during WM_APP message in options UI, used to remove unregistered hotkeys from options
 
-	__inline TCHAR* getSection() const { return LangPackTranslateStringT(hLangpack, ptszSection); }
-	__inline TCHAR* getDescr() const { return LangPackTranslateStringT(hLangpack, ptszDescription); }
+	__inline TCHAR* getSection() const { return TranslateTH(hLangpack, ptszSection); }
+	__inline TCHAR* getDescr() const { return TranslateTH(hLangpack, ptszDescription); }
 };
 
 extern LIST<THotkeyItem> hotkeys;
diff --git a/src/modules/skin/skinicons.cpp b/src/modules/skin/skinicons.cpp
index 24138e0000..509135ae20 100644
--- a/src/modules/skin/skinicons.cpp
+++ b/src/modules/skin/skinicons.cpp
@@ -135,7 +135,7 @@ HICON LoadIconEx(HINSTANCE hInstance, LPCTSTR lpIconName, BOOL bShared)
 {
 	HICON hResIcon = bShared ? LoadSmallIcon(hInstance, lpIconName) : LoadSmallIconShared(hInstance, lpIconName);
 	if ( !hResIcon) { //Icon not found in hInstance lets try to load it from core
-		HINSTANCE hCoreInstance=hMirandaInst;
+		HINSTANCE hCoreInstance=hInst;
 		if (hCoreInstance != hInstance)
 			hResIcon = bShared ? LoadSmallIcon(hCoreInstance, lpIconName) : LoadSmallIconShared(hCoreInstance, lpIconName);
 	}
@@ -144,7 +144,7 @@ HICON LoadIconEx(HINSTANCE hInstance, LPCTSTR lpIconName, BOOL bShared)
 
 int ImageList_AddIcon_NotShared(HIMAGELIST hIml, LPCTSTR szResource)
 {
-	HICON hTempIcon=LoadIconEx(hMirandaInst, szResource, 0);
+	HICON hTempIcon=LoadIconEx(hInst, szResource, 0);
 	int res = ImageList_AddIcon(hIml, hTempIcon);
 	Safe_DestroyIcon(hTempIcon);
 	return res;
@@ -222,7 +222,7 @@ HICON LoadSkinProtoIcon(const char* szProto, int status, bool big)
 	int i, statusIndx = -1;
 	char iconName[MAX_PATH];
 	HICON hIcon;
-	DWORD caps2 = (szProto == NULL) ? (DWORD)-1 : CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_2, 0);
+	DWORD caps2 = (szProto == NULL) ? (DWORD)-1 : CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_2, 0);
 
 	if (status >= ID_STATUS_CONNECTING && status < ID_STATUS_CONNECTING+MAX_CONNECT_RETRIES) {
 		mir_snprintf(iconName, SIZEOF(iconName), "%s%d", mainIconsFmt, 7);
@@ -276,7 +276,7 @@ HICON LoadSkinProtoIcon(const char* szProto, int status, bool big)
 			sid.cbSize = sizeof(sid);
 			sid.flags = SIDF_ALL_TCHAR;
 
-			GetModuleFileName(hMirandaInst, szPath, MAX_PATH);
+			GetModuleFileName(hInst, szPath, MAX_PATH);
 			str = _tcsrchr(szPath, '\\');
 			if (str != NULL)
 				*str = 0;
diff --git a/src/modules/skin/sounds.cpp b/src/modules/skin/sounds.cpp
index 94da829145..24b4e44476 100644
--- a/src/modules/skin/sounds.cpp
+++ b/src/modules/skin/sounds.cpp
@@ -30,8 +30,8 @@ struct SoundItem
 	TCHAR* ptszTempFile;
 	int    hLangpack;
 
-	__inline TCHAR* getSection() const { return LangPackTranslateStringT(hLangpack, ptszSection); }
-	__inline TCHAR* getDescr() const { return LangPackTranslateStringT(hLangpack, ptszDescription); }
+	__inline TCHAR* getSection() const { return TranslateTH(hLangpack, ptszSection); }
+	__inline TCHAR* getDescr() const { return TranslateTH(hLangpack, ptszDescription); }
 
 	__inline void clear(void)
 	{
@@ -112,7 +112,7 @@ static INT_PTR ServiceSkinPlaySound(WPARAM, LPARAM lParam)
 		DBVARIANT dbv;
 		if ( DBGetContactSettingTString(NULL, "SkinSounds", pszSoundName, &dbv) == 0) {
 			TCHAR szFull[MAX_PATH];
-			pathToAbsoluteT(dbv.ptszVal, szFull, NULL);
+			PathToAbsoluteT(dbv.ptszVal, szFull, NULL);
 			NotifyEventHooks(hPlayEvent, 0, (LPARAM)szFull);
 			DBFreeVariant(&dbv);
 		}
@@ -236,7 +236,7 @@ INT_PTR CALLBACK DlgProcSoundOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM
 				DBVARIANT dbv;
 				if ( !DBGetContactSettingTString(NULL, "SkinSounds", arSounds[tvi.lParam].name, &dbv)) {
 					TCHAR szPathFull[MAX_PATH];
-					pathToAbsoluteT(dbv.ptszVal, szPathFull, NULL);
+					PathToAbsoluteT(dbv.ptszVal, szPathFull, NULL);
 					NotifyEventHooks(hPlayEvent, 1, (LPARAM)szPathFull);
 					DBFreeVariant(&dbv);
 				}
@@ -266,12 +266,12 @@ INT_PTR CALLBACK DlgProcSoundOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM
 				if (DBGetContactSettingByte(NULL, "SkinSoundsOff", snd.name, 0) == 0) {
 					DBVARIANT dbv;
 					if (DBGetContactSettingTString(NULL, "SkinSounds", snd.name, &dbv) == 0) {
-						pathToAbsoluteT(dbv.ptszVal, strdir, NULL);
+						PathToAbsoluteT(dbv.ptszVal, strdir, NULL);
 						DBFreeVariant(&dbv);
 			}	}	}
 
 			mir_sntprintf(strFull, SIZEOF(strFull), _T("%s"), snd.ptszTempFile ? snd.ptszTempFile : _T(""));
-			pathToAbsoluteT(strFull, strdir, NULL);
+			PathToAbsoluteT(strFull, strdir, NULL);
 
 			OPENFILENAME ofn;
 			ZeroMemory(&ofn, sizeof(ofn));
@@ -411,7 +411,7 @@ static int SkinOptionsInit(WPARAM wParam, LPARAM)
 	OPTIONSDIALOGPAGE odp = { 0 };
 	odp.cbSize = sizeof(odp);
 	odp.position = -200000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_SOUND);
 	odp.pszGroup = LPGEN("Customize");
 	odp.pszTitle = LPGEN("Sounds");
diff --git a/src/modules/srauth/auth.cpp b/src/modules/srauth/auth.cpp
index c8257c3e20..61dedc06be 100644
--- a/src/modules/srauth/auth.cpp
+++ b/src/modules/srauth/auth.cpp
@@ -30,14 +30,14 @@ INT_PTR CALLBACK DlgProcAdded(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
 
 INT_PTR ShowReqWindow(WPARAM, LPARAM lParam)
 {
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_AUTHREQ), NULL, DlgProcAuthReq, 
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_AUTHREQ), NULL, DlgProcAuthReq, 
 		(LPARAM)((CLISTEVENT *)lParam)->hDbEvent);
 	return 0;
 }
 
 INT_PTR ShowAddedWindow(WPARAM, LPARAM lParam)
 {
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_ADDED), NULL, DlgProcAdded, 
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ADDED), NULL, DlgProcAdded, 
 		(LPARAM)((CLISTEVENT *)lParam)->hDbEvent);
 	return 0;
 }
diff --git a/src/modules/srauth/authdialogs.cpp b/src/modules/srauth/authdialogs.cpp
index b5693e01dd..7a19f54642 100644
--- a/src/modules/srauth/authdialogs.cpp
+++ b/src/modules/srauth/authdialogs.cpp
@@ -52,8 +52,8 @@ INT_PTR CALLBACK DlgProcAdded(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
 			char* last     = first + strlen(first) + 1;
 			char* email    = last  + strlen(last)  + 1;
 
-			SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0));
-			SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0));
+			SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoServiceInt(NULL,dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0));
+			SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoServiceInt(NULL,dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0));
 
 			PROTOACCOUNT* acc = Proto_GetAccount(dbei.szModule);
 
@@ -184,8 +184,8 @@ INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 			email    = last  + strlen(last)  + 1;
 			reason   = email + strlen(email) + 1;
 
-			SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0));
-			SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoService(dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0));
+			SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, CallProtoServiceInt(NULL,dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0));
+			SendMessage(hwndDlg, WM_SETICON, ICON_BIG, CallProtoServiceInt(NULL,dbei.szModule, PS_LOADICON, PLI_PROTOCOL | PLIF_LARGE, 0));
 
 			PROTOACCOUNT* acc = Proto_GetAccount(dbei.szModule);
 
@@ -234,7 +234,7 @@ INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 				ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), FALSE);
 
 			SendDlgItemMessage(hwndDlg, IDC_DENYREASON, EM_LIMITTEXT, 255, 0);
-			if (CallProtoService(dbei.szModule, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_NOAUTHDENYREASON)
+			if (CallProtoServiceInt(NULL,dbei.szModule, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_NOAUTHDENYREASON)
 			{
 				EnableWindow(GetDlgItem(hwndDlg, IDC_DENYREASON), FALSE);
 				SetDlgItemText(hwndDlg, IDC_DENYREASON, TranslateT("Feature is not supported by protocol"));
@@ -267,7 +267,7 @@ INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 				DBEVENTINFO dbei = {0};
 				dbei.cbSize = sizeof(dbei);
 				CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbei);
-				CallProtoService(dbei.szModule, PS_AUTHALLOW, (WPARAM)hDbEvent, 0);
+				CallProtoServiceInt(NULL,dbei.szModule, PS_AUTHALLOW, (WPARAM)hDbEvent, 0);
 
 				if (IsDlgButtonChecked(hwndDlg, IDC_ADDCHECK))
 				{
@@ -291,10 +291,10 @@ INT_PTR CALLBACK DlgProcAuthReq(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 				{
 					TCHAR szReason[256];
 					GetDlgItemText(hwndDlg, IDC_DENYREASON, szReason, SIZEOF(szReason));
-					CallProtoService(dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, (LPARAM)szReason);
+					CallProtoServiceInt(NULL,dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, (LPARAM)szReason);
 				}
 				else
-					CallProtoService(dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, 0);
+					CallProtoServiceInt(NULL,dbei.szModule, PS_AUTHDENYT, (WPARAM)hDbEvent, 0);
 			}
 			DestroyWindow(hwndDlg);
 			break;;
diff --git a/src/modules/srawaymsg/awaymsg.cpp b/src/modules/srawaymsg/awaymsg.cpp
index e480dab74a..82ea8f2121 100644
--- a/src/modules/srawaymsg/awaymsg.cpp
+++ b/src/modules/srawaymsg/awaymsg.cpp
@@ -125,7 +125,7 @@ static INT_PTR GetMessageCommand(WPARAM wParam, LPARAM)
 		SetForegroundWindow(hwnd);
 		SetFocus(hwnd);
 	}
-	else CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_READAWAYMSG), NULL, ReadAwayMsgDlgProc, wParam);
+	else CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_READAWAYMSG), NULL, ReadAwayMsgDlgProc, wParam);
 	return 0;
 }
 
@@ -146,8 +146,8 @@ static int AwayMsgPreBuildMenu(WPARAM wParam, LPARAM)
 			int status = DBGetContactSettingWord((HANDLE)wParam, szProto, "Status", ID_STATUS_OFFLINE);
 			mir_sntprintf(str, SIZEOF(str), TranslateT("Re&ad %s Message"), cli.pfnGetStatusModeDescription(status, 0));
 			clmi.ptszName = str;
-			if (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGRECV) {
-				if (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(status)) {
+			if (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGRECV) {
+				if (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(status)) {
 					clmi.flags = CMIM_FLAGS | CMIM_NAME | CMIF_NOTOFFLINE | CMIM_ICON | CMIF_TCHAR;
 					clmi.hIcon = LoadSkinProtoIcon(szProto, status);
 	}	}	}	}
diff --git a/src/modules/srawaymsg/sendmsg.cpp b/src/modules/srawaymsg/sendmsg.cpp
index d11f80715a..843b43f64f 100644
--- a/src/modules/srawaymsg/sendmsg.cpp
+++ b/src/modules/srawaymsg/sendmsg.cpp
@@ -73,7 +73,7 @@ static TCHAR* GetAwayMessage(int statusMode, char *szProto)
 {
 	DBVARIANT dbv;
 	
-	if (szProto && !(CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(statusMode)))
+	if (szProto && !(CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(statusMode)))
 		return NULL;
 
 	if (DBGetContactSettingByte(NULL, "SRAway", StatusModeToDbSetting(statusMode, "Ignore"), 0))
@@ -176,13 +176,13 @@ void ChangeAllProtoMessages(char *szProto, int statusMode, TCHAR *msg)
 		{
 			PROTOACCOUNT* pa = accounts[i];
 			if ( !Proto_IsAccountEnabled(pa)) continue;
-			if ((CallProtoService(pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) && 
+			if ((CallProtoServiceInt(NULL,pa->szModuleName, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) && 
 				!Proto_IsAccountLocked(pa))
-				CallProtoService(pa->szModuleName, PS_SETAWAYMSGT, statusMode, (LPARAM)msg);
+				CallProtoServiceInt(NULL,pa->szModuleName, PS_SETAWAYMSGT, statusMode, (LPARAM)msg);
 		}
 	}
 	else 
-		CallProtoService(szProto, PS_SETAWAYMSGT, statusMode, (LPARAM)msg);
+		CallProtoServiceInt(NULL,szProto, PS_SETAWAYMSGT, statusMode, (LPARAM)msg);
 }
 
 struct SetAwayMsgData 
@@ -323,8 +323,8 @@ static int StatusModeChange(WPARAM wParam, LPARAM lParam)
 	else
 	{
 		// If its a single protocol check the PFLAGNUM_3 for the single protocol
-		if ( !(CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)  || 
-			!(CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(statusMode)))
+		if ( !(CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND)  || 
+			!(CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_3, 0) & Proto_Status2Flag(statusMode)))
 			return 0;
 	}
 
@@ -346,7 +346,7 @@ static int StatusModeChange(WPARAM wParam, LPARAM lParam)
 		newdat->statusMode = statusMode;
 		if (hwndStatusMsg)
 			DestroyWindow(hwndStatusMsg);
-		hwndStatusMsg = CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_SETAWAYMSG), 
+		hwndStatusMsg = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_SETAWAYMSG), 
 			NULL, SetAwayMsgDlgProc, (LPARAM)newdat);
 	}
 	return 0;
@@ -547,7 +547,7 @@ static int AwayMsgOptInitialise(WPARAM wParam, LPARAM)
 	OPTIONSDIALOGPAGE odp = { 0 };
 	odp.cbSize = sizeof(odp);
 	odp.position = 870000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_AWAYMSG);
 	odp.pszTitle = LPGEN("Status Messages");
 	odp.pszGroup = LPGEN("Status");
@@ -570,7 +570,7 @@ static int AwayMsgSendModernOptInit(WPARAM wParam, LPARAM)
 
 	MODERNOPTOBJECT obj = {0};
 	obj.cbSize = sizeof(obj);
-	obj.hInstance = hMirandaInst;
+	obj.hInstance = hInst;
 	obj.dwFlags = MODEROPT_FLG_TCHAR | MODEROPT_FLG_NORESIZE;
 	obj.iSection = MODERNOPT_PAGE_STATUS;
 	obj.iType = MODERNOPT_TYPE_SECTIONPAGE;
@@ -590,7 +590,7 @@ static int AwayMsgSendAccountsChanged(WPARAM, LPARAM)
 	for (int i=0; i < accounts.getCount(); i++) 
 	{
 		if ( !Proto_IsAccountEnabled(accounts[i])) continue;
-		protoModeMsgFlags |= CallProtoService(accounts[i]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0);
+		protoModeMsgFlags |= CallProtoServiceInt(NULL,accounts[i]->szModuleName, PS_GETCAPS, PFLAGNUM_3, 0);
 	}
 
 	return 0;
diff --git a/src/modules/srfile/file.cpp b/src/modules/srfile/file.cpp
index 6f3b3e0ddf..b398294c8d 100644
--- a/src/modules/srfile/file.cpp
+++ b/src/modules/srfile/file.cpp
@@ -33,7 +33,7 @@ static INT_PTR SendFileCommand(WPARAM wParam, LPARAM)
 	struct FileSendData fsd;
 	fsd.hContact=(HANDLE)wParam;
 	fsd.ppFiles=NULL;
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd);
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd);
 	return 0;
 }
 
@@ -52,7 +52,7 @@ static INT_PTR SendSpecificFiles(WPARAM wParam, LPARAM lParam)
 			fsd.ppFiles[i] = (const TCHAR*)mir_a2t(ppFiles[i]);
 		fsd.ppFiles[ count ] = NULL;
 	
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd);
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd);
 	for (int j=0; j < count; j++)
 			mir_free((void*)fsd.ppFiles[j]);
 	return 0;
@@ -63,7 +63,7 @@ static INT_PTR SendSpecificFilesT(WPARAM wParam, LPARAM lParam)
 	FileSendData fsd;
 	fsd.hContact=(HANDLE)wParam;
 	fsd.ppFiles=(const TCHAR**)lParam;
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd);
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILESEND), NULL, DlgProcSendFile, (LPARAM)&fsd);
 	return 0;
 }
 
@@ -79,7 +79,7 @@ static INT_PTR GetReceivedFilesFolder(WPARAM wParam, LPARAM lParam)
 
 static INT_PTR RecvFileCommand(WPARAM, LPARAM lParam)
 {
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_FILERECV), NULL, DlgProcRecvFile, lParam);
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILERECV), NULL, DlgProcRecvFile, lParam);
 	return 0;
 }
 
@@ -91,7 +91,7 @@ void PushFileEvent(HANDLE hContact, HANDLE hdbe, LPARAM lParam)
 	cle.hDbEvent = hdbe;
 	cle.lParam = lParam;
 	if (DBGetContactSettingByte(NULL, "SRFile", "AutoAccept", 0) && !DBGetContactSettingByte(hContact, "CList", "NotOnList", 0)) {
-		CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_FILERECV), NULL, DlgProcRecvFile, (LPARAM)&cle);
+		CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILERECV), NULL, DlgProcRecvFile, (LPARAM)&cle);
 	}
 	else {
 		SkinPlaySound("RecvFile");
@@ -284,8 +284,8 @@ static int SRFilePreBuildMenu(WPARAM wParam, LPARAM)
 
 	char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, wParam, 0);
 	if (szProto != NULL) {
-		if (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_FILESEND) {
-			if (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_OFFLINEFILES)
+		if (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_FILESEND) {
+			if (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_OFFLINEFILES)
 				mi.flags = CMIM_FLAGS;
 			else if (DBGetContactSettingWord((HANDLE)wParam, szProto, "Status", ID_STATUS_OFFLINE) != ID_STATUS_OFFLINE)
 				mi.flags = CMIM_FLAGS;
diff --git a/src/modules/srfile/fileexistsdlg.cpp b/src/modules/srfile/fileexistsdlg.cpp
index d98ce59f78..1975226b90 100644
--- a/src/modules/srfile/fileexistsdlg.cpp
+++ b/src/modules/srfile/fileexistsdlg.cpp
@@ -189,7 +189,7 @@ void __cdecl LoadIconsAndTypesThread(void* param)
 			else {
 				iconIndex = _ttoi(pszComma+1); *pszComma='\0';
 			}
-			hIcon = ExtractIcon(hMirandaInst, szIconFile, iconIndex);
+			hIcon = ExtractIcon(hInst, szIconFile, iconIndex);
 			if (hIcon)
 				fileInfo.hIcon = hIcon;
 		}
diff --git a/src/modules/srfile/fileopts.cpp b/src/modules/srfile/fileopts.cpp
index e68781da7c..b8c8c0133a 100644
--- a/src/modules/srfile/fileopts.cpp
+++ b/src/modules/srfile/fileopts.cpp
@@ -234,7 +234,7 @@ int FileOptInitialise(WPARAM wParam, LPARAM)
 	OPTIONSDIALOGPAGE odp = {0};
 	odp.cbSize = sizeof(odp);
 	odp.position = 900000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_FILETRANSFER);
 	odp.pszTitle = LPGEN("File Transfers");
 	odp.pszGroup = LPGEN("Events");
diff --git a/src/modules/srfile/filerecvdlg.cpp b/src/modules/srfile/filerecvdlg.cpp
index 61f2c29153..7249291b6d 100644
--- a/src/modules/srfile/filerecvdlg.cpp
+++ b/src/modules/srfile/filerecvdlg.cpp
@@ -330,7 +330,7 @@ INT_PTR CALLBACK DlgProcRecvFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM l
 				if (szProto) {
 					HICON hIcon;
 
-					hIcon=(HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
+					hIcon=(HICON)CallProtoServiceInt(NULL,szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
 					if (hIcon) {
 						DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL);
 						DestroyIcon(hIcon);
diff --git a/src/modules/srfile/filesenddlg.cpp b/src/modules/srfile/filesenddlg.cpp
index d1d0f26c16..92875ddbdb 100644
--- a/src/modules/srfile/filesenddlg.cpp
+++ b/src/modules/srfile/filesenddlg.cpp
@@ -281,7 +281,7 @@ INT_PTR CALLBACK DlgProcSendFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM l
 
 				szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0);
 				if (szProto) {
-					HICON hIcon = (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
+					HICON hIcon = (HICON)CallProtoServiceInt(NULL,szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
 					if (hIcon) {
 						DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL);
 						DestroyIcon(hIcon);
diff --git a/src/modules/srfile/filexferdlg.cpp b/src/modules/srfile/filexferdlg.cpp
index 743e220051..3dc4e27bd5 100644
--- a/src/modules/srfile/filexferdlg.cpp
+++ b/src/modules/srfile/filexferdlg.cpp
@@ -45,7 +45,7 @@ struct virusscanthreadstartinfo {
 TCHAR* PFTS_StringToTchar(int flags, const PROTOCHAR* s)
 {
 	if (flags & PFTS_UTF)
-		return Utf8DecodeUcs2((char*)s);
+		return Utf8DecodeW((char*)s);
 	else if (flags & PFTS_UNICODE)
 		return mir_tstrdup(s);
 	else
@@ -55,7 +55,7 @@ TCHAR* PFTS_StringToTchar(int flags, const PROTOCHAR* s)
 int PFTS_CompareWithTchar(PROTOFILETRANSFERSTATUS* ft, const PROTOCHAR* s, TCHAR* r)
 {
 	if (ft->flags & PFTS_UTF) {
-		TCHAR* ts = Utf8DecodeUcs2((char*)s);
+		TCHAR* ts = Utf8DecodeW((char*)s);
 		int res = _tcscmp(ts, r);
 		mir_free(ts);
 		return res;
@@ -314,14 +314,14 @@ INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR
 				if (dat->bytesRecvedHistory[0] == dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1])
 					lstrcpy(szTime, _T("??:??:??"));
 				else {
-					li.QuadPart=BIGI(10000000)*(dat->transferStatus.currentFileSize-dat->transferStatus.currentFileProgress)*dat->bytesRecvedHistorySize/(dat->bytesRecvedHistory[0]-dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]);
-					ft.dwHighDateTime=li.HighPart; ft.dwLowDateTime=li.LowPart;
+					li.QuadPart = BIGI(10000000)*(dat->transferStatus.currentFileSize-dat->transferStatus.currentFileProgress)*dat->bytesRecvedHistorySize/(dat->bytesRecvedHistory[0]-dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]);
+					ft.dwHighDateTime = li.HighPart; ft.dwLowDateTime = li.LowPart;
 					FileTimeToSystemTime(&ft, &st);
 					GetTimeFormat(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT|TIME_NOTIMEMARKER, &st, NULL, szTime, SIZEOF(szTime));
 				}
 				if (dat->bytesRecvedHistory[0] != dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]) {
 					li.QuadPart=BIGI(10000000)*(dat->transferStatus.totalBytes-dat->transferStatus.totalProgress)*dat->bytesRecvedHistorySize/(dat->bytesRecvedHistory[0]-dat->bytesRecvedHistory[dat->bytesRecvedHistorySize-1]);
-					ft.dwHighDateTime=li.HighPart; ft.dwLowDateTime=li.LowPart;
+					ft.dwHighDateTime = li.HighPart; ft.dwLowDateTime = li.LowPart;
 					FileTimeToSystemTime(&ft, &st);
 					GetTimeFormat(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT|TIME_NOTIMEMARKER, &st, NULL, szTime, SIZEOF(szTime));
 				}
@@ -502,7 +502,7 @@ INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR
 					break;
 			}
 			mir_free(szOriginalFilename);
-			CallProtoService(szProto, PS_FILERESUMET, (WPARAM)dat->fs, (LPARAM)pfr);
+			CallProtoServiceInt(NULL,szProto, PS_FILERESUMET, (WPARAM)dat->fs, (LPARAM)pfr);
 			if (pfr->szFilename) mir_free((char*)pfr->szFilename);
 			mir_free(pfr);
 			break;
@@ -556,7 +556,7 @@ INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR
 					if (dat->resumeBehaviour == FILERESUME_ASK) {
 						TDlgProcFileExistsParam param = { hwndDlg, fts };
 						ShowWindow(hwndDlg, SW_SHOWNORMAL);
-						CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_FILEEXISTS), hwndDlg, DlgProcFileExists, (LPARAM)&param);
+						CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILEEXISTS), hwndDlg, DlgProcFileExists, (LPARAM)&param);
 						EnableWindow(hwndDlg, FALSE);
 					}
 					else {
@@ -720,7 +720,7 @@ INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR
 			UTILRESIZEDIALOG urd={0};
 			urd.cbSize=sizeof(urd);
 			urd.hwndDlg=hwndDlg;
-			urd.hInstance=hMirandaInst;
+			urd.hInstance=hInst;
 			urd.lpTemplate=MAKEINTRESOURCEA(IDD_FILETRANSFERINFO);
 			urd.pfnResizer=FileTransferDlgResizer;
 			CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM)&urd);
diff --git a/src/modules/srfile/ftmanager.cpp b/src/modules/srfile/ftmanager.cpp
index 08b4a9e59c..7e0dcfc9cc 100644
--- a/src/modules/srfile/ftmanager.cpp
+++ b/src/modules/srfile/ftmanager.cpp
@@ -313,8 +313,8 @@ static INT_PTR CALLBACK FtMgrDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
 
 		dat->hhkPreshutdown = HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwnd, M_PRESHUTDOWN);
 
-		dat->hwndIncoming = CreateDialog(hMirandaInst, MAKEINTRESOURCE(IDD_FTPAGE), hwnd, FtMgrPageDlgProc);
-		dat->hwndOutgoing = CreateDialog(hMirandaInst, MAKEINTRESOURCE(IDD_FTPAGE), hwnd, FtMgrPageDlgProc);
+		dat->hwndIncoming = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FTPAGE), hwnd, FtMgrPageDlgProc);
+		dat->hwndOutgoing = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FTPAGE), hwnd, FtMgrPageDlgProc);
 		ShowWindow(dat->hwndIncoming, SW_SHOW);
 
 		tci.mask = TCIF_PARAM|TCIF_TEXT;
@@ -537,7 +537,7 @@ HWND FtMgr_Show(bool bForceActivate, bool bFromMenu)
 	bool bJustCreated = (hwndFtMgr == NULL);
 	if (bJustCreated)
 	{
-		hwndFtMgr = CreateDialog(hMirandaInst, MAKEINTRESOURCE(IDD_FTMGR), NULL, FtMgrDlgProc);
+		hwndFtMgr = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FTMGR), NULL, FtMgrDlgProc);
 	}
 	if (bFromMenu) /* lqbe */
 	{
@@ -584,7 +584,7 @@ HWND FtMgr_AddTransfer(FileDlgData *fdd)
 	TFtMgrData *dat = (TFtMgrData*)GetWindowLongPtr(FtMgr_Show(bForceActivate, false), GWLP_USERDATA);
 	if (dat == NULL) return NULL;
 	HWND hwndBox = fdd->send ? dat->hwndOutgoing : dat->hwndIncoming;
-	HWND hwndFt = CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_FILETRANSFERINFO), hwndBox, DlgProcFileTransfer, (LPARAM)fdd);
+	HWND hwndFt = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FILETRANSFERINFO), hwndBox, DlgProcFileTransfer, (LPARAM)fdd);
 	ShowWindow(hwndFt, SW_SHOWNA);
 	SendMessage(hwndBox, WM_FT_ADD, 0, (LPARAM)hwndFt);
 	FtMgr_ShowPage(fdd->send ? 1 : 0);
diff --git a/src/modules/srurl/url.cpp b/src/modules/srurl/url.cpp
index 4eafff94a2..fe790330c0 100644
--- a/src/modules/srurl/url.cpp
+++ b/src/modules/srurl/url.cpp
@@ -34,7 +34,7 @@ INT_PTR CALLBACK DlgProcUrlRecv(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 
 static INT_PTR ReadUrlCommand(WPARAM, LPARAM lParam)
 {
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_URLRECV), NULL, DlgProcUrlRecv, lParam);
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_URLRECV), NULL, DlgProcUrlRecv, lParam);
 	return 0;
 }
 
@@ -66,7 +66,7 @@ static int UrlEventAdded(WPARAM wParam, LPARAM lParam)
 
 static INT_PTR SendUrlCommand(WPARAM wParam, LPARAM)
 {
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_URLSEND), NULL, DlgProcUrlSend, wParam);
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_URLSEND), NULL, DlgProcUrlSend, wParam);
 	return 0;
 }
 
@@ -121,7 +121,7 @@ static int SRUrlPreBuildMenu(WPARAM wParam, LPARAM)
 
 	char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, wParam, 0);
 	if (szProto != NULL)
-		if (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_URLSEND)
+		if (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_URLSEND)
 			mi.flags = CMIM_FLAGS;
 
 	CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hSRUrlMenuItem, (LPARAM)&mi);
diff --git a/src/modules/srurl/urldialogs.cpp b/src/modules/srurl/urldialogs.cpp
index 6e26068ce8..6fb5e7f33a 100644
--- a/src/modules/srurl/urldialogs.cpp
+++ b/src/modules/srurl/urldialogs.cpp
@@ -145,7 +145,7 @@ INT_PTR CALLBACK DlgProcUrlRecv(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 				if (szProto) {
 					HICON hIcon;
 					
-					hIcon = (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
+					hIcon = (HICON)CallProtoServiceInt(NULL,szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
 					if (hIcon) {
 						DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL);
 						DestroyIcon(hIcon);
@@ -166,7 +166,7 @@ INT_PTR CALLBACK DlgProcUrlRecv(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 				RECT rc;
 				char url[256];
 
-				hMenu=LoadMenu(hMirandaInst, MAKEINTRESOURCE(IDR_CONTEXT));
+				hMenu=LoadMenu(hInst, MAKEINTRESOURCE(IDR_CONTEXT));
 				hSubMenu=GetSubMenu(hMenu, 6);
 				TranslateMenu(hSubMenu);
 				GetWindowRect((HWND)lParam, &rc);
@@ -524,7 +524,7 @@ INT_PTR CALLBACK DlgProcUrlSend(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 			if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_PROTOCOL)) {
 				char *szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0);
 				if (szProto) {
-					HICON hIcon = (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
+					HICON hIcon = (HICON)CallProtoServiceInt(NULL,szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0);
 					if (hIcon) {
 						DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL);
 						DestroyIcon(hIcon);
diff --git a/src/modules/updatenotify/updatenotify.cpp b/src/modules/updatenotify/updatenotify.cpp
index e27bd5503e..184f46a42b 100644
--- a/src/modules/updatenotify/updatenotify.cpp
+++ b/src/modules/updatenotify/updatenotify.cpp
@@ -138,7 +138,7 @@ static int UpdateNotifyOptInit(WPARAM wParam, LPARAM)
 	OPTIONSDIALOGPAGE odp = { 0 };
 	odp.cbSize = sizeof(odp);
 	odp.position = 100000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_UPDATENOTIFY);
 	odp.pszGroup = LPGEN("Events");
 	odp.pszTitle = LPGEN("Update Notify");
@@ -162,7 +162,7 @@ static INT_PTR UpdateNotifyMenuCommand(WPARAM, LPARAM) {
 		DBWriteContactSettingDword(NULL, UN_MOD, UN_CURRENTVERSIONFND, und.reqTime);
 	}
 	und.isManual = 1;
-	DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_UPDATE_NOTIFY), 0, UpdateNotifyProc, (LPARAM)&und);
+	DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_UPDATE_NOTIFY), 0, UpdateNotifyProc, (LPARAM)&und);
 	hwndManualUpdateDlg = 0;
 	return 0;	
 }
@@ -517,7 +517,7 @@ static void UpdateNotifyPerform(void *)
 		if (notify) {
 			DBWriteContactSettingString(NULL, UN_MOD, UN_CURRENTVERSION, und.versionReal);
 			DBWriteContactSettingDword(NULL, UN_MOD, UN_CURRENTVERSIONFND, und.reqTime);
-			DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(IDD_UPDATE_NOTIFY), 0, UpdateNotifyProc, (LPARAM)&und);
+			DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_UPDATE_NOTIFY), 0, UpdateNotifyProc, (LPARAM)&und);
 			hwndUpdateDlg = 0;
 		}
 	}
diff --git a/src/modules/userinfo/contactinfo.cpp b/src/modules/userinfo/contactinfo.cpp
index f83c1c5a5c..64c84cf221 100644
--- a/src/modules/userinfo/contactinfo.cpp
+++ b/src/modules/userinfo/contactinfo.cpp
@@ -209,7 +209,7 @@ INT_PTR CALLBACK ContactDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 			}
 			if (hHandCursor == NULL) {
 				if (IsWinVer2000Plus()) hHandCursor=LoadCursor(NULL, IDC_HAND);
-				else hHandCursor=LoadCursor(hMirandaInst, MAKEINTRESOURCE(IDC_HYPERLINKHAND));
+				else hHandCursor=LoadCursor(hInst, MAKEINTRESOURCE(IDC_HYPERLINKHAND));
 			}
 			TranslateDialogDefault(hwndDlg);
 			{	LVCOLUMN lvc;
@@ -441,7 +441,7 @@ INT_PTR CALLBACK ContactDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 									char szNewData[256]="", idstr[33];
 									int i;
 									DBVARIANT dbv;
-									if (IDOK != DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(nm->hdr.idFrom == IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL), hwndDlg, nm->hdr.idFrom == IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc, (LPARAM)szNewData))
+									if (IDOK != DialogBoxParam(hInst, MAKEINTRESOURCE(nm->hdr.idFrom == IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL), hwndDlg, nm->hdr.idFrom == IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc, (LPARAM)szNewData))
 										break;
 									for (i=0;;i++) {
 										mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate, i);
@@ -477,7 +477,7 @@ INT_PTR CALLBACK ContactDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lP
 									if (DBGetContactSettingString(hContact, "UserInfo", idstr, &dbv)) break;
 									lstrcpynA(szText, dbv.pszVal, SIZEOF(szText));
 									DBFreeVariant(&dbv);
-									if (IDOK != DialogBoxParam(hMirandaInst, MAKEINTRESOURCE(nm->hdr.idFrom == IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL), hwndDlg, nm->hdr.idFrom == IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc, (LPARAM)szText))
+									if (IDOK != DialogBoxParam(hInst, MAKEINTRESOURCE(nm->hdr.idFrom == IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL), hwndDlg, nm->hdr.idFrom == IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc, (LPARAM)szText))
 										break;
 									DBWriteContactSettingString(hContact, "UserInfo", idstr, szText);
 									SendMessage(hwndDlg, M_REMAKELISTS, 0, 0);
diff --git a/src/modules/userinfo/stdinfo.cpp b/src/modules/userinfo/stdinfo.cpp
index 40f749efdf..42f2b3241d 100644
--- a/src/modules/userinfo/stdinfo.cpp
+++ b/src/modules/userinfo/stdinfo.cpp
@@ -38,7 +38,7 @@ static int Proto_GetContactInfoSetting(HANDLE hContact, const char *szProto, con
 	DBCONTACTGETSETTING cgs={szModule, szSetting, dbv};
 	dbv->type=(BYTE)nType;
 
-	return CallProtoService(szProto, PS_GETINFOSETTING, (WPARAM)hContact, (LPARAM)&cgs);
+	return CallProtoServiceInt(NULL,szProto, PS_GETINFOSETTING, (WPARAM)hContact, (LPARAM)&cgs);
 }
 
 static void Proto_FreeInfoVariant(DBVARIANT *dbv)
@@ -69,7 +69,7 @@ static void SetValue(HWND hwndDlg, int idCtrl, HANDLE hContact, char *szModule,
 	TCHAR* ptstr = NULL;
 	int unspecified=0;
 	char* szProto = (char *) CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
-	bool proto_service = szProto && (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC);
+	bool proto_service = szProto && (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC);
 
 	dbv.type=DBVT_DELETED;
 	if (szModule == NULL) unspecified=1;
@@ -385,7 +385,7 @@ static INT_PTR CALLBACK BackgroundDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam,
 				if (hContact != NULL) {
 					char *szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
 					if (szProto == NULL) break;
-					bool proto_service = (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC) == PF4_INFOSETTINGSVC;
+					bool proto_service = (CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC) == PF4_INFOSETTINGSVC;
 					SetValue(hwndDlg, IDC_WEBPAGE, hContact, szProto, "Homepage", SVS_ZEROISUNSPEC);
 
 					//past
@@ -570,7 +570,7 @@ int DetailsInit(WPARAM wParam, LPARAM lParam)
 
 	odp.cbSize = sizeof(odp);
 	odp.hIcon = NULL;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.flags = 0;
 
 	odp.pfnDlgProc = SummaryDlgProc;
diff --git a/src/modules/userinfo/userinfo.cpp b/src/modules/userinfo/userinfo.cpp
index 599902f9ad..c636534b19 100644
--- a/src/modules/userinfo/userinfo.cpp
+++ b/src/modules/userinfo/userinfo.cpp
@@ -100,7 +100,7 @@ static INT_PTR ShowDetailsDialogCommand(WPARAM wParam, LPARAM)
 	psh.pszCaption = (TCHAR*)wParam;	  //more abuses of structure: this is hContact
 	psh.ppsp = (PROPSHEETPAGE*)opi.odp;		  //blatent misuse of the structure, but what the hell
 
-	CreateDialogParam(hMirandaInst, MAKEINTRESOURCE(IDD_DETAILS), NULL, DlgProcDetails, (LPARAM)&psh);
+	CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_DETAILS), NULL, DlgProcDetails, (LPARAM)&psh);
 	for (i=0;i<opi.pageCount;i++) {
 		//cleanup moved to WM_DESTROY
 		//mir_free((char*)opi.odp[i].pszTitle);
@@ -397,7 +397,7 @@ static INT_PTR CALLBACK DlgProcDetails(HWND hwndDlg, UINT msg, WPARAM wParam, LP
 			if (dat->hContact != NULL) {
 				szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)dat->hContact, 0);
 				if (szProto == NULL) {EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE); break;}
-				if (CallProtoService(szProto, PS_GETSTATUS, 0, 0)<ID_STATUS_ONLINE) EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
+				if (CallProtoServiceInt(NULL,szProto, PS_GETSTATUS, 0, 0)<ID_STATUS_ONLINE) EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE);
 				else EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), !IsWindowVisible(GetDlgItem(hwndDlg, IDC_UPDATING)));
 			}
 			break;
diff --git a/src/modules/utils/bmpfilter.cpp b/src/modules/utils/bmpfilter.cpp
index 2e656dbf63..46db86baaf 100644
--- a/src/modules/utils/bmpfilter.cpp
+++ b/src/modules/utils/bmpfilter.cpp
@@ -36,7 +36,7 @@ static INT_PTR sttBitmapLoader(const TCHAR* ptszFileName)
 	short picType;
 
 	TCHAR szFilename[MAX_PATH];
-	if ( !pathToAbsoluteT(ptszFileName, szFilename, NULL))
+	if ( !PathToAbsoluteT(ptszFileName, szFilename, NULL))
 		mir_sntprintf(szFilename, SIZEOF(szFilename), _T("%s"), ptszFileName);
 
 	int filenameLen = lstrlen(szFilename);
@@ -48,7 +48,7 @@ static INT_PTR sttBitmapLoader(const TCHAR* ptszFileName)
 
 		if ( !lstrcmpi(pszExt, _T(".bmp")) || !lstrcmpi(pszExt, _T(".rle"))) {
 			//LoadImage can do this much faster
-			return (INT_PTR)LoadImage(hMirandaInst, szFilename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+			return (INT_PTR)LoadImage(hInst, szFilename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
 		}
 
 		if ( !lstrcmpi(pszExt, _T(".png"))) {
diff --git a/src/modules/utils/colourpicker.cpp b/src/modules/utils/colourpicker.cpp
index 731f61f1e1..dd31bf7155 100644
--- a/src/modules/utils/colourpicker.cpp
+++ b/src/modules/utils/colourpicker.cpp
@@ -47,7 +47,7 @@ static LRESULT CALLBACK ColourPickerWndProc(HWND hwnd, UINT message, WPARAM wPar
 			custColours[0]=GetWindowLongPtr(hwnd, sizeof(COLORREF));
             cc.lStructSize=sizeof(CHOOSECOLOR);
             cc.hwndOwner=hwnd;
-            cc.hInstance=(HWND)hMirandaInst;
+            cc.hInstance=(HWND)hInst;
             cc.rgbResult=GetWindowLongPtr(hwnd, 0);
             cc.lpCustColors=custColours;
             cc.Flags=CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT;
@@ -95,7 +95,7 @@ int InitColourPicker(void)
 	wcl.lpfnWndProc=ColourPickerWndProc;
 	wcl.cbClsExtra=0;
 	wcl.cbWndExtra=sizeof(COLORREF)*2;
-	wcl.hInstance=hMirandaInst;
+	wcl.hInstance=hInst;
 	wcl.hCursor=NULL;
 	wcl.lpszClassName=WNDCLASS_COLOURPICKER;
 	wcl.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
diff --git a/src/modules/utils/hyperlink.cpp b/src/modules/utils/hyperlink.cpp
index 2705347f36..ae372a9017 100644
--- a/src/modules/utils/hyperlink.cpp
+++ b/src/modules/utils/hyperlink.cpp
@@ -261,7 +261,7 @@ int InitHyperlink(void)
 	wcl.lpfnWndProc=HyperlinkWndProc;
 	wcl.cbClsExtra=0;
 	wcl.cbWndExtra=sizeof(struct HyperlinkWndData*);
-	wcl.hInstance=hMirandaInst;
+	wcl.hInstance=hInst;
 	if (IsWinVer2000Plus()) wcl.hCursor=NULL;
 	else wcl.hCursor=LoadCursor(wcl.hInstance, MAKEINTRESOURCE(IDC_HYPERLINKHAND));
 	wcl.lpszClassName=WNDCLASS_HYPERLINK;
diff --git a/src/modules/utils/path.cpp b/src/modules/utils/path.cpp
index b31267ad2a..bf875f9d74 100644
--- a/src/modules/utils/path.cpp
+++ b/src/modules/utils/path.cpp
@@ -26,99 +26,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 extern TCHAR g_profileDir[MAX_PATH];
 
-static char szMirandaPath[MAX_PATH];
-static char szMirandaPathLower[MAX_PATH];
-
 static INT_PTR replaceVars(WPARAM wParam, LPARAM lParam);
 
-static int pathIsAbsolute(const char *path)
-{
-	if (strlen(path) <= 2)
-		return 0;
-	if ((path[1] == ':' && path[2] == '\\') || (path[0] == '\\' && path[1] == '\\'))
-		return 1;
-	return 0;
-}
-
 static INT_PTR pathToRelative(WPARAM wParam, LPARAM lParam)
 {
-	char *pSrc = (char*)wParam;
-	char *pOut = (char*)lParam;
-	if ( !pSrc || !strlen(pSrc) || strlen(pSrc)>MAX_PATH) return 0;
-	if ( !pathIsAbsolute(pSrc)) {
-		mir_snprintf(pOut, MAX_PATH, "%s", pSrc);
-		return strlen(pOut);
-	}
-	else {
-		char szTmp[MAX_PATH];
-
-		mir_snprintf(szTmp, SIZEOF(szTmp), "%s", pSrc);
-		_strlwr(szTmp);
-		if (strstr(szTmp, szMirandaPathLower)) {
-			mir_snprintf(pOut, MAX_PATH, "%s", pSrc+strlen(szMirandaPathLower));
-			return strlen(pOut);
-		}
-		else {
-			mir_snprintf(pOut, MAX_PATH, "%s", pSrc);
-			return strlen(pOut);
-		}
-	}
-}
-
-int pathToAbsolute(const char *pSrc, char *pOut, char* base)
-{
-	if ( !pSrc || !strlen(pSrc) || strlen(pSrc) > MAX_PATH)
-		return 0;
-
-	if (base == NULL)
-		base = szMirandaPath;
-
-	char buf[MAX_PATH];
-	if (pSrc[0] < ' ')
-		return mir_snprintf(pOut, MAX_PATH, "%s", pSrc);
-	else if (pathIsAbsolute(pSrc))
-		return GetFullPathNameA(pSrc, MAX_PATH, pOut, NULL);
-	else if (pSrc[0] != '\\')
-		mir_snprintf(buf, MAX_PATH, "%s%s", base, pSrc);
-	else
-		mir_snprintf(buf, MAX_PATH, "%s%s", base, pSrc+1);
-
-	return GetFullPathNameA(buf, MAX_PATH, pOut, NULL);
+	return PathToRelative((char*)wParam, (char*)lParam);
 }
 
 static INT_PTR pathToAbsolute(WPARAM wParam, LPARAM lParam) 
 {
-	return pathToAbsolute((char*)wParam, (char*)lParam, szMirandaPath);
-}
-
-void CreatePathToFile(char* szFilePath)
-{
-	char* pszLastBackslash = strrchr(szFilePath, '\\');
-	if (pszLastBackslash == NULL)
-		return;
-
-	*pszLastBackslash = '\0';
-	CreateDirectoryTree(szFilePath);
-	*pszLastBackslash = '\\';
-}
-
-int CreateDirectoryTree(const char *szDir)
-{
-	DWORD dwAttributes;
-	char *pszLastBackslash, szTestDir[ MAX_PATH ];
-
-	lstrcpynA(szTestDir, szDir, SIZEOF(szTestDir));
-	if ((dwAttributes = GetFileAttributesA(szTestDir)) != INVALID_FILE_ATTRIBUTES && (dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
-		return 0;
-
-	pszLastBackslash = strrchr(szTestDir, '\\');
-	if (pszLastBackslash == NULL)
-		return 0;
-
-	*pszLastBackslash = '\0';
-	CreateDirectoryTree(szTestDir);
-	*pszLastBackslash = '\\';
-	return (CreateDirectoryA(szTestDir, NULL) == 0) ? GetLastError() : 0;
+	return PathToAbsolute((char*)wParam, (char*)lParam, NULL);
 }
 
 static INT_PTR createDirTree(WPARAM, LPARAM lParam)
@@ -129,94 +46,14 @@ static INT_PTR createDirTree(WPARAM, LPARAM lParam)
 	return CreateDirectoryTree((char*)lParam);
 }
 
-static TCHAR szMirandaPathW[MAX_PATH];
-static TCHAR szMirandaPathWLower[MAX_PATH];
-
-static int pathIsAbsoluteW(const TCHAR *path)
-{
-	if (lstrlen(path) <= 2)
-		return 0;
-	if ((path[1] == ':' && path[2] == '\\') || (path[0] == '\\' && path[1] == '\\'))
-		return 1;
-	return 0;
-}
-
 static INT_PTR pathToRelativeW(WPARAM wParam, LPARAM lParam)
 {
-	TCHAR *pSrc = (TCHAR*)wParam;
-	TCHAR *pOut = (TCHAR*)lParam;
-	if ( !pSrc || !lstrlen(pSrc) || lstrlen(pSrc) > MAX_PATH)
-		return 0;
-
-	if ( !pathIsAbsoluteW(pSrc))
-		mir_sntprintf(pOut, MAX_PATH, _T("%s"), pSrc);
-	else {
-		TCHAR szTmp[MAX_PATH];
-
-		mir_sntprintf(szTmp, SIZEOF(szTmp), _T("%s"), pSrc);
-		_tcslwr(szTmp);
-		if (_tcsstr(szTmp, szMirandaPathWLower))
-			mir_sntprintf(pOut, MAX_PATH, _T("%s"), pSrc+lstrlen(szMirandaPathWLower));
-		else
-			mir_sntprintf(pOut, MAX_PATH, _T("%s"), pSrc);
-	}
-	return lstrlen(pOut);
-}
-
-int pathToAbsoluteW(const TCHAR *pSrc, TCHAR *pOut, TCHAR* base)
-{
-	if ( !pSrc || !wcslen(pSrc) || wcslen(pSrc) > MAX_PATH)
-		return 0;
-
-	if (base == NULL)
-		base = szMirandaPathW;
-
-	TCHAR buf[MAX_PATH];
-	if (pSrc[0] < ' ')
-		return mir_sntprintf(pOut, MAX_PATH, _T("%s"), pSrc);
-	else if (pathIsAbsoluteW(pSrc))
-		return GetFullPathName(pSrc, MAX_PATH, pOut, NULL);
-	else if (pSrc[0] != '\\')
-		mir_sntprintf(buf, MAX_PATH, _T("%s%s"), base, pSrc);
-	else
-		mir_sntprintf(buf, MAX_PATH, _T("%s%s"), base, pSrc+1);
-
-	return GetFullPathName(buf, MAX_PATH, pOut, NULL);
+	return PathToRelativeW((WCHAR*)wParam, (WCHAR*)lParam );
 }
 
 static INT_PTR pathToAbsoluteW(WPARAM wParam, LPARAM lParam)
 {
-	return pathToAbsoluteW((TCHAR*)wParam, (TCHAR*)lParam, szMirandaPathW);
-}
-
-void CreatePathToFileW(WCHAR* wszFilePath)
-{
-	WCHAR* pszLastBackslash = wcsrchr(wszFilePath, '\\');
-	if (pszLastBackslash == NULL)
-		return;
-
-	*pszLastBackslash = '\0';
-	CreateDirectoryTreeW(wszFilePath);
-	*pszLastBackslash = '\\';
-}
-
-int CreateDirectoryTreeW(const WCHAR* szDir)
-{
-	DWORD  dwAttributes;
-	WCHAR* pszLastBackslash, szTestDir[ MAX_PATH ];
-
-	lstrcpynW(szTestDir, szDir, SIZEOF(szTestDir));
-	if ((dwAttributes = GetFileAttributesW(szTestDir)) != INVALID_FILE_ATTRIBUTES && (dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
-		return 0;
-
-	pszLastBackslash = wcsrchr(szTestDir, '\\');
-	if (pszLastBackslash == NULL)
-		return 0;
-
-	*pszLastBackslash = '\0';
-	CreateDirectoryTreeW(szTestDir);
-	*pszLastBackslash = '\\';
-	return (CreateDirectoryW(szTestDir, NULL) == 0) ? GetLastError() : 0;
+	return PathToAbsoluteW((WCHAR*)wParam, (WCHAR*)lParam, NULL);
 }
 
 static INT_PTR createDirTreeW(WPARAM, LPARAM lParam)
@@ -227,20 +64,6 @@ static INT_PTR createDirTreeW(WPARAM, LPARAM lParam)
 	return CreateDirectoryTreeW((WCHAR*)lParam);
 }
 
-int InitPathUtilsW(void)
-{
-	GetModuleFileName(hMirandaInst, szMirandaPathW, SIZEOF(szMirandaPathW));
-	TCHAR *p = _tcsrchr(szMirandaPathW, '\\');
-	if (p)
-		p[1] = 0;
-	mir_sntprintf(szMirandaPathWLower, SIZEOF(szMirandaPathWLower), _T("%s"), szMirandaPathW);
-	_tcslwr(szMirandaPathWLower);
-	CreateServiceFunction(MS_UTILS_PATHTORELATIVEW, pathToRelativeW);
-	CreateServiceFunction(MS_UTILS_PATHTOABSOLUTEW, pathToAbsoluteW);
-	CreateServiceFunction(MS_UTILS_CREATEDIRTREEW, createDirTreeW);
-	return 0;
-}
-
 TCHAR *GetContactID(HANDLE hContact)
 {
 	TCHAR *theValue = {0};
@@ -251,7 +74,7 @@ TCHAR *GetContactID(HANDLE hContact)
 			theValue = (TCHAR *)mir_tstrdup(dbv.ptszVal);
 			DBFreeVariant(&dbv);
 			return theValue;
-		}	}
+	}	}
 	else {
 		CONTACTINFO ci = {0};
 		ci.cbSize = sizeof(ci);
@@ -266,7 +89,7 @@ TCHAR *GetContactID(HANDLE hContact)
 			case CNFT_DWORD:
 				return _itot(ci.dVal, (TCHAR *)mir_alloc(sizeof(TCHAR)*32), 10);
 				break;
-			}	}	}
+	}	}	}
 	return NULL;
 }
 
@@ -574,17 +397,15 @@ static INT_PTR replaceVars(WPARAM wParam, LPARAM lParam)
 
 int InitPathUtils(void)
 {
-	char *p = 0;
-	GetModuleFileNameA(hMirandaInst, szMirandaPath, SIZEOF(szMirandaPath));
-	p = strrchr(szMirandaPath, '\\');
-	if (p)
-		p[1] = 0;
-	mir_snprintf(szMirandaPathLower, MAX_PATH, "%s", szMirandaPath);
-	_strlwr(szMirandaPathLower);
 	CreateServiceFunction(MS_UTILS_PATHTORELATIVE, pathToRelative);
+	CreateServiceFunction(MS_UTILS_PATHTORELATIVEW, pathToRelativeW);
+
 	CreateServiceFunction(MS_UTILS_PATHTOABSOLUTE, pathToAbsolute);
+	CreateServiceFunction(MS_UTILS_PATHTOABSOLUTEW, pathToAbsoluteW);
+
 	CreateServiceFunction(MS_UTILS_CREATEDIRTREE, createDirTree);
-	CreateServiceFunction(MS_UTILS_REPLACEVARS, replaceVars);
+	CreateServiceFunction(MS_UTILS_CREATEDIRTREEW, createDirTreeW);
 
-	return InitPathUtilsW();
+	CreateServiceFunction(MS_UTILS_REPLACEVARS, replaceVars);
+	return 0;
 }
diff --git a/src/modules/utils/timezones.cpp b/src/modules/utils/timezones.cpp
index 05e83afa51..d90a303e49 100644
--- a/src/modules/utils/timezones.cpp
+++ b/src/modules/utils/timezones.cpp
@@ -169,7 +169,7 @@ static HANDLE timeapiGetInfoByName(LPCTSTR tszName, DWORD dwFlags)
 		return (dwFlags & TZF_DIFONLY) ? NULL : &myInfo.myTZ;
 
 	MIM_TIMEZONE tzsearch;
-	tzsearch.hash = hashstr(tszName);
+	tzsearch.hash = mir_hashstrT(tszName);
 
 	MIM_TIMEZONE *tz = g_timezones.find(&tzsearch);
 	if (tz == NULL)
@@ -381,7 +381,7 @@ static int timeapiSelectListItem(HANDLE hContact, HWND hWnd, DWORD dwFlags)
 		DBVARIANT dbv;
 		if ( !DBGetContactSettingTString(hContact, "UserInfo", "TzName", &dbv))
 		{
-			unsigned hash = hashstr(dbv.ptszVal);
+			unsigned hash = mir_hashstrT(dbv.ptszVal);
 			for (int i = 0; i < g_timezonesBias.getCount(); ++i)
 			{
 				if (hash == g_timezonesBias[i]->hash)
@@ -607,7 +607,7 @@ void InitTimeZones(void)
 				tz->tzi.DaylightBias = tzi.DaylightBias;
 
 				_tcscpy(tz->tszName, tszName);
-				tz->hash = hashstr(tszName);
+				tz->hash = mir_hashstrT(tszName);
 				tz->offset = INT_MIN;
 
 				GetLocalizedString(hSubKey, _T("Display"), tz->szDisplay, SIZEOF(tz->szDisplay));
diff --git a/src/modules/utils/utils.cpp b/src/modules/utils/utils.cpp
index c9c1e3a65e..964e9a920f 100644
--- a/src/modules/utils/utils.cpp
+++ b/src/modules/utils/utils.cpp
@@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 INT_PTR ResizeDialog(WPARAM wParam, LPARAM lParam);
 int InitOpenUrl(void);
 int InitWindowList(void);
+int InitPathUtils(void);
 void FreeWindowList(void);
 int InitHyperlink(void);
 int InitColourPicker(void);
@@ -461,98 +462,6 @@ static INT_PTR GenerateRandom(WPARAM wParam, LPARAM lParam)
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-char* __fastcall rtrim(char* str)
-{
-	if (str == NULL) return NULL;
-	char* p = strchr(str, 0);
-	while (--p >= str)
-	{
-		switch (*p)
-		{
-		case ' ': case '\t': case '\n': case '\r':
-			*p = 0; break;
-		default:
-			return str;
-		}
-	}
-	return str;
-}
-
-TCHAR* __fastcall rtrim(TCHAR *str)
-{
-	if (str == NULL) return NULL;
-	TCHAR* p = _tcschr(str, 0);
-	while (--p >= str)
-	{
-		switch (*p)
-		{
-		case ' ': case '\t': case '\n': case '\r':
-			*p = 0; break;
-		default:
-			return str;
-		}
-	}
-	return str;
-}
-
-char* __fastcall ltrim(char* str)
-{
-	if (str == NULL) return NULL;
-	char* p = str;
-
-	for (;;)
-	{
-		switch (*p)
-		{
-		case ' ': case '\t': case '\n': case '\r':
-			++p; break;
-		default:
-			memmove(str, p, strlen(p) + 1);
-			return str;
-		}
-	}
-}
-
-char* __fastcall ltrimp(char* str)
-{
-	if (str == NULL) return NULL;
-	char* p = str;
-
-	for (;;)
-	{
-		switch (*p)
-		{
-		case ' ': case '\t': case '\n': case '\r':
-			++p; break;
-		default:
-			return p;
-		}
-	}
-}
-
-bool __fastcall wildcmp(char * name, char * mask)
-{
-	char * last='\0';
-	for (;; mask++, name++)
-	{
-		if (*mask != '?' && *mask != *name) break;
-		if (*name == '\0') return ((BOOL)!*mask);
-	}
-	if (*mask != '*') return FALSE;
-	for (;; mask++, name++)
-	{
-		while (*mask == '*')
-		{
-			last = mask++;
-			if (*mask == '\0') return ((BOOL)!*mask);   /* true */
-		}
-		if (*name == '\0') return ((BOOL)!*mask);      /* *mask == EOS */
-		if (*mask != '?' && *mask != *name) name -= (size_t)(mask - last) - 1, mask = last;
-	}	
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
 int LoadUtilsModule(void)
 {
 	bModuleInitialized = TRUE;
@@ -570,6 +479,7 @@ int LoadUtilsModule(void)
 	InitOpenUrl();
 	InitWindowList();
 	InitHyperlink();
+	InitPathUtils();
 	InitColourPicker();
 	InitBitmapFilter();
 	InitXmlApi();
diff --git a/src/modules/visibility/visibility.cpp b/src/modules/visibility/visibility.cpp
index 9575830f63..b7e67a2cd4 100644
--- a/src/modules/visibility/visibility.cpp
+++ b/src/modules/visibility/visibility.cpp
@@ -111,7 +111,7 @@ static void SetAllContactIcons(HWND hwndList)
 			szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
 			if (szProto == NULL) {flags=0; status=0;}
 			else {
-				flags=CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_1, 0);
+				flags=CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAGNUM_1, 0);
 				status=DBGetContactSettingWord(hContact, szProto, "ApparentMode", 0);
 			}
 			if (flags&PF1_INVISLIST) {
@@ -280,7 +280,7 @@ static int VisibilityOptInitialise(WPARAM wParam, LPARAM)
 	OPTIONSDIALOGPAGE odp = { 0 };
 	odp.cbSize = sizeof(odp);
 	odp.position = 850000000;
-	odp.hInstance = hMirandaInst;
+	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_VISIBILITY);
 	odp.pszTitle = LPGEN("Visibility");
 	odp.pszGroup = LPGEN("Status");
-- 
cgit v1.2.3