diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c
index c845555..aead13a 100644
--- a/dlls/comctl32/propsheet.c
+++ b/dlls/comctl32/propsheet.c
@@ -45,8 +45,8 @@
 typedef struct tagPropSheetInfo
 {
   HWND hwnd;
-  PROPSHEETHEADERA ppshheader;
-  LPSTR strPropertiesFor;
+  PROPSHEETHEADERW ppshheader;
+  LPWSTR strPropertiesFor;
   int nPages;
   int active_page;
   BOOL isModeless;
@@ -74,12 +74,17 @@
  * Defines and global variables
  */
 
-const char * PropSheetInfoStr = "PropertySheetInfo";
+const WCHAR PropSheetInfoStr[] = 
+    {'P','r','o','p','e','r','t','y','S','h','e','e','t','I','n','f','o',0 };
 
 #define MAX_CAPTION_LENGTH 255
 #define MAX_TABTEXT_LENGTH 255
 #define MAX_BUTTONTEXT_LENGTH 64
 
+#define PSH_WIZARD97_OLD   0x00002000
+#define PSH_WIZARD97_NEW   0x01000000
+#define INTRNL_ANY_WIZARD (PSH_WIZARD | PSH_WIZARD97_OLD | PSH_WIZARD97_NEW | PSH_WIZARD_LITE)
+
 /******************************************************************************
  * Prototypes
  */
@@ -87,16 +92,21 @@
 static BOOL PROPSHEET_SizeMismatch(HWND hwndDlg, PropSheetInfo* psInfo);
 static BOOL PROPSHEET_AdjustSize(HWND hwndDlg, PropSheetInfo* psInfo);
 static BOOL PROPSHEET_AdjustButtons(HWND hwndParent, PropSheetInfo* psInfo);
-static BOOL PROPSHEET_CollectSheetInfo(LPCPROPSHEETHEADERA lppsh,
+static BOOL PROPSHEET_CollectSheetInfoA(LPCPROPSHEETHEADERA lppsh,
                                        PropSheetInfo * psInfo);
-static BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp,
+static BOOL PROPSHEET_CollectSheetInfoW(LPCPROPSHEETHEADERW lppsh,
+                                       PropSheetInfo * psInfo);
+static BOOL PROPSHEET_CollectPageInfoA(LPCPROPSHEETPAGEA lppsp,
+                                      PropSheetInfo * psInfo,
+                                      int index);
+static BOOL PROPSHEET_CollectPageInfoW(LPCPROPSHEETPAGEW lppsp,
                                       PropSheetInfo * psInfo,
                                       int index);
 static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
                                        PropSheetInfo * psInfo);
 static BOOL PROPSHEET_CreatePage(HWND hwndParent, int index,
                                 const PropSheetInfo * psInfo,
-                                LPCPROPSHEETPAGEA ppshpage);
+                                LPCPROPSHEETPAGEW ppshpage);
 static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo);
 static PADDING_INFO PROPSHEET_GetPaddingInfo(HWND hwndDlg);
 static BOOL PROPSHEET_Back(HWND hwndDlg);
@@ -109,7 +119,9 @@
 static void PROPSHEET_UnChanged(HWND hwndDlg, HWND hwndCleanPage);
 static void PROPSHEET_PressButton(HWND hwndDlg, int buttonID);
 static void PROPSHEET_SetFinishTextA(HWND hwndDlg, LPCSTR lpszText);
+static void PROPSHEET_SetFinishTextW(HWND hwndDlg, LPCWSTR lpszText);
 static void PROPSHEET_SetTitleA(HWND hwndDlg, DWORD dwStyle, LPCSTR lpszText);
+static void PROPSHEET_SetTitleW(HWND hwndDlg, DWORD dwStyle, LPCWSTR lpszText);
 static BOOL PROPSHEET_CanSetCurSel(HWND hwndDlg);
 static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
                                 int index,
@@ -128,18 +140,69 @@
 static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags);
 static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg, const PropSheetInfo* psInfo);
 static BOOL PROPSHEET_IsDialogMessage(HWND hwnd, LPMSG lpMsg);
+static BOOL PROPSHEET_DoCommand(HWND hwnd, WORD wID);
 
 BOOL WINAPI
 PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
 DEFAULT_DEBUG_CHANNEL(propsheet);
 
+#define add_flag(a) if (dwFlags & a) {strcat(string, #a );strcat(string," ");}
 /******************************************************************************
- *            PROPSHEET_CollectSheetInfo
+ *            PROPSHEET_UnImplementedFlags
+ *
+ * Document use of flags we don't implement yet.
+ */
+static VOID PROPSHEET_UnImplementedFlags(DWORD dwFlags)
+{
+    CHAR string[256];
+
+    string[0] = '\0';
+
+  /*
+   * unhandled header flags:
+   *  PSH_DEFAULT            0x00000000
+   *  PSH_WIZARDHASFINISH    0x00000010
+   *  PSH_RTLREADING         0x00000800
+   *  PSH_WIZARDCONTEXTHELP  0x00001000
+   *  PSH_WIZARD97           0x00002000  (pre IE 5)
+   *  PSH_WATERMARK          0x00008000
+   *  PSH_USEHBMWATERMARK    0x00010000
+   *  PSH_USEHPLWATERMARK    0x00020000
+   *  PSH_STRETCHWATERMARK   0x00040000
+   *  PSH_HEADER             0x00080000
+   *  PSH_USEHBMHEADER       0x00100000
+   *  PSH_USEPAGELANG        0x00200000
+   *  PSH_WIZARD_LITE        0x00400000      also not in .h
+   *  PSH_WIZARD97           0x01000000  (IE 5 and above)
+   *  PSH_NOCONTEXTHELP      0x02000000      also not in .h
+   */
+
+    add_flag(PSH_WIZARDHASFINISH);
+    add_flag(PSH_RTLREADING);
+    add_flag(PSH_WIZARDCONTEXTHELP);
+    add_flag(PSH_WIZARD97_OLD);
+    add_flag(PSH_WATERMARK);
+    add_flag(PSH_USEHBMWATERMARK);
+    add_flag(PSH_USEHPLWATERMARK);
+    add_flag(PSH_STRETCHWATERMARK);
+    add_flag(PSH_HEADER);
+    add_flag(PSH_USEHBMHEADER);
+    add_flag(PSH_USEPAGELANG);
+    add_flag(PSH_WIZARD_LITE);
+    add_flag(PSH_WIZARD97_NEW);
+    add_flag(PSH_NOCONTEXTHELP);
+    if (string[0] != '\0')
+	FIXME("%s\n", string);
+}
+#undef add_flag()
+
+/******************************************************************************
+ *            PROPSHEET_CollectSheetInfoA
  *
  * Collect relevant data.
  */
-static BOOL PROPSHEET_CollectSheetInfo(LPCPROPSHEETHEADERA lppsh,
+static BOOL PROPSHEET_CollectSheetInfoA(LPCPROPSHEETHEADERA lppsh,
                                        PropSheetInfo * psInfo)
 {
   DWORD dwSize = min(lppsh->dwSize,sizeof(PROPSHEETHEADERA));
@@ -152,12 +215,17 @@
 
   memcpy(&psInfo->ppshheader,lppsh,dwSize);
   TRACE("\n** PROPSHEETHEADER **\ndwSize\t\t%ld\ndwFlags\t\t%08lx\nhwndParent\t%04x\nhInstance\t%08x\npszCaption\t'%s'\nnPages\t\t%d\npfnCallback\t%p\n",
-      lppsh->dwSize, lppsh->dwFlags, lppsh->hwndParent, lppsh->hInstance, lppsh->pszCaption, lppsh->nPages, lppsh->pfnCallback);
+	lppsh->dwSize, lppsh->dwFlags, lppsh->hwndParent, lppsh->hInstance,
+	debugstr_a(lppsh->pszCaption), lppsh->nPages, lppsh->pfnCallback);
+
+  PROPSHEET_UnImplementedFlags(lppsh->dwFlags);
 
   if (HIWORD(lppsh->pszCaption))
   {
-     psInfo->ppshheader.pszCaption = HeapAlloc( GetProcessHeap(), 0, strlen(lppsh->pszCaption)+1 );
-     strcpy( (char *)psInfo->ppshheader.pszCaption, lppsh->pszCaption );
+     int len = strlen(lppsh->pszCaption);
+     psInfo->ppshheader.pszCaption = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof (WCHAR) );
+     MultiByteToWideChar(CP_ACP, 0, lppsh->pszCaption, -1, (LPWSTR) psInfo->ppshheader.pszCaption, len+1);
+     /* strcpy( (char *)psInfo->ppshheader.pszCaption, lppsh->pszCaption ); */
   }
   psInfo->nPages = lppsh->nPages;
 
@@ -181,12 +249,61 @@
 }
 
 /******************************************************************************
- *            PROPSHEET_CollectPageInfo
+ *            PROPSHEET_CollectSheetInfoW
+ *
+ * Collect relevant data.
+ */
+static BOOL PROPSHEET_CollectSheetInfoW(LPCPROPSHEETHEADERW lppsh,
+                                       PropSheetInfo * psInfo)
+{
+  DWORD dwSize = min(lppsh->dwSize,sizeof(PROPSHEETHEADERW));
+  DWORD dwFlags = lppsh->dwFlags;
+
+  psInfo->hasHelp = dwFlags & PSH_HASHELP;
+  psInfo->hasApply = !(dwFlags & PSH_NOAPPLYNOW);
+  psInfo->useCallback = dwFlags & PSH_USECALLBACK;
+  psInfo->isModeless = dwFlags & PSH_MODELESS;
+
+  memcpy(&psInfo->ppshheader,lppsh,dwSize);
+  TRACE("\n** PROPSHEETHEADER **\ndwSize\t\t%ld\ndwFlags\t\t%08lx\nhwndParent\t%04x\nhInstance\t%08x\npszCaption\t'%s'\nnPages\t\t%d\npfnCallback\t%p\n",
+      lppsh->dwSize, lppsh->dwFlags, lppsh->hwndParent, lppsh->hInstance, debugstr_w(lppsh->pszCaption), lppsh->nPages, lppsh->pfnCallback);
+
+  PROPSHEET_UnImplementedFlags(lppsh->dwFlags);
+
+  if (HIWORD(lppsh->pszCaption))
+  {
+     int len = strlenW(lppsh->pszCaption);
+     psInfo->ppshheader.pszCaption = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof(WCHAR) );
+     strcpyW( (WCHAR *)psInfo->ppshheader.pszCaption, lppsh->pszCaption );
+  }
+  psInfo->nPages = lppsh->nPages;
+
+  if (dwFlags & PSH_USEPSTARTPAGE)
+  {
+    TRACE("PSH_USEPSTARTPAGE is on");
+    psInfo->active_page = 0;
+  }
+  else
+    psInfo->active_page = lppsh->u2.nStartPage;
+
+  if (psInfo->active_page < 0 || psInfo->active_page >= psInfo->nPages)
+     psInfo->active_page = 0;
+
+  psInfo->restartWindows = FALSE;
+  psInfo->rebootSystem = FALSE;
+  psInfo->hImageList = 0;
+  psInfo->activeValid = FALSE;
+
+  return TRUE;
+}
+
+/******************************************************************************
+ *            PROPSHEET_CollectPageInfoA
  *
  * Collect property sheet data.
  * With code taken from DIALOG_ParseTemplate32.
  */
-BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEA lppsp,
+BOOL PROPSHEET_CollectPageInfoA(LPCPROPSHEETPAGEA lppsp,
                                PropSheetInfo * psInfo,
                                int index)
 {
@@ -346,6 +463,177 @@
   return TRUE;
 }
 
+/******************************************************************************
+ *            PROPSHEET_CollectPageInfoW
+ *
+ * Collect property sheet data.
+ * With code taken from DIALOG_ParseTemplate32.
+ */
+BOOL PROPSHEET_CollectPageInfoW(LPCPROPSHEETPAGEW lppsp,
+                               PropSheetInfo * psInfo,
+                               int index)
+{
+  DLGTEMPLATE* pTemplate;
+  const WORD*  p;
+  DWORD dwFlags;
+  int width, height;
+
+  TRACE("\n");
+  psInfo->proppage[index].hpage = (HPROPSHEETPAGE)lppsp;
+  psInfo->proppage[index].hwndPage = 0;
+  psInfo->proppage[index].isDirty = FALSE;
+
+  /*
+   * Process property page flags.
+   */
+  dwFlags = lppsp->dwFlags;
+  psInfo->proppage[index].useCallback = (dwFlags & PSP_USECALLBACK) && (lppsp->pfnCallback);
+  psInfo->proppage[index].hasHelp = dwFlags & PSP_HASHELP;
+  psInfo->proppage[index].hasIcon = dwFlags & (PSP_USEHICON | PSP_USEICONID);
+
+  /* as soon as we have a page with the help flag, set the sheet flag on */
+  if (psInfo->proppage[index].hasHelp)
+    psInfo->hasHelp = TRUE;
+
+  /*
+   * Process page template.
+   */
+  if (dwFlags & PSP_DLGINDIRECT)
+    pTemplate = (DLGTEMPLATE*)lppsp->u.pResource;
+  else
+  {
+    HRSRC hResource = FindResourceW(lppsp->hInstance,
+                                    lppsp->u.pszTemplate,
+                                    RT_DIALOGW);
+    HGLOBAL hTemplate = LoadResource(lppsp->hInstance,
+                                     hResource);
+    pTemplate = (LPDLGTEMPLATEW)LockResource(hTemplate);
+  }
+
+  /*
+   * Extract the size of the page and the caption.
+   */
+  if (!pTemplate)
+      return FALSE;
+
+  p = (const WORD *)pTemplate;
+
+  if (((MyDLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF)
+  {
+    /* DIALOGEX template */
+
+    p++;       /* dlgVer    */
+    p++;       /* signature */
+    p += 2;    /* help ID   */
+    p += 2;    /* ext style */
+    p += 2;    /* style     */
+  }
+  else
+  {
+    /* DIALOG template */
+
+    p += 2;    /* style     */
+    p += 2;    /* ext style */
+  }
+
+  p++;    /* nb items */
+  p++;    /*   x      */
+  p++;    /*   y      */
+  width  = (WORD)*p; p++;
+  height = (WORD)*p; p++;
+
+  /* remember the largest width and height */
+  if (width > psInfo->width)
+    psInfo->width = width;
+
+  if (height > psInfo->height)
+    psInfo->height = height;
+
+  /* menu */
+  switch ((WORD)*p)
+  {
+    case 0x0000:
+      p++;
+      break;
+    case 0xffff:
+      p += 2;
+      break;
+    default:
+      p += lstrlenW( (LPCWSTR)p ) + 1;
+      break;
+  } 
+
+  /* class */
+  switch ((WORD)*p)
+  {
+    case 0x0000:
+      p++;
+      break;
+    case 0xffff:
+      p += 2;
+      break;
+    default:
+      p += lstrlenW( (LPCWSTR)p ) + 1;
+      break;
+  }
+
+  /* Extract the caption */
+  psInfo->proppage[index].pszText = (LPCWSTR)p;
+  TRACE("Tab %d %s\n",index,debugstr_w((LPCWSTR)p));
+  p += lstrlenW((LPCWSTR)p) + 1;
+
+  if (dwFlags & PSP_USETITLE)
+  {
+    WCHAR szTitle[256];
+    const WCHAR *pTitle;
+    static WCHAR pszNull[] = { '(','n','u','l','l',')',0 };
+    int len;
+
+    if ( !HIWORD( lppsp->pszTitle ) )
+    {
+      if (!LoadStringW( lppsp->hInstance, (UINT)lppsp->pszTitle,szTitle,sizeof szTitle ))
+      {
+        pTitle = pszNull;
+	FIXME("Could not load resource #%04x?\n",LOWORD(lppsp->pszTitle));
+      }
+      else
+        pTitle = szTitle;
+    }
+    else
+      pTitle = lppsp->pszTitle;
+
+    len = strlenW(szTitle);
+    psInfo->proppage[index].pszText = COMCTL32_Alloc( (len+1)*sizeof (WCHAR) );
+    strcpyW( (LPWSTR)psInfo->proppage[index].pszText,pTitle);
+  }
+
+  /*
+   * Build the image list for icons
+   */
+  if ((dwFlags & PSP_USEHICON) || (dwFlags & PSP_USEICONID)) 
+  {
+    HICON hIcon;
+    int icon_cx = GetSystemMetrics(SM_CXSMICON);
+    int icon_cy = GetSystemMetrics(SM_CYSMICON);
+
+    if (dwFlags & PSP_USEICONID)
+      hIcon = LoadImageW(lppsp->hInstance, lppsp->u2.pszIcon, IMAGE_ICON, 
+                         icon_cx, icon_cy, LR_DEFAULTCOLOR);
+    else
+      hIcon = lppsp->u2.hIcon;
+
+    if ( hIcon )
+    {
+      if (psInfo->hImageList == 0 )
+	psInfo->hImageList = ImageList_Create(icon_cx, icon_cy, ILC_COLOR, 1, 1);
+
+      ImageList_AddIcon(psInfo->hImageList, hIcon);
+    }
+
+  }
+
+  return TRUE;
+}
 
 /******************************************************************************
  *            PROPSHEET_CreateDialog
@@ -362,12 +650,12 @@
   WORD resID = IDD_PROPSHEET;
 
   TRACE("\n");
-  if (psInfo->ppshheader.dwFlags & PSH_WIZARD)
+  if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
     resID = IDD_WIZARD;
 
-  if(!(hRes = FindResourceA(COMCTL32_hModule,
-                            MAKEINTRESOURCEA(resID),
-                            RT_DIALOGA)))
+  if(!(hRes = FindResourceW(COMCTL32_hModule,
+                            MAKEINTRESOURCEW(resID),
+                            RT_DIALOGW)))
     return FALSE;
 
   if(!(template = (LPVOID)LoadResource(COMCTL32_hModule, hRes)))
@@ -389,14 +677,14 @@
     (*(psInfo->ppshheader.pfnCallback))(0, PSCB_PRECREATE, (LPARAM)temp);
 
   if (!(psInfo->ppshheader.dwFlags & PSH_MODELESS))
-      ret = DialogBoxIndirectParamA(psInfo->ppshheader.hInstance,
-                                    (LPDLGTEMPLATEA) temp,
+      ret = DialogBoxIndirectParamW(psInfo->ppshheader.hInstance,
+                                    (LPDLGTEMPLATEW) temp,
                                     psInfo->ppshheader.hwndParent,
                                     (DLGPROC) PROPSHEET_DialogProc,
                                     (LPARAM)psInfo);
   else
-      ret = CreateDialogIndirectParamA(psInfo->ppshheader.hInstance,
-                                       (LPDLGTEMPLATEA) temp,
+      ret = CreateDialogIndirectParamW(psInfo->ppshheader.hInstance,
+                                       (LPDLGTEMPLATEW) temp,
                                        psInfo->ppshheader.hwndParent,
                                        (DLGPROC) PROPSHEET_DialogProc,
                                        (LPARAM)psInfo);
@@ -525,7 +813,7 @@
    */
   GetClientRect(hwndTabCtrl,&tabRect);
 
-  SendMessageA(hwndTabCtrl, TCM_ADJUSTRECT, FALSE, (LPARAM)&tabRect);
+  SendMessageW(hwndTabCtrl, TCM_ADJUSTRECT, FALSE, (LPARAM)&tabRect);
 
   if ((rc.bottom - rc.top) < (tabRect.bottom - tabRect.top))
   {
@@ -539,7 +827,7 @@
       psInfo->width  = MulDiv((rc.right - rc.left),4,units.left);
   }
 
-  SendMessageA(hwndTabCtrl, TCM_ADJUSTRECT, TRUE, (LPARAM)&rc);
+  SendMessageW(hwndTabCtrl, TCM_ADJUSTRECT, TRUE, (LPARAM)&rc);
 
   tabOffsetX = -(rc.left);
   tabOffsetY = -(rc.top);
@@ -884,7 +1172,7 @@
   }
   else
   {
-    if (psInfo->ppshheader.dwFlags & PSH_WIZARD)
+    if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
     {
 	idButton = IDC_NEXT_BUTTON;
     }
@@ -931,14 +1219,12 @@
                                        PropSheetInfo * psInfo)
 {
   HWND hwndTabCtrl = GetDlgItem(hwndParent, IDC_TABCONTROL);
-  TCITEMA item;
+  TCITEMW item;
   int i, nTabs;
   int iImage = 0;
-  char tabtext[MAX_TABTEXT_LENGTH] = "Tab text";
 
   TRACE("\n");
   item.mask = TCIF_TEXT;
-  item.pszText = tabtext;
   item.cchTextMax = MAX_TABTEXT_LENGTH;
 
   nTabs = psInfo->nPages;
@@ -948,7 +1234,7 @@
    */
   if (psInfo->hImageList)
   {
-    SendMessageA(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList);
+    SendMessageW(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList);
   }
 
   for (i = 0; i < nTabs; i++)
@@ -963,11 +1249,8 @@
       item.mask &= ~TCIF_IMAGE;
     }
 
-    WideCharToMultiByte(CP_ACP, 0,
-                        (LPCWSTR)psInfo->proppage[i].pszText,
-                        -1, tabtext, MAX_TABTEXT_LENGTH, NULL, NULL);
-
-    SendMessageA(hwndTabCtrl, TCM_INSERTITEMA, (WPARAM)i, (LPARAM)&item);
+    item.pszText = (LPWSTR) psInfo->proppage[i].pszText;
+    SendMessageW(hwndTabCtrl, TCM_INSERTITEMW, (WPARAM)i, (LPARAM)&item);
   }
 
   return TRUE;
@@ -981,7 +1264,7 @@
 static BOOL PROPSHEET_CreatePage(HWND hwndParent,
                                 int index,
                                 const PropSheetInfo * psInfo,
-                                LPCPROPSHEETPAGEA ppshpage)
+                                LPCPROPSHEETPAGEW ppshpage)
 {
   DLGTEMPLATE* pTemplate;
   HWND hwndPage;
@@ -1001,9 +1284,9 @@
     HRSRC hResource;
     HANDLE hTemplate;
 
-    hResource = FindResourceA(ppshpage->hInstance,
+    hResource = FindResourceW(ppshpage->hInstance,
                                     ppshpage->u.pszTemplate,
-                                    RT_DIALOGA);
+                                    RT_DIALOGW);
     if(!hResource)
 	return FALSE;
 
@@ -1013,7 +1296,7 @@
     if(!hTemplate)
 	return FALSE;
 
-    pTemplate = (LPDLGTEMPLATEA)LockResource(hTemplate);
+    pTemplate = (LPDLGTEMPLATEW)LockResource(hTemplate);
     /*
      * Make a copy of the dialog template to make it writable
      */
@@ -1049,9 +1332,9 @@
   if (psInfo->proppage[index].useCallback)
     (*(ppshpage->pfnCallback))(hwndParent,
                                PSPCB_CREATE,
-                               (LPPROPSHEETPAGEA)ppshpage);
+                               (LPPROPSHEETPAGEW)ppshpage);
 
-  hwndPage = CreateDialogIndirectParamA(ppshpage->hInstance,
+  hwndPage = CreateDialogIndirectParamW(ppshpage->hInstance,
 					pTemplate,
 					hwndParent,
 					ppshpage->pfnDlgProc,
@@ -1072,7 +1355,7 @@
   pageWidth = rc.right - rc.left;
   pageHeight = rc.bottom - rc.top;
 
-  if (psInfo->ppshheader.dwFlags & PSH_WIZARD)
+  if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
     padding = PROPSHEET_GetPaddingInfoWizard(hwndParent, psInfo);
   else
   {
@@ -1081,7 +1364,7 @@
      */
 
     HWND hwndTabCtrl = GetDlgItem(hwndParent, IDC_TABCONTROL);
-    SendMessageA(hwndTabCtrl, TCM_ADJUSTRECT, FALSE, (LPARAM)&rc);
+    SendMessageW(hwndTabCtrl, TCM_ADJUSTRECT, FALSE, (LPARAM)&rc);
     padding = PROPSHEET_GetPaddingInfo(hwndParent);
   }
 
@@ -1112,9 +1395,9 @@
 
   if (psInfo->proppage[index].hwndPage == 0)
   {
-     LPCPROPSHEETPAGEA ppshpage;
+     LPCPROPSHEETPAGEW ppshpage;
 
-     ppshpage = (LPCPROPSHEETPAGEA)psInfo->proppage[index].hpage;
+     ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[index].hpage;
      PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage);
   }
 
@@ -1126,7 +1409,7 @@
   /* Synchronize current selection with tab control
    * It seems to be needed even in case of PSH_WIZARD (no tab controls there) */
   hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
-  SendMessageA(hwndTabCtrl, TCM_SETCURSEL, index, 0);
+  SendMessageW(hwndTabCtrl, TCM_SETCURSEL, index, 0);
 
   psInfo->active_page = index;
   psInfo->activeValid = TRUE;
@@ -1142,7 +1425,7 @@
   BOOL res;
   PSHNOTIFY psn;
   HWND hwndPage;
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
   LRESULT result;
 
@@ -1157,7 +1440,7 @@
  
   hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
 
-  result = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
+  result = SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
   if (result == -1)
     return FALSE;
 
@@ -1181,7 +1464,7 @@
   PSHNOTIFY psn;
   HWND hwndPage;
   LRESULT msgResult = 0;
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
 
   TRACE("active_page %d\n", psInfo->active_page);
@@ -1215,7 +1498,7 @@
   PSHNOTIFY psn;
   HWND hwndPage;
   LRESULT msgResult = 0;
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
 
   TRACE("active_page %d\n", psInfo->active_page);
@@ -1229,7 +1512,7 @@
  
   hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
 
-  msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
+  msgResult = SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
 
   TRACE("msg result %ld\n", msgResult);
 
@@ -1253,7 +1536,7 @@
   HWND hwndPage;
   PSHNOTIFY psn;
   LRESULT msgResult;
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
 
   TRACE("active_page %d\n", psInfo->active_page);
@@ -1312,7 +1595,7 @@
  */
 static void PROPSHEET_Cancel(HWND hwndDlg, LPARAM lParam)
 {
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
   HWND hwndPage;
   PSHNOTIFY psn;
@@ -1356,7 +1639,7 @@
  */
 static void PROPSHEET_Help(HWND hwndDlg)
 {
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
   HWND hwndPage;
   PSHNOTIFY psn;
@@ -1380,7 +1663,7 @@
 static void PROPSHEET_Changed(HWND hwndDlg, HWND hwndDirtyPage)
 {
   int i;
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
 
   TRACE("\n");
@@ -1413,7 +1696,7 @@
   int i;
   BOOL noPageDirty = TRUE;
   HWND hwndApplyBtn = GetDlgItem(hwndDlg, IDC_APPLY_BUTTON);
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
 
   TRACE("\n");
@@ -1445,25 +1728,25 @@
   switch (buttonID)
   {
     case PSBTN_APPLYNOW:
-      SendMessageA(hwndDlg, WM_COMMAND, IDC_APPLY_BUTTON, 0);
+      PROPSHEET_DoCommand(hwndDlg, IDC_APPLY_BUTTON);
       break;
     case PSBTN_BACK:
       PROPSHEET_Back(hwndDlg);
       break;
     case PSBTN_CANCEL:
-      SendMessageA(hwndDlg, WM_COMMAND, IDCANCEL, 0);
+      PROPSHEET_DoCommand(hwndDlg, IDCANCEL);
       break;
     case PSBTN_FINISH:
       PROPSHEET_Finish(hwndDlg);
       break;
     case PSBTN_HELP:
-      SendMessageA(hwndDlg, WM_COMMAND, IDHELP, 0);
+      PROPSHEET_DoCommand(hwndDlg, IDHELP);
       break;
     case PSBTN_NEXT:
       PROPSHEET_Next(hwndDlg);
       break;
     case PSBTN_OK:
-      SendMessageA(hwndDlg, WM_COMMAND, IDOK, 0);
+      PROPSHEET_DoCommand(hwndDlg, IDOK);
       break;
     default:
       FIXME("Invalid button index %d\n", buttonID);
@@ -1486,7 +1769,7 @@
  */
 static BOOL PROPSHEET_CanSetCurSel(HWND hwndDlg)
 {
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
   HWND hwndPage;
   PSHNOTIFY psn;
@@ -1530,7 +1813,7 @@
                                 HPROPSHEETPAGE hpage
 				)
 {
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg, PropSheetInfoStr);
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg, PropSheetInfoStr);
   HWND hwndHelp  = GetDlgItem(hwndDlg, IDHELP);
 
   TRACE("index %d, skipdir %d, hpage %p\n", index, skipdir, hpage);
@@ -1554,11 +1837,11 @@
     psn.lParam       = 0;
 
     if (!psInfo->proppage[index].hwndPage) {
-      LPCPROPSHEETPAGEA ppshpage = (LPCPROPSHEETPAGEA)psInfo->proppage[index].hpage;
+      LPCPROPSHEETPAGEW ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[index].hpage;
       PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage);
     }
 
-    result = SendMessageA(psInfo->proppage[index].hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
+    result = SendMessageW(psInfo->proppage[index].hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
     if (!result)
       break;
     if (result == -1) {
@@ -1593,31 +1876,49 @@
  */
 static void PROPSHEET_SetTitleA(HWND hwndDlg, DWORD dwStyle, LPCSTR lpszText)
 {
-  PropSheetInfo*	psInfo = (PropSheetInfo*) GetPropA(hwndDlg, PropSheetInfoStr);
-  char 				szTitle[256];
+  if(HIWORD(lpszText))
+  {
+     WCHAR szTitle[256];
+     MultiByteToWideChar(CP_ACP, 0, lpszText, -1, 
+			     szTitle, sizeof szTitle);
+     PROPSHEET_SetTitleW(hwndDlg, dwStyle, szTitle);
+  }
+  else
+  {
+     PROPSHEET_SetTitleW(hwndDlg, dwStyle, (LPCWSTR)lpszText);
+  }
+}
 
-  TRACE("'%s' (style %08lx)\n", lpszText, dwStyle);
+/******************************************************************************
+ *            PROPSHEET_SetTitleW
+ */
+static void PROPSHEET_SetTitleW(HWND hwndDlg, DWORD dwStyle, LPCWSTR lpszText)
+{
+  PropSheetInfo*	psInfo = (PropSheetInfo*) GetPropW(hwndDlg, PropSheetInfoStr);
+  WCHAR			szTitle[256];
+
+  TRACE("'%s' (style %08lx)\n", debugstr_w(lpszText), dwStyle);
   if (HIWORD(lpszText) == 0) {
-    if (!LoadStringA(psInfo->ppshheader.hInstance, 
-                     LOWORD(lpszText), szTitle, sizeof(szTitle)-1))
+    if (!LoadStringW(psInfo->ppshheader.hInstance, 
+                     LOWORD(lpszText), szTitle, sizeof(szTitle)-sizeof(WCHAR)))
       return;
     lpszText = szTitle;
   }
   if (dwStyle & PSH_PROPTITLE)
   {
-    char* dest;
-    int lentitle = strlen(lpszText);
-    int lenprop  = strlen(psInfo->strPropertiesFor);
+    WCHAR* dest;
+    int lentitle = strlenW(lpszText);
+    int lenprop  = strlenW(psInfo->strPropertiesFor);
 
-    dest = COMCTL32_Alloc(lentitle + lenprop + 1);
-    strcpy(dest, psInfo->strPropertiesFor);
-    strcat(dest, lpszText);
+    dest = COMCTL32_Alloc( (lentitle + lenprop + 1)*sizeof (WCHAR));
+    strcpyW(dest, psInfo->strPropertiesFor);
+    strcatW(dest, lpszText);
 
-    SetWindowTextA(hwndDlg, dest);
+    SetWindowTextW(hwndDlg, dest);
     COMCTL32_Free(dest);
   }
   else
-    SetWindowTextA(hwndDlg, lpszText);
+    SetWindowTextW(hwndDlg, lpszText);
 }
 
 /******************************************************************************
@@ -1646,6 +1947,31 @@
 }
 
 /******************************************************************************
+ *            PROPSHEET_SetFinishTextW
+ */
+static void PROPSHEET_SetFinishTextW(HWND hwndDlg, LPCWSTR lpszText)
+{
+  HWND hwndButton = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
+
+  TRACE("'%s'\n", debugstr_w(lpszText));
+  /* Set text, show and enable the Finish button */
+  SetWindowTextW(hwndButton, lpszText);
+  ShowWindow(hwndButton, SW_SHOW);
+  EnableWindow(hwndButton, TRUE);
+
+  /* Make it default pushbutton */
+  SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);
+
+  /* Hide Back button */
+  hwndButton = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
+  ShowWindow(hwndButton, SW_HIDE);
+
+  /* Hide Next button */
+  hwndButton = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
+  ShowWindow(hwndButton, SW_HIDE);
+}
+
+/******************************************************************************
  *            PROPSHEET_QuerySiblings
  */
 static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg,
@@ -1654,7 +1980,7 @@
   int i = 0;
   HWND hwndPage;
   LRESULT msgResult = 0;
-  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                     PropSheetInfoStr);
 
   while ((i < psInfo->nPages) && (msgResult == 0))
@@ -1674,12 +2000,11 @@
 static BOOL PROPSHEET_AddPage(HWND hwndDlg,
                               HPROPSHEETPAGE hpage)
 {
-  PropSheetInfo * psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo * psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                      PropSheetInfoStr);
   HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
-  TCITEMA item;
-  char tabtext[MAX_TABTEXT_LENGTH] = "Tab text";
-  LPCPROPSHEETPAGEA ppsp = (LPCPROPSHEETPAGEA)hpage;
+  TCITEMW item;
+  LPCPROPSHEETPAGEW ppsp = (LPCPROPSHEETPAGEW)hpage;
 
   TRACE("hpage %p\n", hpage);
   /*
@@ -1688,7 +2013,7 @@
   psInfo->proppage = (PropPageInfo*) COMCTL32_ReAlloc(psInfo->proppage,
                                                       sizeof(PropPageInfo) *
                                                       (psInfo->nPages + 1));
-  if (!PROPSHEET_CollectPageInfo(ppsp, psInfo, psInfo->nPages))
+  if (!PROPSHEET_CollectPageInfoW(ppsp, psInfo, psInfo->nPages))
       return FALSE;
 
   psInfo->proppage[psInfo->nPages].hpage = hpage;
@@ -1703,14 +2028,10 @@
    * Add a new tab to the tab control.
    */
   item.mask = TCIF_TEXT;
-  item.pszText = tabtext;
+  item.pszText = (LPWSTR) psInfo->proppage[psInfo->nPages].pszText;
   item.cchTextMax = MAX_TABTEXT_LENGTH;
 
-  WideCharToMultiByte(CP_ACP, 0,
-                      (LPCWSTR)psInfo->proppage[psInfo->nPages].pszText,
-                      -1, tabtext, MAX_TABTEXT_LENGTH, NULL, NULL);
-
-  SendMessageA(hwndTabControl, TCM_INSERTITEMA, psInfo->nPages + 1,
+  SendMessageW(hwndTabControl, TCM_INSERTITEMW, psInfo->nPages + 1,
                (LPARAM)&item);
 
   psInfo->nPages++;
@@ -1728,7 +2049,7 @@
                                  int index,
                                  HPROPSHEETPAGE hpage)
 {
-  PropSheetInfo * psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
+  PropSheetInfo * psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
                                                      PropSheetInfoStr);
   HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
   PropPageInfo* oldPages;
@@ -1793,7 +2114,7 @@
   /* Free page resources */
   if(psInfo->proppage[index].hpage)
   {
-     PROPSHEETPAGEA* psp = (PROPSHEETPAGEA*)psInfo->proppage[index].hpage;
+     PROPSHEETPAGEW* psp = (PROPSHEETPAGEW*)psInfo->proppage[index].hpage;
 
      if ((psp->dwFlags & PSP_USETITLE) && psInfo->proppage[index].pszText)
         HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->proppage[index].pszText);
@@ -1802,7 +2123,7 @@
   }
  
   /* Remove the tab */
-  SendMessageA(hwndTabControl, TCM_DELETEITEM, index, 0);
+  SendMessageW(hwndTabControl, TCM_DELETEITEM, index, 0);
 
   psInfo->nPages--;
   psInfo->proppage = COMCTL32_Alloc(sizeof(PropPageInfo) * psInfo->nPages);
@@ -1903,7 +2224,7 @@
 static void PROPSHEET_CleanUp(HWND hwndDlg)
 {
   int i;
-  PropSheetInfo* psInfo = (PropSheetInfo*) RemovePropA(hwndDlg,
+  PropSheetInfo* psInfo = (PropSheetInfo*) RemovePropW(hwndDlg,
                                                        PropSheetInfoStr);
 
   TRACE("\n");
@@ -1946,7 +2267,9 @@
   int i, n;
   BYTE* pByte;
 
-  PROPSHEET_CollectSheetInfo(lppsh, psInfo);
+  TRACE("(%p)\n", lppsh);
+
+  PROPSHEET_CollectSheetInfoA(lppsh, psInfo);
 
   psInfo->proppage = (PropPageInfo*) COMCTL32_Alloc(sizeof(PropPageInfo) *
                                                     lppsh->nPages);
@@ -1962,7 +2285,7 @@
        pByte += ((LPPROPSHEETPAGEA)pByte)->dwSize;
     }
 
-    if (!PROPSHEET_CollectPageInfo((LPCPROPSHEETPAGEA)psInfo->proppage[n].hpage,
+    if (!PROPSHEET_CollectPageInfoA((LPCPROPSHEETPAGEA)psInfo->proppage[n].hpage,
                                psInfo, n))
     {
 	if (lppsh->dwFlags & PSH_PROPSHEETPAGE)
@@ -1980,11 +2303,45 @@
 /******************************************************************************
  *            PropertySheetW   (COMCTL32.89)
  */
-INT WINAPI PropertySheetW(LPCPROPSHEETHEADERW propertySheetHeader)
+INT WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
 {
-    FIXME("(%p): stub\n", propertySheetHeader);
+  int bRet = 0;
+  PropSheetInfo* psInfo = (PropSheetInfo*) GlobalAlloc(GPTR,
+                                                       sizeof(PropSheetInfo));
+  int i, n;
+  BYTE* pByte;
 
-    return -1;
+  TRACE("(%p)\n", lppsh);
+
+  PROPSHEET_CollectSheetInfoW(lppsh, psInfo);
+
+  psInfo->proppage = (PropPageInfo*) COMCTL32_Alloc(sizeof(PropPageInfo) *
+                                                    lppsh->nPages);
+  pByte = (BYTE*) psInfo->ppshheader.u3.ppsp;
+
+  for (n = i = 0; i < lppsh->nPages; i++, n++)
+  {
+    if (!(lppsh->dwFlags & PSH_PROPSHEETPAGE))
+      psInfo->proppage[n].hpage = psInfo->ppshheader.u3.phpage[i];
+    else
+    {
+       psInfo->proppage[n].hpage = CreatePropertySheetPageW((LPCPROPSHEETPAGEW)pByte);
+       pByte += ((LPPROPSHEETPAGEW)pByte)->dwSize;
+    }
+
+    if (!PROPSHEET_CollectPageInfoW((LPCPROPSHEETPAGEW)psInfo->proppage[n].hpage,
+                               psInfo, n))
+    {
+	if (lppsh->dwFlags & PSH_PROPSHEETPAGE)
+	    DestroyPropertySheetPage(psInfo->proppage[n].hpage);
+	n--;
+	psInfo->nPages--;
+    }
+  }
+
+  bRet = PROPSHEET_CreateDialog(psInfo);
+
+  return bRet;
 }
 
 /******************************************************************************
@@ -2025,9 +2382,34 @@
  */
 HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
 {
-    FIXME("(%p): stub\n", lpPropSheetPage);
+  PROPSHEETPAGEW* ppsp = COMCTL32_Alloc(sizeof(PROPSHEETPAGEW));
 
-    return 0;
+  memcpy(ppsp,lpPropSheetPage,min(lpPropSheetPage->dwSize,sizeof(PROPSHEETPAGEW)));
+
+  if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) && HIWORD( ppsp->u.pszTemplate ) )
+  {
+    int len = strlenW(lpPropSheetPage->u.pszTemplate);
+
+    ppsp->u.pszTemplate = HeapAlloc( GetProcessHeap(),0,(len+1)*sizeof (WCHAR) );
+    strcpyW( (WCHAR *)ppsp->u.pszTemplate, lpPropSheetPage->u.pszTemplate );
+  }
+  if ( (ppsp->dwFlags & PSP_USEICONID) && HIWORD( ppsp->u2.pszIcon ) )
+  {
+      int len = strlenW(lpPropSheetPage->u2.pszIcon);
+      ppsp->u2.pszIcon = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof (WCHAR) );
+      strcpyW( (WCHAR *)ppsp->u2.pszIcon, lpPropSheetPage->u2.pszIcon );
+  }
+
+  if ((ppsp->dwFlags & PSP_USETITLE) && HIWORD( ppsp->pszTitle ))
+  {
+      int len = strlenW(lpPropSheetPage->pszTitle);
+      ppsp->pszTitle = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof (WCHAR) );
+      strcpyW( (WCHAR *)ppsp->pszTitle, lpPropSheetPage->pszTitle );
+  }
+  else if ( !(ppsp->dwFlags & PSP_USETITLE) )
+      ppsp->pszTitle = NULL;
+
+  return (HPROPSHEETPAGE)ppsp;
 }
 
 /******************************************************************************
@@ -2035,7 +2417,7 @@
  */
 BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
 {
-  PROPSHEETPAGEA *psp = (PROPSHEETPAGEA *)hPropPage;
+  PROPSHEETPAGEW *psp = (PROPSHEETPAGEW *)hPropPage;
 
   if (!psp)
      return FALSE;
@@ -2059,7 +2441,7 @@
  */
 static BOOL PROPSHEET_IsDialogMessage(HWND hwnd, LPMSG lpMsg)
 {
-   PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd, PropSheetInfoStr);
+   PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd, PropSheetInfoStr);
 
    TRACE("\n");
    if (!psInfo || (hwnd != lpMsg->hwnd && !IsChild(hwnd, lpMsg->hwnd)))
@@ -2108,22 +2490,89 @@
 }
 
 /******************************************************************************
+ *            PROPSHEET_DoCommand
+ */
+static BOOL PROPSHEET_DoCommand(HWND hwnd, WORD wID)
+{
+
+    switch (wID) {
+
+    case IDOK:
+    case IDC_APPLY_BUTTON:
+	{
+	    HWND hwndApplyBtn = GetDlgItem(hwnd, IDC_APPLY_BUTTON);
+
+	    if (PROPSHEET_Apply(hwnd, wID == IDOK ? 1: 0) == FALSE)
+		break;
+
+	    if (wID == IDOK)
+		{
+		    PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd,
+								      PropSheetInfoStr);
+		    int result = TRUE;
+
+		    if (psInfo->restartWindows)
+			result = ID_PSRESTARTWINDOWS;
+
+		    /* reboot system takes precedence over restart windows */
+		    if (psInfo->rebootSystem)
+			result = ID_PSREBOOTSYSTEM;
+
+		    if (psInfo->isModeless)
+			psInfo->activeValid = FALSE;
+		    else
+			EndDialog(hwnd, result);
+		}
+	    else
+		EnableWindow(hwndApplyBtn, FALSE);
+
+	    break;
+	}
+
+    case IDC_BACK_BUTTON:
+	PROPSHEET_Back(hwnd);
+	break;
+
+    case IDC_NEXT_BUTTON:
+	PROPSHEET_Next(hwnd);
+	break;
+
+    case IDC_FINISH_BUTTON:
+	PROPSHEET_Finish(hwnd);
+	break;
+
+    case IDCANCEL:
+	PROPSHEET_Cancel(hwnd, 0);
+	break;
+
+    case IDHELP:
+	PROPSHEET_Help(hwnd);
+	break;
+    }
+
+    return TRUE;
+}
+
+/******************************************************************************
  *            PROPSHEET_DialogProc
  */
 BOOL WINAPI
 PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
+  TRACE("hwnd=%x msg=%x wparam=%x lparam=%lx\n", 
+	hwnd, uMsg, wParam, lParam);
+
   switch (uMsg)
   {
     case WM_INITDIALOG:
     {
       PropSheetInfo* psInfo = (PropSheetInfo*) lParam;
-      char* strCaption = (char*)COMCTL32_Alloc(MAX_CAPTION_LENGTH);
+      WCHAR* strCaption = (WCHAR*)COMCTL32_Alloc(MAX_CAPTION_LENGTH*sizeof(WCHAR));
       HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL);
-      LPCPROPSHEETPAGEA ppshpage;
+      LPCPROPSHEETPAGEW ppshpage;
       int idx;
 
-      SetPropA(hwnd, PropSheetInfoStr, (HANDLE)psInfo);
+      SetPropW(hwnd, PropSheetInfoStr, (HANDLE)psInfo);
 
       /*
        * psInfo->hwnd is not being used by WINE code - it exists 
@@ -2132,7 +2581,7 @@
        * property.
        */
       psInfo->hwnd = hwnd;
-      SetWindowLongA(hwnd,DWL_USER,(LONG)psInfo);
+      SetWindowLongW(hwnd,DWL_USER,(LONG)psInfo);
 
       /*
        * Small icon in the title bar.
@@ -2145,7 +2594,7 @@
         int icon_cy = GetSystemMetrics(SM_CYSMICON);
 
         if (psInfo->ppshheader.dwFlags & PSH_USEICONID)
-          hIcon = LoadImageA(psInfo->ppshheader.hInstance,
+          hIcon = LoadImageW(psInfo->ppshheader.hInstance,
                              psInfo->ppshheader.u.pszIcon,
                              IMAGE_ICON,
                              icon_cx, icon_cy,
@@ -2153,19 +2602,19 @@
         else
           hIcon = psInfo->ppshheader.u.hIcon;
 
-        SendMessageA(hwnd, WM_SETICON, 0, hIcon);
+        SendMessageW(hwnd, WM_SETICON, 0, hIcon);
       }
       
       if (psInfo->ppshheader.dwFlags & PSH_USEHICON)
-        SendMessageA(hwnd, WM_SETICON, 0, psInfo->ppshheader.u.hIcon);
+        SendMessageW(hwnd, WM_SETICON, 0, psInfo->ppshheader.u.hIcon);
 
       psInfo->strPropertiesFor = strCaption;
 
-      GetWindowTextA(hwnd, psInfo->strPropertiesFor, MAX_CAPTION_LENGTH);
+      GetWindowTextW(hwnd, psInfo->strPropertiesFor, MAX_CAPTION_LENGTH);
 
       PROPSHEET_CreateTabControl(hwnd, psInfo);
 
-      if (psInfo->ppshheader.dwFlags & PSH_WIZARD)
+      if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
       {
         if (PROPSHEET_IsTooSmallWizard(hwnd, psInfo))
         {
@@ -2187,7 +2636,7 @@
 					      PSCB_INITIALIZED, (LPARAM)0); 
 
       idx = psInfo->active_page;
-      ppshpage = (LPCPROPSHEETPAGEA)psInfo->proppage[idx].hpage;
+      ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[idx].hpage;
       psInfo->active_page = -1;
  
       PROPSHEET_SetCurSel(hwnd, idx, 1, psInfo->proppage[idx].hpage);
@@ -2195,20 +2644,20 @@
       /* doing TCM_SETCURSEL seems to be needed even in case of PSH_WIZARD,
        * as some programs call TCM_GETCURSEL to get the current selection
        * from which to switch to the next page */
-      SendMessageA(hwndTabCtrl, TCM_SETCURSEL, psInfo->active_page, 0);
+      SendMessageW(hwndTabCtrl, TCM_SETCURSEL, psInfo->active_page, 0);
 
       if (!HIWORD(psInfo->ppshheader.pszCaption) &&
               psInfo->ppshheader.hInstance)
       {
-         char szText[256];
+         WCHAR szText[256];
 
-         if (LoadStringA(psInfo->ppshheader.hInstance, 
+         if (LoadStringW(psInfo->ppshheader.hInstance, 
                  (UINT)psInfo->ppshheader.pszCaption, szText, 255))
-            PROPSHEET_SetTitleA(hwnd, psInfo->ppshheader.dwFlags, szText);
+            PROPSHEET_SetTitleW(hwnd, psInfo->ppshheader.dwFlags, szText);
       }
       else
       {
-         PROPSHEET_SetTitleA(hwnd, psInfo->ppshheader.dwFlags,
+         PROPSHEET_SetTitleW(hwnd, psInfo->ppshheader.dwFlags,
                          psInfo->ppshheader.pszCaption);
       }
 
@@ -2224,66 +2673,7 @@
       return TRUE;
 
     case WM_COMMAND:
-    {
-      WORD wID = LOWORD(wParam);
-
-      switch (wID)
-      {
-        case IDOK:
-        case IDC_APPLY_BUTTON:
-        {
-          HWND hwndApplyBtn = GetDlgItem(hwnd, IDC_APPLY_BUTTON);
-
-          if (PROPSHEET_Apply(hwnd, wID == IDOK ? 1: 0) == FALSE)
-            break;
-
-          if (wID == IDOK)
-          {
-            PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd,
-                                                            PropSheetInfoStr);
-            int result = TRUE;
-
-            if (psInfo->restartWindows)
-              result = ID_PSRESTARTWINDOWS;
-
-            /* reboot system takes precedence over restart windows */
-            if (psInfo->rebootSystem)
-              result = ID_PSREBOOTSYSTEM;
-
-            if (psInfo->isModeless)
-              psInfo->activeValid = FALSE;
-            else
-              EndDialog(hwnd, result);
-          }
-          else
-             EnableWindow(hwndApplyBtn, FALSE);
-
-          break;
-        }
-
-        case IDC_BACK_BUTTON:
-          PROPSHEET_Back(hwnd);
-          break;
-
-        case IDC_NEXT_BUTTON:
-          PROPSHEET_Next(hwnd);
-          break;
-
-        case IDC_FINISH_BUTTON:
-          PROPSHEET_Finish(hwnd);
-          break;
-
-        case IDCANCEL:
-          PROPSHEET_Cancel(hwnd, 0);
-          break;
-
-        case IDHELP:
-          PROPSHEET_Help(hwnd);
-          break;
-      }
-
-      return TRUE;
-    }
+      return PROPSHEET_DoCommand(hwnd, LOWORD(wParam));
 
     case WM_NOTIFY:
     {
@@ -2291,14 +2681,14 @@
 
       if (pnmh->code == TCN_SELCHANGE)
       {
-        int index = SendMessageA(pnmh->hwndFrom, TCM_GETCURSEL, 0, 0);
+        int index = SendMessageW(pnmh->hwndFrom, TCM_GETCURSEL, 0, 0);
         PROPSHEET_SetCurSel(hwnd, index, 1, 0);
       }
 
       if(pnmh->code == TCN_SELCHANGING)
       {
         BOOL bRet = PROPSHEET_CanSetCurSel(hwnd);
-        SetWindowLongA(hwnd, DWL_MSGRESULT, !bRet);
+        SetWindowLongW(hwnd, DWL_MSGRESULT, !bRet);
         return TRUE;
       }
 
@@ -2307,14 +2697,14 @@
 
     case PSM_GETCURRENTPAGEHWND:
     {
-      PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd,
+      PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd,
                                                         PropSheetInfoStr);
       HWND hwndPage = 0;
 
       if (psInfo->activeValid && psInfo->active_page != -1)
         hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
 
-      SetWindowLongA(hwnd, DWL_MSGRESULT, hwndPage);
+      SetWindowLongW(hwnd, DWL_MSGRESULT, hwndPage);
 
       return TRUE;
     }
@@ -2331,7 +2721,7 @@
     {
       HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL);
 
-      SetWindowLongA(hwnd, DWL_MSGRESULT, hwndTabCtrl);
+      SetWindowLongW(hwnd, DWL_MSGRESULT, hwndTabCtrl);
 
       return TRUE;
     }
@@ -2349,27 +2739,27 @@
                                        (HPROPSHEETPAGE)lParam);
       }
 
-      SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
+      SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
 
       return TRUE;
     }
 
     case PSM_CANCELTOCLOSE:
     {
-      char buf[MAX_BUTTONTEXT_LENGTH];
+      WCHAR buf[MAX_BUTTONTEXT_LENGTH];
       HWND hwndOK = GetDlgItem(hwnd, IDOK);
       HWND hwndCancel = GetDlgItem(hwnd, IDCANCEL);
 
       EnableWindow(hwndCancel, FALSE);
-      if (LoadStringA(COMCTL32_hModule, IDS_CLOSE, buf, sizeof(buf)))
-         SetWindowTextA(hwndOK, buf);
+      if (LoadStringW(COMCTL32_hModule, IDS_CLOSE, buf, sizeof(buf)))
+         SetWindowTextW(hwndOK, buf);
  
       return FALSE;
     }
 
     case PSM_RESTARTWINDOWS:
     {
-      PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd,
+      PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd,
                                                         PropSheetInfoStr);
 
       psInfo->restartWindows = TRUE;
@@ -2378,7 +2768,7 @@
 
     case PSM_REBOOTSYSTEM:
     {
-      PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd, 
+      PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwnd, 
                                                         PropSheetInfoStr);
 
       psInfo->rebootSystem = TRUE;
@@ -2388,12 +2778,16 @@
     case PSM_SETTITLEA:
       PROPSHEET_SetTitleA(hwnd, (DWORD) wParam, (LPCSTR) lParam);
       return TRUE;
+   
+    case PSM_SETTITLEW:
+      PROPSHEET_SetTitleW(hwnd, (DWORD) wParam, (LPCWSTR) lParam);
+      return TRUE;
 
     case PSM_APPLY:
     {
       BOOL msgResult = PROPSHEET_Apply(hwnd, 0);
 
-      SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
+      SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
 
       return TRUE;
     }
@@ -2402,7 +2796,7 @@
     {
       LRESULT msgResult = PROPSHEET_QuerySiblings(hwnd, wParam, lParam);
 
-      SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
+      SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
 
       return TRUE;
     }
@@ -2419,7 +2813,7 @@
 
       BOOL msgResult = PROPSHEET_AddPage(hwnd, (HPROPSHEETPAGE)lParam);
 
-      SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
+      SetWindowLongW(hwnd, DWL_MSGRESULT, msgResult);
 
       return TRUE;
     }
@@ -2447,16 +2841,12 @@
       PROPSHEET_SetWizButtons(hwnd, (DWORD)lParam);
       return TRUE;
 
-    case PSM_SETTITLEW:
-        FIXME("Unimplemented msg PSM_SETTITLE32W\n");
-        return FALSE;
-
     case PSM_SETCURSELID:
         FIXME("Unimplemented msg PSM_SETCURSELID\n");
         return FALSE;
 
     case PSM_SETFINISHTEXTW:
-        FIXME("Unimplemented msg PSM_SETFINISHTEXT32W\n");
+        PROPSHEET_SetFinishTextW(hwnd, (LPCWSTR) lParam);        
         return FALSE;
 
     default:
diff --git a/include/prsht.h b/include/prsht.h
index 6f37b9f..0c7b410 100644
--- a/include/prsht.h
+++ b/include/prsht.h
@@ -136,8 +136,8 @@
     union
     {
       HICON                  hIcon;
-      LPCSTR                   pszIcon;
-    }DUMMYUNIONNAME1;
+      LPCWSTR                   pszIcon;
+    }DUMMYUNIONNAME;
     LPCWSTR                  pszCaption;
     UINT                   nPages;
     union
@@ -218,6 +218,7 @@
 #define PSH_USEHICON            0x0002
 #define PSH_USEICONID           0x0004
 #define PSH_PROPSHEETPAGE       0x0008
+#define PSH_WIZARDHASFINISH     0x0010
 #define PSH_WIZARD              0x0020
 #define PSH_USEPSTARTPAGE       0x0040
 #define PSH_NOAPPLYNOW          0x0080
@@ -227,7 +228,10 @@
 #define PSH_RTLREADING          0x0800
 #define PSH_WIZARDCONTEXTHELP   0x00001000
 
-#define PSH_WIZARD97            0x00002000  
+     /*
+      * for below IE 5 
+      * PSH_WIZARD97            0x00002000
+      */
 #define PSH_WATERMARK           0x00008000
 #define PSH_USEHBMWATERMARK     0x00010000
 #define PSH_USEHPLWATERMARK     0x00020000
@@ -235,7 +239,13 @@
 #define PSH_HEADER              0x00080000
 #define PSH_USEHBMHEADER        0x00100000
 #define PSH_USEPAGELANG         0x00200000
- 
+#define PSH_WIZARD_LITE         0x00400000
+     /*
+      * for IE 5 and above
+      * PSH_WIZARD97            0x01000000
+      */
+#define PSH_NOCONTEXTHELP       0x02000000
+
 #define PSCB_INITIALIZED  1
 #define PSCB_PRECREATE    2
 
