diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c
index d7fab22c3418da5eb36e4a3a4bf0cda802b39c0c..ec0f6bfecb84a33160cdbff9b252e647c3971ff8 100644
--- a/dlls/comctl32/toolbar.c
+++ b/dlls/comctl32/toolbar.c
@@ -104,6 +104,7 @@ typedef struct
     HWND     hwndNotify;      /* handle to the window that gets notifications */
     HWND     hwndSelf;        /* my own handle */
     BOOL     bTransparent;    /* background transparency flag */
+    BOOL     bBtnTranspnt;    /* button transparency flag */
     BOOL     bAutoSize;       /* auto size deadlock indicator */
     BOOL     bAnchor;         /* anchor highlight enabled */
     BOOL     bNtfUnicode;     /* TRUE if NOTIFYs use {W} */
@@ -198,8 +199,6 @@ TOOLBAR_CheckStyle (HWND hwnd, DWORD dwStyle)
 	FIXME("[%04x] TBSTYLE_ALTDRAG not implemented\n", hwnd);
     if (dwStyle & TBSTYLE_REGISTERDROP)
 	FIXME("[%04x] TBSTYLE_REGISTERDROP not implemented\n", hwnd);
-    if (dwStyle & TBSTYLE_TRANSPARENT)
-	FIXME("[%04x] TBSTYLE_TRANSPARENT not implemented\n", hwnd);
 }
 
 
@@ -459,7 +458,7 @@ TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
 		    rcText.left += (infoPtr->nBitmapWidth + 2);
 		}
 		else {
-		    rcText.top += infoPtr->nBitmapHeight;
+		    rcText.top += infoPtr->nBitmapHeight + 1;
 		}
 	}
 	else {
@@ -572,7 +571,7 @@ TOOLBAR_DrawButton (HWND hwnd, TBUTTON_INFO *btnPtr, HDC hdc)
     CopyRect (&rcArrow, &rc);
     CopyRect(&rcBitmap, &rc);
 
-    if (!infoPtr->bTransparent)
+    if (!infoPtr->bBtnTranspnt)
 	FillRect( hdc, &rc, GetSysColorBrush(COLOR_BTNFACE));
 
     if (hasDropDownArrow)
@@ -773,7 +772,7 @@ TOOLBAR_Refresh (HWND hwnd, HDC hdc, PAINTSTRUCT* ps)
 
     TOOLBAR_DumpToolbar (infoPtr, __LINE__);
 
-    if (infoPtr->bTransparent)
+    if (infoPtr->bBtnTranspnt)
 	oldBKmode = SetBkMode (hdc, TRANSPARENT);
 
     /* redraw necessary buttons */
@@ -784,7 +783,7 @@ TOOLBAR_Refresh (HWND hwnd, HDC hdc, PAINTSTRUCT* ps)
             TOOLBAR_DrawButton (hwnd, btnPtr, hdc);
     }
 
-    if (infoPtr->bTransparent && (oldBKmode != TRANSPARENT))
+    if (infoPtr->bBtnTranspnt && (oldBKmode != TRANSPARENT))
 	SetBkMode (hdc, oldBKmode);
 }
 
@@ -1078,8 +1077,19 @@ TOOLBAR_CalcToolbar (HWND hwnd)
 
     if (dwStyle & TBSTYLE_LIST)
     {
-	infoPtr->nButtonHeight = max(infoPtr->nBitmapHeight, sizeString.cy) + 6;
-	infoPtr->nButtonWidth = infoPtr->nBitmapWidth + sizeString.cx + 6;
+        for (i = 0; i < infoPtr->nNumButtons && !usesBitmaps; i++)
+        {
+	    if (infoPtr->buttons[i].iBitmap >= 0)
+	        usesBitmaps = TRUE;
+        }
+	infoPtr->nButtonHeight = max((usesBitmaps) ? infoPtr->nBitmapHeight :
+				     0, sizeString.cy) + 6;
+	infoPtr->nButtonWidth = ((usesBitmaps) ? infoPtr->nBitmapWidth :
+				 0) + sizeString.cx + 6;
+	TRACE("LIST style, But w=%d h=%d, useBitmaps=%d, Bit w=%d h=%d\n",
+	      infoPtr->nButtonWidth, infoPtr->nButtonHeight, usesBitmaps,
+	      infoPtr->nBitmapWidth, infoPtr->nBitmapHeight);
+	TOOLBAR_DumpToolbar (infoPtr, __LINE__);
     }
     else {
         for (i = 0; i < infoPtr->nNumButtons && !usesBitmaps; i++)
@@ -1091,7 +1101,8 @@ TOOLBAR_CalcToolbar (HWND hwnd)
         if (sizeString.cy > 0)
         {
             if (usesBitmaps)
-	      infoPtr->nButtonHeight = sizeString.cy +
+		infoPtr->nButtonHeight = sizeString.cy + 
+		    2 + /* this is the space to separate text from bitmap */
                   infoPtr->nBitmapHeight + 6;
             else 
                 infoPtr->nButtonHeight = sizeString.cy + 6;
@@ -1107,13 +1118,13 @@ TOOLBAR_CalcToolbar (HWND hwnd)
 
     if ( infoPtr->cxMin >= 0 && infoPtr->nButtonWidth < infoPtr->cxMin )
         infoPtr->nButtonWidth = infoPtr->cxMin;
-    if ( infoPtr->cxMax >= 0 && infoPtr->nButtonWidth > infoPtr->cxMax )
+    if ( infoPtr->cxMax > 0 && infoPtr->nButtonWidth > infoPtr->cxMax )
         infoPtr->nButtonWidth = infoPtr->cxMax;
 
     TOOLBAR_WrapToolbar( hwnd, dwStyle );
 
     x  = infoPtr->nIndent;
-    y  = (dwStyle & TBSTYLE_FLAT) ? 0 : TOP_BORDER;
+    y  = 0;
 
    /*
     * We will set the height below, and we set the width on entry 
@@ -2759,8 +2770,11 @@ TOOLBAR_GetButtonSize (HWND hwnd)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
 
-    return MAKELONG((WORD)infoPtr->nButtonWidth,
-		    (WORD)infoPtr->nButtonHeight);
+    if (infoPtr->nNumButtons > 0)
+	return MAKELONG((WORD)infoPtr->nButtonWidth,
+			(WORD)infoPtr->nButtonHeight);
+    else
+	return MAKELONG(8,7);
 }
 
 
@@ -4012,7 +4026,8 @@ TOOLBAR_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
     infoPtr->nOldHit = -1;
     infoPtr->nHotItem = -2; /* It has to be initially different from nOldHit */
     infoPtr->hwndNotify = GetParent (hwnd);
-    infoPtr->bTransparent = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_TRANSPARENT));
+    infoPtr->bTransparent = (dwStyle & TBSTYLE_TRANSPARENT);
+    infoPtr->bBtnTranspnt = (dwStyle & (TBSTYLE_FLAT | TBSTYLE_LIST));
     infoPtr->dwDTFlags = (dwStyle & TBSTYLE_LIST) ? DT_LEFT | DT_VCENTER | DT_SINGLELINE : DT_CENTER;
     infoPtr->bAnchor = FALSE; /* no anchor highlighting */
     infoPtr->iVersion = 0;
@@ -4094,15 +4109,15 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
     DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
     NMTBCUSTOMDRAW tbcd;
-    INT ret;
+    INT ret, ntfret;
 
     if (dwStyle & TBSTYLE_CUSTOMERASE) {
 	ZeroMemory (&tbcd, sizeof(NMTBCUSTOMDRAW));
 	tbcd.nmcd.dwDrawStage = CDDS_PREERASE;
 	tbcd.nmcd.hdc = (HDC)wParam;
-	ret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW);
+	ntfret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW);
 	/* FIXME: in general the return flags *can* be or'ed together */
-	switch (ret) 
+	switch (ntfret) 
 	    {
 	    case CDRF_DODEFAULT:
 		break;
@@ -4110,7 +4125,7 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
 		return TRUE;
 	    default:
 		FIXME("[%04x] response %d not handled to NM_CUSTOMDRAW (CDDS_PREERASE)\n",
-		      hwnd, ret);
+		      hwnd, ntfret);
 	    }
     }
 
@@ -4131,13 +4146,14 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
 	SetWindowOrgEx (hdc, ptorig.x, ptorig.y, 0);
 	return TRUE;
     }
+    ret = DefWindowProcA (hwnd, WM_ERASEBKGND, wParam, lParam);
 
     if (dwStyle & TBSTYLE_CUSTOMERASE) {
 	ZeroMemory (&tbcd, sizeof(NMTBCUSTOMDRAW));
 	tbcd.nmcd.dwDrawStage = CDDS_POSTERASE;
 	tbcd.nmcd.hdc = (HDC)wParam;
-	ret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW);
-	switch (ret) 
+	ntfret = TOOLBAR_SendNotify ((NMHDR *)&tbcd, infoPtr, NM_CUSTOMDRAW);
+	switch (ntfret) 
 	    {
 	    case CDRF_DODEFAULT:
 		break;
@@ -4145,10 +4161,10 @@ TOOLBAR_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
 		return TRUE;
 	    default:
 		FIXME("[%04x] response %d not handled to NM_CUSTOMDRAW (CDDS_PREERASE)\n",
-		      hwnd, ret);
+		      hwnd, ntfret);
 	    }
     }
-    return DefWindowProcA (hwnd, WM_ERASEBKGND, wParam, lParam);
+    return ret;
 }
 
 
@@ -4549,6 +4565,8 @@ static LRESULT
 TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     TOOLBAR_INFO *infoPtr;
+    LPCREATESTRUCTA cs = (LPCREATESTRUCTA)lParam;
+    DWORD styleadd = 0;
 
     /* allocate memory for info structure */
     infoPtr = (TOOLBAR_INFO *)COMCTL32_Alloc (sizeof(TOOLBAR_INFO));
@@ -4563,6 +4581,58 @@ TOOLBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
 	SetWindowLongA (hwnd, GWL_HINSTANCE, (DWORD)hInst);
     }
 
+    /* native control does:
+     *    Get a lot of colors and brushes
+     *    WM_NOTIFYFORMAT
+     *    SystemParametersInfoA(0x1f, 0x3c, adr1, 0)
+     *    CreateFontIndirectA(adr1)
+     *    CreateBitmap(0x27, 0x24, 1, 1, 0)
+     *    hdc = GetDC(toolbar)
+     *    GetSystemMetrics(0x48)
+     *    fnt2=CreateFontA(0xe, 0, 0, 0, 0x190, 0, 0, 0, 0, 2, 
+     *                     0, 0, 0, 0, "MARLETT")
+     *    oldfnt = SelectObject(hdc, fnt2)
+     *    GetCharWidthA(hdc, 0x36, 0x36, adr2)
+     *    GetTextMetricsA(hdc, adr3)
+     *    SelectObject(hdc, oldfnt)
+     *    DeleteObject(fnt2)
+     *    ReleaseDC(hdc)
+     *    InvalidateRect(toolbar, 0, 1)
+     *    SetWindowLongA(toolbar, 0, addr)
+     *    SetWindowLongA(toolbar, -16, xxx)  **sometimes**
+     *                                          WM_STYLECHANGING
+     *                             CallWinEx   old         new
+     *                       ie 1  0x56000a4c  0x46000a4c  0x56008a4d
+     *                       ie 2  0x4600094c  0x4600094c  0x4600894d
+     *                       ie 3  0x56000b4c  0x46000b4c  0x56008b4d
+     *                      rebar  0x50008844  0x40008844  0x50008845
+     *                      pager  0x50000844  0x40000844  0x50008845
+     *                    IC35mgr  0x5400084e  **nochange**
+     *           on entry to _NCCREATE         0x5400084e
+     *                    rowlist  0x5400004e  **nochange**
+     *           on entry to _NCCREATE         0x5400004e
+     *
+     */
+
+    /* I think the code below is a bug, but it is the way that the native
+     * controls seem to work. The effect is that if the user of TBSTYLE_FLAT
+     * forgets to specify TBSTYLE_TRANSPARENT but does specify either
+     * CCS_TOP or CCS_BOTTOM (_NOMOVEY and _TOP), then the control
+     * does *not* set TBSTYLE_TRANSPARENT even though it should!!!!
+     * Some how, the only cases of this seem to be MFC programs.
+     *
+     * Note also that the addition of _TRANSPARENT occurs *only* here. It
+     * does not occur in the WM_STYLECHANGING routine.
+     *    (Guy Albertelli   9/2001)
+     *
+     */
+    if ((cs->style & TBSTYLE_FLAT) && !(cs->style & TBSTYLE_TRANSPARENT))
+	styleadd |= TBSTYLE_TRANSPARENT;
+    if (!(cs->style & (CCS_TOP | CCS_NOMOVEY))) {
+	styleadd |= CCS_TOP;   /* default to top */
+	SetWindowLongA (hwnd, GWL_STYLE, cs->style | styleadd);
+    }
+
     return DefWindowProcA (hwnd, WM_NCCREATE, wParam, lParam);
 }
 
@@ -4767,6 +4837,9 @@ TOOLBAR_StyleChanged (HWND hwnd, INT nType, LPSTYLESTRUCT lpStyle)
 	else {
 	    infoPtr->dwDTFlags = DT_CENTER;
 	}
+	infoPtr->bTransparent = (lpStyle->styleNew & TBSTYLE_TRANSPARENT);
+	infoPtr->bBtnTranspnt = (lpStyle->styleNew & 
+				 (TBSTYLE_FLAT | TBSTYLE_LIST));
 	TOOLBAR_CheckStyle (hwnd, lpStyle->styleNew);
     }