diff --git a/if1632/user.spec b/if1632/user.spec
index a91fa002b787cf7529bf32e66886f387272bf144..e3bc89b1cfb28795e7cefcd76326a80f9d2db567 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -498,10 +498,10 @@ file	user.exe
 654 stub UnloadKeyboardLayout
 655 stub PostPostedMessages
 656 pascal16 DrawFrameControl(word ptr word word) DrawFrameControl16
-657 stub DrawCaptionTemp
+657 pascal16 DrawCaptionTemp(word word ptr word word ptr word) DrawCaptionTemp16
 658 stub DispatchInput
 659 pascal16 DrawEdge(word ptr word word) DrawEdge16
-660 stub DrawCaption
+660 pascal16 DrawCaption(word word ptr word) DrawCaption16
 661 stub SetSysColorsTemp
 662 stub DrawMenubarTemp
 663 stub GetMenuDefaultItem
diff --git a/include/windows.h b/include/windows.h
index af54d7170f860f68572e51dcbe0b425d3cfa113f..2a23cc1e65887dc03b778051506cb9f22e9318d2 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -3565,6 +3565,13 @@ DECL_WINELIB_TYPE_AW(LPMENUITEMINFO)
 #define DT_NOPREFIX 2048
 #define DT_INTERNAL 4096
 
+/* DrawCaption()/DrawCaptionTemp() flags */
+#define DC_ACTIVE		0x0001
+#define DC_SMALLCAP		0x0002
+#define DC_ICON			0x0004
+#define DC_TEXT			0x0008
+#define DC_INBUTTON		0x0010
+
 /* DrawEdge() flags */
 #define BDR_RAISEDOUTER    0x0001
 #define BDR_SUNKENOUTER    0x0002
@@ -7450,6 +7457,13 @@ BOOL32      WINAPI DragDetect32(HWND32,POINT32);
 DWORD       WINAPI DragObject16(HWND16,HWND16,UINT16,HANDLE16,WORD,HCURSOR16);
 DWORD       WINAPI DragObject32(HWND32,HWND32,UINT32,DWORD,HCURSOR32);
 #define     DragObject WINELIB_NAME(DragObject)
+BOOL16      WINAPI DrawCaption16(HWND16,HDC16,const RECT16*,UINT16);
+BOOL32      WINAPI DrawCaption32(HWND32,HDC32,const RECT32*,UINT32);
+#define     DrawCaption WINELIB_NAME(DrawCaption)
+BOOL16      WINAPI DrawCaptionTemp16(HWND16,HDC16, const RECT16*,HFONT16,HICON16,LPCSTR,UINT16);
+BOOL32      WINAPI DrawCaptionTemp32A(HWND32,HDC32,const RECT32*,HFONT32,HICON32,LPCSTR,UINT32);
+BOOL32      WINAPI DrawCaptionTemp32W(HWND32,HDC32,const RECT32*,HFONT32,HICON32,LPCWSTR,UINT32);
+#define     DrawCaptionTemp WINELIB_NAME_AW(DrawCaptionTemp)
 BOOL16      WINAPI DrawEdge16(HDC16,LPRECT16,UINT16,UINT16);
 BOOL32      WINAPI DrawEdge32(HDC32,LPRECT32,UINT32,UINT32);
 #define     DrawEdge WINELIB_NAME(DrawEdge)
diff --git a/relay32/user32.spec b/relay32/user32.spec
index b8de44d88f13473ef056ad0e735adb0c454f131b..7d020f9debd2158467168447c2c5f708b03bacd2 100644
--- a/relay32/user32.spec
+++ b/relay32/user32.spec
@@ -154,7 +154,7 @@ type	win32
 151 stdcall DragDetect(long long long) DragDetect32
 152 stub DragObject
 153 stdcall DrawAnimatedRects(long long ptr ptr) DrawAnimatedRects32
-154 stub DrawCaption
+154 stdcall DrawCaption(long long ptr long) DrawCaption32
 155 stdcall DrawEdge(long ptr long long) DrawEdge32
 156 stdcall DrawFocusRect(long ptr) DrawFocusRect32
 157 stub DrawFrame
@@ -603,7 +603,7 @@ type	win32
 599 stdcall DrawCaptionTempA(long long ptr long long str long) DrawCaptionTemp32A
 600 stub RegisterNetworkCapabilities
 601 stub WNDPROC_CALLBACK
-602 stub DrawCaptionTempW
+602 stdcall DrawCaptionTempW(long long ptr long long wstr long) DrawCaptionTemp32W
 603 stub IsHungAppWindow
 604 stub ChangeDisplaySettingsA
 605 stub ChangeDisplaySettingsW
diff --git a/windows/nonclient.c b/windows/nonclient.c
index b5dbbcf85da4b75d05ed72ab5789534e09d01baa..572a9528682c18354bdc1bfa4914806feaef8290 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -24,7 +24,7 @@
 #include "tweak.h"
 #include "debug.h"
 #include "options.h"
-
+#include "cache.h"
 
 static HBITMAP16 hbitmapClose = 0;
 static HBITMAP16 hbitmapCloseD = 0;
@@ -217,20 +217,186 @@ NC_AdjustRectInner95 (LPRECT16 rect, DWORD style, DWORD exStyle)
 
 
 /***********************************************************************
- * DrawCaptionTempA [USER32.599]
+ * DrawCaption16 [USER.660] Draws a caption bar
+ *
+ * PARAMS
+ *     hwnd   [I]
+ *     hdc    [I]
+ *     lpRect [I]
+ *     uFlags [I]
+ *
+ */
+
+BOOL16 WINAPI
+DrawCaption16 (HWND16 hwnd, HDC16 hdc, const RECT16 *lpRect, UINT16 uFlags)
+{
+    FIXME (nonclient, " stub!\n");
+
+//    return DrawCaptionTemp32A (hwnd, hdc, lpRect, 0, 0, NULL, uFlags & 0x1F);
+
+    return 0;
+}
+
+
+/***********************************************************************
+ * DrawCaption32 [USER32.154] Draws a caption bar
+ *
+ * PARAMS
+ *     hwnd   [I]
+ *     hdc    [I]
+ *     lpRect [I]
+ *     uFlags [I]
+ *
+ */
+
+BOOL32 WINAPI
+DrawCaption32 (HWND32 hwnd, HDC32 hdc, const RECT32 *lpRect, UINT32 uFlags)
+{
+    return DrawCaptionTemp32A (hwnd, hdc, lpRect, 0, 0, NULL, uFlags & 0x1F);
+}
+
+
+/***********************************************************************
+ * DrawCaptionTemp16 [USER.657]
  *
  */
-DWORD WINAPI
-DrawCaptionTemp32A (HWND32 hwnd, HDC32 hdc, LPRECT32 rect,
-		    HFONT32 hfont,DWORD x1,LPCSTR str,DWORD x2)
+
+BOOL16 WINAPI
+DrawCaptionTemp16 (HWND16 hwnd, HDC16 hdc, const RECT16 *rect, HFONT16 hFont,
+		   HICON16 hIcon, LPCSTR str, UINT16 uFlags)
 {
-    FIXME (nonclient, "(%08x,%08x,%p,%08x,%08x,\"%s\",%08x): stub\n",
-	   hwnd, hdc, rect, hfont, x1, str, x2);
+    FIXME (nonclient, " stub!\n");
+
+//    return DrawCaptionTemp32A (hwnd, hdc, lpRect, 0, 0, NULL, uFlags & 0x1F);
 
     return 0;
 }
 
 
+/***********************************************************************
+ * DrawCaptionTemp32A [USER32.599]
+ *
+ */
+
+BOOL32 WINAPI
+DrawCaptionTemp32A (HWND32 hwnd, HDC32 hdc, const RECT32 *rect, HFONT32 hFont,
+		    HICON32 hIcon, LPCSTR str, UINT32 uFlags)
+{
+    RECT32   rc = *rect;
+
+    TRACE (nonclient, "(%08x,%08x,%p,%08x,%08x,\"%s\",%08x)\n",
+	   hwnd, hdc, rect, hFont, hIcon, str, uFlags);
+
+    /* drawing background */
+    if (uFlags & DC_INBUTTON) {
+	FillRect32 (hdc, &rc, GetSysColorBrush32 (COLOR_3DFACE));
+
+	if (uFlags & DC_ACTIVE) {
+	    HBRUSH32 hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
+	    PatBlt32 (hdc, rc.left, rc.top,
+		      rc.right-rc.left, rc.bottom-rc.top, 0xFA0089);
+	    SelectObject32 (hdc, hbr);
+	}
+    }
+    else {
+	FillRect32 (hdc, &rc, GetSysColorBrush32 ((uFlags & DC_ACTIVE) ?
+		    COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION));
+    }
+
+
+    /* drawing icon */
+    if ((uFlags & DC_ICON) && !(uFlags & DC_SMALLCAP)) {
+	POINT32 pt;
+
+	pt.x = rc.left + 2;
+	pt.y = (rc.bottom + rc.top - sysMetrics[SM_CYSMICON]) / 2;
+
+	if (hIcon) {
+	    DrawIconEx32 (hdc, pt.x, pt.y, hIcon, sysMetrics[SM_CXSMICON],
+			  sysMetrics[SM_CYSMICON], 0, 0, DI_NORMAL);
+	}
+	else {
+	    WND *wndPtr = WIN_FindWndPtr(hwnd);
+	    HICON32 hAppIcon = 0;
+
+	    if (wndPtr->class->hIconSm)
+		hAppIcon = wndPtr->class->hIconSm;
+	    else if (wndPtr->class->hIcon)
+		hAppIcon = wndPtr->class->hIcon;
+
+	    DrawIconEx32 (hdc, pt.x, pt.y, hAppIcon, sysMetrics[SM_CXSMICON],
+			  sysMetrics[SM_CYSMICON], 0, 0, DI_NORMAL);
+	}
+
+	rc.left += (rc.bottom - rc.top);
+    }
+
+    /* drawing text */
+    if (uFlags & DC_TEXT) {
+	HFONT32 hOldFont;
+
+	if (uFlags & DC_INBUTTON)
+	    SetTextColor32 (hdc, GetSysColor32 (COLOR_BTNTEXT));
+	else if (uFlags & DC_ACTIVE)
+	    SetTextColor32 (hdc, GetSysColor32 (COLOR_CAPTIONTEXT));
+	else
+	    SetTextColor32 (hdc, GetSysColor32 (COLOR_INACTIVECAPTIONTEXT));
+
+	SetBkMode32 (hdc, TRANSPARENT);
+
+	if (hFont)
+	    hOldFont = SelectObject32 (hdc, hFont);
+	else {
+	    NONCLIENTMETRICS32A nclm;
+	    HFONT32 hNewFont;
+	    nclm.cbSize = sizeof(NONCLIENTMETRICS32A);
+	    SystemParametersInfo32A (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
+	    hNewFont = CreateFontIndirect32A ((uFlags & DC_SMALLCAP) ?
+		&nclm.lfSmCaptionFont : &nclm.lfCaptionFont);
+	    hOldFont = SelectObject32 (hdc, hNewFont);
+	}
+
+	if (str)
+	    DrawText32A (hdc, str, -1, &rc,
+			 DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_LEFT);
+	else {
+	    CHAR szText[128];
+	    INT32 nLen;
+	    nLen = GetWindowText32A (hwnd, szText, 128);
+	    DrawText32A (hdc, szText, nLen, &rc,
+			 DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_LEFT);
+	}
+
+	if (hFont)
+	    SelectObject32 (hdc, hOldFont);
+	else
+	    DeleteObject32 (SelectObject32 (hdc, hOldFont));
+    }
+
+    /* drawing focus ??? */
+    if (uFlags & 0x2000)
+	FIXME (nonclient, "undocumented flag (0x2000)!\n");
+
+    return 0;
+}
+
+
+/***********************************************************************
+ * DrawCaptionTemp32W [USER32.602]
+ *
+ */
+
+BOOL32 WINAPI
+DrawCaptionTemp32W (HWND32 hwnd, HDC32 hdc, const RECT32 *rect, HFONT32 hFont,
+		    HICON32 hIcon, LPCWSTR str, UINT32 uFlags)
+{
+    LPSTR p = HEAP_strdupWtoA (GetProcessHeap (), 0, str);
+    BOOL32 res = DrawCaptionTemp32A (hwnd, hdc, rect, hFont, hIcon, p, uFlags);
+    HeapFree (GetProcessHeap (), 0, p);
+    return res;
+}
+
+
 /***********************************************************************
  *           AdjustWindowRect16    (USER.102)
  */
@@ -1252,10 +1418,11 @@ static void NC_DrawCaption( HDC32 hdc, RECT32 *rect, HWND32 hwnd,
 
 static void  NC_DrawCaption95(
     HDC32  hdc,
-    RECT32  *rect,
+    RECT32 *rect,
     HWND32 hwnd,
     DWORD  style,
-    BOOL32  active )
+    DWORD  exStyle,
+    BOOL32 active )
 {
     RECT32  r = *rect;
     WND     *wndPtr = WIN_FindWndPtr( hwnd );
@@ -1282,9 +1449,11 @@ static void  NC_DrawCaption95(
 	hbitmapRestoreD  = LoadBitmap16( 0, MAKEINTRESOURCE16(OBM_RESTORED) );
     }
 
-    if (style & WS_SYSMENU) {
+    if ((style & WS_SYSMENU) && !(exStyle & WS_EX_TOOLWINDOW)) {
 	if (NC_DrawSysButton95 (hwnd, hdc, FALSE))
 	    r.left += sysMetrics[SM_CYCAPTION] - 1;
+    }
+    if (style & WS_SYSMENU) {
 	NC_DrawCloseButton95 (hwnd, hdc, FALSE);
 	r.right -= sysMetrics[SM_CYCAPTION] - 1;
     }
@@ -1302,7 +1471,10 @@ static void  NC_DrawCaption95(
 	HFONT32 hFont, hOldFont;
 	nclm.cbSize = sizeof(NONCLIENTMETRICS32A);
 	SystemParametersInfo32A (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
-	hFont = CreateFontIndirect32A (&nclm.lfCaptionFont);
+	if (exStyle & WS_EX_TOOLWINDOW)
+	    hFont = CreateFontIndirect32A (&nclm.lfSmCaptionFont);
+	else
+	    hFont = CreateFontIndirect32A (&nclm.lfCaptionFont);
 	hOldFont = SelectObject32 (hdc, hFont);
 	if (active) SetTextColor32( hdc, GetSysColor32( COLOR_CAPTIONTEXT ) );
 	else SetTextColor32( hdc, GetSysColor32( COLOR_INACTIVECAPTIONTEXT ) );
@@ -1488,7 +1660,8 @@ void  NC_DoNCPaint95(
 		r.bottom = rect.top + sysMetrics[SM_CYCAPTION];
 		rect.top += sysMetrics[SM_CYCAPTION];
 	    }
-            NC_DrawCaption95( hdc, &r, hwnd, wndPtr->dwStyle, active );
+            NC_DrawCaption95( hdc, &r, hwnd, wndPtr->dwStyle,
+                              wndPtr->dwExStyle,active );
         }
     }