From 74d0eac304a0ea26a7c28b26452f373b2dce0fea Mon Sep 17 00:00:00 2001
From: aunsane <aunsane@gmail.com>
Date: Sat, 6 Oct 2018 01:05:46 +0300
Subject: NewStory: porting to ng (not complete)

---
 plugins/NewStory/res/resource.rc         |   4 +-
 plugins/NewStory/src/calendartool.cpp    |   4 +-
 plugins/NewStory/src/fonts.cpp           |  63 ++--
 plugins/NewStory/src/history.cpp         | 150 ++++----
 plugins/NewStory/src/history.h           |   2 +-
 plugins/NewStory/src/history_array.cpp   |  22 +-
 plugins/NewStory/src/history_array.h     |   4 +-
 plugins/NewStory/src/history_control.cpp |   8 +-
 plugins/NewStory/src/icons.cpp           | 102 +++---
 plugins/NewStory/src/icons.h             |  21 +-
 plugins/NewStory/src/main.cpp            |  30 +-
 plugins/NewStory/src/opt_passwords.cpp   | 268 +++++++-------
 plugins/NewStory/src/options.cpp         | 217 ++++++-----
 plugins/NewStory/src/password.cpp        |  99 ++----
 plugins/NewStory/src/password.h          |   6 +-
 plugins/NewStory/src/stdafx.h            |   1 +
 plugins/NewStory/src/templates.cpp       | 593 ++++++++++++++++---------------
 plugins/NewStory/src/templates.h         |   4 +-
 18 files changed, 776 insertions(+), 822 deletions(-)

(limited to 'plugins/NewStory')

diff --git a/plugins/NewStory/res/resource.rc b/plugins/NewStory/res/resource.rc
index c1b5f5037d..7963b06071 100644
--- a/plugins/NewStory/res/resource.rc
+++ b/plugins/NewStory/res/resource.rc
@@ -1,13 +1,13 @@
 //Microsoft Developer Studio generated resource script.
 //
-#include "resource.h"
+#include "..\src\resource.h"
 
 #define APSTUDIO_READONLY_SYMBOLS
 /////////////////////////////////////////////////////////////////////////////
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+#include "winres.h"
 
 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS
diff --git a/plugins/NewStory/src/calendartool.cpp b/plugins/NewStory/src/calendartool.cpp
index 3d1e118fe7..f45e125bcc 100644
--- a/plugins/NewStory/src/calendartool.cpp
+++ b/plugins/NewStory/src/calendartool.cpp
@@ -1,4 +1,4 @@
-#include "headers.h"
+#include "stdafx.h"
 
 struct CalendarToolData
 {
@@ -87,5 +87,5 @@ time_t CalendarTool_Show(HWND hwnd, int x, int y)
 
 //	HWND hwndTool = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_CALENDARTOOL), 0, CalendarToolDlgProc, (LPARAM)data);
 //	ShowWindow(hwndTool, SW_SHOWNORMAL);
-	return DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_CALENDARTOOL), 0, CalendarToolDlgProc, (LPARAM)data);
+	return DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_CALENDARTOOL), 0, CalendarToolDlgProc, (LPARAM)data);
 }
\ No newline at end of file
diff --git a/plugins/NewStory/src/fonts.cpp b/plugins/NewStory/src/fonts.cpp
index f454fdc976..0db756187b 100644
--- a/plugins/NewStory/src/fonts.cpp
+++ b/plugins/NewStory/src/fonts.cpp
@@ -1,40 +1,40 @@
-#include "headers.h"
+#include "stdafx.h"
 
 MyColourID colors[] = 
 {
-	{0, {sizeof(ColourID), MODULETITLE, "Incoming Messages",     MODULENAME, "ColorMsgIn", 0,   RGB(0xff, 0xff, 0xff),  0}},
-	{0, {sizeof(ColourID), MODULETITLE, "Outgoing Messages",     MODULENAME, "ColorMsgOut", 0,  RGB(0xff, 0xff, 0xff),  1}},
+	{0, {MODULETITLE, "Incoming Messages",     MODULENAME, "ColorMsgIn", 0,   RGB(0xff, 0xff, 0xff),  0}},
+	{0, {MODULETITLE, "Outgoing Messages",     MODULENAME, "ColorMsgOut", 0,  RGB(0xff, 0xff, 0xff),  1}},
 
-	{0, {sizeof(ColourID), MODULETITLE, "Incoming Files",        MODULENAME, "ColorFileIn", 0,  RGB(0xff, 0xff, 0xff),  2}},
-	{0, {sizeof(ColourID), MODULETITLE, "Outgoing Files",        MODULENAME, "ColorFileOut", 0, RGB(0xff, 0xff, 0xff),  3}},
+	{0, {MODULETITLE, "Incoming Files",        MODULENAME, "ColorFileIn", 0,  RGB(0xff, 0xff, 0xff),  2}},
+	{0, {MODULETITLE, "Outgoing Files",        MODULENAME, "ColorFileOut", 0, RGB(0xff, 0xff, 0xff),  3}},
 
-	{0, {sizeof(ColourID), MODULETITLE, "Incoming URLs",         MODULENAME, "ColorURLIn", 0,   RGB(0xff, 0xff, 0xff),  4}},
-	{0, {sizeof(ColourID), MODULETITLE, "Outgoing URLs",         MODULENAME, "ColorURLOut", 0,  RGB(0xff, 0xff, 0xff),  5}},
+	{0, {MODULETITLE, "Incoming URLs",         MODULENAME, "ColorURLIn", 0,   RGB(0xff, 0xff, 0xff),  4}},
+	{0, {MODULETITLE, "Outgoing URLs",         MODULENAME, "ColorURLOut", 0,  RGB(0xff, 0xff, 0xff),  5}},
 
-	{0, {sizeof(ColourID), MODULETITLE, "Status changes",        MODULENAME, "ColorStatus", 0,  RGB(0xff, 0xff, 0xff),  6}},
+	{0, {MODULETITLE, "Status changes",        MODULENAME, "ColorStatus", 0,  RGB(0xff, 0xff, 0xff),  6}},
 
-	{0, {sizeof(ColourID), MODULETITLE, "Other Outgoing Events", MODULENAME, "ColorOut", 0,     RGB(0xff, 0xff, 0xff),  7}},
-	{0, {sizeof(ColourID), MODULETITLE, "Other Incoming Events", MODULENAME, "ColorIn", 0,      RGB(0xff, 0xff, 0xff),  8}},
+	{0, {MODULETITLE, "Other Outgoing Events", MODULENAME, "ColorOut", 0,     RGB(0xff, 0xff, 0xff),  7}},
+	{0, {MODULETITLE, "Other Incoming Events", MODULENAME, "ColorIn", 0,      RGB(0xff, 0xff, 0xff),  8}},
 
-	{0, {sizeof(ColourID), MODULETITLE, "Selected Items",        MODULENAME, "ColorSel", 0,     RGB(0x60, 0x60, 0x60),  9}},
-	{0, {sizeof(ColourID), MODULETITLE, "Selected Items (Text)", MODULENAME, "ColorSelTxt", 0,  RGB(0xff, 0xff, 0xff), 10}}
+	{0, {MODULETITLE, "Selected Items",        MODULENAME, "ColorSel", 0,     RGB(0x60, 0x60, 0x60),  9}},
+	{0, {MODULETITLE, "Selected Items (Text)", MODULENAME, "ColorSelTxt", 0,  RGB(0xff, 0xff, 0xff), 10}}
 };
 
 MyFontID fonts[] = 
 {
-	{0, 0, 0, {sizeof(FontID), MODULETITLE, "Incoming Messages",     MODULENAME, "FontMsgIn", 0,   {0}, 0}},
-	{0, 0, 0, {sizeof(FontID), MODULETITLE, "Outgoing Messages",     MODULENAME, "FontMsgOut", 0,  {0}, 1}},
+	{0, 0, 0, {MODULETITLE, "Incoming Messages",     MODULENAME, "FontMsgIn", 0,   {0}, 0}},
+	{0, 0, 0, {MODULETITLE, "Outgoing Messages",     MODULENAME, "FontMsgOut", 0,  {0}, 1}},
 
-	{0, 0, 0, {sizeof(FontID), MODULETITLE, "Incoming Files",        MODULENAME, "FontFileIn", 0,  {0}, 2}},
-	{0, 0, 0, {sizeof(FontID), MODULETITLE, "Outgoing Files",        MODULENAME, "FontFileOut", 0, {0}, 3}},
+	{0, 0, 0, {MODULETITLE, "Incoming Files",        MODULENAME, "FontFileIn", 0,  {0}, 2}},
+	{0, 0, 0, {MODULETITLE, "Outgoing Files",        MODULENAME, "FontFileOut", 0, {0}, 3}},
 
-	{0, 0, 0, {sizeof(FontID), MODULETITLE, "Incoming URLs",         MODULENAME, "FontURLIn", 0,   {0}, 4}},
-	{0, 0, 0, {sizeof(FontID), MODULETITLE, "Outgoing URLs",         MODULENAME, "FontURLOut", 0,  {0}, 5}},
+	{0, 0, 0, {MODULETITLE, "Incoming URLs",         MODULENAME, "FontURLIn", 0,   {0}, 4}},
+	{0, 0, 0, {MODULETITLE, "Outgoing URLs",         MODULENAME, "FontURLOut", 0,  {0}, 5}},
 
-	{0, 0, 0, {sizeof(FontID), MODULETITLE, "Status changes",        MODULENAME, "FontStatus", 0,  {0}, 6}},
+	{0, 0, 0, {MODULETITLE, "Status changes",        MODULENAME, "FontStatus", 0,  {0}, 6}},
 
-	{0, 0, 0, {sizeof(FontID), MODULETITLE, "Other Outgoing Events", MODULENAME, "FontOut", 0,     {0}, 7}},
-	{0, 0, 0, {sizeof(FontID), MODULETITLE, "Other Incoming Events", MODULENAME, "FontIn", 0,      {0}, 8}}
+	{0, 0, 0, {MODULETITLE, "Other Outgoing Events", MODULENAME, "FontOut", 0,     {0}, 7}},
+	{0, 0, 0, {MODULETITLE, "Other Incoming Events", MODULENAME, "FontIn", 0,      {0}, 8}}
 
 //	{sizeof(FontID), MODULETITLE, "Default Text",  MODULENAME, "FontDef", FIDF_SAVEPOINTSIZE, {0}, 0},
 //	{sizeof(FontID), MODULETITLE, "Selected Item", MODULENAME, "FontSel", FIDF_SAVEPOINTSIZE, {0}, 1}
@@ -44,12 +44,10 @@ int evtFontsChanged(WPARAM, LPARAM)
 {
 	int i;
 	for (i = 0; i < COLOR_COUNT; i++)
-	{
-		colors[i].cl = (COLORREF)CallService(MS_COLOUR_GET, (WPARAM)&colors[i].info, 0);
-	}
-	for (i = 0; i < FONT_COUNT; i++)
-	{
-		fonts[i].cl = (COLORREF)CallService(MS_FONT_GET, (WPARAM)&fonts[i].info, (LPARAM)fonts[i].lf);
+		colors[i].cl = Colour_Get(colors[i].info.group, colors[i].info.name);
+
+	for (i = 0; i < FONT_COUNT; i++) {
+		fonts[i].cl = (COLORREF)Font_Get(fonts[i].info, fonts[i].lf);
 		DeleteObject(fonts[i].hfnt);
 		fonts[i].hfnt = CreateFontIndirectA(fonts[i].lf);
 	}
@@ -59,7 +57,7 @@ int evtFontsChanged(WPARAM, LPARAM)
 
 void InitFonts()
 {
-	bool isFSInstalled = ServiceExists(MS_FONT_GET) ? true : false;
+	bool isFSInstalled = /*ServiceExists(MS_FONT_GET) ? */true/* : false*/;
 
 	int i; // damn msvc can't handle for(int i...) correctly! =(
 
@@ -70,14 +68,15 @@ void InitFonts()
 	{
 		for (i = 0; i < COLOR_COUNT; i++)
 		{
-			CallService(MS_COLOUR_REGISTER, (WPARAM)&colors[i].info, 0);
-			colors[i].cl = (COLORREF)CallService(MS_COLOUR_GET, (WPARAM)&colors[i].info, 0);
+			g_plugin.addColor(&colors[i].info);
+			colors[i].cl = Colour_Get(colors[i].info.group, colors[i].info.name);
 		}
 		for (i = 0; i < FONT_COUNT; i++)
 		{
-			CallService(MS_FONT_REGISTER, (WPARAM)&fonts[i].info, 0);
+			//CallService(MS_FONT_REGISTER, (WPARAM)&fonts[i].info, 0);
+			g_plugin.addFont(&fonts[i].info);
 			fonts[i].lf = (LOGFONTA *)malloc(sizeof(LOGFONTA));
-			fonts[i].cl = (COLORREF)CallService(MS_FONT_GET, (WPARAM)&fonts[i].info, (LPARAM)fonts[i].lf);
+			fonts[i].cl = (COLORREF)Font_Get(fonts[i].info, fonts[i].lf);
 			fonts[i].hfnt = CreateFontIndirectA(fonts[i].lf);
 			//MessageBox(0, fonts[i].lf->lfFaceName, _T(""), MB_OK);
 		}
diff --git a/plugins/NewStory/src/history.cpp b/plugins/NewStory/src/history.cpp
index 0bc77cdaa4..e02501c219 100644
--- a/plugins/NewStory/src/history.cpp
+++ b/plugins/NewStory/src/history.cpp
@@ -11,27 +11,27 @@ for the date picker:
         break;
 */
 
-#include "headers.h"
+#include "stdafx.h"
 
-HANDLE hNewstoryWindows = 0;
+MWindowList hNewstoryWindows = 0;
 
 int evtEventAdded(WPARAM wParam, LPARAM lParam)
 {
-	HWND hwnd = WindowList_Find(hNewstoryWindows, (HANDLE)wParam);
+	HWND hwnd = WindowList_Find(hNewstoryWindows, (UINT_PTR)wParam);
 	SendMessage(hwnd, UM_ADDEVENT, wParam, lParam);
 	return 0;
 }
 
 int evtEventDeleted(WPARAM wParam, LPARAM lParam)
 {
-	HWND hwnd = WindowList_Find(hNewstoryWindows, (HANDLE)wParam);
+	HWND hwnd = WindowList_Find(hNewstoryWindows, (UINT_PTR)wParam);
 	SendMessage(hwnd, UM_REMOVEEVENT, wParam, lParam);
 	return 0;
 }
 
 void InitHistory()
 {
-	hNewstoryWindows = (HANDLE)CallService(MS_UTILS_ALLOCWINDOWLIST, 0, 0);
+	hNewstoryWindows = WindowList_Create();
 
 	HookEvent(ME_DB_EVENT_ADDED, evtEventAdded);
 	HookEvent(ME_DB_EVENT_DELETED, evtEventDeleted);
@@ -90,7 +90,7 @@ struct WindowData
 	WORD showFlags;
 	bool gonnaRedraw;
 	bool isContactHistory;
-	HANDLE hContact;
+	MCONTACT hContact;
 	int lastYear, lastMonth, lastDay;
 	HTREEITEM hLastYear, hLastMonth, hLastDay;
 	bool disableTimeTreeChange;
@@ -406,7 +406,7 @@ bool ExportHistoryDialog(HANDLE hContact, HWND hwndHistory)
 
 int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
-	CallSnappingWindowProc(hwnd, msg, wParam, lParam);
+	//CallSnappingWindowProc(hwnd, msg, wParam, lParam);
 
 	WindowData *data = (WindowData *)GetWindowLong(hwnd, GWL_USERDATA);
 
@@ -422,9 +422,9 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 		case WM_INITDIALOG:
 		{
 			data = new WindowData;
-			data->hContact = (HANDLE)lParam;
+			data->hContact = (MCONTACT)lParam;
 			data->disableTimeTreeChange = false;
-			data->showFlags = DBGetContactSettingWord(data->hContact, MODULENAME, "showFlags", 0x7f);
+			data->showFlags = db_get_w(data->hContact, MODULENAME, "showFlags", 0x7f);
 			data->lastYear = data->lastMonth = data->lastDay = -1;
 			data->hLastYear = data->hLastMonth = data->hLastDay = 0;
 
@@ -447,7 +447,7 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 			data->hwndBtnFindPrev = GetDlgItem(hwnd, IDC_FINDPREV);
 			data->hwndBtnFindNext = GetDlgItem(hwnd, IDC_FINDNEXT);
 			data->hwndSearchText = GetDlgItem(hwnd, IDC_SEARCHTEXT);
-			data->hwndStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0, hwnd, NULL, hInst, NULL);
+			data->hwndStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0, hwnd, NULL, g_plugin.getInst(), NULL);
 			SendMessage(data->hwndStatus, SB_SETMINHEIGHT, GetSystemMetrics(SM_CYSMICON), 0);
 
 			// filterbar
@@ -513,8 +513,8 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 			
 			SetWindowLong(hwnd, GWL_USERDATA, (LONG)data);
 
-			data->hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_POPUPS));
-			CallService(MS_LANGPACK_TRANSLATEMENU, (WPARAM)data->hMenu, 0);
+			data->hMenu = LoadMenu(g_plugin.getInst(), MAKEINTRESOURCE(IDR_POPUPS));
+			//CallService(MS_LANGPACK_TRANSLATEMENU, (WPARAM)data->hMenu, 0);
 			CheckMenuItem(GetSubMenu(data->hMenu, 1), IDD_FILTER_INCOMING,
 				data->showFlags&HIST_SHOW_IN ? MF_CHECKED : MF_UNCHECKED);
 			CheckMenuItem(GetSubMenu(data->hMenu, 1), IDD_FILTER_OUTGOING,
@@ -569,13 +569,13 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
 			WindowList_Add(hNewstoryWindows, hwnd, data->hContact);
 
-			if (data->hContact && (data->hContact != INVALID_HANDLE_VALUE))
+			if (data->hContact && (data->hContact != INVALID_CONTACT_ID))
 			{
 				TCHAR *title = TplFormatString(TPL_TITLE, data->hContact, 0);
 				SetWindowText(hwnd, title);
 				free(title);
 			} else
-			if (data->hContact == INVALID_HANDLE_VALUE)
+			if (data->hContact == INVALID_CONTACT_ID)
 			{
 				SetWindowText(hwnd, TranslateT("Newstory Search Results"));
 			} else
@@ -583,7 +583,7 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 				SetWindowText(hwnd, TranslateT("System Newstory"));
 			}
 
-			if (data->hContact != INVALID_HANDLE_VALUE)
+			if (data->hContact != INVALID_CONTACT_ID)
 			{
 //				ShowWindow(GetDlgItem(hwnd, IDC_TIMETREE), SW_HIDE);
 //				ShowWindow(GetDlgItem(hwnd, IDC_ITEMS), SW_HIDE);
@@ -595,11 +595,13 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 			SendMessage(hwnd, UM_UPDATEICONS, 0, 0);
 			SetFocus(GetDlgItem(hwnd, IDC_ITEMS2));
 
-			RECT rc;
-			rc.left = (int)DBGetContactSettingDword(data->hContact, MODULENAME, "left", 0);
-			rc.top = (int)DBGetContactSettingDword(data->hContact, MODULENAME, "top", 0);
-			rc.right = (int)DBGetContactSettingDword(data->hContact, MODULENAME, "right", 0);
-			rc.bottom = (int)DBGetContactSettingDword(data->hContact, MODULENAME, "bottom", 0);
+			RECT rc
+			{
+				db_get_dw(data->hContact, MODULENAME, "left"),
+				db_get_dw(data->hContact, MODULENAME, "top"),
+				db_get_dw(data->hContact, MODULENAME, "right"),
+				db_get_dw(data->hContact, MODULENAME, "bottom")
+			};
 			if ((rc.left-rc.right) && (rc.top-rc.bottom))
 				MoveWindow(hwnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE);
 	
@@ -618,40 +620,40 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
 		case UM_UPDATEICONS:
 		{
-			SendMessage(hwnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)icons[ICO_NEWSTORY].hIcon);
-
-			SendMessage(GetDlgItem(hwnd, IDC_SEARCHICON), STM_SETICON, (WPARAM)icons[ICO_SEARCH].hIcon, 0);
-
-			SendMessage(GetDlgItem(hwnd, IDC_USERINFO),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_USERINFO].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_MESSAGE),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_SENDMSG].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_USERMENU),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_USERMENU].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_COPY),		 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_COPY].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_LOGOPTIONS),BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_OPTIONS].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_FILTER),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_FILTER].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_DATEPOPUP), BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_CALENDAR].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_SEARCH),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_SEARCH].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_EXPORT),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_EXPORT].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_CLOSE),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_CLOSE].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_FINDPREV),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_FINDPREV].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_FINDNEXT),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_FINDNEXT].hIcon);
-
-			SendMessage(data->ibMessages.hwndIco, STM_SETICON, (LPARAM)icons[ICO_SENDMSG].hIcon, 0);
-			SendMessage(data->ibMessages.hwndIcoIn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_MSGIN].hIcon);
-			SendMessage(data->ibMessages.hwndIcoOut, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_MSGOUT].hIcon);
-			SendMessage(data->ibFiles.hwndIco, STM_SETICON, (LPARAM)icons[ICO_FILE].hIcon, 0);
-			SendMessage(data->ibFiles.hwndIcoIn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_MSGIN].hIcon);
-			SendMessage(data->ibFiles.hwndIcoOut, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_MSGOUT].hIcon);
-			SendMessage(data->ibUrls.hwndIco, STM_SETICON, (LPARAM)icons[ICO_URL].hIcon, 0);
-			SendMessage(data->ibUrls.hwndIcoIn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_MSGIN].hIcon);
-			SendMessage(data->ibUrls.hwndIcoOut, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_MSGOUT].hIcon);
-			SendMessage(data->ibTotal.hwndIco, STM_SETICON, (LPARAM)icons[ICO_UNKNOWN].hIcon, 0);
-			SendMessage(data->ibTotal.hwndIcoIn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_MSGIN].hIcon);
-			SendMessage(data->ibTotal.hwndIcoOut, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_MSGOUT].hIcon);
+			SendMessage(hwnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)GetIcon(ICO_NEWSTORY));
+
+			SendMessage(GetDlgItem(hwnd, IDC_SEARCHICON), STM_SETICON, (WPARAM)GetIcon(ICO_SEARCH), 0);
+
+			SendMessage(GetDlgItem(hwnd, IDC_USERINFO),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_USERINFO));
+			SendMessage(GetDlgItem(hwnd, IDC_MESSAGE),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_SENDMSG));
+			SendMessage(GetDlgItem(hwnd, IDC_USERMENU),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_USERMENU));
+			SendMessage(GetDlgItem(hwnd, IDC_COPY),		 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_COPY));
+			SendMessage(GetDlgItem(hwnd, IDC_LOGOPTIONS),BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_OPTIONS));
+			SendMessage(GetDlgItem(hwnd, IDC_FILTER),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_FILTER));
+			SendMessage(GetDlgItem(hwnd, IDC_DATEPOPUP), BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_CALENDAR));
+			SendMessage(GetDlgItem(hwnd, IDC_SEARCH),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_SEARCH));
+			SendMessage(GetDlgItem(hwnd, IDC_EXPORT),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_EXPORT));
+			SendMessage(GetDlgItem(hwnd, IDC_CLOSE),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_CLOSE));
+			SendMessage(GetDlgItem(hwnd, IDC_FINDPREV),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_FINDPREV));
+			SendMessage(GetDlgItem(hwnd, IDC_FINDNEXT),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_FINDNEXT));
+
+			SendMessage(data->ibMessages.hwndIco, STM_SETICON, (LPARAM)GetIcon(ICO_SENDMSG), 0);
+			SendMessage(data->ibMessages.hwndIcoIn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_MSGIN));
+			SendMessage(data->ibMessages.hwndIcoOut, BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_MSGOUT));
+			SendMessage(data->ibFiles.hwndIco, STM_SETICON, (LPARAM)GetIcon(ICO_FILE), 0);
+			SendMessage(data->ibFiles.hwndIcoIn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_MSGIN));
+			SendMessage(data->ibFiles.hwndIcoOut, BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_MSGOUT));
+			SendMessage(data->ibUrls.hwndIco, STM_SETICON, (LPARAM)GetIcon(ICO_URL), 0);
+			SendMessage(data->ibUrls.hwndIcoIn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_MSGIN));
+			SendMessage(data->ibUrls.hwndIcoOut, BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_MSGOUT));
+			SendMessage(data->ibTotal.hwndIco, STM_SETICON, (LPARAM)GetIcon(ICO_UNKNOWN), 0);
+			SendMessage(data->ibTotal.hwndIcoIn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_MSGIN));
+			SendMessage(data->ibTotal.hwndIcoOut, BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_MSGOUT));
 
 			if (CheckPassword(data->hContact, ""))
-				SendMessage(GetDlgItem(hwnd, IDC_SECURITY),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_NOPASSWORD].hIcon);
+				SendMessage(GetDlgItem(hwnd, IDC_SECURITY),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_NOPASSWORD));
 			else
-				SendMessage(GetDlgItem(hwnd, IDC_SECURITY),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_PASSWORD].hIcon);
+				SendMessage(GetDlgItem(hwnd, IDC_SECURITY),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_PASSWORD));
 			
 			break;
 		}
@@ -690,7 +692,7 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 			lpmis = (LPMEASUREITEMSTRUCT) lParam; 
 
 			if (lpmis->CtlType == ODT_MENU)
-				return CallService(MS_CLIST_MENUMEASUREITEM, wParam, lParam);
+				return Menu_MeasureItem(lParam);
 
 			lpmis->itemHeight = 25;
 			return TRUE; 
@@ -718,13 +720,13 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 		{
 			WindowList_Remove(hNewstoryWindows, hwnd);
 
-			DBWriteContactSettingWord(data->hContact, MODULENAME, "showFlags", data->showFlags);
+			db_set_dw(data->hContact, MODULENAME, "showFlags", data->showFlags);
 			RECT rc;
 			GetWindowRect(hwnd, &rc);
-			DBWriteContactSettingDword(data->hContact, MODULENAME, "left", rc.left);
-			DBWriteContactSettingDword(data->hContact, MODULENAME, "top", rc.top);
-			DBWriteContactSettingDword(data->hContact, MODULENAME, "right", rc.right);
-			DBWriteContactSettingDword(data->hContact, MODULENAME, "bottom", rc.bottom);
+			db_set_dw(data->hContact, MODULENAME, "left", rc.left);
+			db_set_dw(data->hContact, MODULENAME, "top", rc.top);
+			db_set_dw(data->hContact, MODULENAME, "right", rc.right);
+			db_set_dw(data->hContact, MODULENAME, "bottom", rc.bottom);
 
 //			CLCombo_Cleanup(GetDlgItem(hwnd, IDC_USERLIST));
 
@@ -740,7 +742,7 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 			lpdis = (LPDRAWITEMSTRUCT) lParam;
 
 			if (lpdis->CtlType == ODT_MENU)
-				return CallService(MS_CLIST_MENUDRAWITEM, wParam, lParam);
+				return Menu_DrawItem(lParam);
 
 			if (lpdis->itemID == -1)
 				return FALSE;
@@ -783,8 +785,8 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
 		case WM_COMMAND:
 		{
-			if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM) data->hContact))
-                return TRUE;
+			//if (Menu_ProcessCommand(MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM) data->hContact))
+            //    return TRUE;
 			switch(LOWORD(wParam))
 			{
 				case IDCANCEL:
@@ -812,7 +814,7 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 				case IDC_USERMENU:
 				{
 					RECT rc;
-					HMENU hMenu = (HMENU) CallService(MS_CLIST_MENUBUILDCONTACT, (WPARAM)data->hContact, 0);
+					HMENU hMenu = Menu_BuildContactMenu(data->hContact);
 					GetWindowRect(GetDlgItem(hwnd, LOWORD(wParam)), &rc);
 					TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwnd, NULL);
 					DestroyMenu(hMenu);
@@ -838,31 +840,19 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 						case ID_LOGOPTIONS_OPTIONS:
 						{
 							OptShowPage = 0;
-							OPENOPTIONSDIALOG ood;
-							ood.cbSize = sizeof(ood);
-							ood.pszGroup = 0;
-							ood.pszPage = "Newstory";
-							CallService(MS_OPT_OPENOPTIONS, 0, (LPARAM)&ood);
+							g_plugin.openOptions(nullptr, L"Newstory");
 							break;
 						}
 						case ID_LOGOPTIONS_TEMPLATES:
 						{
 							OptShowPage = 1;
-							OPENOPTIONSDIALOG ood;
-							ood.cbSize = sizeof(ood);
-							ood.pszGroup = 0;
-							ood.pszPage = "Newstory";
-							CallService(MS_OPT_OPENOPTIONS, 0, (LPARAM)&ood);
+							g_plugin.openOptions(nullptr, L"Newstory");
 							break;
 						}
 						case ID_LOGOPTIONS_PASSWORDS:
 						{
 							OptShowPage = 2;
-							OPENOPTIONSDIALOG ood;
-							ood.cbSize = sizeof(ood);
-							ood.pszGroup = 0;
-							ood.pszPage = "Newstory";
-							CallService(MS_OPT_OPENOPTIONS, 0, (LPARAM)&ood);
+							g_plugin.openOptions(nullptr, L"Newstory");
 							break;
 						}
 					}
@@ -1043,15 +1033,15 @@ int CALLBACK HistoryDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
 int svcShowNewstory(WPARAM wParam, LPARAM lParam)
 {
-	HWND hwnd = (HWND)WindowList_Find(hNewstoryWindows, (HANDLE)wParam);
+	HWND hwnd = (HWND)WindowList_Find(hNewstoryWindows, (MCONTACT)wParam);
 	if (hwnd && IsWindow(hwnd))
 	{
 		SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
 		SetFocus(hwnd);
 	} else
-	if (AskPassword((HANDLE)wParam))
+	if (AskPassword((MCONTACT)wParam))
 	{
-		HWND hwnd = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_HISTORY), 0, HistoryDlgProc, wParam);
+		HWND hwnd = CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_HISTORY), 0, HistoryDlgProc, wParam);
 		ShowWindow(hwnd, SW_SHOWNORMAL);
 	}
 	return 0;
@@ -1067,7 +1057,7 @@ int svcShowSystemNewstory(WPARAM wParam, LPARAM lParam)
 	} else
 	if (AskPassword(0))
 	{
-		HWND hwnd = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_HISTORY), 0, HistoryDlgProc, 0);
+		HWND hwnd = CreateDialogParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_HISTORY), 0, HistoryDlgProc, 0);
 		ShowWindow(hwnd, SW_SHOWNORMAL);
 	}
 	return 0;
diff --git a/plugins/NewStory/src/history.h b/plugins/NewStory/src/history.h
index c070d3e4d3..4aa5a05073 100644
--- a/plugins/NewStory/src/history.h
+++ b/plugins/NewStory/src/history.h
@@ -29,7 +29,7 @@ enum
 	UM_JUMP2TIME
 };
 
-extern HANDLE hNewstoryWindows;
+extern MWindowList hNewstoryWindows;
 
 void InitHistory();
 void FreeHistory();
diff --git a/plugins/NewStory/src/history_array.cpp b/plugins/NewStory/src/history_array.cpp
index 81758eab48..ed2ceadcdb 100644
--- a/plugins/NewStory/src/history_array.cpp
+++ b/plugins/NewStory/src/history_array.cpp
@@ -1,4 +1,4 @@
-#include "headers.h"
+#include "stdafx.h"
 
 void CacheThreadFunc(void *arg);
 
@@ -8,23 +8,21 @@ bool HistoryArray::ItemData::load(EventLoadMode mode)
 	if (mode == ELM_NOTHING)
 		return true;
 
-	if ((mode == ELM_INFO) && (!dbeOk || !dbe.cbSize))
+	if ((mode == ELM_INFO) && !dbeOk)
 	{
 		dbeOk = true;
-		dbe.cbSize = sizeof(dbe);
 		dbe.cbBlob = 0;
 		dbe.pBlob = 0;
-		CallService(MS_DB_EVENT_GET, (WPARAM)hEvent, (LPARAM)&dbe);
+		db_event_get(hEvent, &dbe);
 		return true;
 	}
 
 	if ((mode == ELM_DATA) && (!dbeOk || !dbe.cbBlob))
 	{
 		dbeOk = true;
-		dbe.cbSize = sizeof(dbe);
-		dbe.cbBlob = CallService(MS_DB_EVENT_GETBLOBSIZE, (WPARAM)hEvent, 0);
+		dbe.cbBlob = db_event_getBlobSize(hEvent);
 		dbe.pBlob = (PBYTE)calloc(dbe.cbBlob+1, 1);
-		CallService(MS_DB_EVENT_GET, (WPARAM)hEvent, (LPARAM)&dbe);
+		db_event_get(hEvent, &dbe);
 
 		int aLength = 0;
 		atext = 0;
@@ -170,27 +168,27 @@ void HistoryArray::clear()
 	preIndex = 0;
 }
 
-bool HistoryArray::addHistory(HANDLE hContact, EventLoadMode mode)
+bool HistoryArray::addHistory(MCONTACT hContact, EventLoadMode mode)
 {
-	int count = CallService(MS_DB_EVENT_GETCOUNT, (WPARAM)hContact, 0);
+	int count = db_event_count(hContact);
 	allocateBlock(count);
 
 	int i = 0;
-	HANDLE hEvent = (HANDLE)CallService(MS_DB_EVENT_FINDFIRST, (WPARAM)hContact, 0);
+	MEVENT hEvent = db_event_first(hContact);
 	while (hEvent)
 	{
 		tail->items[i].hContact = hContact;
 		tail->items[i].hEvent = hEvent;
 
 		++i;
-		hEvent = (HANDLE)CallService(MS_DB_EVENT_FINDNEXT, (WPARAM)hEvent, 0);
+		hEvent = db_event_next(hEvent, 0);
 	}
 	char buf[666];
 
 	return true;
 }
 
-bool HistoryArray::addEvent(HANDLE hContact, HANDLE hEvent, EventLoadMode mode)
+bool HistoryArray::addEvent(MCONTACT hContact, MEVENT hEvent, EventLoadMode mode)
 {
 	allocateBlock(1);
 	tail->items[0].hContact = hContact;
diff --git a/plugins/NewStory/src/history_array.h b/plugins/NewStory/src/history_array.h
index 924450a401..640548e84d 100644
--- a/plugins/NewStory/src/history_array.h
+++ b/plugins/NewStory/src/history_array.h
@@ -194,8 +194,8 @@ public:
 	~HistoryArray();
 
 	void clear();
-	bool addHistory(HANDLE hContact, EventLoadMode mode = ELM_NOTHING);
-	bool addEvent(HANDLE hContact, HANDLE hEvent, EventLoadMode mode = ELM_NOTHING);
+	bool addHistory(MCONTACT hContact, EventLoadMode mode = ELM_NOTHING);
+	bool addEvent(MCONTACT hContact, MEVENT hEvent, EventLoadMode mode = ELM_NOTHING);
 
 //	bool preloadEvents(int count = 10);
 
diff --git a/plugins/NewStory/src/history_control.cpp b/plugins/NewStory/src/history_control.cpp
index f433a3e1a7..02df609ef2 100644
--- a/plugins/NewStory/src/history_control.cpp
+++ b/plugins/NewStory/src/history_control.cpp
@@ -1,4 +1,4 @@
-#include "headers.h"
+#include "stdafx.h"
 
 LRESULT CALLBACK NewstoryListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
@@ -12,7 +12,7 @@ void InitNewstoryControl()
 	wndclass.lpfnWndProc = NewstoryListWndProc;
 	wndclass.cbClsExtra = 0;
 	wndclass.cbWndExtra = sizeof(void *);
-	wndclass.hInstance = hInst;
+	wndclass.hInstance = g_plugin.getInst();
 	wndclass.hIcon = NULL;
 	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 	wndclass.hbrBackground = NULL;
@@ -122,7 +122,7 @@ LRESULT CALLBACK NewstoryListWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
 
 		case WM_USER:
 		{
-			data->items.addHistory((HANDLE)wParam);
+			data->items.addHistory((MCONTACT)wParam);
 			RecalcScrollBar(hwnd, data);
 			data->scrollTopItem = data->items.getCount();
 			FixScrollPosition(hwnd, data);
@@ -807,7 +807,7 @@ static void BeginEditItem(HWND hwnd, NewstoryListData *data, int index)
 			}
 
 			TCHAR *text = TplFormatString(tpl, item->hContact, item);
-			data->hwndEditBox = CreateWindow(_T("EDIT"), text, WS_CHILD|WS_BORDER|ES_READONLY|ES_MULTILINE|ES_AUTOVSCROLL, 0, top, rc.right-rc.left, itemHeight, hwnd, NULL, hInst, NULL);
+			data->hwndEditBox = CreateWindow(_T("EDIT"), text, WS_CHILD|WS_BORDER|ES_READONLY|ES_MULTILINE|ES_AUTOVSCROLL, 0, top, rc.right-rc.left, itemHeight, hwnd, NULL, g_plugin.getInst(), NULL);
 			OldEditWndProc = (WNDPROC)SetWindowLong(data->hwndEditBox, GWL_WNDPROC, (LONG)HistoryEditWndProc);
 			SendMessage(data->hwndEditBox, WM_SETFONT, (WPARAM)fonts[fontid].hfnt, 0);
 			SendMessage(data->hwndEditBox, EM_SETMARGINS, EC_RIGHTMARGIN, 100);
diff --git a/plugins/NewStory/src/icons.cpp b/plugins/NewStory/src/icons.cpp
index 8572678804..61f9cd4211 100644
--- a/plugins/NewStory/src/icons.cpp
+++ b/plugins/NewStory/src/icons.cpp
@@ -1,74 +1,64 @@
-#include "headers.h"
+#include "stdafx.h"
 
-MyIconDesriptor icons[] = 
+static IconItem icons[] =
 {
-	{ICO_NEWSTORY,  MODULENAME"/main",      MODULETITLE, "Main Icon", 0},
-	{ICO_USERINFO,  MODULENAME"/userinfo",  MODULETITLE, "User Info", 0},
-	{ICO_USERMENU,  MODULENAME"/usermenu",  MODULETITLE, "User Menu", 0},
-	{ICO_SEARCH,    MODULENAME"/search",    MODULETITLE, "Search", 0},
-	{ICO_OPTIONS,   MODULENAME"/options",   MODULETITLE, "Options", 0},
-	{ICO_FILTER,    MODULENAME"/filter",    MODULETITLE, "Filter", 0},
-	{ICO_EXPORT,    MODULENAME"/export",    MODULETITLE, "Export", 0},
-	{ICO_COPY,      MODULENAME"/copy",      MODULETITLE, "Copy", 0},
-	{ICO_SENDMSG,   MODULENAME"/message",   MODULETITLE, "Send Message", 0},
-	{ICO_CLOSE,     MODULENAME"/close",     MODULETITLE, "Close", 0},
+	{ LPGEN("Main Icon"),         "main",      ICO_NEWSTORY   },
+	{ LPGEN("User Info"),         "userinfo",  ICO_USERINFO   },
+	{ LPGEN("User Menu"),         "usermenu",  ICO_USERMENU   },
+	{ LPGEN("Search"),            "search",    ICO_SEARCH     },
+	{ LPGEN("Options"),           "options",   ICO_OPTIONS    },
+	{ LPGEN("Filter"),            "filter",    ICO_FILTER     },
+	{ LPGEN("Export"),            "export",    ICO_EXPORT     },
+	{ LPGEN("Copy"),              "copy",      ICO_COPY       },
+	{ LPGEN("Send Message"),      "message",   ICO_SENDMSG    },
+	{ LPGEN("Close"),             "close",     ICO_CLOSE      },
 
-	{ICO_MSGIN,     MODULENAME"/msgin",     MODULETITLE, "Incoming Message", 0},
-	{ICO_MSGOUT,    MODULENAME"/msgout",    MODULETITLE, "Outgoing Message", 0},
-	{ICO_SIGNIN,    MODULENAME"/signin",    MODULETITLE, "User Signed In", 0},
-	{ICO_FILE,      MODULENAME"/file",      MODULETITLE, "File", 0},
-	{ICO_URL,       MODULENAME"/url",       MODULETITLE, "URL", 0},
-	{ICO_UNKNOWN,   MODULENAME"/unknown",   MODULETITLE, "Unknown Event", 0},
-	
-	{ICO_FINDPREV,  MODULENAME"/findprev",  MODULETITLE, "Find Previous", 0},
-	{ICO_FINDNEXT,  MODULENAME"/findnext",  MODULETITLE, "Find Next", 0},
-	{ICO_NOPASSWORD,MODULENAME"/nopassword",MODULETITLE, "Password disabled", 0},
-	{ICO_PASSWORD,  MODULENAME"/password",  MODULETITLE, "Password enabled", 0},
-	{ICO_CALENDAR,  MODULENAME"/calendar",  MODULETITLE, "Jump to Date", 0},
+	{ LPGEN("Incoming Message"),  "msgin",     ICO_MSGIN      },
+	{ LPGEN("Outgoing Message"),  "msgout",    ICO_MSGOUT     },
+	{ LPGEN("User Signed In"),    "signin",    ICO_SIGNIN     },
+	{ LPGEN("File"),              "file",      ICO_FILE       },
+	{ LPGEN("URL"),               "url",       ICO_URL        },
+	{ LPGEN("Unknown Event"),     "unknown",   ICO_UNKNOWN    },
 
-	{ICO_TPLGROUP,  MODULENAME"/tplgroup",  MODULETITLE, "Template Group", 0},
-	{ICO_RESET,     MODULENAME"/reset",     MODULETITLE, "Reset", 0},
-	{ICO_PREVIEW,   MODULENAME"/preview",   MODULETITLE, "Update Preview", 0},
-	{ICO_VARHELP,   MODULENAME"/varhelp",   MODULETITLE, "Help", 0},
-	{ICO_SAVEPASS,  MODULENAME"/savepass",  MODULETITLE, "Save Password", 0}
+	{ LPGEN("Find Previous"),     "findprev",  ICO_FINDPREV   },
+	{ LPGEN("Find Next"),         "findnext",  ICO_FINDNEXT   },
+	{ LPGEN("Password disabled"), "nopassword",ICO_NOPASSWORD },
+	{ LPGEN("Password enabled"),  "password",  ICO_PASSWORD   },
+	{ LPGEN("Jump to Date"),      "calendar",  ICO_CALENDAR   },
+
+	{ LPGEN("Template Group"),    "tplgroup",  ICO_TPLGROUP   },
+	{ LPGEN("Reset"),             "reset",     ICO_RESET      },
+	{ LPGEN("Update Preview"),    "preview",   ICO_PREVIEW    },
+	{ LPGEN("Help"),              "varhelp",   ICO_VARHELP    },
+	{ LPGEN("Save Password"),     "savepass",  ICO_SAVEPASS   }
 };
 
-int iconCount = sizeof(icons) / sizeof(icons[0]);
+//int iconCount = sizeof(icons) / sizeof(icons[0]);
 
 int evtIconsChanged(WPARAM, LPARAM)
 {
-	RefreshIcons(icons, ICO_COUNT);
-	WindowList_Broadcast(hNewstoryWindows, UM_UPDATEICONS, 0, 0);
+	//RefreshIcons(icons, ICO_COUNT);
+	//WindowList_Broadcast(hNewstoryWindows, UM_UPDATEICONS, 0, 0);
 	return 0;
 }
 
-void InitIcons(MyIconDesriptor *icons, LPSTR szFilename, int count)
+void InitIcons(LPSTR szFilename, int count)
 {
-	for (int i = 0; i < count; i++)
-	{
-		if (ServiceExists(MS_SKIN2_ADDICON))
-		{
-			SKINICONDESC sid;
-			sid.cbSize = sizeof(sid);
-			sid.pszName = icons[i].szId;
-			sid.pszSection = icons[i].szGroup;
-			sid.pszDescription = icons[i].szTitle;
-			sid.pszDefaultFile = szFilename;
-			sid.iDefaultIndex = -icons[i].dwIndex-1;
-			CallService(MS_SKIN2_ADDICON, 0, (LPARAM)&sid);
-			icons[i].hIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)icons[i].szId);
-		} else
-		{
-			ExtractIconExA(szFilename, icons[i].dwIndex, 0, &icons[i].hIcon, 1);
-		}
-	}
-
+	g_plugin.registerIcon(MODULETITLE, icons);
 	HookEvent(ME_SKIN2_ICONSCHANGED, evtIconsChanged);
 }
 
-void RefreshIcons(MyIconDesriptor *icons, int count)
+void RefreshIcons(IconItem *icons, int count)
+{
+	//if (ServiceExists(MS_SKIN2_ADDICON))
+	//	for (int i = 0; i < count; i++)
+	//		icons[i].hIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)icons[i].szId);
+}
+
+HICON GetIcon(int iconId)
 {
-	if (ServiceExists(MS_SKIN2_ADDICON))
-		for (int i = 0; i < count; i++)
-			icons[i].hIcon = (HICON)CallService(MS_SKIN2_GETICON, 0, (LPARAM)icons[i].szId);
+	for (auto &it : icons)
+		if (it.defIconID == iconId)
+			return IcoLib_GetIconByHandle(it.hIcolib);
+	return nullptr;
 }
\ No newline at end of file
diff --git a/plugins/NewStory/src/icons.h b/plugins/NewStory/src/icons.h
index e041c648e5..635ece3f7a 100644
--- a/plugins/NewStory/src/icons.h
+++ b/plugins/NewStory/src/icons.h
@@ -1,14 +1,3 @@
-struct MyIconDesriptor
-{
-	DWORD dwIndex;
-
-	LPSTR szId;
-	LPSTR szGroup;
-	LPSTR szTitle;
-
-	HICON hIcon;
-};
-
 enum
 {
 	ICO_NEWSTORY,	// 0
@@ -40,8 +29,10 @@ enum
 	ICO_COUNT		// 26
 };
 
-extern MyIconDesriptor icons[];
-extern int iconCount;
+//extern IconItem icons[];
+//extern int iconCount;
+
+HICON GetIcon(int iconId);
 
-void InitIcons(MyIconDesriptor *icons, LPSTR szFilename, int count);
-void RefreshIcons(MyIconDesriptor *icons, int count);
\ No newline at end of file
+void InitIcons(LPSTR szFilename, int count);
+void RefreshIcons(IconItem *icons, int count);
\ No newline at end of file
diff --git a/plugins/NewStory/src/main.cpp b/plugins/NewStory/src/main.cpp
index 885c53393c..a88a597399 100644
--- a/plugins/NewStory/src/main.cpp
+++ b/plugins/NewStory/src/main.cpp
@@ -17,7 +17,8 @@ CMPlugin g_plugin;
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-PLUGININFOEX pluginInfoEx = {
+PLUGININFOEX pluginInfoEx =
+{
 	sizeof(PLUGININFOEX),
 	__PLUGIN_NAME,
 	PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
@@ -42,36 +43,33 @@ extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_UIHIST
 
 int evtModulesLoaded(WPARAM, LPARAM)
 {
-	InitIcons(icons, "plugins\\newstory_icons.dll", iconCount);
+	InitIcons("icons\\newstory_icons.dll", 0);
 	InitFonts();
 	InitNewstoryControl();
 	InitHistory();
 	InitOptions();
 	LoadTemplates();
 
-	CLISTMENUITEM mi;
-	ZeroMemory(&mi, sizeof(mi));
-	mi.cbSize = sizeof(mi);
+	CMenuItem mi(&g_plugin);
+	mi.flags = CMIF_UNICODE;
+
 	mi.pszService = MS_HISTORY_SHOWCONTACTHISTORY;
-	mi.pszName = "User Newstory";
-	mi.popupPosition = 1999990000;
-	mi.hIcon = icons[ICO_NEWSTORY].hIcon;
-	CallService(MS_CLIST_ADDCONTACTMENUITEM, (WPARAM)0, (LPARAM)&mi);
+	mi.name.w = L"User Newstory";
+	mi.position = 1999990000;
+	mi.hIcon = GetIcon(ICO_NEWSTORY);
+	Menu_AddContactMenuItem(&mi);
 
-	ZeroMemory(&mi, sizeof(mi));
-	mi.cbSize = sizeof(mi);
 	mi.pszService = "Newstory/System";
-	mi.pszName = "System Newstory";
-	mi.popupPosition = 1999990000;
-	mi.hIcon = icons[ICO_NEWSTORY].hIcon;
-	CallService(MS_CLIST_ADDMAINMENUITEM, (WPARAM)0, (LPARAM)&mi);
+	mi.name.w = L"System Newstory";
+	mi.position = 1999990000;
+	mi.hIcon = GetIcon(ICO_NEWSTORY);
+	Menu_AddMainMenuItem(&mi);
 
 	return 0;
 }
 
 int CMPlugin::Load()
 {
-
 	CreateServiceFunction(MS_HISTORY_SHOWCONTACTHISTORY, svcShowNewstory);
 	CreateServiceFunction("Newstory/System", svcShowSystemNewstory);
 
diff --git a/plugins/NewStory/src/opt_passwords.cpp b/plugins/NewStory/src/opt_passwords.cpp
index ac81dc01bc..cb59426f3b 100644
--- a/plugins/NewStory/src/opt_passwords.cpp
+++ b/plugins/NewStory/src/opt_passwords.cpp
@@ -4,26 +4,24 @@ int icoidNoPassword, icoidPassword;
 
 void SetAllContactIcons(HWND hwndList)
 {
-	HANDLE hContact,hItem;
-	hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);
-	while (hContact)
-	{
-		hItem=(HANDLE)SendMessage(hwndList,CLM_FINDCONTACT,(WPARAM)hContact,0);
-		SendMessage(hwndList,CLM_SETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(0, CheckPassword(hContact,"")?icoidNoPassword:icoidPassword));
-		hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0);
+	MCONTACT hContact, hItem;
+	hContact = db_find_first();
+	for (auto &hContact : Contacts()) {
+		hItem = (MCONTACT)SendMessage(hwndList, CLM_FINDCONTACT, (WPARAM)hContact, 0);
+		SendMessage(hwndList, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(0, CheckPassword(hContact, "") ? icoidNoPassword : icoidPassword));
 	}
 }
 
 static void ResetListOptions(HWND hwndList)
 {
-	SendMessage(hwndList,CLM_SETBKBITMAP,0,(LPARAM)(HBITMAP)NULL);
-	SendMessage(hwndList,CLM_SETBKCOLOR,GetSysColor(COLOR_WINDOW),0);
-	SendMessage(hwndList,CLM_SETGREYOUTFLAGS,0,0);
-	SendMessage(hwndList,CLM_SETLEFTMARGIN,2,0);
-	SendMessage(hwndList,CLM_SETINDENT,10,0);
-	for(int i=0;i<=FONTID_MAX;i++)
-		SendMessage(hwndList,CLM_SETTEXTCOLOR,i,GetSysColor(COLOR_WINDOWTEXT));
-	SetWindowLong(hwndList,GWL_STYLE,GetWindowLong(hwndList,GWL_STYLE)|CLS_SHOWHIDDEN);
+	SendMessage(hwndList, CLM_SETBKBITMAP, 0, (LPARAM)(HBITMAP)NULL);
+	SendMessage(hwndList, CLM_SETBKCOLOR, GetSysColor(COLOR_WINDOW), 0);
+	SendMessage(hwndList, CLM_SETGREYOUTFLAGS, 0, 0);
+	SendMessage(hwndList, CLM_SETLEFTMARGIN, 2, 0);
+	SendMessage(hwndList, CLM_SETINDENT, 10, 0);
+	for (int i = 0; i <= FONTID_MAX; i++)
+		SendMessage(hwndList, CLM_SETTEXTCOLOR, i, GetSysColor(COLOR_WINDOWTEXT));
+	SetWindowLong(hwndList, GWL_STYLE, GetWindowLong(hwndList, GWL_STYLE) | CLS_SHOWHIDDEN);
 }
 
 BOOL CALLBACK OptPasswordsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
@@ -31,144 +29,144 @@ BOOL CALLBACK OptPasswordsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
 	HTREEITEM hitmGlobal, hitmMaster;
 	switch (msg)
 	{
-		case WM_INITDIALOG:
-		{
-			HIMAGELIST himg;
-			himg = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), (IsWinVerXPPlus()?ILC_COLOR32:ILC_COLOR16)|ILC_MASK, 3, 3);
-			icoidNoPassword = ImageList_AddIcon(himg, icons[ICO_NOPASSWORD].hIcon);
-			icoidPassword = ImageList_AddIcon(himg, icons[ICO_PASSWORD].hIcon);
-			SendDlgItemMessage(hwnd, IDC_LIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)himg);
+	case WM_INITDIALOG:
+	{
+		HIMAGELIST himg;
+		himg = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 3, 3);
+		icoidNoPassword = ImageList_AddIcon(himg, GetIcon(ICO_NOPASSWORD));
+		icoidPassword = ImageList_AddIcon(himg, GetIcon(ICO_PASSWORD));
+		SendDlgItemMessage(hwnd, IDC_LIST, CLM_SETEXTRAIMAGELIST, 0, (LPARAM)himg);
 
-			SendDlgItemMessage(hwnd,IDC_LIST,CLM_SETEXTRACOLUMNS,1,0);
+		SendDlgItemMessage(hwnd, IDC_LIST, CLM_SETEXTRACOLUMNS, 1, 0);
 
-			CLCINFOITEM cii={0};
-			cii.cbSize=sizeof(cii);
-			cii.flags=CLCIIF_GROUPFONT;
+		CLCINFOITEM cii = { 0 };
+		cii.cbSize = sizeof(cii);
+		cii.flags = CLCIIF_GROUPFONT;
 
-			cii.pszText=TranslateT("** Global **");
-			hitmGlobal = (HTREEITEM)SendDlgItemMessage(hwnd,IDC_LIST,CLM_ADDINFOITEM,0,(LPARAM)&cii);
-			SendMessage(GetDlgItem(hwnd, IDC_LIST),CLM_SETEXTRAIMAGE,(WPARAM)hitmGlobal,MAKELPARAM(0, icoidNoPassword));
+		cii.pszText = TranslateT("** Global **");
+		hitmGlobal = (HTREEITEM)SendDlgItemMessage(hwnd, IDC_LIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
+		SendMessage(GetDlgItem(hwnd, IDC_LIST), CLM_SETEXTRAIMAGE, (WPARAM)hitmGlobal, MAKELPARAM(0, icoidNoPassword));
 
-			cii.pszText=TranslateT("** Master **");
-			hitmMaster = (HTREEITEM)SendDlgItemMessage(hwnd,IDC_LIST,CLM_ADDINFOITEM,0,(LPARAM)&cii);
-			SendMessage(GetDlgItem(hwnd, IDC_LIST),CLM_SETEXTRAIMAGE,(WPARAM)hitmMaster,MAKELPARAM(0, icoidNoPassword));
+		cii.pszText = TranslateT("** Master **");
+		hitmMaster = (HTREEITEM)SendDlgItemMessage(hwnd, IDC_LIST, CLM_ADDINFOITEM, 0, (LPARAM)&cii);
+		SendMessage(GetDlgItem(hwnd, IDC_LIST), CLM_SETEXTRAIMAGE, (WPARAM)hitmMaster, MAKELPARAM(0, icoidNoPassword));
 
-			HWND hwndList = GetDlgItem(hwnd, IDC_LIST);
+		HWND hwndList = GetDlgItem(hwnd, IDC_LIST);
 
-			SetAllContactIcons(GetDlgItem(hwnd, IDC_LIST));
-			ResetListOptions(GetDlgItem(hwnd, IDC_LIST));
+		SetAllContactIcons(GetDlgItem(hwnd, IDC_LIST));
+		ResetListOptions(GetDlgItem(hwnd, IDC_LIST));
 
-			SendMessage(GetDlgItem(hwnd, IDC_ICO_NOPASSWORD), STM_SETICON, (WPARAM)icons[ICO_NOPASSWORD].hIcon, 0);
-			SendMessage(GetDlgItem(hwnd, IDC_ICO_PASSWORD), STM_SETICON, (WPARAM)icons[ICO_PASSWORD].hIcon, 0);
+		SendMessage(GetDlgItem(hwnd, IDC_ICO_NOPASSWORD), STM_SETICON, (WPARAM)GetIcon(ICO_NOPASSWORD), 0);
+		SendMessage(GetDlgItem(hwnd, IDC_ICO_PASSWORD), STM_SETICON, (WPARAM)GetIcon(ICO_PASSWORD), 0);
 
-			SendMessage(GetDlgItem(hwnd, IDC_SAVEPASSWORD),	 BUTTONSETASFLATBTN, 0, 0);
-			SendMessage(GetDlgItem(hwnd, IDC_SAVEPASSWORD),	 BUTTONADDTOOLTIP, (WPARAM)Translate("Save Password"), 0);
-			SendMessage(GetDlgItem(hwnd, IDC_SAVEPASSWORD),	 BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_SAVEPASS].hIcon);
+		SendMessage(GetDlgItem(hwnd, IDC_SAVEPASSWORD), BUTTONSETASFLATBTN, 0, 0);
+		SendMessage(GetDlgItem(hwnd, IDC_SAVEPASSWORD), BUTTONADDTOOLTIP, (WPARAM)Translate("Save Password"), 0);
+		SendMessage(GetDlgItem(hwnd, IDC_SAVEPASSWORD), BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_SAVEPASS));
 
-//			hVisibleIcon=ImageList_GetIcon(hIml,1,ILD_NORMAL);
-//			SendDlgItemMessage(hwndDlg,IDC_VISIBLEICON,STM_SETICON,(WPARAM)hVisibleIcon,0);
-//			hInvisibleIcon=ImageList_GetIcon(hIml,2,ILD_NORMAL);
-//			SendDlgItemMessage(hwndDlg,IDC_INVISIBLEICON,STM_SETICON,(WPARAM)hInvisibleIcon,0);
+		//			hVisibleIcon=ImageList_GetIcon(hIml,1,ILD_NORMAL);
+		//			SendDlgItemMessage(hwndDlg,IDC_VISIBLEICON,STM_SETICON,(WPARAM)hVisibleIcon,0);
+		//			hInvisibleIcon=ImageList_GetIcon(hIml,2,ILD_NORMAL);
+		//			SendDlgItemMessage(hwndDlg,IDC_INVISIBLEICON,STM_SETICON,(WPARAM)hInvisibleIcon,0);
 
-			return TRUE;
+		return TRUE;
+	}
+
+	case WM_NOTIFY:
+		switch (((LPNMHDR)lParam)->idFrom)
+		{
+		case 0:
+		{
+			switch (((LPNMHDR)lParam)->code)
+			{
+			case PSN_RESET:
+			{
+				return TRUE;
+			}
+
+			case PSN_APPLY:
+			{
+				return TRUE;
+			}
+			}
+			break;
 		}
 
-		case WM_NOTIFY:
-			switch(((LPNMHDR)lParam)->idFrom)
+		case IDC_LIST:
+		{
+			switch (((LPNMHDR)lParam)->code)
 			{
-				case 0:
-				{
-					switch (((LPNMHDR)lParam)->code) 
-					{
-						case PSN_RESET:
-						{
-							return TRUE;
-						}
-
-						case PSN_APPLY:
-						{
-							return TRUE;
-						}
-					}
-					break; 
-				} 
-
-				case IDC_LIST:
-				{
-					switch (((LPNMHDR)lParam)->code)
-					{
-						case CLN_NEWCONTACT:
-						case CLN_LISTREBUILT:
-							SetAllContactIcons(GetDlgItem(hwnd,IDC_LIST));
-							//fall through
+			case CLN_NEWCONTACT:
+			case CLN_LISTREBUILT:
+				SetAllContactIcons(GetDlgItem(hwnd, IDC_LIST));
+				//fall through
 //						case CLN_CONTACTMOVED:
 //							SetListGroupIcons(GetDlgItem(hwndDlg,IDC_LIST),(HANDLE)SendDlgItemMessage(hwndDlg,IDC_LIST,CLM_GETNEXTITEM,CLGN_ROOT,0),hItemAll,NULL);
 //							break;
 //						case CLN_OPTIONSCHANGED:
-							ResetListOptions(GetDlgItem(hwnd,IDC_LIST));
-							break;
-/*
-						case NM_CLICK:
-						{	HANDLE hItem;
-							NMCLISTCONTROL *nm=(NMCLISTCONTROL*)lParam;
-							DWORD hitFlags;
-							int iImage;
-							int itemType;
-
-							// Make sure we have an extra column
-							if (nm->iColumn == -1)
-								break;
-
-							// Find clicked item
-							hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nm->pt.x,nm->pt.y));
-							// Nothing was clicked
-							if (hItem == NULL) break; 
-							// It was not a visbility icon
-							if (!(hitFlags & CLCHT_ONITEMEXTRA)) break;
-
-							// Get image in clicked column (0=none, 1=visible, 2=invisible)
-							iImage = SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, 0));
-							if (iImage == 0)
-								iImage=nm->iColumn + 1;
-							else
-								if (iImage == 1 || iImage == 2)
-									iImage = 0;
-
-							// Get item type (contact, group, etc...)
-							itemType = SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETITEMTYPE, (WPARAM)hItem, 0);
-
-							// Update list, making sure that the options are mutually exclusive
-							if (itemType == CLCIT_CONTACT) { // A contact
-								SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, iImage));
-								if (iImage && SendDlgItemMessage(hwndDlg,IDC_LIST,CLM_GETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(nm->iColumn?0:1,0))!=0xFF)
-									SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn?0:1, 0));
-							}
-							else if (itemType == CLCIT_INFO) {	 // All Contacts
-								SetAllChildIcons(GetDlgItem(hwndDlg, IDC_LIST), hItem, nm->iColumn, iImage);
-								if (iImage)
-									SetAllChildIcons(GetDlgItem(hwndDlg, IDC_LIST), hItem, nm->iColumn?0:1, 0);
-							}
-							else if (itemType == CLCIT_GROUP) { // A group
-								hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem);
-								if (hItem) {
-									SetAllChildIcons(GetDlgItem(hwndDlg, IDC_LIST), hItem, nm->iColumn, iImage);
-									if (iImage)
-										SetAllChildIcons(GetDlgItem(hwndDlg, IDC_LIST), hItem, nm->iColumn?0:1, 0);
-								}
-							}
-							// Update the all/none icons
-							SetListGroupIcons(GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL);
-
-							// Activate Apply button
-							SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
-							break;
-						}
-*/
-					}
-					return TRUE;
-				}
+				ResetListOptions(GetDlgItem(hwnd, IDC_LIST));
+				break;
+				/*
+										case NM_CLICK:
+										{	HANDLE hItem;
+											NMCLISTCONTROL *nm=(NMCLISTCONTROL*)lParam;
+											DWORD hitFlags;
+											int iImage;
+											int itemType;
+
+											// Make sure we have an extra column
+											if (nm->iColumn == -1)
+												break;
+
+											// Find clicked item
+											hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_HITTEST, (WPARAM)&hitFlags, MAKELPARAM(nm->pt.x,nm->pt.y));
+											// Nothing was clicked
+											if (hItem == NULL) break;
+											// It was not a visbility icon
+											if (!(hitFlags & CLCHT_ONITEMEXTRA)) break;
+
+											// Get image in clicked column (0=none, 1=visible, 2=invisible)
+											iImage = SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, 0));
+											if (iImage == 0)
+												iImage=nm->iColumn + 1;
+											else
+												if (iImage == 1 || iImage == 2)
+													iImage = 0;
+
+											// Get item type (contact, group, etc...)
+											itemType = SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETITEMTYPE, (WPARAM)hItem, 0);
+
+											// Update list, making sure that the options are mutually exclusive
+											if (itemType == CLCIT_CONTACT) { // A contact
+												SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn, iImage));
+												if (iImage && SendDlgItemMessage(hwndDlg,IDC_LIST,CLM_GETEXTRAIMAGE,(WPARAM)hItem,MAKELPARAM(nm->iColumn?0:1,0))!=0xFF)
+													SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_SETEXTRAIMAGE, (WPARAM)hItem, MAKELPARAM(nm->iColumn?0:1, 0));
+											}
+											else if (itemType == CLCIT_INFO) {	 // All Contacts
+												SetAllChildIcons(GetDlgItem(hwndDlg, IDC_LIST), hItem, nm->iColumn, iImage);
+												if (iImage)
+													SetAllChildIcons(GetDlgItem(hwndDlg, IDC_LIST), hItem, nm->iColumn?0:1, 0);
+											}
+											else if (itemType == CLCIT_GROUP) { // A group
+												hItem = (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_CHILD, (LPARAM)hItem);
+												if (hItem) {
+													SetAllChildIcons(GetDlgItem(hwndDlg, IDC_LIST), hItem, nm->iColumn, iImage);
+													if (iImage)
+														SetAllChildIcons(GetDlgItem(hwndDlg, IDC_LIST), hItem, nm->iColumn?0:1, 0);
+												}
+											}
+											// Update the all/none icons
+											SetListGroupIcons(GetDlgItem(hwndDlg, IDC_LIST), (HANDLE)SendDlgItemMessage(hwndDlg, IDC_LIST, CLM_GETNEXTITEM, CLGN_ROOT, 0), hItemAll, NULL);
+
+											// Activate Apply button
+											SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+											break;
+										}
+				*/
 			}
-			break;
+			return TRUE;
+		}
+		}
+		break;
 	}
 	return FALSE;
 }
diff --git a/plugins/NewStory/src/options.cpp b/plugins/NewStory/src/options.cpp
index fb5283223a..c968da49e3 100644
--- a/plugins/NewStory/src/options.cpp
+++ b/plugins/NewStory/src/options.cpp
@@ -23,139 +23,138 @@ BOOL CALLBACK OptionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 static int OptionsInitialize(WPARAM wParam, LPARAM lParam)
 {
 	OPTIONSDIALOGPAGE odp = { 0 };
-	odp.cbSize = sizeof(odp);
 	odp.position = 100000000;
-	odp.hInstance = hInst;
 	odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS);
-	odp.pszTitle = Translate("Newstory");
-//	odp.pszGroup = Translate("PopUps");
-	odp.groupPosition = 910000000;
-	odp.flags=ODPF_BOLDGROUPS;
+	odp.szTitle.w = TranslateT("Newstory");
+	//	odp.pszGroup = Translate("PopUps");
+	odp.position = 910000000;
+	odp.flags = ODPF_BOLDGROUPS;
 	odp.pfnDlgProc = OptionsDlgProc;
-	CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp);
+	g_plugin.addOptions(wParam, &odp);
 	return 0;
 }
 
 static void ThemeDialogBackground(HWND hwnd) {
-	if (IsWinVerXPPlus()) {
+	//if (IsWinVerXPPlus())
+	{
 		static HMODULE hThemeAPI = NULL;
 		if (!hThemeAPI) hThemeAPI = GetModuleHandle(_T("uxtheme"));
 		if (hThemeAPI) {
-			HRESULT (STDAPICALLTYPE *MyEnableThemeDialogTexture)(HWND,DWORD) = (HRESULT (STDAPICALLTYPE*)(HWND,DWORD))GetProcAddress(hThemeAPI,"EnableThemeDialogTexture");
+			HRESULT(STDAPICALLTYPE *MyEnableThemeDialogTexture)(HWND, DWORD) = (HRESULT(STDAPICALLTYPE*)(HWND, DWORD))GetProcAddress(hThemeAPI, "EnableThemeDialogTexture");
 			if (MyEnableThemeDialogTexture)
-				MyEnableThemeDialogTexture(hwnd,0x00000002|0x00000004); //0x00000002|0x00000004=ETDT_ENABLETAB
+				MyEnableThemeDialogTexture(hwnd, 0x00000002 | 0x00000004); //0x00000002|0x00000004=ETDT_ENABLETAB
 		}
 	}
 }
 
-BOOL CALLBACK OptionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
-{ 
-	switch(msg)
+BOOL CALLBACK OptionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+	switch (msg)
 	{
-		case WM_INITDIALOG:
-		{
-			TCITEM tci;
-			RECT rc;
-
-			tci.mask = TCIF_PARAM|TCIF_TEXT;
-			tci.lParam = (LPARAM)CreateDialog(hInst,MAKEINTRESOURCE(IDD_OPT_PASSWORDS),GetDlgItem(hwnd, IDC_TAB),OptPasswordsDlgProc);
-			tci.pszText = TranslateT("Passwords (not ready yet)");
-			if (tci.lParam)	TabCtrl_InsertItem(GetDlgItem(hwnd,IDC_TAB),0,&tci);
-			GetClientRect(GetDlgItem(hwnd, IDC_TAB), &rc);
-			TabCtrl_AdjustRect(GetDlgItem(hwnd, IDC_TAB), FALSE, &rc);
-			ThemeDialogBackground((HWND)tci.lParam);
-			MoveWindow((HWND)tci.lParam, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE);
-			ShowWindow((HWND)tci.lParam,(OptShowPage==2)?SW_SHOW:SW_HIDE);
-
-			tci.mask = TCIF_PARAM|TCIF_TEXT;
-			tci.lParam = (LPARAM)CreateDialog(hInst,MAKEINTRESOURCE(IDD_OPT_TEMPLATES),GetDlgItem(hwnd, IDC_TAB),OptTemplatesDlgProc);
-			tci.pszText = TranslateT("Templates");
-			if (tci.lParam)	TabCtrl_InsertItem(GetDlgItem(hwnd,IDC_TAB),0,&tci);
-			GetClientRect(GetDlgItem(hwnd, IDC_TAB), &rc);
-			TabCtrl_AdjustRect(GetDlgItem(hwnd, IDC_TAB), FALSE, &rc);
-			ThemeDialogBackground((HWND)tci.lParam);
-			MoveWindow((HWND)tci.lParam, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE);
-			ShowWindow((HWND)tci.lParam,(OptShowPage==1)?SW_SHOW:SW_HIDE);
-
-			tci.mask = TCIF_PARAM|TCIF_TEXT;
-			tci.lParam = (LPARAM)CreateDialog(hInst,MAKEINTRESOURCE(IDD_OPT_GENERAL),GetDlgItem(hwnd, IDC_TAB), 0);
-			tci.pszText = TranslateT("General");
-			if (tci.lParam)	TabCtrl_InsertItem(GetDlgItem(hwnd,IDC_TAB),0,&tci);
-			GetClientRect(GetDlgItem(hwnd, IDC_TAB), &rc);
-			TabCtrl_AdjustRect(GetDlgItem(hwnd, IDC_TAB), FALSE, &rc);
-			ThemeDialogBackground((HWND)tci.lParam);
-			MoveWindow((HWND)tci.lParam, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE);
-			ShowWindow((HWND)tci.lParam,(OptShowPage==0)?SW_SHOW:SW_HIDE);
-
-			TabCtrl_SetCurSel(GetDlgItem(hwnd, IDC_TAB), OptShowPage);
-			OptShowPage = 0;
-			return FALSE;
-		} 
-
-		case PSM_CHANGED: 
-		{
-			SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0);
-			break;
-		}
+	case WM_INITDIALOG:
+	{
+		TCITEM tci;
+		RECT rc;
+
+		tci.mask = TCIF_PARAM | TCIF_TEXT;
+		tci.lParam = (LPARAM)CreateDialog(g_plugin.getInst(), MAKEINTRESOURCE(IDD_OPT_PASSWORDS), GetDlgItem(hwnd, IDC_TAB), OptPasswordsDlgProc);
+		tci.pszText = TranslateT("Passwords (not ready yet)");
+		if (tci.lParam)	TabCtrl_InsertItem(GetDlgItem(hwnd, IDC_TAB), 0, &tci);
+		GetClientRect(GetDlgItem(hwnd, IDC_TAB), &rc);
+		TabCtrl_AdjustRect(GetDlgItem(hwnd, IDC_TAB), FALSE, &rc);
+		ThemeDialogBackground((HWND)tci.lParam);
+		MoveWindow((HWND)tci.lParam, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
+		ShowWindow((HWND)tci.lParam, (OptShowPage == 2) ? SW_SHOW : SW_HIDE);
+
+		tci.mask = TCIF_PARAM | TCIF_TEXT;
+		tci.lParam = (LPARAM)CreateDialog(g_plugin.getInst(), MAKEINTRESOURCE(IDD_OPT_TEMPLATES), GetDlgItem(hwnd, IDC_TAB), OptTemplatesDlgProc);
+		tci.pszText = TranslateT("Templates");
+		if (tci.lParam)	TabCtrl_InsertItem(GetDlgItem(hwnd, IDC_TAB), 0, &tci);
+		GetClientRect(GetDlgItem(hwnd, IDC_TAB), &rc);
+		TabCtrl_AdjustRect(GetDlgItem(hwnd, IDC_TAB), FALSE, &rc);
+		ThemeDialogBackground((HWND)tci.lParam);
+		MoveWindow((HWND)tci.lParam, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
+		ShowWindow((HWND)tci.lParam, (OptShowPage == 1) ? SW_SHOW : SW_HIDE);
+
+		tci.mask = TCIF_PARAM | TCIF_TEXT;
+		tci.lParam = (LPARAM)CreateDialog(g_plugin.getInst(), MAKEINTRESOURCE(IDD_OPT_GENERAL), GetDlgItem(hwnd, IDC_TAB), 0);
+		tci.pszText = TranslateT("General");
+		if (tci.lParam)	TabCtrl_InsertItem(GetDlgItem(hwnd, IDC_TAB), 0, &tci);
+		GetClientRect(GetDlgItem(hwnd, IDC_TAB), &rc);
+		TabCtrl_AdjustRect(GetDlgItem(hwnd, IDC_TAB), FALSE, &rc);
+		ThemeDialogBackground((HWND)tci.lParam);
+		MoveWindow((HWND)tci.lParam, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
+		ShowWindow((HWND)tci.lParam, (OptShowPage == 0) ? SW_SHOW : SW_HIDE);
+
+		TabCtrl_SetCurSel(GetDlgItem(hwnd, IDC_TAB), OptShowPage);
+		OptShowPage = 0;
+		return FALSE;
+	}
 
-		case WM_DESTROY:
+	case PSM_CHANGED:
+	{
+		SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0);
+		break;
+	}
+
+	case WM_DESTROY:
+	{
+		OptShowPage = 0;
+		break;
+	}
+
+	case WM_NOTIFY:
+	{
+		switch (((LPNMHDR)lParam)->idFrom)
 		{
-			OptShowPage = 0;
+		case 0:
+		{
+			switch (((LPNMHDR)lParam)->code)
+			{
+			case PSN_RESET:
+			case PSN_APPLY:
+			{
+				TCITEM tci;
+				int i, count;
+				tci.mask = TCIF_PARAM;
+				count = TabCtrl_GetItemCount(GetDlgItem(hwnd, IDC_TAB));
+				for (i = 0; i < count; i++)
+				{
+					TabCtrl_GetItem(GetDlgItem(hwnd, IDC_TAB), i, &tci);
+					SendMessage((HWND)tci.lParam, WM_NOTIFY, wParam, lParam);
+				}
+				break;
+			}
+			}
 			break;
 		}
 
-		case WM_NOTIFY:
+		case IDC_TAB:
 		{
-			switch(((LPNMHDR)lParam)->idFrom)
-			{ 
-				case 0:
-				{
-					switch (((LPNMHDR)lParam)->code) 
-					{
-						case PSN_RESET:
-						case PSN_APPLY:
-						{ 
-							TCITEM tci; 
-							int i,count; 
-							tci.mask = TCIF_PARAM; 
-							count = TabCtrl_GetItemCount(GetDlgItem(hwnd,IDC_TAB)); 
-							for (i=0;i<count;i++) 
-							{ 
-								TabCtrl_GetItem(GetDlgItem(hwnd,IDC_TAB),i,&tci); 
-								SendMessage((HWND)tci.lParam,WM_NOTIFY,wParam,lParam); 
-							} 
-							break; 
-						}
-					} 
-					break; 
-				}
-				
-				case IDC_TAB:
-				{
-					switch (((LPNMHDR)lParam)->code)
-					{
-						case TCN_SELCHANGING:
-						{
-							TCITEM tci;
-							tci.mask = TCIF_PARAM;
-							TabCtrl_GetItem(GetDlgItem(hwnd,IDC_TAB),TabCtrl_GetCurSel(GetDlgItem(hwnd,IDC_TAB)),&tci);
-							ShowWindow((HWND)tci.lParam,SW_HIDE);
-							break;
-						}
-						case TCN_SELCHANGE:
-						{
-							TCITEM tci;
-							tci.mask = TCIF_PARAM;
-							TabCtrl_GetItem(GetDlgItem(hwnd,IDC_TAB),TabCtrl_GetCurSel(GetDlgItem(hwnd,IDC_TAB)),&tci);
-							ShowWindow((HWND)tci.lParam,SW_SHOW);
-							break;
-						}
-					}
-					break;
-				}
+			switch (((LPNMHDR)lParam)->code)
+			{
+			case TCN_SELCHANGING:
+			{
+				TCITEM tci;
+				tci.mask = TCIF_PARAM;
+				TabCtrl_GetItem(GetDlgItem(hwnd, IDC_TAB), TabCtrl_GetCurSel(GetDlgItem(hwnd, IDC_TAB)), &tci);
+				ShowWindow((HWND)tci.lParam, SW_HIDE);
+				break;
+			}
+			case TCN_SELCHANGE:
+			{
+				TCITEM tci;
+				tci.mask = TCIF_PARAM;
+				TabCtrl_GetItem(GetDlgItem(hwnd, IDC_TAB), TabCtrl_GetCurSel(GetDlgItem(hwnd, IDC_TAB)), &tci);
+				ShowWindow((HWND)tci.lParam, SW_SHOW);
+				break;
+			}
 			}
 			break;
 		}
+		}
+		break;
+	}
 	}
 	return FALSE;
-} 
+}
diff --git a/plugins/NewStory/src/password.cpp b/plugins/NewStory/src/password.cpp
index bd49cbf653..0924037c69 100644
--- a/plugins/NewStory/src/password.cpp
+++ b/plugins/NewStory/src/password.cpp
@@ -2,83 +2,67 @@
 
 struct PasswordData
 {
-	HANDLE hContact;
+	MCONTACT hContact;
 	int attempt;
 };
 
-bool CheckPassword(HANDLE hContact, char *password)
+bool CheckPassword(MCONTACT hContact, char *password)
 {
-	md5_state_t ms;
-	md5_byte_t digest[16];
-	md5_init(&ms);
-	md5_append(&ms, (const unsigned char *)password, lstrlenA(password));
-	md5_finish(&ms, digest);
+	mir_md5_state_t ms;
+	BYTE digest[16];
+	mir_md5_init(&ms);
+	mir_md5_append(&ms, (const unsigned char *)password, lstrlenA(password));
+	mir_md5_finish(&ms, digest);
 
 	DBVARIANT dbv;
-	DBCONTACTGETSETTING dbcgs;
-	dbcgs.szModule = MODULENAME;
-	dbcgs.szSetting = "password";
-	dbcgs.pValue = &dbv;
-	CallService(MS_DB_CONTACT_GETSETTING, (WPARAM)hContact, (LPARAM)&dbcgs);
-	if (dbv.type != DBVT_BLOB)
-	{
-		CallService(MS_DB_CONTACT_FREEVARIANT, 0, (LPARAM)&dbv);
+	db_get(hContact, MODULENAME, "password", &dbv);
+	if (dbv.type != DBVT_BLOB) {
+		db_free(&dbv);
 		return true;
-	} else
-	{
-		if (dbv.cpbVal != 16)
-		{
-			CallService(MS_DB_CONTACT_FREEVARIANT, 0, (LPARAM)&dbv);
+	}
+	else {
+		if (dbv.cpbVal != 16) {
+			db_free(&dbv);
 			return false;
 		}
-		for (int i = 0; i < 16; i++)
-			if (dbv.pbVal[i] != digest[i])
-			{
-				CallService(MS_DB_CONTACT_FREEVARIANT, 0, (LPARAM)&dbv);
+		for (int i = 0; i < 16; i++) {
+			if (dbv.pbVal[i] != digest[i]) {
+				db_free(&dbv);
 				return false;
 			}
+		}
 	
-		CallService(MS_DB_CONTACT_FREEVARIANT, 0, (LPARAM)&dbv);
+		db_free(&dbv);
 		return true;
 	}
 }
 
-void SetPassword(HANDLE hContact, char *password)
+void SetPassword(MCONTACT hContact, char *password)
 {
-	if (!password || !*password)
-	{
-		DBCONTACTGETSETTING dbcgs;
-		dbcgs.szModule = MODULENAME;
-		dbcgs.szSetting = "password";
-		CallService(MS_DB_CONTACT_DELETESETTING, (WPARAM)hContact, (LPARAM)&dbcgs);
+	if (!password || !*password) {
+		db_unset(hContact, MODULENAME, "password");
 		return;
 	}
 
-	md5_state_t ms;
-	md5_byte_t digest[16];
-	md5_init(&ms);
-	md5_append(&ms, (const unsigned char *)password, lstrlenA(password));
-	md5_finish(&ms, digest);
+	mir_md5_state_t ms;
+	BYTE digest[16];
+	mir_md5_init(&ms);
+	mir_md5_append(&ms, (const unsigned char *)password, lstrlenA(password));
+	mir_md5_finish(&ms, digest);
 
-	DBCONTACTWRITESETTING dbcws;
-	dbcws.szModule = MODULENAME;
-	dbcws.szSetting = "password";
-	dbcws.value.type = DBVT_BLOB;
-	dbcws.value.cpbVal = 16;
-	dbcws.value.pbVal = (PBYTE)digest;
-	CallService(MS_DB_CONTACT_WRITESETTING, (WPARAM)hContact, (LPARAM)&dbcws);
+	db_set_blob(hContact, MODULENAME, "password", (PBYTE)digest, 16);
 }
 
 int CALLBACK PasswordDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
 	PasswordData *data = (PasswordData *)GetWindowLong(hwnd, GWL_USERDATA);
-	switch (msg)
+	switch (msg) 
 	{
 		case WM_INITDIALOG:
 		{
 			data = new PasswordData;
 			data->attempt = 0;
-			data->hContact = (HANDLE)lParam;
+			data->hContact = (MCONTACT)lParam;
 			SetWindowLong(hwnd, GWL_USERDATA, (LONG)data);
 
 			RECT rc, rcMe;
@@ -148,22 +132,17 @@ int CALLBACK PasswordDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 	return FALSE;
 }
 
-bool AskPassword(HANDLE hContact)
+bool AskPassword(MCONTACT hContact)
 {
 	DBVARIANT dbv;
-	DBCONTACTGETSETTING dbcgs;
-	dbcgs.szModule = MODULENAME;
-	dbcgs.szSetting = "password";
-	dbcgs.pValue = &dbv;
-	CallService(MS_DB_CONTACT_GETSETTING, (WPARAM)hContact, (LPARAM)&dbcgs);
-	if (dbv.type != DBVT_BLOB)
-	{
-		CallService(MS_DB_CONTACT_FREEVARIANT, 0, (LPARAM)&dbv);
+	db_get(hContact, MODULENAME, "password", &dbv);
+	if (dbv.type != DBVT_BLOB) {
+		db_free(&dbv);
 		return true;
 	}
-	CallService(MS_DB_CONTACT_FREEVARIANT, 0, (LPARAM)&dbv);
+	db_free(&dbv);
 	
-	if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PASSWORD), 0, PasswordDlgProc, (LPARAM)hContact))
+	if (DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_PASSWORD), 0, PasswordDlgProc, (LPARAM)hContact))
 		return true;
 	return false;
 }
@@ -171,12 +150,12 @@ bool AskPassword(HANDLE hContact)
 
 int CALLBACK ChangePasswordDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
-	HANDLE hContact = (HANDLE)GetWindowLong(hwnd, GWL_USERDATA);
+	MCONTACT hContact = (MCONTACT)GetWindowLong(hwnd, GWL_USERDATA);
 	switch (msg)
 	{
 		case WM_INITDIALOG:
 		{
-			hContact = (HANDLE)lParam;
+			hContact = (MCONTACT)lParam;
 			SetWindowLong(hwnd, GWL_USERDATA, (LONG)hContact);
 
 //			RECT rc, rcMe;
@@ -254,5 +233,5 @@ int CALLBACK ChangePasswordDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP
 
 void ChangePassword(HWND hwnd, HANDLE hContact)
 {
-	DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_CHANGEPASSWORD), hwnd, ChangePasswordDlgProc, (LPARAM)hContact);
+	DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_CHANGEPASSWORD), hwnd, ChangePasswordDlgProc, (LPARAM)hContact);
 }
diff --git a/plugins/NewStory/src/password.h b/plugins/NewStory/src/password.h
index 592cf137ec..60dfc1b3df 100644
--- a/plugins/NewStory/src/password.h
+++ b/plugins/NewStory/src/password.h
@@ -1,8 +1,8 @@
 #ifndef __password_h__
 #define __password_h__
 
-bool CheckPassword(HANDLE hContact, char *password);
-bool AskPassword(HANDLE hContact);
-void ChangePassword(HWND hwnd, HANDLE hContact);
+bool CheckPassword(MCONTACT hContact, char *password);
+bool AskPassword(MCONTACT hContact);
+void ChangePassword(HWND hwnd, MCONTACT hContact);
 
 #endif // __password_h__
\ No newline at end of file
diff --git a/plugins/NewStory/src/stdafx.h b/plugins/NewStory/src/stdafx.h
index c5e790b543..b9e774aa86 100644
--- a/plugins/NewStory/src/stdafx.h
+++ b/plugins/NewStory/src/stdafx.h
@@ -48,6 +48,7 @@ Boston, MA 02111-1307, USA.
 #include "m_userinfo.h"
 #include "m_icolib.h"
 #include "m_fontservice.h"
+#include "m_text.h"
 
 #include "m_smileyadd.h"
 //#include "m_nconvers.h"
diff --git a/plugins/NewStory/src/templates.cpp b/plugins/NewStory/src/templates.cpp
index 461bbce7fb..199b009458 100644
--- a/plugins/NewStory/src/templates.cpp
+++ b/plugins/NewStory/src/templates.cpp
@@ -19,7 +19,7 @@ void vfAdded(int mode, TemplateVars *vars, MCONTACT hContact, HistoryArray::Item
 void vfDeleted(int mode, TemplateVars *vars, MCONTACT hContact, HistoryArray::ItemData *item);
 void vfOther(int mode, TemplateVars *vars, MCONTACT hContact, HistoryArray::ItemData *item);
 
-TemplateInfo templates[TPL_COUNT] = 
+TemplateInfo templates[TPL_COUNT] =
 {
 	{ "tpl/interface/title", _T("Interface"), ICO_NEWSTORY, _T("Window Title"),
 		_T("%N's Newstory [%c messages total]"), 0, 0,
@@ -85,14 +85,15 @@ void LoadTemplates()
 {
 	for (int i = 0; i < TPL_COUNT; i++)
 	{
-		DBVARIANT dbv = {0};
+		DBVARIANT dbv = { 0 };
 		db_get_ws(0, MODULENAME, templates[i].setting, &dbv);
 		if (templates[i].value)
 			free(templates[i].value);
 		if (dbv.pwszVal)
 		{
 			templates[i].value = _tcsdup(dbv.pwszVal);
-		} else
+		}
+		else
 		{
 			templates[i].value = 0;
 		}
@@ -123,20 +124,21 @@ TCHAR *TplFormatStringEx(int tpl, TCHAR *sztpl, MCONTACT hContact, HistoryArray:
 		if (templates[tpl].vf[i])
 			templates[tpl].vf[i](VFM_VARS, &vars, hContact, item);
 
-	TCHAR *buf = (TCHAR *)malloc(sizeof(TCHAR)*(TplMeasureVars(&vars, sztpl)+1));
+	TCHAR *buf = (TCHAR *)malloc(sizeof(TCHAR)*(TplMeasureVars(&vars, sztpl) + 1));
 	TCHAR *bufptr = buf;
 	for (TCHAR *p = sztpl; *p; p++)
 	{
 		if (*p == '%')
 		{
-			TCHAR *var = TplGetVar(&vars, (char)(p[1]&0xff));
+			TCHAR *var = TplGetVar(&vars, (char)(p[1] & 0xff));
 			if (var)
 			{
 				lstrcpy(bufptr, var);
 				bufptr += lstrlen(var);
 			}
 			p++;
-		} else
+		}
+		else
 		{
 			*bufptr++ = *p;
 		}
@@ -164,20 +166,21 @@ TCHAR *TplFormatString(int tpl, MCONTACT hContact, HistoryArray::ItemData *item)
 		if (templates[tpl].vf[i])
 			templates[tpl].vf[i](VFM_VARS, &vars, hContact, item);
 
-	TCHAR *buf = (TCHAR *)malloc(sizeof(TCHAR)*(TplMeasureVars(&vars, templates[tpl].value)+1));
+	TCHAR *buf = (TCHAR *)malloc(sizeof(TCHAR)*(TplMeasureVars(&vars, templates[tpl].value) + 1));
 	TCHAR *bufptr = buf;
 	for (TCHAR *p = templates[tpl].value; *p; p++)
 	{
 		if (*p == '%')
 		{
-			TCHAR *var = TplGetVar(&vars, (char)(p[1]&0xff));
+			TCHAR *var = TplGetVar(&vars, (char)(p[1] & 0xff));
 			if (var)
 			{
 				lstrcpy(bufptr, var);
 				bufptr += lstrlen(var);
 			}
 			p++;
-		} else
+		}
+		else
 		{
 			*bufptr++ = *p;
 		}
@@ -189,7 +192,7 @@ TCHAR *TplFormatString(int tpl, MCONTACT hContact, HistoryArray::ItemData *item)
 // Variable management
 void TplInitVars(TemplateVars *vars)
 {
-	for(int i = 0; i < 256; i++)
+	for (int i = 0; i < 256; i++)
 	{
 		vars->val[i] = 0;
 		vars->del[i] = false;
@@ -198,7 +201,7 @@ void TplInitVars(TemplateVars *vars)
 
 void TplCleanVars(TemplateVars *vars)
 {
-	for(int i = 0; i < 256; i++)
+	for (int i = 0; i < 256; i++)
 		if (vars->val[i] && vars->del[i])
 		{
 			free(vars->val[i]);
@@ -227,10 +230,11 @@ int TplMeasureVars(TemplateVars *vars, TCHAR *str)
 	{
 		if (*p == '%')
 		{
-			TCHAR *var = TplGetVar(vars, (char)(p[1]&0xff));
+			TCHAR *var = TplGetVar(vars, (char)(p[1] & 0xff));
 			if (var) res += lstrlen(var);
 			p++;
-		} else
+		}
+		else
 		{
 			res++;
 		}
@@ -241,24 +245,24 @@ int TplMeasureVars(TemplateVars *vars, TCHAR *str)
 // Loading variables
 void vfGlobal(int mode, TemplateVars *vars, HANDLE hContact, HistoryArray::ItemData *item)
 {
-//  %%: simply % character
+	//  %%: simply % character
 	TplSetVar(vars, '%', _T("%"), false);
 
-//  %n: line break
+	//  %n: line break
 	TplSetVar(vars, 'n', _T("\x0d\x0a"), false);
 
-// %M: my nick (not for messages)
+	// %M: my nick (not for messages)
 	wchar_t *buf = Clist_GetContactDisplayName(0, 0);
 	TplSetVar(vars, 'M', buf, false);
 }
 
 void vfContact(int mode, TemplateVars *vars, MCONTACT hContact, HistoryArray::ItemData *item)
 {
-// %N: buddy's nick (not for messages)
+	// %N: buddy's nick (not for messages)
 	wchar_t *buff = Clist_GetContactDisplayName(hContact, 0);
 	TplSetVar(vars, 'N', buff, false);
 
-// %c: event count
+	// %c: event count
 	TCHAR *buf = new TCHAR[20];
 	wsprintf(buf, _T("%d"), db_event_count(hContact));
 	TplSetVar(vars, 'c', buf, false);
@@ -266,10 +270,10 @@ void vfContact(int mode, TemplateVars *vars, MCONTACT hContact, HistoryArray::It
 
 void vfSystem(int mode, TemplateVars *vars, MCONTACT hContact, HistoryArray::ItemData *item)
 {
-// %N: buddy's nick (not for messages)
+	// %N: buddy's nick (not for messages)
 	TplSetVar(vars, 'N', /*TranslateTS*/_T("System Event"), false);
 
-// %c: event count
+	// %c: event count
 	TCHAR *buf = new TCHAR[20];
 	wsprintf(buf, _T("%d"), db_event_count(hContact));
 	TplSetVar(vars, 'c', buf, false);
@@ -280,119 +284,121 @@ void vfEvent(int mode, TemplateVars *vars, MCONTACT hContact, HistoryArray::Item
 	HICON hIcon;
 	TCHAR *s;
 
-//  %U: UIN (contextual, own uin for sent, buddys UIN for received messages)
+	//  %U: UIN (contextual, own uin for sent, buddys UIN for received messages)
 
-//  %N: Nickname
+	//  %N: Nickname
 	wchar_t *buff = Clist_GetContactDisplayName(item->dbe.flags&DBEF_SENT ? 0 : (WPARAM)item->hContact, 0);
 	TplSetVar(vars, 'N', buff, false);
 
-//  %I: Icon
+	//  %I: Icon
 	switch (item->dbe.eventType)
 	{
-		case EVENTTYPE_MESSAGE:
-			hIcon = icons[ICO_SENDMSG].hIcon;
-			break;
-		case EVENTTYPE_FILE:
-			hIcon = icons[ICO_FILE].hIcon;
-			break;
-		case EVENTTYPE_URL:
-			hIcon = icons[ICO_URL].hIcon;
-			break;
-		case EVENTTYPE_STATUSCHANGE:
-			hIcon = icons[ICO_SIGNIN].hIcon;
-			break;
-		default:
-			hIcon = icons[ICO_UNKNOWN].hIcon;
-			break;
+	case EVENTTYPE_MESSAGE:
+		hIcon = GetIcon(ICO_SENDMSG);
+		break;
+	case EVENTTYPE_FILE:
+		hIcon = GetIcon(ICO_FILE);
+		break;
+	case EVENTTYPE_URL:
+		hIcon = GetIcon(ICO_URL);
+		break;
+	case EVENTTYPE_STATUSCHANGE:
+		hIcon = GetIcon(ICO_SIGNIN);
+		break;
+	default:
+		hIcon = GetIcon(ICO_UNKNOWN);
+		break;
 	}
-	s = (TCHAR *)calloc(64,sizeof(TCHAR));
+	s = (TCHAR *)calloc(64, sizeof(TCHAR));
 	wsprintf(s, _T("[$hicon=%d$]"), hIcon);
 	TplSetVar(vars, 'I', s, true);
 
-//  %i: Direction icon
+	//  %i: Direction icon
 	if (item->dbe.flags & DBEF_SENT)
 	{
-		hIcon = icons[ICO_MSGOUT].hIcon;
-	} else
+		hIcon = GetIcon(ICO_MSGOUT);
+	}
+	else
 	{
-		hIcon = icons[ICO_MSGIN].hIcon;
+		hIcon = GetIcon(ICO_MSGIN);
 	}
-	s = (TCHAR *)calloc(64,sizeof(TCHAR));
+	s = (TCHAR *)calloc(64, sizeof(TCHAR));
 	wsprintf(s, _T("[$hicon=%d$]"), hIcon);
 	TplSetVar(vars, 'i', s, true);
 
-// %D: direction symbol
+	// %D: direction symbol
 	if (item->dbe.flags & DBEF_SENT)
 	{
 		TplSetVar(vars, 'D', _T("<<"), false);
-	} else
+	}
+	else
 	{
 		TplSetVar(vars, 'D', _T(">>"), false);
 	}
 
-//  %t: timestamp
+	//  %t: timestamp
 	TCHAR *buf = (TCHAR *)calloc(100, sizeof(TCHAR));
 	_tcsftime(buf, 100, _T("%d.%m.%Y, %H:%M"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 't', buf, true);
 
-//	DBTIMETOSTRING tts;
-//	tts.cbDest = 100;
-//	tts.szFormat = "d, t";
-//	tts.szDest = (char *)calloc(100, 1);
-//	CallService(MS_DB_TIME_TIMESTAMPTOSTRING, item->dbe.timestamp, (LPARAM)&tts);
-//	TplSetVar(vars, 't', tts.szDest, true);
+	//	DBTIMETOSTRING tts;
+	//	tts.cbDest = 100;
+	//	tts.szFormat = "d, t";
+	//	tts.szDest = (char *)calloc(100, 1);
+	//	CallService(MS_DB_TIME_TIMESTAMPTOSTRING, item->dbe.timestamp, (LPARAM)&tts);
+	//	TplSetVar(vars, 't', tts.szDest, true);
 
-//	tts.szFormat = "";
-//	tts.szDest = (char *)calloc(100, 1);
-//	CallService(MS_DB_TIME_TIMESTAMPTOSTRING, item->dbe.timestamp, (LPARAM)&tts);
-//	TplSetVar(vars, 't', tts.szDest, true);
+	//	tts.szFormat = "";
+	//	tts.szDest = (char *)calloc(100, 1);
+	//	CallService(MS_DB_TIME_TIMESTAMPTOSTRING, item->dbe.timestamp, (LPARAM)&tts);
+	//	TplSetVar(vars, 't', tts.szDest, true);
 
-//  %h: hour (24 hour format, 0-23)
+	//  %h: hour (24 hour format, 0-23)
 	buf = (TCHAR *)calloc(5, sizeof(TCHAR));
 	_tcsftime(buf, 5, _T("%H"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 'h', buf, true);
 
-//  %a: hour (12 hour format)
+	//  %a: hour (12 hour format)
 	buf = (TCHAR *)calloc(5, sizeof(TCHAR));
 	_tcsftime(buf, 5, _T("%h"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 'a', buf, true);
 
-//  %m: minute
+	//  %m: minute
 	buf = (TCHAR *)calloc(5, sizeof(TCHAR));
 	_tcsftime(buf, 5, _T("%M"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 'm', buf, true);
 
-//  %s: second
+	//  %s: second
 	buf = (TCHAR *)calloc(5, sizeof(TCHAR));
 	_tcsftime(buf, 5, _T("%S"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 's', buf, true);
 
-//  %o: month
+	//  %o: month
 	buf = (TCHAR *)calloc(5, sizeof(TCHAR));
 	_tcsftime(buf, 5, _T("%m"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 'o', buf, true);
 
-//  %d: day of month
+	//  %d: day of month
 	buf = (TCHAR *)calloc(5, sizeof(TCHAR));
 	_tcsftime(buf, 5, _T("%d"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 'd', buf, true);
 
-//  %y: year
+	//  %y: year
 	buf = (TCHAR *)calloc(5, sizeof(TCHAR));
 	_tcsftime(buf, 5, _T("%Y"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 'y', buf, true);
 
-//  %w: day of week (Sunday, Monday.. translateable)
+	//  %w: day of week (Sunday, Monday.. translateable)
 	buf = (TCHAR *)calloc(25, sizeof(TCHAR));
 	_tcsftime(buf, 25, _T("%A"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 'w', TranslateW(buf), false);
 
-//  %p: AM/PM symbol
+	//  %p: AM/PM symbol
 	buf = (TCHAR *)calloc(5, sizeof(TCHAR));
 	_tcsftime(buf, 5, _T("%p"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 'p', buf, true);
 
-//  %O: Name of month, translateable
+	//  %O: Name of month, translateable
 	buf = (TCHAR *)calloc(25, sizeof(TCHAR));
 	_tcsftime(buf, 25, _T("%B"), localtime((time_t *)&item->dbe.timestamp));
 	TplSetVar(vars, 'O', TranslateW(buf), false);
@@ -400,54 +406,54 @@ void vfEvent(int mode, TemplateVars *vars, MCONTACT hContact, HistoryArray::Item
 
 void vfMessage(int mode, TemplateVars *vars, HANDLE hContact, HistoryArray::ItemData *item)
 {
-//  %M: the message string itself
+	//  %M: the message string itself
 	TplSetVar(vars, 'M', item->getTBuf(), false);
 }
 
 void vfFile(int mode, TemplateVars *vars, HANDLE hContact, HistoryArray::ItemData *item)
 {
-//  %M: the message string itself
+	//  %M: the message string itself
 	TplSetVar(vars, 'M', item->getTBuf(), false);
-//	TplSetVar(vars, 'M', _T("File event"), false);
+	//	TplSetVar(vars, 'M', _T("File event"), false);
 }
 
 void vfUrl(int mode, TemplateVars *vars, HANDLE hContact, HistoryArray::ItemData *item)
 {
-//  %M: the message string itself
+	//  %M: the message string itself
 	TplSetVar(vars, 'M', item->getTBuf(), false);
-//	TplSetVar(vars, 'M', _T("URL Event"), false);
+	//	TplSetVar(vars, 'M', _T("URL Event"), false);
 }
 
 void vfSign(int mode, TemplateVars *vars, HANDLE hContact, HistoryArray::ItemData *item)
 {
-//  %M: the message string itself
+	//  %M: the message string itself
 	TplSetVar(vars, 'M', item->getTBuf(), false);
 }
 
 void vfAuth(int mode, TemplateVars *vars, HANDLE hContact, HistoryArray::ItemData *item)
 {
-//  %M: the message string itself
+	//  %M: the message string itself
 	TplSetVar(vars, 'M', item->getTBuf(), false);
-//	TplSetVar(vars, 'M', _T("Auth Rq"), false);
+	//	TplSetVar(vars, 'M', _T("Auth Rq"), false);
 }
 
 void vfAdded(int mode, TemplateVars *vars, HANDLE hContact, HistoryArray::ItemData *item)
 {
-//  %M: the message string itself
+	//  %M: the message string itself
 	TplSetVar(vars, 'M', item->getTBuf(), false);
-//	TplSetVar(vars, 'M', _T("Added"), false);
+	//	TplSetVar(vars, 'M', _T("Added"), false);
 }
 
 void vfDeleted(int mode, TemplateVars *vars, HANDLE hContact, HistoryArray::ItemData *item)
 {
-//  %M: the message string itself
+	//  %M: the message string itself
 	TplSetVar(vars, 'M', item->getTBuf(), false);
-//	TplSetVar(vars, 'M', _T("Deleted"), false);
+	//	TplSetVar(vars, 'M', _T("Deleted"), false);
 }
 
 void vfOther(int mode, TemplateVars *vars, HANDLE hContact, HistoryArray::ItemData *item)
 {
-//  %M: the message string itself
+	//  %M: the message string itself
 	TplSetVar(vars, 'M', _T("Unknown Event"), false);
 }
 
@@ -458,257 +464,262 @@ BOOL CALLBACK OptTemplatesDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
 	static int CurrentTemplate;
 	switch (msg)
 	{
-		case WM_INITDIALOG:
-		{
-			CurrentTemplate = -1;
+	case WM_INITDIALOG:
+	{
+		CurrentTemplate = -1;
 
-			HTREEITEM hGroup = 0;
-			HTREEITEM hFirst = 0;
+		HTREEITEM hGroup = 0;
+		HTREEITEM hFirst = 0;
 
-			HIMAGELIST himgTree = ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK,1,1);
-			TreeView_SetImageList(GetDlgItem(hwnd, IDC_TEMPLATES), himgTree, TVSIL_NORMAL);
+		HIMAGELIST himgTree = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 1, 1);
+		TreeView_SetImageList(GetDlgItem(hwnd, IDC_TEMPLATES), himgTree, TVSIL_NORMAL);
 
-			ImageList_AddIcon(himgTree, icons[ICO_TPLGROUP].hIcon);
+		ImageList_AddIcon(himgTree, GetIcon(ICO_TPLGROUP));
 
-			for (int i = 0; i < TPL_COUNT; i++)
+		for (int i = 0; i < TPL_COUNT; i++)
+		{
+			if (!i || lstrcmp(templates[i].group, templates[i - 1].group))
 			{
-				if (!i || lstrcmp(templates[i].group, templates[i-1].group))
-				{
-					if (hGroup)
-						TreeView_Expand(GetDlgItem(hwnd, IDC_TEMPLATES), hGroup, TVE_EXPAND);
-
-					TVINSERTSTRUCT tvis;
-					tvis.hParent = 0;
-					tvis.hInsertAfter = TVI_LAST;
-					tvis.item.mask = TVIF_TEXT|TVIF_STATE|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-					tvis.item.state = tvis.item.stateMask = TVIS_BOLD;
-					tvis.item.iSelectedImage = tvis.item.iImage = 0;
-					tvis.item.pszText = templates[i].group;
-					tvis.item.lParam = -1;
-					hGroup = TreeView_InsertItem(GetDlgItem(hwnd, IDC_TEMPLATES), &tvis);
-
-					if (!hFirst) hFirst = hGroup;
-				}
+				if (hGroup)
+					TreeView_Expand(GetDlgItem(hwnd, IDC_TEMPLATES), hGroup, TVE_EXPAND);
 
 				TVINSERTSTRUCT tvis;
-				tvis.hParent = hGroup;
+				tvis.hParent = 0;
 				tvis.hInsertAfter = TVI_LAST;
-				tvis.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-				tvis.item.pszText = templates[i].title;
-				tvis.item.iSelectedImage = tvis.item.iImage =
-					ImageList_AddIcon(himgTree, icons[templates[i].icon].hIcon);
-				tvis.item.lParam = i;
-				TreeView_InsertItem(GetDlgItem(hwnd, IDC_TEMPLATES), &tvis);
+				tvis.item.mask = TVIF_TEXT | TVIF_STATE | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
+				tvis.item.state = tvis.item.stateMask = TVIS_BOLD;
+				tvis.item.iSelectedImage = tvis.item.iImage = 0;
+				tvis.item.pszText = templates[i].group;
+				tvis.item.lParam = -1;
+				hGroup = TreeView_InsertItem(GetDlgItem(hwnd, IDC_TEMPLATES), &tvis);
+
+				if (!hFirst) hFirst = hGroup;
 			}
 
-			if (hGroup)
-				TreeView_Expand(GetDlgItem(hwnd, IDC_TEMPLATES), hGroup, TVE_EXPAND);
+			TVINSERTSTRUCT tvis;
+			tvis.hParent = hGroup;
+			tvis.hInsertAfter = TVI_LAST;
+			tvis.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
+			tvis.item.pszText = templates[i].title;
+			tvis.item.iSelectedImage = tvis.item.iImage =
+				ImageList_AddIcon(himgTree, GetIcon(templates[i].icon));
+			tvis.item.lParam = i;
+			TreeView_InsertItem(GetDlgItem(hwnd, IDC_TEMPLATES), &tvis);
+		}
 
-			TreeView_SelectItem(GetDlgItem(hwnd, IDC_TEMPLATES), hFirst);
-			TreeView_EnsureVisible(GetDlgItem(hwnd, IDC_TEMPLATES), hFirst);
+		if (hGroup)
+			TreeView_Expand(GetDlgItem(hwnd, IDC_TEMPLATES), hGroup, TVE_EXPAND);
 
-			SendMessage(GetDlgItem(hwnd, IDC_DISCARD),       BUTTONSETASFLATBTN, 0, 0);
-			SendMessage(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), BUTTONSETASFLATBTN, 0, 0);
-			SendMessage(GetDlgItem(hwnd, IDC_VARHELP),       BUTTONSETASFLATBTN, 0, 0);
+		TreeView_SelectItem(GetDlgItem(hwnd, IDC_TEMPLATES), hFirst);
+		TreeView_EnsureVisible(GetDlgItem(hwnd, IDC_TEMPLATES), hFirst);
 
-			SendMessage(GetDlgItem(hwnd, IDC_DISCARD),       BUTTONADDTOOLTIP, (WPARAM)Translate("Cancel Edit"), 0);
-			SendMessage(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), BUTTONADDTOOLTIP, (WPARAM)Translate("Update Preview"), 0);
-			SendMessage(GetDlgItem(hwnd, IDC_VARHELP),       BUTTONADDTOOLTIP, (WPARAM)Translate("Help on Variables"), 0);
+		SendMessage(GetDlgItem(hwnd, IDC_DISCARD), BUTTONSETASFLATBTN, 0, 0);
+		SendMessage(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), BUTTONSETASFLATBTN, 0, 0);
+		SendMessage(GetDlgItem(hwnd, IDC_VARHELP), BUTTONSETASFLATBTN, 0, 0);
 
-			SendMessage(GetDlgItem(hwnd, IDC_DISCARD),       BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_RESET].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_PREVIEW].hIcon);
-			SendMessage(GetDlgItem(hwnd, IDC_VARHELP),       BM_SETIMAGE, IMAGE_ICON, (LPARAM)icons[ICO_VARHELP].hIcon);
+		SendMessage(GetDlgItem(hwnd, IDC_DISCARD), BUTTONADDTOOLTIP, (WPARAM)Translate("Cancel Edit"), 0);
+		SendMessage(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), BUTTONADDTOOLTIP, (WPARAM)Translate("Update Preview"), 0);
+		SendMessage(GetDlgItem(hwnd, IDC_VARHELP), BUTTONADDTOOLTIP, (WPARAM)Translate("Help on Variables"), 0);
+
+		SendMessage(GetDlgItem(hwnd, IDC_DISCARD), BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_RESET));
+		SendMessage(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_PREVIEW));
+		SendMessage(GetDlgItem(hwnd, IDC_VARHELP), BM_SETIMAGE, IMAGE_ICON, (LPARAM)GetIcon(ICO_VARHELP));
+
+		return TRUE;
+	}
+
+	case WM_COMMAND:
+		switch (LOWORD(wParam))
+		{
+		case IDC_EDITTEMPLATE:
+		{
+			SendMessage(GetParent(GetParent(hwnd)), PSM_CHANGED, 0, 0);
+		}
 
-			return TRUE;
+		case IDC_UPDATEPREVIEW:
+		{
+			if (templates[CurrentTemplate].tmpValue)
+				free(templates[CurrentTemplate].tmpValue);
+			int length = GetWindowTextLength(GetDlgItem(hwnd, IDC_EDITTEMPLATE)) + 1;
+			templates[CurrentTemplate].tmpValue = (TCHAR *)malloc(length * sizeof(TCHAR));
+			GetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].tmpValue, length);
+
+			HistoryArray::ItemData item;
+			item.hContact = db_find_first();
+			while (item.hContact && !item.hEvent)
+			{
+				item.hEvent = db_event_first(item.hContact);
+				if (!item.hEvent)
+					item.hContact = db_find_next(item.hContact);
+			}
+			if (item.hContact && item.hEvent)
+			{
+				item.load(ELM_DATA);
+				TCHAR *preview = TplFormatStringEx(CurrentTemplate, templates[CurrentTemplate].tmpValue, item.hContact, &item);
+				SetWindowText(GetDlgItem(hwnd, IDC_PREVIEW), preview);
+				//						SetWindowText(GetDlgItem(hwnd, IDC_GPREVIEW), preview);
+				SetWindowText(GetDlgItem(hwnd, IDC_GPREVIEW), _T("$hit :)"));
+				free(preview);
+			}
+			else
+			{
+				SetWindowText(GetDlgItem(hwnd, IDC_PREVIEW), _T(""));
+				SetWindowText(GetDlgItem(hwnd, IDC_GPREVIEW), _T(""));
+			}
+			break;
 		}
 
-		case WM_COMMAND:
-			switch (LOWORD(wParam))
+		case IDC_DISCARD:
+		{
+			if (templates[CurrentTemplate].tmpValue)
+				free(templates[CurrentTemplate].tmpValue);
+			templates[CurrentTemplate].tmpValue = 0;
+			if (templates[CurrentTemplate].value)
 			{
-				case IDC_EDITTEMPLATE:
-				{
-					SendMessage(GetParent(GetParent(hwnd)), PSM_CHANGED, 0, 0);
-				}
+				SetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].value);
+			}
+			else
+			{
+				SetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].defvalue);
+			}
+			PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDC_UPDATEPREVIEW, 0), 0);
+			break;
+		}
+		}
+		break;
 
-				case IDC_UPDATEPREVIEW:
+	case WM_NOTIFY:
+		switch (((LPNMHDR)lParam)->idFrom)
+		{
+		case 0:
+		{
+			switch (((LPNMHDR)lParam)->code)
+			{
+			case PSN_RESET:
+			{
+				for (int i = 0; i < TPL_COUNT; i++)
 				{
-					if (templates[CurrentTemplate].tmpValue)
-						free(templates[CurrentTemplate].tmpValue);
-					int length = GetWindowTextLength(GetDlgItem(hwnd, IDC_EDITTEMPLATE))+1;
-					templates[CurrentTemplate].tmpValue = (TCHAR *)malloc(length*sizeof(TCHAR));
-					GetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].tmpValue, length);
-
-					HistoryArray::ItemData item;
-					item.hContact = db_find_first();
-					while (item.hContact && !item.hEvent)
+					if (templates[i].tmpValue)
 					{
-						item.hEvent = db_event_first(item.hContact);
-						if (!item.hEvent)
-							item.hContact = db_find_next(item.hContact);
+						if (templates[i].tmpValue)
+							free(templates[i].tmpValue);
 					}
-					if (item.hContact && item.hEvent)
-					{
-						item.load(ELM_DATA);
-						TCHAR *preview = TplFormatStringEx(CurrentTemplate, templates[CurrentTemplate].tmpValue, item.hContact, &item);
-						SetWindowText(GetDlgItem(hwnd, IDC_PREVIEW), preview);
-//						SetWindowText(GetDlgItem(hwnd, IDC_GPREVIEW), preview);
-						SetWindowText(GetDlgItem(hwnd, IDC_GPREVIEW), _T("$hit :)"));
-						free(preview);
-					} else
+				}
+				return TRUE;
+			}
+
+			case PSN_APPLY:
+			{
+				for (int i = 0; i < TPL_COUNT; i++)
+				{
+					if (templates[i].tmpValue)
 					{
-						SetWindowText(GetDlgItem(hwnd, IDC_PREVIEW), _T(""));
-						SetWindowText(GetDlgItem(hwnd, IDC_GPREVIEW), _T(""));
+						if (templates[i].value)
+							free(templates[i].value);
+						templates[i].value = templates[i].tmpValue;
+						templates[i].tmpValue = 0;
 					}
+				}
+				SaveTemplates();
+				return TRUE;
+			}
+			}
+			break;
+		}
+
+		case IDC_TEMPLATES:
+		{
+			switch (((LPNMHDR)lParam)->code)
+			{
+			case TVN_SELCHANGED:
+			case TVN_SELCHANGING:
+			{
+				LPNMTREEVIEW lpnmtv = (LPNMTREEVIEW)lParam;
+
+				TVITEM tvi;
+				tvi.hItem = TreeView_GetSelection(GetDlgItem(hwnd, IDC_TEMPLATES));
+				tvi.mask = TVIF_PARAM;
+				TreeView_GetItem(GetDlgItem(hwnd, IDC_TEMPLATES), &tvi);
+
+				if ((tvi.lParam < 0) || (tvi.lParam >= TPL_COUNT))
+				{
+					EnableWindow(GetDlgItem(hwnd, IDC_EDITTEMPLATE), FALSE);
+					EnableWindow(GetDlgItem(hwnd, IDC_GPREVIEW), FALSE);
+					EnableWindow(GetDlgItem(hwnd, IDC_PREVIEW), FALSE);
+					EnableWindow(GetDlgItem(hwnd, IDC_DISCARD), FALSE);
+					EnableWindow(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), FALSE);
+					EnableWindow(GetDlgItem(hwnd, IDC_VARHELP), FALSE);
+					/*								HTREEITEM hItem = TreeView_GetChild(GetDlgItem(hwnd, IDC_TEMPLATES), tvi.hItem);
+													if (hItem)
+													{
+														TreeView_Expand(GetDlgItem(hwnd, IDC_TEMPLATES), tvi.hItem, TVE_EXPAND);
+														TreeView_SelectItem(GetDlgItem(hwnd, IDC_TEMPLATES), hItem);
+													}*/
 					break;
 				}
+				else
+				{
+					EnableWindow(GetDlgItem(hwnd, IDC_EDITTEMPLATE), TRUE);
+					EnableWindow(GetDlgItem(hwnd, IDC_GPREVIEW), TRUE);
+					EnableWindow(GetDlgItem(hwnd, IDC_PREVIEW), TRUE);
+					EnableWindow(GetDlgItem(hwnd, IDC_DISCARD), TRUE);
+					EnableWindow(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), TRUE);
+					EnableWindow(GetDlgItem(hwnd, IDC_VARHELP), TRUE);
+				}
+
+				if ((lpnmtv->itemOld.mask&TVIF_HANDLE) && lpnmtv->itemOld.hItem && (lpnmtv->itemOld.hItem != lpnmtv->itemNew.hItem) && (lpnmtv->itemOld.lParam >= 0) && (lpnmtv->itemOld.lParam < TPL_COUNT))
+				{
+					if (templates[lpnmtv->itemOld.lParam].tmpValue)
+						free(templates[lpnmtv->itemOld.lParam].tmpValue);
+					int length = GetWindowTextLength(GetDlgItem(hwnd, IDC_EDITTEMPLATE)) + 1;
+					templates[lpnmtv->itemOld.lParam].tmpValue = (TCHAR *)malloc(length * sizeof(TCHAR));
+					GetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[lpnmtv->itemOld.lParam].tmpValue, length);
+				}
+
+				CurrentTemplate = tvi.lParam;
 
-				case IDC_DISCARD:
+				if (templates[CurrentTemplate].tmpValue)
 				{
-					if (templates[CurrentTemplate].tmpValue)
-						free(templates[CurrentTemplate].tmpValue);
-					templates[CurrentTemplate].tmpValue = 0;
+					SetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].tmpValue);
+				}
+				else
 					if (templates[CurrentTemplate].value)
 					{
 						SetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].value);
-					} else
+					}
+					else
 					{
 						SetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].defvalue);
 					}
-					PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDC_UPDATEPREVIEW,0), 0);
-					break;
-				}
-			}
-			break;
 
-		case WM_NOTIFY:
-			switch(((LPNMHDR)lParam)->idFrom)
+				PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDC_UPDATEPREVIEW, 0), 0);
+
+				break;
+			}
+			case TVN_KEYDOWN:
+			case NM_CLICK:
 			{
-				case 0:
-				{
-					switch (((LPNMHDR)lParam)->code) 
-					{
-						case PSN_RESET:
-						{
-							for (int i = 0; i < TPL_COUNT; i++)
-							{
-								if (templates[i].tmpValue)
-								{
-									if (templates[i].tmpValue)
-										free(templates[i].tmpValue);
-								}
-							}
-							return TRUE;
-						}
-
-						case PSN_APPLY:
-						{
-							for (int i = 0; i < TPL_COUNT; i++)
-							{
-								if (templates[i].tmpValue)
-								{
-									if (templates[i].value)
-										free(templates[i].value);
-									templates[i].value = templates[i].tmpValue;
-									templates[i].tmpValue = 0;
-								}
-							}
-							SaveTemplates();
-							return TRUE;
-						}
-					}
-					break; 
-				} 
+				SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0);
+				break;
+			}
 
-				case IDC_TEMPLATES:
-				{
-					switch (((LPNMHDR)lParam)->code)
-					{
-						case TVN_SELCHANGED:
-						case TVN_SELCHANGING:
-						{
-							LPNMTREEVIEW lpnmtv = (LPNMTREEVIEW)lParam;
-
-							TVITEM tvi;
-							tvi.hItem = TreeView_GetSelection(GetDlgItem(hwnd, IDC_TEMPLATES));
-							tvi.mask = TVIF_PARAM;
-							TreeView_GetItem(GetDlgItem(hwnd, IDC_TEMPLATES), &tvi);
-
-							if ((tvi.lParam < 0) || (tvi.lParam >= TPL_COUNT))
-							{
-								EnableWindow(GetDlgItem(hwnd, IDC_EDITTEMPLATE), FALSE);
-								EnableWindow(GetDlgItem(hwnd, IDC_GPREVIEW), FALSE);
-								EnableWindow(GetDlgItem(hwnd, IDC_PREVIEW), FALSE);
-								EnableWindow(GetDlgItem(hwnd, IDC_DISCARD), FALSE);
-								EnableWindow(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), FALSE);
-								EnableWindow(GetDlgItem(hwnd, IDC_VARHELP), FALSE);
-/*								HTREEITEM hItem = TreeView_GetChild(GetDlgItem(hwnd, IDC_TEMPLATES), tvi.hItem);
-								if (hItem)
-								{
-									TreeView_Expand(GetDlgItem(hwnd, IDC_TEMPLATES), tvi.hItem, TVE_EXPAND);
-									TreeView_SelectItem(GetDlgItem(hwnd, IDC_TEMPLATES), hItem);
-								}*/
-								break;
-							} else
-							{
-								EnableWindow(GetDlgItem(hwnd, IDC_EDITTEMPLATE), TRUE);
-								EnableWindow(GetDlgItem(hwnd, IDC_GPREVIEW), TRUE);
-								EnableWindow(GetDlgItem(hwnd, IDC_PREVIEW), TRUE);
-								EnableWindow(GetDlgItem(hwnd, IDC_DISCARD), TRUE);
-								EnableWindow(GetDlgItem(hwnd, IDC_UPDATEPREVIEW), TRUE);
-								EnableWindow(GetDlgItem(hwnd, IDC_VARHELP), TRUE);
-							}
-
-							if ((lpnmtv->itemOld.mask&TVIF_HANDLE) && lpnmtv->itemOld.hItem && (lpnmtv->itemOld.hItem != lpnmtv->itemNew.hItem) && (lpnmtv->itemOld.lParam >= 0) && (lpnmtv->itemOld.lParam < TPL_COUNT))
-							{
-								if (templates[lpnmtv->itemOld.lParam].tmpValue)
-									free(templates[lpnmtv->itemOld.lParam].tmpValue);
-								int length = GetWindowTextLength(GetDlgItem(hwnd, IDC_EDITTEMPLATE))+1;
-								templates[lpnmtv->itemOld.lParam].tmpValue = (TCHAR *)malloc(length*sizeof(TCHAR));
-								GetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[lpnmtv->itemOld.lParam].tmpValue, length);
-							}
-
-							CurrentTemplate = tvi.lParam;
-
-							if (templates[CurrentTemplate].tmpValue)
-							{
-								SetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].tmpValue);
-							} else
-							if (templates[CurrentTemplate].value)
-							{
-								SetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].value);
-							} else
-							{
-								SetWindowText(GetDlgItem(hwnd, IDC_EDITTEMPLATE), templates[CurrentTemplate].defvalue);
-							}
-
-							PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDC_UPDATEPREVIEW,0), 0);
-
-							break;
-						}
-						case TVN_KEYDOWN:
-						case NM_CLICK:
-						{
-							SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0);
-							break;
-						}
-
-/*
-						{
-							TVHITTESTINFO hti;
-							hti.pt.x = (short)LOWORD(GetMessagePos());
-							hti.pt.y = (short)HIWORD(GetMessagePos());
-							ScreenToClient(((LPNMHDR)lParam)->hwndFrom,&hti.pt);
-							if(TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom,&hti))
-								if(hti.flags&TVHT_ONITEMSTATEICON)
-									SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0);
-						}
-*/
+			/*
+									{
+										TVHITTESTINFO hti;
+										hti.pt.x = (short)LOWORD(GetMessagePos());
+										hti.pt.y = (short)HIWORD(GetMessagePos());
+										ScreenToClient(((LPNMHDR)lParam)->hwndFrom,&hti.pt);
+										if(TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom,&hti))
+											if(hti.flags&TVHT_ONITEMSTATEICON)
+												SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0);
+									}
+			*/
 
-					}
-					break;
-				}
 			}
 			break;
+		}
+		}
+		break;
 	}
 	return FALSE;
 }
diff --git a/plugins/NewStory/src/templates.h b/plugins/NewStory/src/templates.h
index 93916bec29..2b703619f3 100644
--- a/plugins/NewStory/src/templates.h
+++ b/plugins/NewStory/src/templates.h
@@ -68,8 +68,8 @@ extern TemplateInfo templates[TPL_COUNT];
 void LoadTemplates();
 void SaveTemplates();
 
-TCHAR *TplFormatString(int tpl, HANDLE hContact, HistoryArray::ItemData *args);
-TCHAR *TplFormatStringEx(int tpl, TCHAR *sztpl, HANDLE hContact, HistoryArray::ItemData *args);
+TCHAR *TplFormatString(int tpl, MCONTACT hContact, HistoryArray::ItemData *args);
+TCHAR *TplFormatStringEx(int tpl, TCHAR *sztpl, MCONTACT hContact, HistoryArray::ItemData *args);
 
 BOOL CALLBACK OptTemplatesDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
-- 
cgit v1.2.3