diff --git a/programs/wineconsole/dialog.c b/programs/wineconsole/dialog.c
index 04220ac..4861254 100644
--- a/programs/wineconsole/dialog.c
+++ b/programs/wineconsole/dialog.c
@@ -1,28 +1,117 @@
 /* dialog management for wineconsole
+ * USER32 backend
  * (c) 2001 Eric Pouech
  */
 
 #include <stdio.h>
-#include "winecon_private.h"
 #include "commctrl.h"
 #include "prsht.h"
+#include "winecon_user.h"
 
 /* FIXME: so far, part of the code is made in ASCII because the Uncode property sheet functions
  * are not implemented yet
  */
+
+enum WCUSER_ApplyTo {
+    /* Prop sheet CFG */
+    WCUSER_ApplyToCursorSize, 
+    WCUSER_ApplyToHistorySize, WCUSER_ApplyToHistoryMode, WCUSER_ApplyToMenuMask,
+    /* Prop sheet FNT */
+    WCUSER_ApplyToFont, WCUSER_ApplyToAttribute,
+    /* Prop sheep CNF */
+    WCUSER_ApplyToBufferSize, WCUSER_ApplyToWindow
+};
+
 struct dialog_info 
 {
-    struct inner_data*	data;		/* pointer to current winecon info */
-    HWND		hDlg;		/* handle to window dialog */
+    struct config_data* config;         /* pointer to configuration used for dialog box */
+    struct inner_data*	data;	        /* pointer to current winecon info */
+    HWND		hDlg;		/* handle to active propsheet */
     int			nFont;		/* number of font size in size LB */
     struct font_info 
     {
 	TEXTMETRIC		tm;
 	LOGFONT			lf;
     } 			*font;		/* array of nFont. index sync'ed with SIZE LB */
+    void        (*apply)(struct dialog_info*, HWND, enum WCUSER_ApplyTo, DWORD);
 };
 
 /******************************************************************
+ *		WCUSER_ApplyDefault
+ *
+ *
+ */
+static void WCUSER_ApplyDefault(struct dialog_info* di, HWND hDlg, enum WCUSER_ApplyTo apply, DWORD val)
+{
+    switch (apply)
+    {
+    case WCUSER_ApplyToCursorSize:
+    case WCUSER_ApplyToHistorySize:
+    case WCUSER_ApplyToHistoryMode:
+    case WCUSER_ApplyToBufferSize:
+    case WCUSER_ApplyToWindow:
+        /* not saving those for now... */
+        break;
+    case WCUSER_ApplyToMenuMask:
+        di->config->menu_mask = val;
+        break;
+    case WCUSER_ApplyToFont:
+        WCUSER_CopyFont(di->config, &di->font[val].lf);
+        break;
+    case WCUSER_ApplyToAttribute:
+        di->config->def_attr = val;
+        break;
+    }
+    WINECON_RegSave(di->config);
+}
+
+/******************************************************************
+ *		WCUSER_ApplyCurrent
+ *
+ *
+ */
+static void WCUSER_ApplyCurrent(struct dialog_info* di, HWND hDlg, enum WCUSER_ApplyTo apply, DWORD val)
+{
+    switch (apply)
+    {
+    case WCUSER_ApplyToCursorSize:
+        {
+            CONSOLE_CURSOR_INFO cinfo;
+            cinfo.dwSize = val;
+            cinfo.bVisible = di->config->cursor_visible;
+            /* this shall update (through notif) curcfg */
+            SetConsoleCursorInfo(di->data->hConOut, &cinfo);
+        }
+        break;
+    case WCUSER_ApplyToHistorySize:
+        di->config->history_size = val;
+        WINECON_SetHistorySize(di->data->hConIn, val);
+        break;
+    case WCUSER_ApplyToHistoryMode:
+        WINECON_SetHistoryMode(di->data->hConIn, val);
+        break;
+    case WCUSER_ApplyToMenuMask:
+        di->config->menu_mask = val;
+        break;
+    case WCUSER_ApplyToFont:
+        WCUSER_SetFont(di->data, &di->font[val].lf);
+        break;
+    case WCUSER_ApplyToAttribute:
+        di->config->def_attr = val;
+        SetConsoleTextAttribute(di->data->hConOut, val);
+        break;
+    case WCUSER_ApplyToBufferSize:
+        /* this shall update (through notif) curcfg */
+        SetConsoleScreenBufferSize(di->data->hConOut, *(COORD*)val);
+        break;
+    case WCUSER_ApplyToWindow:
+        /* this shall update (through notif) curcfg */
+        SetConsoleWindowInfo(di->data->hConOut, FALSE, (SMALL_RECT*)val);
+        break;
+    }
+}
+
+/******************************************************************
  *		WCUSER_OptionDlgProc
  *
  * Dialog prop for the option property sheet
@@ -38,19 +127,25 @@
 	di = (struct dialog_info*)((PROPSHEETPAGEA*)lParam)->lParam;
 	di->hDlg = hDlg;
 	SetWindowLongA(hDlg, DWL_USER, (DWORD)di);
-	if (di->data->cursor_size < 33)		idc = IDC_OPT_CURSOR_SMALL;
-	else if (di->data->cursor_size < 66)	idc = IDC_OPT_CURSOR_MEDIUM;
-	else					idc = IDC_OPT_CURSOR_LARGE;
+	if (di->config->cursor_size <= 25)	idc = IDC_OPT_CURSOR_SMALL;
+	else if (di->config->cursor_size <= 50)	idc = IDC_OPT_CURSOR_MEDIUM;
+	else				        idc = IDC_OPT_CURSOR_LARGE;
 	SendDlgItemMessage(hDlg, idc, BM_SETCHECK, BST_CHECKED, 0L);
 	SetDlgItemInt(hDlg, IDC_OPT_HIST_SIZE, WINECON_GetHistorySize(di->data->hConIn),  FALSE);
 	if (WINECON_GetHistoryMode(di->data->hConIn))
 	    SendDlgItemMessage(hDlg, IDC_OPT_HIST_DOUBLE, BM_SETCHECK, BST_CHECKED, 0L);
+        SendDlgItemMessage(hDlg, IDC_OPT_CONF_CTRL, BM_SETCHECK, 
+                           (di->config->menu_mask & MK_CONTROL) ? BST_CHECKED : BST_UNCHECKED, 0L);
+        SendDlgItemMessage(hDlg, IDC_OPT_CONF_SHIFT, BM_SETCHECK, 
+                           (di->config->menu_mask & MK_SHIFT) ? BST_CHECKED : BST_UNCHECKED, 0L);
 	return FALSE; /* because we set the focus */
     case WM_COMMAND:
 	break;
     case WM_NOTIFY:
     {
 	NMHDR*	nmhdr = (NMHDR*)lParam;
+        DWORD   val;
+        BOOL	done;
 
 	di = (struct dialog_info*)GetWindowLongA(hDlg, DWL_USER);
 	switch (nmhdr->code) 
@@ -67,30 +162,26 @@
 	    else
 		idc = IDC_OPT_CURSOR_LARGE;
 	    PostMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, idc), TRUE);
+            di->hDlg = hDlg;
 	    break;
 	case PSN_APPLY:
-	{
-	    int		curs_size;
-	    int		hist_size;
-	    BOOL	done;
+	    if (IsDlgButtonChecked(hDlg, IDC_OPT_CURSOR_SMALL) == BST_CHECKED) val = 25;
+	    else if (IsDlgButtonChecked(hDlg, IDC_OPT_CURSOR_MEDIUM) == BST_CHECKED) val = 50;
+	    else val = 99;
+            (di->apply)(di, hDlg, WCUSER_ApplyToCursorSize, val);
 
-	    if (IsDlgButtonChecked(hDlg, IDC_OPT_CURSOR_SMALL) == BST_CHECKED)	curs_size = 33;
-	    else if (IsDlgButtonChecked(hDlg, IDC_OPT_CURSOR_MEDIUM) == BST_CHECKED) curs_size = 66;
-	    else curs_size = 99;
-	    if (curs_size != di->data->cursor_size)
-	    {
-		CONSOLE_CURSOR_INFO cinfo;
-		cinfo.dwSize = curs_size;
-		cinfo.bVisible = di->data->cursor_visible;
-		SetConsoleCursorInfo(di->data->hConOut, &cinfo);
-	    }
-	    hist_size = GetDlgItemInt(hDlg, IDC_OPT_HIST_SIZE, &done, FALSE);
-	    if (done) WINECON_SetHistorySize(di->data->hConIn, hist_size);
-	    SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
-	    WINECON_SetHistoryMode(di->data->hConIn, 
-				   IsDlgButtonChecked(hDlg, IDC_OPT_HIST_DOUBLE) & BST_CHECKED);
+ 	    val = GetDlgItemInt(hDlg, IDC_OPT_HIST_SIZE, &done, FALSE);
+	    if (done) (di->apply)(di, hDlg, WCUSER_ApplyToHistorySize, val);
+
+	    (di->apply)(di, hDlg, WCUSER_ApplyToHistoryMode, 
+                        IsDlgButtonChecked(hDlg, IDC_OPT_HIST_DOUBLE) & BST_CHECKED);
+
+            val = 0;
+            if (IsDlgButtonChecked(hDlg, IDC_OPT_CONF_CTRL) & BST_CHECKED)  val |= MK_CONTROL;
+            if (IsDlgButtonChecked(hDlg, IDC_OPT_CONF_SHIFT) & BST_CHECKED) val |= MK_SHIFT;
+            (di->apply)(di, hDlg, WCUSER_ApplyToMenuMask, val);
+            SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
 	    return TRUE;
-	}
 	default:
 	    return FALSE;
 	}
@@ -112,45 +203,121 @@
     switch (msg)
     {
     case WM_PAINT:
-    {
-	PAINTSTRUCT	ps;
-	int		font_idx;
-	int		size_idx;
-	struct dialog_info*	di;
+        {
+            PAINTSTRUCT	        ps;
+            int		        font_idx;
+            int		        size_idx;
+            struct dialog_info*	di;
+            
+            di = (struct dialog_info*)GetWindowLong(GetParent(hWnd), DWL_USER);
+            BeginPaint(hWnd, &ps);
 
-	di = (struct dialog_info*)GetWindowLong(GetParent(hWnd), DWL_USER);
-	BeginPaint(hWnd, &ps);
-	
-	font_idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_GETCURSEL, 0L, 0L);
-	size_idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0L, 0L);
-
-	if (font_idx >= 0 && size_idx >= 0 && size_idx < di->nFont)
-	{
-	    HFONT	hFont, hOldFont;
-	    WCHAR	buf1[256];
-	    WCHAR	buf2[256];
-	    int		len1, len2;
-
-	    hFont = CreateFontIndirect(&di->font[size_idx].lf);
-	    len1 = LoadString(GetModuleHandle(NULL), IDS_FNT_PREVIEW_1, 
-			      buf1, sizeof(buf1) / sizeof(WCHAR));
-	    len2 = LoadString(GetModuleHandle(NULL), IDS_FNT_PREVIEW_2,
-			      buf2, sizeof(buf2) / sizeof(WCHAR));
-	    if (hFont && len1)
-	    {
-		hOldFont = SelectObject(ps.hdc, hFont);
-		SetBkColor(ps.hdc, RGB(0x00, 0x00, 0x00));
-		SetTextColor(ps.hdc, RGB(0xFF, 0xFF, 0xFF));
-		TextOut(ps.hdc, 0, 0, buf1, len1);
-		if (len2)
-		    TextOut(ps.hdc, 0, di->font[size_idx].tm.tmHeight, buf2, len2);
-		SelectObject(ps.hdc, hOldFont);
-		DeleteObject(hFont);
-	    }
-	}
-	EndPaint(hWnd, &ps);
-	break;
+            font_idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_GETCURSEL, 0L, 0L);
+            size_idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0L, 0L);
+            
+            if (font_idx >= 0 && size_idx >= 0 && size_idx < di->nFont)
+            {
+                HFONT	hFont, hOldFont;
+                WCHAR	buf1[256];
+                WCHAR	buf2[256];
+                int	len1, len2;
+                
+                hFont = CreateFontIndirect(&di->font[size_idx].lf);
+                len1 = LoadString(GetModuleHandle(NULL), IDS_FNT_PREVIEW_1, 
+                                  buf1, sizeof(buf1) / sizeof(WCHAR));
+                len2 = LoadString(GetModuleHandle(NULL), IDS_FNT_PREVIEW_2,
+                                  buf2, sizeof(buf2) / sizeof(WCHAR));
+                buf1[len1] = buf2[len2] = 0;
+                if (hFont && len1)
+                {
+                    hOldFont = SelectObject(ps.hdc, hFont);
+                    SetBkColor(ps.hdc, WCUSER_ColorMap[GetWindowLong(GetDlgItem(di->hDlg, IDC_FNT_COLOR_BK), 0)]);
+                    SetTextColor(ps.hdc, WCUSER_ColorMap[GetWindowLong(GetDlgItem(di->hDlg, IDC_FNT_COLOR_FG), 0)]);
+                    TextOut(ps.hdc, 0, 0, buf1, len1);
+                    if (len2)
+                        TextOut(ps.hdc, 0, di->font[size_idx].tm.tmHeight, buf2, len2);
+                    SelectObject(ps.hdc, hOldFont);
+                    DeleteObject(hFont);
+                }
+            }
+            EndPaint(hWnd, &ps);
+        }
+        break;
+    default:
+	return DefWindowProc(hWnd, msg, wParam, lParam);
     }
+    return 0L;
+}
+
+/******************************************************************
+ *		WCUSER_ColorPreviewProc
+ *
+ * Window proc for color previewer in font property sheet
+ */
+static LRESULT WINAPI WCUSER_ColorPreviewProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    switch (msg)
+    {
+    case WM_PAINT:
+        {
+            PAINTSTRUCT     ps;
+            int             i, step;
+            RECT            client, r;
+            HBRUSH          hbr;
+            
+            BeginPaint(hWnd, &ps);
+            GetClientRect(hWnd, &client);
+            step = client.right / 8;
+            
+            for (i = 0; i < 16; i++)
+            {
+                r.top = (i / 8) * (client.bottom / 2);
+                r.bottom = r.top + client.bottom / 2;
+                r.left = (i & 7) * step;
+                r.right = r.left + step;
+                hbr = CreateSolidBrush(WCUSER_ColorMap[i]);
+                FillRect(ps.hdc, &r, hbr);
+                DeleteObject(hbr);
+                if (GetWindowLong(hWnd, 0) == i)
+                {
+                    HPEN        hOldPen;
+                    int         i = 2;
+
+                    hOldPen = SelectObject(ps.hdc, GetStockObject(WHITE_PEN));
+                    r.right--; r.bottom--;
+                    for (;;)
+                    {
+                        MoveToEx(ps.hdc, r.left, r.bottom, NULL);
+                        LineTo(ps.hdc, r.left, r.top);
+                        LineTo(ps.hdc, r.right, r.top);
+                        SelectObject(ps.hdc, GetStockObject(BLACK_PEN));
+                        LineTo(ps.hdc, r.right, r.bottom);
+                        LineTo(ps.hdc, r.left, r.bottom);
+
+                        if (--i == 0) break;
+                        r.left++; r.top++; r.right--; r.bottom--;
+                        SelectObject(ps.hdc, GetStockObject(WHITE_PEN));
+                    }
+                    SelectObject(ps.hdc, hOldPen);
+                }
+            }
+            EndPaint(hWnd, &ps);
+            break;
+        }
+    case WM_LBUTTONDOWN:
+        {
+            int             i, step;
+            RECT            client;
+            
+            GetClientRect(hWnd, &client);
+            step = client.right / 8;
+            i = (HIWORD(lParam) >= client.bottom / 2) ? 8 : 0;
+            i += LOWORD(lParam) / step;
+            SetWindowLong(hWnd, 0, i);
+            InvalidateRect(GetDlgItem(GetParent(hWnd), IDC_FNT_PREVIEW), NULL, FALSE);
+            InvalidateRect(hWnd, NULL, FALSE);
+        }
+        break;
     default:
 	return DefWindowProc(hWnd, msg, wParam, lParam);
     }
@@ -160,7 +327,7 @@
 /******************************************************************
  *		font_enum
  *
- *
+ * enumerates all the font names with at least one valid font
  */
 static int CALLBACK font_enum_size2(const LOGFONT* lf, const TEXTMETRIC* tm, 
 				    DWORD FontType, LPARAM lParam)
@@ -208,24 +375,44 @@
     if (WCUSER_ValidateFontMetric(di->data, tm))
     {
 	WCHAR	buf[32];
-	WCHAR	fmt[] = {'%','l','d',0};
+        static const WCHAR fmt[] = {'%','l','d',0};
 	int	idx;
 
 	/* we want the string to be sorted with a numeric order, not a lexicographic...
 	 * do the job by hand... get where to insert the new string
 	 */
 	for (idx = 0; idx < di->nFont && tm->tmHeight > di->font[idx].tm.tmHeight; idx++);
-	wsprintfW(buf, fmt, tm->tmHeight);
-	SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_INSERTSTRING, idx, (LPARAM)buf);
+        if (idx < di->nFont &&
+            tm->tmHeight == di->font[idx].tm.tmHeight && 
+            tm->tmMaxCharWidth == di->font[idx].tm.tmMaxCharWidth)
+        {
+            /* we already have an entry with the same width & height...
+             * try to see which TEXTMETRIC (old or new) we should keep... 
+             */
+            if (di->font[idx].tm.tmWeight != tm->tmWeight)
+            {
+                /* get the weight closer to 400, the default value */
+                if (abs(tm->tmWeight - 400) < abs(di->font[idx].tm.tmWeight - 400))
+                {
+                    di->font[idx].tm = *tm;
+                }
+            }
+            /* else FIXME: skip the new tm for now */
+        }
+        else
+        {
+            /* here we need to add the new entry */
+            wsprintfW(buf, fmt, tm->tmHeight);
+            SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_INSERTSTRING, idx, (LPARAM)buf);
 
-	/* now grow our arrays and insert to values at the same index than in the list box */
-	di->font = HeapReAlloc(GetProcessHeap(), 0, di->font, sizeof(*di->font) * (di->nFont + 1));
-	if (idx != di->nFont)
-	    memmove(&di->font[idx + 1], &di->font[idx], (di->nFont - idx) * sizeof(*di->font));
-	di->font[idx].tm = *tm;
-	di->font[idx].lf = *lf;
-	di->nFont++;
-
+            /* now grow our arrays and insert to values at the same index than in the list box */
+            di->font = HeapReAlloc(GetProcessHeap(), 0, di->font, sizeof(*di->font) * (di->nFont + 1));
+            if (idx != di->nFont)
+                memmove(&di->font[idx + 1], &di->font[idx], (di->nFont - idx) * sizeof(*di->font));
+            di->font[idx].tm = *tm;
+            di->font[idx].lf = *lf;
+            di->nFont++;
+        }
     }
     return 1;
 }
@@ -283,7 +470,7 @@
     {
 	for (idx = 0; idx < di->nFont; idx++)
 	{
-	    if (memcmp(&di->data->logFont, &di->font[idx].lf, sizeof(LOGFONT)) == 0)
+	    if (WCUSER_AreFontsEqual(di->config, &di->font[idx].lf))
 		break;
 	}
 	if (idx == di->nFont) idx = 0;
@@ -311,7 +498,7 @@
     EnumFontFamilies(hdc, NULL, font_enum, (LPARAM)di);
     ReleaseDC(di->hDlg, hdc);
     if (SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_SELECTSTRING, 
-			   (WPARAM)-1, (LPARAM)di->data->logFont.lfFaceName) == LB_ERR)
+			   (WPARAM)-1, (LPARAM)di->config->face_name) == LB_ERR)
 	SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_FONT, LB_SETCURSEL, 0L, 0L);
     fill_list_size(di, TRUE);
     return TRUE;
@@ -333,6 +520,8 @@
 	di->hDlg = hDlg;
 	SetWindowLong(hDlg, DWL_USER, (DWORD)di);
 	fill_list_font(di);
+        SetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_BK), 0, di->config->def_attr & 0x0F);
+        SetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_FG), 0, (di->config->def_attr >> 4) & 0x0F);
 	break;
     case WM_COMMAND:
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
@@ -355,21 +544,25 @@
     case WM_NOTIFY:
     {
 	NMHDR*	nmhdr = (NMHDR*)lParam;
+        DWORD   val;
 
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
 	switch (nmhdr->code) 
 	{
+        case PSN_SETACTIVE:
+            di->hDlg = hDlg;
+            break;
 	case PSN_APPLY:
-	{
-	    int idx = SendDlgItemMessage(di->hDlg, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0L, 0L);
+ 	    val = SendDlgItemMessage(hDlg, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0L, 0L);
 
-	    if (idx >= 0 && idx < di->nFont)
-	    {
-		WCUSER_SetFont(di->data, &di->font[idx].lf, &di->font[idx].tm);
-	    }
-	    SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
+	    if (val < di->nFont) (di->apply)(di, hDlg, WCUSER_ApplyToFont, val);
+
+            (di->apply)(di, hDlg, WCUSER_ApplyToAttribute, 
+                        GetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_BK), 0) | 
+                        (GetWindowLong(GetDlgItem(hDlg, IDC_FNT_COLOR_FG), 0) << 4));
+
+            SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
 	    return TRUE;
-	}
 	default:
 	    return FALSE;
 	}
@@ -396,10 +589,10 @@
 	di = (struct dialog_info*)((PROPSHEETPAGEA*)lParam)->lParam;
 	di->hDlg = hDlg;
 	SetWindowLong(hDlg, DWL_USER, (DWORD)di);
-	SetDlgItemInt(hDlg, IDC_CNF_SB_WIDTH,   di->data->sb_width,   FALSE);
-	SetDlgItemInt(hDlg, IDC_CNF_SB_HEIGHT,  di->data->sb_height,  FALSE);
-	SetDlgItemInt(hDlg, IDC_CNF_WIN_WIDTH,  di->data->win_width,  FALSE);
-	SetDlgItemInt(hDlg, IDC_CNF_WIN_HEIGHT, di->data->win_height, FALSE);
+	SetDlgItemInt(hDlg, IDC_CNF_SB_WIDTH,   di->config->sb_width,   FALSE);
+	SetDlgItemInt(hDlg, IDC_CNF_SB_HEIGHT,  di->config->sb_height,  FALSE);
+	SetDlgItemInt(hDlg, IDC_CNF_WIN_WIDTH,  di->config->win_width,  FALSE);
+	SetDlgItemInt(hDlg, IDC_CNF_WIN_HEIGHT, di->config->win_height, FALSE);
 	break;
     case WM_COMMAND:
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
@@ -409,37 +602,36 @@
 	break;
     case WM_NOTIFY:
     {
-	NMHDR*	nmhdr = (NMHDR*)lParam;
+	NMHDR*	        nmhdr = (NMHDR*)lParam;
+        COORD           sb;
+        SMALL_RECT	pos;
+        BOOL	        st_w, st_h;
 
 	di = (struct dialog_info*)GetWindowLong(hDlg, DWL_USER);
 	switch (nmhdr->code) 
 	{
+        case PSN_SETACTIVE:
+            di->hDlg = hDlg;
+            break;
 	case PSN_APPLY:
-	{
-	    COORD	sb;
-	    SMALL_RECT	pos;
-	    BOOL	st_w, st_h;
-
-	    sb.X = GetDlgItemInt(hDlg, IDC_CNF_SB_WIDTH,  &st_w, FALSE);
-	    sb.Y = GetDlgItemInt(hDlg, IDC_CNF_SB_HEIGHT, &st_h, FALSE);
-	    if (st_w && st_h && (sb.X != di->data->sb_width || sb.Y != di->data->sb_height))
-	    {
-		SetConsoleScreenBufferSize(di->data->hConOut, sb);
-	    }
-
-	    pos.Right  = GetDlgItemInt(hDlg, IDC_CNF_WIN_WIDTH,  &st_w, FALSE);
-	    pos.Bottom = GetDlgItemInt(hDlg, IDC_CNF_WIN_HEIGHT, &st_h, FALSE);
-	    if (st_w && st_h && 
-		(pos.Right != di->data->win_width || pos.Bottom != di->data->win_height))
-	    {
-		pos.Left = pos.Top = 0;
-		pos.Right--; pos.Bottom--;
-		SetConsoleWindowInfo(di->data->hConOut, FALSE, &pos);
-	    }
-
-	    SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
+            sb.X = GetDlgItemInt(hDlg, IDC_CNF_SB_WIDTH,  &st_w, FALSE);
+            sb.Y = GetDlgItemInt(hDlg, IDC_CNF_SB_HEIGHT, &st_h, FALSE);
+            if (st_w && st_h && (sb.X != di->config->sb_width || sb.Y != di->config->sb_height))
+            {
+                (di->apply)(di, hDlg, WCUSER_ApplyToBufferSize, (DWORD)&sb);
+            }
+            
+            pos.Right  = GetDlgItemInt(hDlg, IDC_CNF_WIN_WIDTH,  &st_w, FALSE);
+            pos.Bottom = GetDlgItemInt(hDlg, IDC_CNF_WIN_HEIGHT, &st_h, FALSE);
+            if (st_w && st_h && 
+                (pos.Right != di->config->win_width || pos.Bottom != di->config->win_height))
+            {
+                pos.Left = pos.Top = 0;
+                pos.Right--; pos.Bottom--;
+                (di->apply)(di, hDlg, WCUSER_ApplyToWindow, (DWORD)&pos);
+            }
+            SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
 	    return TRUE;
-	}
 	default:
 	    return FALSE;
 	}
@@ -456,18 +648,30 @@
  *
  * Runs the dialog box to set up the winconsole options
  */
-BOOL WCUSER_GetProperties(struct inner_data* data)
+BOOL WCUSER_GetProperties(struct inner_data* data, BOOL current)
 {
     HPROPSHEETPAGE	psPage[3];
     PROPSHEETPAGEA	psp;
     PROPSHEETHEADERA	psHead;
     WNDCLASS		wndclass;
-    static WCHAR	szFntPreview[] = {'W','i','n','e','C','o','n','F','o','n','t','P','r','e','v','i','e','w',0};
+    static const WCHAR szFntPreview[] = {'W','i','n','e','C','o','n','F','o','n','t','P','r','e','v','i','e','w',0};
+    static const WCHAR szColorPreview[] = {'W','i','n','e','C','o','n','C','o','l','o','r','P','r','e','v','i','e','w',0};
     struct dialog_info	di;
+    CHAR		buff[256];
 
     InitCommonControls();
 
     di.data = data;
+    if (current)
+    {
+        di.config = &data->curcfg;
+        di.apply = WCUSER_ApplyCurrent;
+    }
+    else
+    {
+        di.config = &data->defcfg;
+        di.apply = WCUSER_ApplyDefault;
+    }
     di.nFont = 0;
     di.font = NULL;
 
@@ -483,6 +687,18 @@
     wndclass.lpszClassName = szFntPreview;
     RegisterClass(&wndclass);
 
+    wndclass.style         = 0;
+    wndclass.lpfnWndProc   = WCUSER_ColorPreviewProc;
+    wndclass.cbClsExtra    = 0;
+    wndclass.cbWndExtra    = sizeof(DWORD);
+    wndclass.hInstance     = GetModuleHandle(NULL);
+    wndclass.hIcon         = 0;
+    wndclass.hCursor       = LoadCursor(0, IDC_ARROW);
+    wndclass.hbrBackground = GetStockObject(BLACK_BRUSH);
+    wndclass.lpszMenuName  = NULL;
+    wndclass.lpszClassName = szColorPreview;
+    RegisterClass(&wndclass);
+
     memset(&psp, 0, sizeof(psp));
     psp.dwSize = sizeof(psp);
     psp.dwFlags = 0;
@@ -503,9 +719,14 @@
 
     memset(&psHead, 0, sizeof(psHead));
     psHead.dwSize = sizeof(psHead);
-    psHead.pszCaption = "Setup";
+
+    if (!LoadStringA(GetModuleHandle(NULL), 
+                     (current) ? IDS_DLG_TIT_CURRENT : IDS_DLG_TIT_DEFAULT, 
+                     buff, sizeof(buff)))
+        strcpy(buff, "Setup");
+    psHead.pszCaption = buff;
     psHead.nPages = 3;
-    psHead.hwndParent = data->hWnd;
+    psHead.hwndParent = PRIVATE(data)->hWnd;
     psHead.u3.phpage = psPage;
  
     PropertySheetA(&psHead);
@@ -513,3 +734,4 @@
     return TRUE;
 }
 
+
