Added Unicode support (at least partially).

diff --git a/dlls/comctl32/header.c b/dlls/comctl32/header.c
index 0abbed8..50edfa4 100644
--- a/dlls/comctl32/header.c
+++ b/dlls/comctl32/header.c
@@ -130,7 +130,7 @@
 	    GetObject32A (phdi->hbm, sizeof(BITMAP32), (LPVOID)&bmp);
 
 	    textRect = r;
-            DrawText32A(hdc, phdi->pszText, lstrlen32A(phdi->pszText),
+            DrawText32W (hdc, phdi->pszText, lstrlen32W (phdi->pszText),
 	   	  &textRect, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_CALCRECT);
 	    tx = textRect.right - textRect.left;
 	    ry = r.bottom - r.top;
@@ -182,7 +182,7 @@
             r.left += 3;
 	    r.right -= 3;
 	    SetTextColor32 (hdc, bHotTrack ? COLOR_HIGHLIGHT : COLOR_BTNTEXT);
-            DrawText32A(hdc, phdi->pszText, lstrlen32A(phdi->pszText),
+            DrawText32W (hdc, phdi->pszText, lstrlen32W (phdi->pszText),
 	   	  &r, uTextJustify|DT_VCENTER|DT_SINGLELINE);
             if (oldBkMode != TRANSPARENT)
                 SetBkMode32(hdc, oldBkMode);
@@ -591,8 +591,8 @@
 	phdi->lParam = lpItem->lParam;
 
     if (phdi->mask & HDI_TEXT) {
-	if (lpItem->pszText != LPSTR_TEXTCALLBACK32A)
-	    lstrcpyn32A (phdi->pszText, lpItem->pszText, phdi->cchTextMax);
+	if (lpItem->pszText != LPSTR_TEXTCALLBACK32W)
+	    lstrcpynWtoA (phdi->pszText, lpItem->pszText, phdi->cchTextMax);
 	else
 	    phdi->pszText = LPSTR_TEXTCALLBACK32A;
     }
@@ -608,11 +608,58 @@
 
 
 static LRESULT
+HEADER_GetItem32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
+    HDITEM32W   *phdi = (HDITEM32W*)lParam;
+    INT32       nItem = (INT32)wParam;
+    HEADER_ITEM *lpItem;
+
+    if (!phdi)
+	return FALSE;
+    if ((nItem < 0) || (nItem >= (INT32)infoPtr->uNumItem))
+        return FALSE;
+
+    TRACE (header, "[nItem=%d]\n", nItem);
+
+    if (phdi->mask == 0)
+	return TRUE;
+
+    lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
+    if (phdi->mask & HDI_BITMAP)
+	phdi->hbm = lpItem->hbm;
+
+    if (phdi->mask & HDI_FORMAT)
+	phdi->fmt = lpItem->fmt;
+
+    if (phdi->mask & HDI_WIDTH)
+	phdi->cxy = lpItem->cxy;
+
+    if (phdi->mask & HDI_LPARAM)
+	phdi->lParam = lpItem->lParam;
+
+    if (phdi->mask & HDI_TEXT) {
+	if (lpItem->pszText != LPSTR_TEXTCALLBACK32W)
+	    lstrcpyn32W (phdi->pszText, lpItem->pszText, phdi->cchTextMax);
+	else
+	    phdi->pszText = LPSTR_TEXTCALLBACK32W;
+    }
+
+    if (phdi->mask & HDI_IMAGE)
+	phdi->iImage = lpItem->iImage;
+
+    if (phdi->mask & HDI_ORDER)
+	phdi->iOrder = lpItem->iOrder;
+
+    return TRUE;
+}
+
+
+__inline__ static LRESULT
 HEADER_GetItemCount (WND *wndPtr)
 {
     HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-
-    return (infoPtr->uNumItem);
+    return infoPtr->uNumItem;
 }
 
 
@@ -635,6 +682,17 @@
 }
 
 
+// << HEADER_GetOrderArray >>
+
+
+__inline__ static LRESULT
+HEADER_GetUnicodeFormat (WND *wndPtr)
+{
+    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
+    return infoPtr->bUnicode;
+}
+
+
 static LRESULT
 HEADER_HitTest (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
@@ -695,11 +753,95 @@
     if (phdi->mask & HDI_TEXT) {
 	if (phdi->pszText != LPSTR_TEXTCALLBACK32A) {
 	    len = lstrlen32A (phdi->pszText);
-	    lpItem->pszText = COMCTL32_Alloc (len+1);
-	    lstrcpy32A (lpItem->pszText, phdi->pszText);
+	    lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+	    lstrcpyAtoW (lpItem->pszText, phdi->pszText);
 	}
 	else
-	    lpItem->pszText = LPSTR_TEXTCALLBACK32A;
+	    lpItem->pszText = LPSTR_TEXTCALLBACK32W;
+    }
+
+    if (phdi->mask & HDI_FORMAT)
+	lpItem->fmt = phdi->fmt;
+
+    if (lpItem->fmt == 0)
+	lpItem->fmt = HDF_LEFT;
+
+    if (phdi->mask & HDI_BITMAP)
+        lpItem->hbm = phdi->hbm;
+
+    if (phdi->mask & HDI_LPARAM)
+        lpItem->lParam = phdi->lParam;
+
+    if (phdi->mask & HDI_IMAGE)
+        lpItem->iImage = phdi->iImage;
+
+    if (phdi->mask & HDI_ORDER)
+        lpItem->iOrder = phdi->iOrder;
+
+    HEADER_SetItemBounds (wndPtr);
+
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    HEADER_Refresh (wndPtr, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+
+    return nItem;
+}
+
+
+static LRESULT
+HEADER_InsertItem32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
+    HDITEM32W   *phdi = (HDITEM32W*)lParam;
+    INT32       nItem = (INT32)wParam;
+    HEADER_ITEM *lpItem;
+    HDC32       hdc;
+    INT32       len;
+
+    if ((phdi == NULL) || (nItem < 0))
+	return -1;
+
+    if (nItem > infoPtr->uNumItem)
+        nItem = infoPtr->uNumItem;
+
+    if (infoPtr->uNumItem == 0) {
+        infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM));
+        infoPtr->uNumItem++;
+    }
+    else {
+        HEADER_ITEM *oldItems = infoPtr->items;
+
+        infoPtr->uNumItem++;
+        infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
+        /* pre insert copy */
+        if (nItem > 0) {
+            memcpy (&infoPtr->items[0], &oldItems[0],
+                    nItem * sizeof(HEADER_ITEM));
+        }
+
+        /* post insert copy */
+        if (nItem < infoPtr->uNumItem - 1) {
+            memcpy (&infoPtr->items[nItem+1], &oldItems[nItem],
+                    (infoPtr->uNumItem - nItem) * sizeof(HEADER_ITEM));
+        }
+
+	COMCTL32_Free (oldItems);
+    }
+
+    lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
+    lpItem->bDown = FALSE;
+
+    if (phdi->mask & HDI_WIDTH)
+	lpItem->cxy = phdi->cxy;
+
+    if (phdi->mask & HDI_TEXT) {
+	if (phdi->pszText != LPSTR_TEXTCALLBACK32W) {
+	    len = lstrlen32W (phdi->pszText);
+	    lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+	    lstrcpy32W (lpItem->pszText, phdi->pszText);
+	}
+	else
+	    lpItem->pszText = LPSTR_TEXTCALLBACK32W;
     }
 
     if (phdi->mask & HDI_FORMAT)
@@ -809,14 +951,18 @@
 
     if (phdi->mask & HDI_TEXT) {
 	if (phdi->pszText != LPSTR_TEXTCALLBACK32A) {
-	    INT32 len = lstrlen32A (phdi->pszText);
-	    if (lpItem->pszText)
+	    if (lpItem->pszText) {
 		COMCTL32_Free (lpItem->pszText);
-	    lpItem->pszText = COMCTL32_Alloc (len+1);
-	    lstrcpy32A (lpItem->pszText, phdi->pszText);
+		lpItem->pszText = NULL;
+	    }
+	    if (phdi->pszText) {
+		INT32 len = lstrlen32A (phdi->pszText);
+		lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+		lstrcpyAtoW (lpItem->pszText, phdi->pszText);
+	    }
 	}
 	else
-	    lpItem->pszText = LPSTR_TEXTCALLBACK32A;
+	    lpItem->pszText = LPSTR_TEXTCALLBACK32W;
     }
 
     if (phdi->mask & HDI_WIDTH)
@@ -840,6 +986,86 @@
 
 
 static LRESULT
+HEADER_SetItem32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
+    HDITEM32W *phdi = (HDITEM32W*)lParam;
+    INT32 nItem = (INT32)wParam;
+    HEADER_ITEM *lpItem;
+    HDC32 hdc;
+
+    if (phdi == NULL)
+	return FALSE;
+    if ((nItem < 0) || (nItem >= (INT32)infoPtr->uNumItem))
+        return FALSE;
+
+    TRACE (header, "[nItem=%d]\n", nItem);
+
+    if (HEADER_SendHeaderNotify (wndPtr, HDN_ITEMCHANGING32A, nItem))
+	return FALSE;
+
+    lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
+    if (phdi->mask & HDI_BITMAP)
+	lpItem->hbm = phdi->hbm;
+
+    if (phdi->mask & HDI_FORMAT)
+	lpItem->fmt = phdi->fmt;
+
+    if (phdi->mask & HDI_LPARAM)
+	lpItem->lParam = phdi->lParam;
+
+    if (phdi->mask & HDI_TEXT) {
+	if (phdi->pszText != LPSTR_TEXTCALLBACK32W) {
+	    if (lpItem->pszText) {
+		COMCTL32_Free (lpItem->pszText);
+		lpItem->pszText = NULL;
+	    }
+	    if (phdi->pszText) {
+		INT32 len = lstrlen32W (phdi->pszText);
+		lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+		lstrcpy32W (lpItem->pszText, phdi->pszText);
+	    }
+	}
+	else
+	    lpItem->pszText = LPSTR_TEXTCALLBACK32W;
+    }
+
+    if (phdi->mask & HDI_WIDTH)
+	lpItem->cxy = phdi->cxy;
+
+    if (phdi->mask & HDI_IMAGE)
+	lpItem->iImage = phdi->iImage;
+
+    if (phdi->mask & HDI_ORDER)
+	lpItem->iOrder = phdi->iOrder;
+
+    HEADER_SendHeaderNotify (wndPtr, HDN_ITEMCHANGED32A, nItem);
+
+    HEADER_SetItemBounds (wndPtr);
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    HEADER_Refresh (wndPtr, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+
+    return TRUE;
+}
+
+
+// << HEADER_SetOrderArray >>
+
+
+__inline__ static LRESULT
+HEADER_SetUnicodeFormat (WND *wndPtr, WPARAM32 wParam)
+{
+    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
+    BOOL32 bTemp = infoPtr->bUnicode;
+
+    infoPtr->bUnicode = (BOOL32)wParam;
+
+    return bTemp;
+}
+
+
+static LRESULT
 HEADER_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     HEADER_INFO *infoPtr;
@@ -862,6 +1088,7 @@
     infoPtr->iMoveItem = 0;
     infoPtr->himl = 0;
     infoPtr->iHotItem = -1;
+    infoPtr->bUnicode = IsWindowUnicode (wndPtr->hwndSelf);
 
     hdc = GetDC32 (0);
     hOldFont = SelectObject32 (hdc, GetStockObject32 (SYSTEM_FONT));
@@ -884,7 +1111,7 @@
     if (infoPtr->items) {
 	lpItem = (HEADER_ITEM*)infoPtr->items;
         for (nItem = 0; nItem < infoPtr->uNumItem; nItem++, lpItem++) {
-	    if ((lpItem->pszText) && (lpItem->pszText != LPSTR_TEXTCALLBACK32A))
+	    if ((lpItem->pszText) && (lpItem->pszText != LPSTR_TEXTCALLBACK32W))
 		COMCTL32_Free (lpItem->pszText);
         }
         COMCTL32_Free (infoPtr->items);
@@ -1214,7 +1441,8 @@
 	case HDM_GETITEM32A:
 	    return HEADER_GetItem32A (wndPtr, wParam, lParam);
 
-//	case HDM_GETITEM32W:
+	case HDM_GETITEM32W:
+	    return HEADER_GetItem32W (wndPtr, wParam, lParam);
 
 	case HDM_GETITEMCOUNT:
 	    return HEADER_GetItemCount (wndPtr);
@@ -1223,7 +1451,9 @@
 	    return HEADER_GetItemRect (wndPtr, wParam, lParam);
 
 //	case HDM_GETORDERARRAY:
-//	case HDM_GETUNICODEFORMAT:
+
+	case HDM_GETUNICODEFORMAT:
+	    return HEADER_GetUnicodeFormat (wndPtr);
 
 	case HDM_HITTEST:
 	    return HEADER_HitTest (wndPtr, wParam, lParam);
@@ -1231,7 +1461,8 @@
 	case HDM_INSERTITEM32A:
 	    return HEADER_InsertItem32A (wndPtr, wParam, lParam);
 
-//	case HDM_INSERTITEM32W:
+	case HDM_INSERTITEM32W:
+	    return HEADER_InsertItem32W (wndPtr, wParam, lParam);
 
 	case HDM_LAYOUT:
 	    return HEADER_Layout (wndPtr, wParam, lParam);
@@ -1242,9 +1473,13 @@
 	case HDM_SETITEM32A:
 	    return HEADER_SetItem32A (wndPtr, wParam, lParam);
 
-//	case HDM_SETITEM32W:
+	case HDM_SETITEM32W:
+	    return HEADER_SetItem32W (wndPtr, wParam, lParam);
+
 //	case HDM_SETORDERARRAY:
-//	case HDM_SETUNICODEFORMAT:
+
+	case HDM_SETUNICODEFORMAT:
+	    return HEADER_SetUnicodeFormat (wndPtr, wParam);
 
 
         case WM_CREATE:
@@ -1274,6 +1509,8 @@
         case WM_MOUSEMOVE:
             return HEADER_MouseMove (wndPtr, wParam, lParam);
 
+//	case WM_NOTIFYFORMAT:
+
         case WM_PAINT:
             return HEADER_Paint (wndPtr, wParam);
 
diff --git a/dlls/comctl32/status.c b/dlls/comctl32/status.c
index 489b817..2efee9d 100644
--- a/dlls/comctl32/status.c
+++ b/dlls/comctl32/status.c
@@ -20,7 +20,7 @@
 /*
  * Fixme/Todo
  * 1) Don't hard code bar to bottom of window, allow CCS_TOP also.
- + 2) Tooltip support (almost done).
+ * 2) Tooltip support (almost done).
  */
 
 #define _MAX(a,b) (((a)>(b))?(a):(b))
@@ -95,19 +95,19 @@
     /* now draw text */
     if (part->text) {
       int oldbkmode = SetBkMode32(hdc, TRANSPARENT);
-      LPSTR p = (LPSTR)part->text;
+      LPWSTR p = (LPWSTR)part->text;
       UINT32 align = DT_LEFT;
-      if (*p == '\t') {
+      if (*p == L'\t') {
 	p++;
 	align = DT_CENTER;
 
-	if (*p == '\t') {
+	if (*p == L'\t') {
 	  p++;
 	  align = DT_RIGHT;
 	}
       }
       r.left += 3;
-      DrawText32A(hdc, p, lstrlen32A(p), &r, align|DT_VCENTER|DT_SINGLELINE);
+      DrawText32W (hdc, p, lstrlen32W (p), &r, align|DT_VCENTER|DT_SINGLELINE);
       if (oldbkmode != TRANSPARENT)
 	SetBkMode32(hdc, oldbkmode);
     }
@@ -332,16 +332,16 @@
 static LRESULT
 STATUSBAR_GetRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
     int	part_num;
     LPRECT32  rect;
 
     part_num = ((INT32) wParam) & 0x00ff;
     rect = (LPRECT32) lParam;
-    if (self->simple)
-	*rect = self->part0.bound;
+    if (infoPtr->simple)
+	*rect = infoPtr->part0.bound;
     else
-	*rect = self->parts[part_num].bound;
+	*rect = infoPtr->parts[part_num].bound;
     return TRUE;
 }
 
@@ -351,50 +351,70 @@
 {
     STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
     STATUSWINDOWPART *part;
-    int	part_num;
+    INT32   nPart;
     LRESULT result;
-    LPSTR   out_text;
 
-    part_num = ((INT32) wParam) & 0x00ff;
-    out_text = (LPSTR) lParam;
+    nPart = ((INT32) wParam) & 0x00ff;
     if (self->simple)
 	part = &self->part0;
     else
-	part = &self->parts[part_num];
+	part = &self->parts[nPart];
 
     if (part->style == SBT_OWNERDRAW)
-	result = (LRESULT) part->text;
+	result = (LRESULT)part->text;
     else {
-	result = part->text ? lstrlen32A(part->text) : 0;
+	result = part->text ? lstrlen32W (part->text) : 0;
 	result |= (part->style << 16);
-	if (out_text) {
-	    lstrcpy32A(out_text, part->text);
-	}
+	if (lParam)
+	    lstrcpyWtoA ((LPSTR)lParam, part->text);
     }
     return result;
 }
 
 
-//  << STATUSBAR_GetText32W >>
-
-
 static LRESULT
-STATUSBAR_GetTextLength32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+STATUSBAR_GetText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
     STATUSWINDOWPART *part;
-    int	part_num;
-    DWORD	result;
+    INT32   nPart;
+    LRESULT result;
 
-    part_num = ((INT32) wParam) & 0x00ff;
-
+    nPart = ((INT32)wParam) & 0x00ff;
     if (self->simple)
 	part = &self->part0;
     else
-	part = &self->parts[part_num];
+	part = &self->parts[nPart];
+
+    if (part->style == SBT_OWNERDRAW)
+	result = (LRESULT)part->text;
+    else {
+	result = part->text ? lstrlen32W (part->text) : 0;
+	result |= (part->style << 16);
+	if (lParam)
+	    lstrcpy32W ((LPWSTR)lParam, part->text);
+    }
+    return result;
+}
+
+
+static LRESULT
+STATUSBAR_GetTextLength (WND *wndPtr, WPARAM32 wParam)
+{
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
+    STATUSWINDOWPART *part;
+    INT32 part_num;
+    DWORD result;
+
+    part_num = ((INT32) wParam) & 0x00ff;
+
+    if (infoPtr->simple)
+	part = &infoPtr->part0;
+    else
+	part = &infoPtr->parts[part_num];
 
     if (part->text)
-	result = lstrlen32A(part->text);
+	result = lstrlen32W(part->text);
     else
 	result = 0;
 
@@ -403,9 +423,6 @@
 }
 
 
-//  << STATUSBAR_GetTextLength32W >>
-
-
 static LRESULT
 STATUSBAR_GetTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
@@ -413,7 +430,6 @@
 
     if (infoPtr->hwndToolTip) {
 	TTTOOLINFO32A ti;
-
 	ti.cbSize = sizeof(TTTOOLINFO32A);
 	ti.hwnd = wndPtr->hwndSelf;
 	ti.uId = LOWORD(wParam);
@@ -427,16 +443,39 @@
 }
 
 
-//  << STATUSBAR_GetTipText32W >>
-//  << STATUSBAR_GetUnicodeFormat >>
+static LRESULT
+STATUSBAR_GetTipText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
+
+    if (infoPtr->hwndToolTip) {
+	TTTOOLINFO32W ti;
+	ti.cbSize = sizeof(TTTOOLINFO32W);
+	ti.hwnd = wndPtr->hwndSelf;
+	ti.uId = LOWORD(wParam);
+	SendMessage32W (infoPtr->hwndToolTip, TTM_GETTEXT32W, 0, (LPARAM)&ti);
+
+	if (ti.lpszText)
+	    lstrcpyn32W ((LPWSTR)lParam, ti.lpszText, HIWORD(wParam));
+    }
+
+    return 0;
+}
+
+
+__inline__ static LRESULT
+STATUSBAR_GetUnicodeFormat (WND *wndPtr)
+{
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
+    return infoPtr->bUnicode;
+}
 
 
 __inline__ static LRESULT
 STATUSBAR_IsSimple (WND *wndPtr)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-
-    return self->simple;
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
+    return infoPtr->simple;
 }
 
 
@@ -464,7 +503,8 @@
     INT32 nPart = (INT32)wParam & 0x00ff;
     HDC32 hdc; 
 
-    if ((nPart < -1) || (nPart >= self->numParts)) return FALSE;
+    if ((nPart < -1) || (nPart >= self->numParts))
+	return FALSE;
 
     hdc = GetDC32 (wndPtr->hwndSelf);
     if (nPart == -1) {
@@ -512,9 +552,9 @@
 STATUSBAR_SetParts (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
+    STATUSWINDOWPART *tmp;
     HDC32	hdc;
     LPINT32 parts;
-    STATUSWINDOWPART *	tmp;
     int	i;
     int	oldNumParts;
 
@@ -569,7 +609,7 @@
 
 	    for (i = nTipCount - 1; i >= self->numParts; i--) {
 
-		TRACE (statusbar, "delete tool %d\n", i);
+		FIXME (statusbar, "delete tool %d\n", i);
 
 	    }
 	}
@@ -607,7 +647,7 @@
     if (!part) return FALSE;
     part->style = style;
     if (style == SBT_OWNERDRAW) {
-	part->text = text;
+	part->text = (LPWSTR)text;
     }
     else {
 	/* duplicate string */
@@ -615,8 +655,8 @@
 	    COMCTL32_Free (part->text);
 	part->text = 0;
 	if (text && (len = lstrlen32A(text))) {
-	    part->text = COMCTL32_Alloc (len+1);
-	    lstrcpy32A(part->text, text);
+	    part->text = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+	    lstrcpyAtoW (part->text, text);
 	}
     }
 
@@ -628,23 +668,61 @@
 }
 
 
-//  << STATUSBAR_SetText32W >>
+static LRESULT
+STATUSBAR_SetText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
+    STATUSWINDOWPART *part;
+    INT32  part_num, style, len;
+    LPWSTR text;
+    HDC32  hdc;
+
+    text = (LPWSTR) lParam;
+    part_num = ((INT32) wParam) & 0x00ff;
+    style = ((INT32) wParam) & 0xff00;
+
+    if ((self->simple) || (self->parts==NULL) || (part_num==255))
+	part = &self->part0;
+    else
+	part = &self->parts[part_num];
+    if (!part) return FALSE;
+    part->style = style;
+    if (style == SBT_OWNERDRAW) {
+	part->text = text;
+    }
+    else {
+	/* duplicate string */
+	if (part->text)
+	    COMCTL32_Free (part->text);
+	part->text = 0;
+	if (text && (len = lstrlen32W(text))) {
+	    part->text = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+	    lstrcpy32W(part->text, text);
+	}
+    }
+
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    STATUSBAR_RefreshPart (wndPtr, part, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+
+    return TRUE;
+}
 
 
 static LRESULT
 STATUSBAR_SetTipText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    TTTOOLINFO32A ti;
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
 
     TRACE (statusbar, "part %d: \"%s\"\n", (INT32)wParam, (LPSTR)lParam);
-    if (self->hwndToolTip) {
+    if (infoPtr->hwndToolTip) {
+	TTTOOLINFO32A ti;
 	ti.cbSize = sizeof(TTTOOLINFO32A);
 	ti.hwnd = wndPtr->hwndSelf;
 	ti.uId = (INT32)wParam;
 	ti.hinst = 0;
 	ti.lpszText = (LPSTR)lParam;
-	SendMessage32A (self->hwndToolTip, TTM_UPDATETIPTEXT32A,
+	SendMessage32A (infoPtr->hwndToolTip, TTM_UPDATETIPTEXT32A,
 			0, (LPARAM)&ti);
     }
 
@@ -652,20 +730,48 @@
 }
 
 
-//  << STATUSBAR_SetTipText32W >>
-//  << STATUSBAR_SetUnicodeFormat >>
+static LRESULT
+STATUSBAR_SetTipText32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
+
+    TRACE (statusbar, "part %d: \"%s\"\n", (INT32)wParam, (LPSTR)lParam);
+    if (infoPtr->hwndToolTip) {
+	TTTOOLINFO32W ti;
+	ti.cbSize = sizeof(TTTOOLINFO32W);
+	ti.hwnd = wndPtr->hwndSelf;
+	ti.uId = (INT32)wParam;
+	ti.hinst = 0;
+	ti.lpszText = (LPWSTR)lParam;
+	SendMessage32W (infoPtr->hwndToolTip, TTM_UPDATETIPTEXT32W,
+			0, (LPARAM)&ti);
+    }
+
+    return 0;
+}
+
+
+__inline__ static LRESULT
+STATUSBAR_SetUnicodeFormat (WND *wndPtr, WPARAM32 wParam)
+{
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
+    BOOL32 bTemp = infoPtr->bUnicode;
+
+    TRACE (statusbar, "(0x%x)\n", (BOOL32)wParam);
+    infoPtr->bUnicode = (BOOL32)wParam;
+
+    return bTemp;
+}
 
 
 static LRESULT
 STATUSBAR_Simple (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    BOOL32 simple;
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
     HDC32  hdc;
     NMHDR  nmhdr;
 
-    simple = (BOOL32) wParam;
-    self->simple = simple;
+    infoPtr->simple = (BOOL32)wParam;
 
     /* send notification */
     nmhdr.hwndFrom = wndPtr->hwndSelf;
@@ -685,7 +791,7 @@
 static LRESULT
 STATUSBAR_WMCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    LPCREATESTRUCT32A lpCreate = (LPCREATESTRUCT32A) lParam;
+    LPCREATESTRUCT32A lpCreate = (LPCREATESTRUCT32A)lParam;
     NONCLIENTMETRICS32A nclm;
     RECT32	rect;
     int	        width, len;
@@ -721,9 +827,18 @@
     self->parts[0].style = 0;
     self->parts[0].hIcon = 0;
 
-    if ((len = lstrlen32A (lpCreate->lpszName))) {
-        self->parts[0].text = COMCTL32_Alloc (len + 1);
-        lstrcpy32A (self->parts[0].text, lpCreate->lpszName);
+    if (IsWindowUnicode (wndPtr->hwndSelf)) {
+	self->bUnicode = TRUE;
+	if ((len = lstrlen32W ((LPCWSTR)lpCreate->lpszName))) {
+	    self->parts[0].text = COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));
+	    lstrcpy32W (self->parts[0].text, (LPCWSTR)lpCreate->lpszName);
+	}
+    }
+    else {
+	if ((len = lstrlen32A ((LPCSTR)lpCreate->lpszName))) {
+	    self->parts[0].text = COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));
+	    lstrcpyAtoW (self->parts[0].text, (LPCSTR)lpCreate->lpszName);
+	}
     }
 
     if ((hdc = GetDC32 (0))) {
@@ -800,49 +915,39 @@
 static __inline__ LRESULT
 STATUSBAR_WMGetFont (WND *wndPtr)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-
-    return self->hFont;
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
+    return infoPtr->hFont;
 }
 
 
 static LRESULT
 STATUSBAR_WMGetText (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
     INT32 len;
 
-    if (!(self->parts[0].text))
+    if (!(infoPtr->parts[0].text))
         return 0;
-    len = lstrlen32A (self->parts[0].text);
+    len = lstrlen32W (infoPtr->parts[0].text);
     if (wParam > len) {
-        lstrcpy32A ((LPSTR)lParam, self->parts[0].text);
-        return len;
+	if (infoPtr->bUnicode)
+	    lstrcpy32W ((LPWSTR)lParam, infoPtr->parts[0].text);
+	else
+	    lstrcpyWtoA ((LPSTR)lParam, infoPtr->parts[0].text);
+	return len;
     }
-    else
-        return -1;
-}
 
-
-static LRESULT
-STATUSBAR_WMGetTextLength (WND *wndPtr)
-{
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-
-    if (!(self->parts[0].text))
-        return 0;
-
-    return (lstrlen32A (self->parts[0].text));
+    return -1;
 }
 
 
 __inline__ static LRESULT
 STATUSBAR_WMMouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
 
-    if (self->hwndToolTip)
-	STATUSBAR_RelayEvent (self->hwndToolTip, wndPtr->hwndSelf,
+    if (infoPtr->hwndToolTip)
+	STATUSBAR_RelayEvent (infoPtr->hwndToolTip, wndPtr->hwndSelf,
 			      WM_MOUSEMOVE, wParam, lParam);
     return 0;
 }
@@ -908,9 +1013,9 @@
 static LRESULT
 STATUSBAR_WMSetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
 
-    self->hFont = (HFONT32)wParam;
+    infoPtr->hFont = (HFONT32)wParam;
     if (LOWORD(lParam) == TRUE) {
 	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
         STATUSBAR_Refresh (wndPtr, hdc);
@@ -924,22 +1029,30 @@
 static LRESULT
 STATUSBAR_WMSetText (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
     STATUSWINDOWPART *part;
     int len;
     HDC32 hdc;
 
-    if (self->numParts == 0)
+    if (infoPtr->numParts == 0)
 	return FALSE;
 
-    part = &self->parts[0];
+    part = &infoPtr->parts[0];
     /* duplicate string */
     if (part->text)
         COMCTL32_Free (part->text);
     part->text = 0;
-    if (lParam && (len = lstrlen32A((LPCSTR)lParam))) {
-        part->text = COMCTL32_Alloc (len+1);
-        lstrcpy32A (part->text, (LPCSTR)lParam);
+    if (infoPtr->bUnicode) {
+	if (lParam && (len = lstrlen32W((LPCWSTR)lParam))) {
+	    part->text = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+	    lstrcpy32W (part->text, (LPCWSTR)lParam);
+	}
+    }
+    else {
+	if (lParam && (len = lstrlen32A((LPCSTR)lParam))) {
+	    part->text = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
+	    lstrcpyAtoW (part->text, (LPCSTR)lParam);
+	}
     }
 
     hdc = GetDC32 (wndPtr->hwndSelf);
@@ -953,10 +1066,10 @@
 static LRESULT
 STATUSBAR_WMSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    STATUSWINDOWINFO *self = STATUSBAR_GetInfoPtr (wndPtr);
-    INT32	width, x, y, flags;
-    RECT32	parent_rect;
-    HWND32	parent;
+    STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (wndPtr);
+    INT32  width, x, y, flags;
+    RECT32 parent_rect;
+    HWND32 parent;
 
     /* Need to resize width to match parent */
     flags = (INT32) wParam;
@@ -971,10 +1084,10 @@
 	GetClientRect32 (parent, &parent_rect);
 	width = parent_rect.right - parent_rect.left;
 	x = parent_rect.left;
-	y = parent_rect.bottom - self->height;
+	y = parent_rect.bottom - infoPtr->height;
 	MoveWindow32 (wndPtr->hwndSelf, parent_rect.left, 
-		      parent_rect.bottom - self->height,
-		      width, self->height, TRUE);
+		      parent_rect.bottom - infoPtr->height,
+		      width, infoPtr->height, TRUE);
 	STATUSBAR_SetPartBounds (wndPtr);
     }
     return 0;
@@ -1017,18 +1130,21 @@
 	case SB_GETTEXT32A:
 	    return STATUSBAR_GetText32A (wndPtr, wParam, lParam);
 
-//	case SB_GETTEXT32W:
+	case SB_GETTEXT32W:
+	    return STATUSBAR_GetText32W (wndPtr, wParam, lParam);
 
 	case SB_GETTEXTLENGTH32A:
-	    return STATUSBAR_GetTextLength32A (wndPtr, wParam, lParam);
-
-//	case SB_GETTEXTLENGHT32W:
+	case SB_GETTEXTLENGTH32W:
+	    return STATUSBAR_GetTextLength (wndPtr, wParam);
 
 	case SB_GETTIPTEXT32A:
 	    return STATUSBAR_GetTipText32A (wndPtr, wParam, lParam);
 
-//	case SB_GETTIPTEXT32W:
-//	case SB_GETUNICODEFORMAT:
+	case SB_GETTIPTEXT32W:
+	    return STATUSBAR_GetTipText32W (wndPtr, wParam, lParam);
+
+	case SB_GETUNICODEFORMAT:
+	    return STATUSBAR_GetUnicodeFormat (wndPtr);
 
 	case SB_ISSIMPLE:
 	    return STATUSBAR_IsSimple (wndPtr);
@@ -1048,13 +1164,17 @@
 	case SB_SETTEXT32A:
 	    return STATUSBAR_SetText32A (wndPtr, wParam, lParam);
 
-//	case SB_SETTEXT32W:
+	case SB_SETTEXT32W:
+	    return STATUSBAR_SetText32W (wndPtr, wParam, lParam);
 
 	case SB_SETTIPTEXT32A:
 	    return STATUSBAR_SetTipText32A (wndPtr, wParam, lParam);
 
-//	case SB_SETTIPTEXT32W:
-//	case SB_SETUNICODEFORMAT:
+	case SB_SETTIPTEXT32W:
+	    return STATUSBAR_SetTipText32W (wndPtr, wParam, lParam);
+
+	case SB_SETUNICODEFORMAT:
+	    return STATUSBAR_SetUnicodeFormat (wndPtr, wParam);
 
 	case SB_SIMPLE:
 	    return STATUSBAR_Simple (wndPtr, wParam, lParam);
@@ -1073,7 +1193,7 @@
             return STATUSBAR_WMGetText (wndPtr, wParam, lParam);
 
 	case WM_GETTEXTLENGTH:
-            return STATUSBAR_WMGetTextLength (wndPtr);
+	    return STATUSBAR_GetTextLength (wndPtr, 0);
 
 	case WM_LBUTTONDBLCLK:
             return STATUSBAR_SendNotify (wndPtr, NM_DBLCLK);
diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c
index f9a248b..0033545 100644
--- a/dlls/comctl32/toolbar.c
+++ b/dlls/comctl32/toolbar.c
@@ -83,21 +83,21 @@
 	if (!(nState & TBSTATE_ENABLED)) {
 	    clrOld = SetTextColor32 (hdc, GetSysColor32 (COLOR_3DHILIGHT));
 	    OffsetRect32 (&rcText, 1, 1);
-	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1,
+	    DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
 			 &rcText, infoPtr->dwDTFlags);
 	    SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
 	    OffsetRect32 (&rcText, -1, -1);
-	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1,
+	    DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
 			 &rcText, infoPtr->dwDTFlags);
 	}
 	else if (nState & TBSTATE_INDETERMINATE) {
 	    clrOld = SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
-	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1,
+	    DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
 			 &rcText, infoPtr->dwDTFlags);
 	}
 	else {
 	    clrOld = SetTextColor32 (hdc, GetSysColor32 (COLOR_BTNTEXT));
-	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1,
+	    DrawText32W (hdc, infoPtr->strings[btnPtr->iString], -1,
 			 &rcText, infoPtr->dwDTFlags);
 	}
 
@@ -292,8 +292,8 @@
 	if (!(btnPtr->fsState & TBSTATE_HIDDEN) &&
 	    (btnPtr->iString > -1) &&
 	    (btnPtr->iString < infoPtr->nNumStrings)) {
-	    LPSTR lpText = infoPtr->strings[btnPtr->iString];
-	    GetTextExtentPoint32A (hdc, lpText, lstrlen32A(lpText), &sz);
+	    LPWSTR lpText = infoPtr->strings[btnPtr->iString];
+	    GetTextExtentPoint32W (hdc, lpText, lstrlen32W (lpText), &sz);
 	    if (sz.cx > lpSize->cx)
 		lpSize->cx = sz.cx;
 	    if (sz.cy > lpSize->cy)
@@ -753,27 +753,28 @@
 	nIndex = infoPtr->nNumStrings;
 	if (infoPtr->nNumStrings == 0) {
 	    infoPtr->strings =
-		COMCTL32_Alloc (sizeof(char *));
+		COMCTL32_Alloc (sizeof(LPWSTR));
 	}
 	else {
-	    char **oldStrings = infoPtr->strings;
+	    LPWSTR *oldStrings = infoPtr->strings;
 	    infoPtr->strings =
-		COMCTL32_Alloc (sizeof(char *) * (infoPtr->nNumStrings + 1));
+		COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
 	    memcpy (&infoPtr->strings[0], &oldStrings[0],
-		    sizeof(char *) * infoPtr->nNumStrings);
+		    sizeof(LPWSTR) * infoPtr->nNumStrings);
 	    COMCTL32_Free (oldStrings);
 	}
 
 	infoPtr->strings[infoPtr->nNumStrings] =
-	    COMCTL32_Alloc (sizeof(char)*(len+1));
-	lstrcpy32A (infoPtr->strings[infoPtr->nNumStrings], szString);
+	    COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
+	lstrcpyAtoW (infoPtr->strings[infoPtr->nNumStrings], szString);
 	infoPtr->nNumStrings++;
     }
     else {
-	char *p = (char*)lParam;
+	LPSTR p = (LPSTR)lParam;
 	INT32 len;
 
-	if (p == NULL) return -1;
+	if (p == NULL)
+	    return -1;
 	TRACE (toolbar, "adding string(s) from array!\n");
 	nIndex = infoPtr->nNumStrings;
 	while (*p) {
@@ -782,20 +783,20 @@
 
 	    if (infoPtr->nNumStrings == 0) {
 		infoPtr->strings =
-		    COMCTL32_Alloc (sizeof(char *));
+		    COMCTL32_Alloc (sizeof(LPWSTR));
 	    }
 	    else {
-		char **oldStrings = infoPtr->strings;
+		LPWSTR *oldStrings = infoPtr->strings;
 		infoPtr->strings =
-		    COMCTL32_Alloc (sizeof(char *) * (infoPtr->nNumStrings + 1));
+		    COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
 		memcpy (&infoPtr->strings[0], &oldStrings[0],
-			sizeof(char *) * infoPtr->nNumStrings);
+			sizeof(LPWSTR) * infoPtr->nNumStrings);
 		COMCTL32_Free (oldStrings);
 	    }
 
 	    infoPtr->strings[infoPtr->nNumStrings] =
-		COMCTL32_Alloc (sizeof(char)*(len+1));
-	    lstrcpy32A (infoPtr->strings[infoPtr->nNumStrings], p);
+		COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
+	    lstrcpyAtoW (infoPtr->strings[infoPtr->nNumStrings], p);
 	    infoPtr->nNumStrings++;
 
 	    p += (len+1);
@@ -806,7 +807,76 @@
 }
 
 
-// << TOOLBAR_AddString32W >>
+static LRESULT
+TOOLBAR_AddString32W (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    INT32 nIndex;
+
+    if ((wParam) && (HIWORD(lParam) == 0)) {
+	WCHAR szString[256];
+	INT32 len;
+	TRACE (toolbar, "adding string from resource!\n");
+
+	len = LoadString32W ((HINSTANCE32)wParam, (UINT32)lParam,
+			     szString, 256);
+
+	TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(szString));
+	nIndex = infoPtr->nNumStrings;
+	if (infoPtr->nNumStrings == 0) {
+	    infoPtr->strings =
+		COMCTL32_Alloc (sizeof(LPWSTR));
+	}
+	else {
+	    LPWSTR *oldStrings = infoPtr->strings;
+	    infoPtr->strings =
+		COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
+	    memcpy (&infoPtr->strings[0], &oldStrings[0],
+		    sizeof(LPWSTR) * infoPtr->nNumStrings);
+	    COMCTL32_Free (oldStrings);
+	}
+
+	infoPtr->strings[infoPtr->nNumStrings] =
+	    COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
+	lstrcpy32W (infoPtr->strings[infoPtr->nNumStrings], szString);
+	infoPtr->nNumStrings++;
+    }
+    else {
+	LPWSTR p = (LPWSTR)lParam;
+	INT32 len;
+
+	if (p == NULL)
+	    return -1;
+	TRACE (toolbar, "adding string(s) from array!\n");
+	nIndex = infoPtr->nNumStrings;
+	while (*p) {
+	    len = lstrlen32W (p);
+	    TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(p));
+
+	    if (infoPtr->nNumStrings == 0) {
+		infoPtr->strings =
+		    COMCTL32_Alloc (sizeof(LPWSTR));
+	    }
+	    else {
+		LPWSTR *oldStrings = infoPtr->strings;
+		infoPtr->strings =
+		    COMCTL32_Alloc (sizeof(LPWSTR) * (infoPtr->nNumStrings + 1));
+		memcpy (&infoPtr->strings[0], &oldStrings[0],
+			sizeof(LPWSTR) * infoPtr->nNumStrings);
+		COMCTL32_Free (oldStrings);
+	    }
+
+	    infoPtr->strings[infoPtr->nNumStrings] =
+		COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
+	    lstrcpy32W (infoPtr->strings[infoPtr->nNumStrings], p);
+	    infoPtr->nNumStrings++;
+
+	    p += (len+1);
+	}
+    }
+
+    return nIndex;
+}
 
 
 static LRESULT
@@ -2055,7 +2125,7 @@
     infoPtr->cxMax = -1;
 
     infoPtr->bCaptured = FALSE;
-    infoPtr->bUnicode = FALSE;
+    infoPtr->bUnicode = IsWindowUnicode (wndPtr->hwndSelf);
     infoPtr->nButtonDown = -1;
     infoPtr->nOldHit = -1;
 
@@ -2555,7 +2625,8 @@
 	case TB_ADDSTRING32A:
 	    return TOOLBAR_AddString32A (wndPtr, wParam, lParam);
 
-//	case TB_ADDSTRING32W:
+	case TB_ADDSTRING32W:
+	    return TOOLBAR_AddString32W (wndPtr, wParam, lParam);
 
 	case TB_AUTOSIZE:
 	    return TOOLBAR_AutoSize (wndPtr, wParam, lParam);
diff --git a/include/commctrl.h b/include/commctrl.h
index 2e6c31c..3de344a 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -119,56 +119,57 @@
 
 /* StatusWindow */
 
-#define STATUSCLASSNAME16     "msctls_statusbar"
-#define STATUSCLASSNAME32A    "msctls_statusbar32"
-#define STATUSCLASSNAME32W    L"msctls_statusbar32"
-#define STATUSCLASSNAME WINELIB_NAME_AW(STATUSCLASSNAME)
+#define STATUSCLASSNAME16	"msctls_statusbar"
+#define STATUSCLASSNAME32A	"msctls_statusbar32"
+#define STATUSCLASSNAME32W	L"msctls_statusbar32"
+#define STATUSCLASSNAME		WINELIB_NAME_AW(STATUSCLASSNAME)
 
-#define SBT_NOBORDERS         0x0100
-#define SBT_POPOUT            0x0200
-#define SBT_RTLREADING        0x0400  /* not supported */
-#define SBT_TOOLTIPS          0x0800
-#define SBT_OWNERDRAW         0x1000
+#define SBT_NOBORDERS		0x0100
+#define SBT_POPOUT		0x0200
+#define SBT_RTLREADING		0x0400  /* not supported */
+#define SBT_TOOLTIPS		0x0800
+#define SBT_OWNERDRAW		0x1000
 
-#define SBARS_SIZEGRIP        0x0100
+#define SBARS_SIZEGRIP		0x0100
 
-#define SB_SETTEXT32A         (WM_USER+1)
-#define SB_SETTEXT32W         (WM_USER+11)
-#define SB_SETTEXT WINELIB_NAME_AW(SB_SETTEXT)
-#define SB_GETTEXT32A         (WM_USER+2)
-#define SB_GETTEXT32W         (WM_USER+13)
-#define SB_GETTEXT WINELIB_NAME_AW(SB_GETTEXT)
-#define SB_GETTEXTLENGTH32A   (WM_USER+3)
-#define SB_GETTEXTLENGTH32W   (WM_USER+12)
-#define SB_GETTEXTLENGTH WINELIB_NAME_AW(SB_GETTEXTLENGTH)
+#define SB_SETTEXT32A		(WM_USER+1)
+#define SB_SETTEXT32W		(WM_USER+11)
+#define SB_SETTEXT		WINELIB_NAME_AW(SB_SETTEXT)
+#define SB_GETTEXT32A		(WM_USER+2)
+#define SB_GETTEXT32W		(WM_USER+13)
+#define SB_GETTEXT		WINELIB_NAME_AW(SB_GETTEXT)
+#define SB_GETTEXTLENGTH32A	(WM_USER+3)
+#define SB_GETTEXTLENGTH32W	(WM_USER+12)
+#define SB_GETTEXTLENGTH	WINELIB_NAME_AW(SB_GETTEXTLENGTH)
+#define SB_SETPARTS		(WM_USER+4)
+#define SB_GETPARTS		(WM_USER+6)
+#define SB_GETBORDERS		(WM_USER+7)
+#define SB_SETMINHEIGHT		(WM_USER+8)
+#define SB_SIMPLE		(WM_USER+9)
+#define SB_GETRECT		(WM_USER+10)
+#define SB_ISSIMPLE		(WM_USER+14)
+#define SB_SETICON		(WM_USER+15)
+#define SB_SETTIPTEXT32A	(WM_USER+16)
+#define SB_SETTIPTEXT32W	(WM_USER+17)
+#define SB_SETTIPTEXT		WINELIB_NAME_AW(SB_SETTIPTEXT)
+#define SB_GETTIPTEXT32A	(WM_USER+18)
+#define SB_GETTIPTEXT32W	(WM_USER+19)
+#define SB_GETTIPTEXT		WINELIB_NAME_AW(SB_GETTIPTEXT)
+#define SB_GETICON		(WM_USER+20)
+#define SB_SETBKCOLOR		CCM_SETBKCOLOR   /* lParam = bkColor */
+#define SB_GETUNICODEFORMAT	CCM_GETUNICODEFORMAT
+#define SB_SETUNICODEFORMAT	CCM_SETUNICODEFORMAT
 
-#define SB_SETPARTS           (WM_USER+4)
-#define SB_GETPARTS           (WM_USER+6)
-#define SB_GETBORDERS         (WM_USER+7)
-#define SB_SETMINHEIGHT       (WM_USER+8)
-#define SB_SIMPLE             (WM_USER+9)
-#define SB_GETRECT            (WM_USER+10)
-#define SB_ISSIMPLE           (WM_USER+14)
-#define SB_SETICON            (WM_USER+15)
-#define SB_SETTIPTEXT32A      (WM_USER+16)
-#define SB_SETTIPTEXT32W      (WM_USER+17)
-#define SB_SETTIPTEXT WINELIB_NAME_AW(SB_SETTIPTEXT)
-#define SB_GETTIPTEXT32A      (WM_USER+18)
-#define SB_GETTIPTEXT32W      (WM_USER+19)
-#define SB_GETTIPTEXT WINELIB_NAME_AW(SB_GETTIPTEXT)
-#define SB_GETICON            (WM_USER+20)
-#define SB_SETBKCOLOR         CCM_SETBKCOLOR   /* lParam = bkColor */
-
-#define SBN_FIRST             (0U-880U)
-#define SBN_LAST              (0U-899U)
-#define SBN_SIMPLEMODECHANGE  (SBN_FIRST-0)
+#define SBN_FIRST		(0U-880U)
+#define SBN_LAST		(0U-899U)
+#define SBN_SIMPLEMODECHANGE	(SBN_FIRST-0)
 
 HWND32 WINAPI CreateStatusWindow32A (INT32, LPCSTR, HWND32, UINT32);
 HWND32 WINAPI CreateStatusWindow32W (INT32, LPCWSTR, HWND32, UINT32);
-#define    CreateStatusWindow WINELIB_NAME_AW(CreateStatusWindow)
+#define CreateStatusWindow WINELIB_NAME_AW(CreateStatusWindow)
 VOID WINAPI DrawStatusText32A (HDC32, LPRECT32, LPCSTR, UINT32);
 VOID WINAPI DrawStatusText32W (HDC32, LPRECT32, LPCWSTR, UINT32);
-#define    DrawStatusText WINELIB_NAME_AW(DrawStatusText)
+#define DrawStatusText WINELIB_NAME_AW(DrawStatusText)
 VOID WINAPI MenuHelp (UINT32, WPARAM32, LPARAM, HMENU32,
                       HINSTANCE32, HWND32, LPUINT32);
 
@@ -1160,11 +1161,11 @@
 #define RB_SETPALETTE           (WM_USER+37)
 #define RB_GETPALETTE           (WM_USER+38)
 #define RB_MOVEBAND             (WM_USER+39)
-#define RB_GETDROPTARGET        CCS_GETDROPTARGET
-#define RB_SETCOLORSCHEME       CCS_SETCOLORSCHEME
-#define RB_GETCOLORSCHEME       CCS_GETCOLORSCHEME
-#define RB_SETUNICODEFORMAT     CCS_SETUNICODEFORMAT
-#define RB_GETUNICODEFORMAT     CCS_GETUNICODEFORMAT
+#define RB_GETDROPTARGET        CCM_GETDROPTARGET
+#define RB_SETCOLORSCHEME       CCM_SETCOLORSCHEME
+#define RB_GETCOLORSCHEME       CCM_GETCOLORSCHEME
+#define RB_SETUNICODEFORMAT     CCM_SETUNICODEFORMAT
+#define RB_GETUNICODEFORMAT     CCM_GETUNICODEFORMAT
 
 #define RBN_FIRST               (0U-831U)
 #define RBN_LAST                (0U-859U)
@@ -1218,7 +1219,7 @@
     UINT32    fStyle;
     COLORREF  clrFore;
     COLORREF  clrBack;
-    LPSTR     lpText;
+    LPWSTR    lpText;
     UINT32    cch;
     INT32     iImage;
     HWND32    hwndChild;
@@ -1248,7 +1249,7 @@
 typedef struct tagNMREBARCHILDSIZE
 {
     NMHDR  hdr;
-    UINT32 iBand;
+    UINT32 uBand;
     UINT32 wID;
     RECT32 rcChild;
     RECT32 rcBand;
@@ -2443,6 +2444,10 @@
 INT32  WINAPI DSA_InsertItem (const HDSA, INT32, LPVOID);
 BOOL32 WINAPI DSA_SetItem (const HDSA, INT32, LPVOID);
 
+typedef INT32 (CALLBACK *DSAENUMPROC)(LPVOID, DWORD);
+VOID   WINAPI DSA_EnumCallback (const HDSA, DSAENUMPROC, LPARAM);
+BOOL32 WINAPI DSA_DestroyCallback (const HDSA, DSAENUMPROC, LPARAM);
+
 
 /* Dynamic Pointer Array */
 
@@ -2476,6 +2481,15 @@
  
 INT32  WINAPI DPA_Search (const HDPA, LPVOID, INT32, PFNDPACOMPARE, LPARAM, UINT32);
 
+#define DPAM_SORT               0x0001
+
+BOOL32 WINAPI DPA_Merge (const HDPA, const HDPA, DWORD, PFNDPACOMPARE, LPVOID, LPARAM);
+
+typedef INT32 (CALLBACK *DPAENUMPROC)(LPVOID, DWORD);
+VOID   WINAPI DPA_EnumCallback (const HDPA, DPAENUMPROC, LPARAM);
+BOOL32 WINAPI DPA_DestroyCallback (const HDPA, DPAENUMPROC, LPARAM);
+
+
 #define DPA_GetPtrCount(hdpa)  (*(INT32*)(hdpa))
 #define DPA_GetPtrPtr(hdpa)    (*((LPVOID**)((BYTE*)(hdpa)+sizeof(INT32))))
 #define DPA_FastGetPtr(hdpa,i) (DPA_GetPtrPtr(hdpa)[i])
diff --git a/include/header.h b/include/header.h
index 9194fa7..df6e0e5 100644
--- a/include/header.h
+++ b/include/header.h
@@ -12,7 +12,7 @@
 {
     INT32     cxy;
     HBITMAP32 hbm;
-    LPSTR     pszText;
+    LPWSTR    pszText;
     INT32     fmt;
     LPARAM    lParam;
     INT32     iImage;
@@ -34,6 +34,7 @@
     BOOL32      bCaptured;	/* Is the mouse captured? */
     BOOL32      bPressed;	/* Is a header item pressed (down)? */
     BOOL32      bTracking;	/* Is in tracking mode? */
+    BOOL32      bUnicode;       /* Unicode flag */
     INT32       iMoveItem;	/* index of tracked item. (Tracking mode) */
     INT32       xTrackOffset;	/* distance between the right side of the tracked item and the cursor */
     INT32       xOldTrack;	/* track offset (see above) after the last WM_MOUSEMOVE */
diff --git a/include/listview.h b/include/listview.h
index ea5ff90..b140b80 100644
--- a/include/listview.h
+++ b/include/listview.h
@@ -35,6 +35,7 @@
     RECT32     rcList;       /* "client" area of the list (without header) */
     BOOL32     bFocus;
 
+    DWORD      dwExStyle;    /* extended listview style */
     HDPA       hdpaItems;
 
 } LISTVIEW_INFO;
diff --git a/include/ole2.h b/include/ole2.h
index ee87629..dc604c4 100644
--- a/include/ole2.h
+++ b/include/ole2.h
@@ -8,7 +8,7 @@
 /* to be implemented */
 typedef LPVOID LPMESSAGEFILTER;
 typedef LPVOID LPDROPTARGET;
-typedef LPVOID LPMONIKER;
+typedef struct tagMONIKER *LPMONIKER, IMoniker;
 
 #define S_OK	0
 #define S_FALSE	1
diff --git a/include/rebar.h b/include/rebar.h
index 52ba2d7..d5033be 100644
--- a/include/rebar.h
+++ b/include/rebar.h
@@ -34,7 +34,7 @@
     RECT32    rcCapText;      /* calculated caption text rectangle */
     RECT32    rcChild;        /* calculated child rectangle */
 
-    LPSTR     lpText;
+    LPWSTR    lpText;
     HWND32    hwndPrevParent;
 } REBAR_BAND;
 
@@ -51,6 +51,7 @@
 
     SIZE32     calcSize;    /* calculated rebar size */
     BOOL32     bAutoResize; /* auto resize deadlock flag */
+    BOOL32     bUnicode;    /* Unicode flag */
     HCURSOR32  hcurArrow;   /* handle to the arrow cursor */
     HCURSOR32  hcurHorz;    /* handle to the EW cursor */
     HCURSOR32  hcurVert;    /* handle to the NS cursor */
diff --git a/include/status.h b/include/status.h
index 6f4718d..ec44579 100644
--- a/include/status.h
+++ b/include/status.h
@@ -12,7 +12,7 @@
     INT32	x;
     INT32	style;
     RECT32	bound;
-    LPSTR	text;
+    LPWSTR	text;
     HICON32     hIcon;
 } STATUSWINDOWPART;
 
@@ -25,8 +25,9 @@
     HWND32              hwndToolTip;
     HFONT32             hFont;
     HFONT32             hDefaultFont;
-    COLORREF            clrBk;  /* background color */
-    STATUSWINDOWPART	part0;	/* simple window */
+    COLORREF            clrBk;     /* background color */
+    BOOL32              bUnicode;  /* unicode flag */
+    STATUSWINDOWPART	part0;	   /* simple window */
     STATUSWINDOWPART   *parts;
 } STATUSWINDOWINFO;
 
diff --git a/include/toolbar.h b/include/toolbar.h
index 55686d7..55a4274 100644
--- a/include/toolbar.h
+++ b/include/toolbar.h
@@ -60,7 +60,7 @@
     RECT32     rcBound;         /* bounding rectangle */
 
     TBUTTON_INFO *buttons;      /* pointer to button array */
-    CHAR         **strings;
+    LPWSTR       *strings;      /* pointer to string array */
 } TOOLBAR_INFO;
 
 
diff --git a/include/tooltips.h b/include/tooltips.h
index 34d1d27..22e7bb5 100644
--- a/include/tooltips.h
+++ b/include/tooltips.h
@@ -18,19 +18,19 @@
 
 typedef struct tagTTTOOL_INFO
 {
-    UINT32 uFlags;
-    HWND32 hwnd;
-    UINT32 uId;
-    RECT32 rect;
+    UINT32      uFlags;
+    HWND32      hwnd;
+    UINT32      uId;
+    RECT32      rect;
     HINSTANCE32 hinst;
-    LPSTR  lpszText;
-    LPARAM lParam;
+    LPWSTR      lpszText;
+    LPARAM      lParam;
 } TTTOOL_INFO; 
 
 
 typedef struct tagTOOLTIPS_INFO
 {
-    CHAR       szTipText[INFOTIPSIZE];
+    WCHAR      szTipText[INFOTIPSIZE];
     BOOL32     bActive;
     BOOL32     bTrackActive;
     UINT32     uNumTools;