diff --git a/controls/menu.c b/controls/menu.c
index 2a0d211..3c1b9b3 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -146,15 +146,7 @@
 static WORD arrow_bitmap_width = 0, arrow_bitmap_height = 0;
 
 static HBITMAP hStdMnArrow = 0;
-
-/* Minimze/restore/close buttons to be inserted in menubar */
-static HBITMAP hBmpMinimize = 0;
-static HBITMAP hBmpMinimizeD = 0;
-static HBITMAP hBmpMaximize = 0;
-static HBITMAP hBmpMaximizeD = 0;
-static HBITMAP hBmpClose = 0;
-static HBITMAP hBmpCloseD = 0;
-
+static HBITMAP hBmpSysMenu = 0;
 
 static HBRUSH	hShadeBrush = 0;
 static HFONT	hMenuFont = 0;
@@ -397,12 +389,7 @@
     /* Load menu bitmaps */
     hStdMnArrow = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_MNARROW));
     /* Load system buttons bitmaps */
-    hBmpMinimize = LoadBitmapA(0,MAKEINTRESOURCEA(OBM_REDUCE));
-    hBmpMinimizeD = LoadBitmapA(0,MAKEINTRESOURCEA(OBM_REDUCED));
-    hBmpMaximize = LoadBitmapA(0,MAKEINTRESOURCEA(OBM_RESTORE));
-    hBmpMaximizeD = LoadBitmapA(0,MAKEINTRESOURCEA(OBM_RESTORED));
-    hBmpClose = LoadBitmapA(0,MAKEINTRESOURCEA(OBM_CLOSE));
-    hBmpCloseD = LoadBitmapA(0,MAKEINTRESOURCEA(OBM_CLOSED));
+    hBmpSysMenu = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_CLOSE));
 
     if (hStdMnArrow)
     {
@@ -696,47 +683,150 @@
     }
     return (UINT)(-1);
 }
+
+
 /***********************************************************************
- *           MENU_LoadMagicItem
+ *           MENU_GetBitmapItemSize
  *
- * Load the bitmap associated with the magic menu item and its style
+ * Get the size of a bitmap item.
  */
-
-static HBITMAP MENU_LoadMagicItem(UINT id, BOOL hilite, DWORD dwItemData)
+static void MENU_GetBitmapItemSize( UINT id, DWORD data, SIZE *size )
 {
-    /*
-     * Magic menu item id's section
-     * These magic id's are used by windows to insert "standard" mdi
-     * buttons (minimize,restore,close) on menu. Under windows,
-     * these magic id's make sure the right things appear when those
-     * bitmap buttons are pressed/selected/released.
-     */
+    BITMAP bm;
+    HBITMAP bmp = (HBITMAP)id;
 
-    switch(id & 0xffff)
-    {   case HBMMENU_SYSTEM:
-	    return (dwItemData) ?
-		(HBITMAP)dwItemData :
-		(hilite ? hBmpMinimizeD : hBmpMinimize);
-	case HBMMENU_MBAR_RESTORE:
-	    return (hilite ? hBmpMaximizeD: hBmpMaximize);
-	case HBMMENU_MBAR_MINIMIZE:
-	    return (hilite ? hBmpMinimizeD : hBmpMinimize);
-	case HBMMENU_MBAR_CLOSE:
-	    return (hilite ? hBmpCloseD : hBmpClose);
-	case HBMMENU_CALLBACK:
-	case HBMMENU_MBAR_CLOSE_D:
-	case HBMMENU_MBAR_MINIMIZE_D:
-	case HBMMENU_POPUP_CLOSE:
-	case HBMMENU_POPUP_RESTORE:
-	case HBMMENU_POPUP_MAXIMIZE:
-	case HBMMENU_POPUP_MINIMIZE:
-	default:
-	    FIXME("Magic 0x%08x not implemented\n", id);
-	    return 0;
+    size->cx = size->cy = 0;
+
+    /* check if there is a magic menu item associated with this item */
+    if (id && IS_MAGIC_ITEM( id ))
+    {
+        switch(LOWORD(id))
+        {
+        case HBMMENU_SYSTEM:
+            if (data)
+            {
+                bmp = (HBITMAP)data;
+                break;
+            }
+            /* fall through */
+        case HBMMENU_MBAR_RESTORE:
+        case HBMMENU_MBAR_MINIMIZE:
+        case HBMMENU_MBAR_MINIMIZE_D:
+        case HBMMENU_MBAR_CLOSE:
+        case HBMMENU_MBAR_CLOSE_D:
+            size->cx = GetSystemMetrics( SM_CXSIZE );
+            size->cy = GetSystemMetrics( SM_CYSIZE );
+            return;
+        case HBMMENU_CALLBACK:
+        case HBMMENU_POPUP_CLOSE:
+        case HBMMENU_POPUP_RESTORE:
+        case HBMMENU_POPUP_MAXIMIZE:
+        case HBMMENU_POPUP_MINIMIZE:
+        default:
+            FIXME("Magic 0x%08x not implemented\n", id);
+            return;
+        }
+    }
+    if (GetObjectA(bmp, sizeof(bm), &bm ))
+    {
+        size->cx = bm.bmWidth;
+        size->cy = bm.bmHeight;
+    }
+}
+
+/***********************************************************************
+ *           MENU_DrawBitmapItem
+ *
+ * Draw a bitmap item.
+ */
+static void MENU_DrawBitmapItem( HDC hdc, MENUITEM *lpitem, const RECT *rect, BOOL menuBar )
+{
+    BITMAP bm;
+    DWORD rop;
+    HDC hdcMem;
+    HBITMAP bmp = (HBITMAP)lpitem->text;
+    int w = rect->right - rect->left;
+    int h = rect->bottom - rect->top;
+    int bmp_xoffset = 0;
+    int left, top;
+
+    /* Check if there is a magic menu item associated with this item */
+    if (lpitem->text && IS_MAGIC_ITEM(lpitem->text))
+    {
+        UINT flags = 0;
+        RECT r;
+
+        switch(LOWORD(lpitem->text))
+        {
+        case HBMMENU_SYSTEM:
+            if (lpitem->dwItemData)
+            {
+                bmp = (HBITMAP)lpitem->dwItemData;
+                if (!GetObjectA( bmp, sizeof(bm), &bm )) return;
+            }
+            else
+            {
+                bmp = hBmpSysMenu;
+                if (!GetObjectA( bmp, sizeof(bm), &bm )) return;
+                /* only use right half of the bitmap */
+                bmp_xoffset = bm.bmWidth / 2;
+                bm.bmWidth -= bmp_xoffset;
+            }
+            goto got_bitmap;
+        case HBMMENU_MBAR_RESTORE:
+            flags = DFCS_CAPTIONRESTORE;
+            break;
+        case HBMMENU_MBAR_MINIMIZE:
+            flags = DFCS_CAPTIONMIN;
+            break;
+        case HBMMENU_MBAR_MINIMIZE_D:
+            flags = DFCS_CAPTIONMIN | DFCS_INACTIVE;
+            break;
+        case HBMMENU_MBAR_CLOSE:
+            flags = DFCS_CAPTIONCLOSE;
+            break;
+        case HBMMENU_MBAR_CLOSE_D:
+            flags = DFCS_CAPTIONCLOSE | DFCS_INACTIVE;
+            break;
+        case HBMMENU_CALLBACK:
+        case HBMMENU_POPUP_CLOSE:
+        case HBMMENU_POPUP_RESTORE:
+        case HBMMENU_POPUP_MAXIMIZE:
+        case HBMMENU_POPUP_MINIMIZE:
+        default:
+            FIXME("Magic 0x%08x not implemented\n", LOWORD(lpitem->text));
+            return;
+        }
+        r = *rect;
+        InflateRect( &r, -1, -1 );
+        if (lpitem->fState & MF_HILITE) flags |= DFCS_PUSHED;
+        DrawFrameControl( hdc, &r, DFC_CAPTION, flags );
+        return;
     }
 
+    if (!bmp || !GetObjectA( bmp, sizeof(bm), &bm )) return;
+
+ got_bitmap:
+    hdcMem = CreateCompatibleDC( hdc );
+    SelectObject( hdcMem, bmp );
+
+    /* handle fontsize > bitmap_height */
+    top = (h>bm.bmHeight) ? rect->top+(h-bm.bmHeight)/2 : rect->top;
+    left=rect->left;
+    if (TWEAK_WineLook == WIN95_LOOK) {
+        rop=((lpitem->fState & MF_HILITE) && !IS_MAGIC_ITEM(lpitem->text)) ? NOTSRCCOPY : SRCCOPY;
+        if ((lpitem->fState & MF_HILITE) && IS_BITMAP_ITEM(lpitem->fType))
+            SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
+    } else {
+        left++;
+        w-=2;
+        rop=((lpitem->fState & MF_HILITE) && !IS_MAGIC_ITEM(lpitem->text) && (!menuBar)) ? MERGEPAINT : SRCCOPY;
+    }
+    BitBlt( hdc, left, top, w, h, hdcMem, bmp_xoffset, 0, rop );
+    DeleteDC( hdcMem );
 }
 
+
 /***********************************************************************
  *           MENU_CalcItemSize
  *
@@ -812,28 +902,16 @@
 
     if (IS_BITMAP_ITEM(lpitem->fType))
     {
-	BITMAP bm;
-	HBITMAP resBmp = 0;
+        SIZE size;
 
-	/* Check if there is a magic menu item associated with this item */
-	if (IS_MAGIC_ITEM(lpitem->text))
-	{
-	    resBmp = MENU_LoadMagicItem((int)lpitem->text, (lpitem->fType & MF_HILITE),
-					lpitem->dwItemData);
-        }
-        else
-            resBmp = (HBITMAP)lpitem->text;
-
-        if (GetObjectA(resBmp, sizeof(bm), &bm ))
+        MENU_GetBitmapItemSize( (int)lpitem->text, lpitem->dwItemData, &size );
+        lpitem->rect.right  += size.cx;
+        lpitem->rect.bottom += size.cy;
+        if (TWEAK_WineLook == WIN98_LOOK)
         {
-            lpitem->rect.right  += bm.bmWidth;
-            lpitem->rect.bottom += bm.bmHeight;
-            if (TWEAK_WineLook == WIN98_LOOK) {
-                /* Leave space for the sunken border */
-                lpitem->rect.right  += 2;
-                lpitem->rect.bottom += 2;
-            }
-
+            /* Leave space for the sunken border */
+            lpitem->rect.right  += 2;
+            lpitem->rect.bottom += 2;
         }
     }
     
@@ -1259,53 +1337,7 @@
     /* Draw the item text or bitmap */
     if (IS_BITMAP_ITEM(lpitem->fType))
     {
-        int left,top,w,h;
-        DWORD rop;
-
-        HBITMAP resBmp = 0;
-
-        HDC hdcMem = CreateCompatibleDC( hdc );
-
-        /*
-         * Check if there is a magic menu item associated with this item
-         * and load the appropriate bitmap
-         */
-	if (IS_MAGIC_ITEM(lpitem->text))
-	{
-	    resBmp = MENU_LoadMagicItem((int)lpitem->text, (lpitem->fState & MF_HILITE),
-					lpitem->dwItemData);
-        }
-        else
-            resBmp = (HBITMAP)lpitem->text;
-
-	if (resBmp)
-	{
-	    BITMAP bm;
-	    GetObjectA( resBmp, sizeof(bm), &bm );
-	
-	    SelectObject(hdcMem,resBmp );
-	
-	    /* handle fontsize > bitmap_height */
-            h=rect.bottom - rect.top;
-	    top = (h>bm.bmHeight) ? 
-		rect.top+(h-bm.bmHeight)/2 : rect.top;
-            w=rect.right - rect.left;
-            left=rect.left;
-            if (TWEAK_WineLook == WIN95_LOOK) {
-                rop=((lpitem->fState & MF_HILITE) && !IS_MAGIC_ITEM(lpitem->text)) ? NOTSRCCOPY : SRCCOPY;
-                if ((lpitem->fState & MF_HILITE) && IS_BITMAP_ITEM(lpitem->fType))
-                    SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
-            } else {
-                left++;
-                w-=2;
-                rop=((lpitem->fState & MF_HILITE) && !IS_MAGIC_ITEM(lpitem->text) && (!menuBar)) ? MERGEPAINT : SRCCOPY;
-            }
-	    BitBlt( hdc, left, top, w,
-		  h, hdcMem, 0, 0,
-		   rop);
-	}
-	DeleteDC( hdcMem );
-
+        MENU_DrawBitmapItem( hdc, lpitem, &rect, menuBar );
 	return;
 
     }
