diff --git a/controls/button.c b/controls/button.c
index 9f988db..7ab8c33 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -6,7 +6,6 @@
  */
 
 #include "win.h"
-#include "graphics.h"
 #include "button.h"
 #include "windows.h"
 #include "tweak.h"
@@ -306,9 +305,12 @@
         PatBlt32(hDC, rc.left, rc.top, rc.right-rc.left, 1, PATCOPY );
         rc.left += 2;  /* To position the text down and right */
         rc.top  += 2;
+    } else {
+        rc.right++, rc.bottom++;
+	DrawEdge32( hDC, &rc, EDGE_RAISED, BF_RECT );
+        rc.right--, rc.bottom--;
     }
-    else GRAPH_DrawReliefRect( hDC, &rc, 2, 2, FALSE );
-    
+	
     /* draw button label, if any: */
     if (wndPtr->text && wndPtr->text[0])
     {
@@ -425,6 +427,7 @@
     if (wndPtr->text) textlen = strlen( wndPtr->text );
     if (action == ODA_DRAWENTIRE || action == ODA_SELECT)
     { 
+        HDC32 hMemDC = CreateCompatibleDC32( hDC );
         int x = 0, y = 0;
         delta = (rbox.bottom - rbox.top - checkBoxHeight) >> 1;
 
@@ -437,8 +440,11 @@
             ((wndPtr->dwStyle & 0x0f) == BS_AUTORADIOBUTTON)) y += checkBoxHeight;
         else if (infoPtr->state & BUTTON_3STATE) y += 2 * checkBoxHeight;
 
-        GRAPH_DrawBitmap( hDC, hbitmapCheckBoxes, rbox.left, rbox.top + delta,
-                          x, y, checkBoxWidth, checkBoxHeight, FALSE );
+	SelectObject32( hMemDC, hbitmapCheckBoxes );
+	BitBlt32( hDC, rbox.left, rbox.top + delta, checkBoxWidth,
+		  checkBoxHeight, hMemDC, x, y, SRCCOPY );
+	DeleteDC32( hMemDC );
+
         if( textlen && action != ODA_SELECT )
         {
             if (wndPtr->dwStyle & WS_DISABLED)
@@ -506,10 +512,16 @@
     BUTTON_SEND_CTLCOLOR( wndPtr, hDC );
 
     GetClientRect32( wndPtr->hwndSelf, &rc);
-    if (TWEAK_WineLook == WIN31_LOOK)
-	GRAPH_DrawRectangle( hDC, rc.left, rc.top + 2, rc.right - 1, rc.bottom - 1,
-			    GetSysColorPen32(COLOR_WINDOWFRAME) );
-    else {
+    if (TWEAK_WineLook == WIN31_LOOK) {
+        HPEN32 hPrevPen = SelectObject32( hDC,
+					  GetSysColorPen32(COLOR_WINDOWFRAME));
+	HBRUSH32 hPrevBrush = SelectObject32( hDC,
+					      GetStockObject32(NULL_BRUSH) );
+
+	Rectangle32( hDC, rc.left, rc.top + 2, rc.right - 1, rc.bottom - 1 );
+	SelectObject32( hDC, hPrevBrush );
+	SelectObject32( hDC, hPrevPen );
+    } else {
 	TEXTMETRIC32A tm;
 	rcFrame = rc;
 
diff --git a/controls/combo.c b/controls/combo.c
index fc5aade..8276351 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -13,7 +13,6 @@
 #include "win.h"
 #include "spy.h"
 #include "user.h"
-#include "graphics.h"
 #include "heap.h"
 #include "combo.h"
 #include "drive.h"
@@ -377,37 +376,44 @@
 static void CBPaintButton(LPHEADCOMBO lphc, HDC32 hdc)
 {
     RECT32 	r;
-    HBRUSH32 	hPrevBrush;
     UINT32 	x, y;
     BOOL32 	bBool;
+    HDC32       hMemDC;
+    HBRUSH32    hPrevBrush;
+    COLORREF    oldTextColor, oldBkColor;
 
     if( lphc->wState & CBF_NOREDRAW ) return;
 
-    hPrevBrush = (HBRUSH32)SelectObject32(hdc, GetSysColorBrush32(COLOR_BTNFACE));
+    hPrevBrush = SelectObject32(hdc, GetSysColorBrush32(COLOR_BTNFACE));
     CONV_RECT16TO32( &lphc->RectButton, &r );
 
     Rectangle32(hdc, r.left, r.top, r.right, r.bottom );
-    InflateRect32( &r, -1, -1 );
     if( (bBool = lphc->wState & CBF_BUTTONDOWN) )
     {
-	GRAPH_DrawReliefRect(hdc, &r, 1, 0, TRUE);
+	DrawEdge32( hdc, &r, EDGE_SUNKEN, BF_RECT );
 	OffsetRect32( &r, 1, 1 );
-    } else GRAPH_DrawReliefRect(hdc, &r, 1, 2, FALSE);
+    } else {
+        r.top++, r.left++;
+	DrawEdge32( hdc, &r, EDGE_RAISED, BF_RECT );
+	r.top--, r.left--;
+    }
+
+    InflateRect32( &r, -1, -1 );	
 
     x = (r.left + r.right - CBitWidth) >> 1;
     y = (r.top + r.bottom - CBitHeight) >> 1;
 
     InflateRect32( &r, -3, -3 );
-    if( (bBool = CB_DISABLED(lphc)) )
-    {
-        GRAPH_SelectClipMask(hdc, hComboBmp, x + 1, y + 1 );
-        FillRect32(hdc, &r, (HBRUSH32)GetStockObject32(WHITE_BRUSH));
-    }
 
-    GRAPH_SelectClipMask(hdc, hComboBmp, x, y );
-    FillRect32(hdc, &r, (HBRUSH32)GetStockObject32((bBool) ? GRAY_BRUSH : BLACK_BRUSH));
-
-    GRAPH_SelectClipMask(hdc, (HBITMAP32)0, 0, 0);
+    hMemDC = CreateCompatibleDC32( hdc );
+    SelectObject32( hMemDC, hComboBmp );
+    oldTextColor = SetTextColor32( hdc, GetSysColor32(COLOR_BTNFACE) );
+    oldBkColor = SetBkColor32( hdc, CB_DISABLED(lphc) ? RGB(128,128,128) :
+			       RGB(0,0,0) );
+    BitBlt32( hdc, x, y, 8, 8, hMemDC, 0, 0, SRCCOPY );
+    SetBkColor32( hdc, oldBkColor );
+    SetTextColor32( hdc, oldTextColor );
+    DeleteDC32( hMemDC );
     SelectObject32( hdc, hPrevBrush );
 }
 
@@ -553,11 +559,13 @@
       if( !(lphc->wState & CBF_EDIT) )
       {
 	  /* paint text field */
+	  
+	  HPEN32 hPrevPen = SelectObject32( hDC, GetSysColorPen32(
+							  COLOR_WINDOWFRAME) );
 
-	  GRAPH_DrawRectangle( hDC, lphc->RectEdit.left, lphc->RectEdit.top,
-				    lphc->RectEdit.right - lphc->RectEdit.left, 
-				    lphc->RectButton.bottom - lphc->RectButton.top,
-				    GetSysColorPen32(COLOR_WINDOWFRAME) ); 
+	  Rectangle32( hDC, lphc->RectEdit.left, lphc->RectEdit.top,
+		       lphc->RectEdit.right, lphc->RectButton.bottom );
+	  SelectObject32( hDC, hPrevPen );
 	  CBPaintText( lphc, hDC );
       }
       if( hPrevBrush ) SelectObject32( hDC, hPrevBrush );
diff --git a/controls/desktop.c b/controls/desktop.c
index 52add8a..73baa5a 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -9,7 +9,6 @@
 #include <unistd.h>
 #include "win.h"
 #include "desktop.h"
-#include "graphics.h"
 #include "heap.h"
 
 
@@ -101,15 +100,16 @@
     if (infoPtr->hbitmapWallPaper)
     {
 	INT32 x, y;
+	HDC32 hMemDC = CreateCompatibleDC32( hdc );
+	
+	SelectObject32( hMemDC, infoPtr->hbitmapWallPaper );
 
 	if (infoPtr->fTileWallPaper)
 	{
 	    for (y = 0; y < rect.bottom; y += infoPtr->bitmapSize.cy)
 		for (x = 0; x < rect.right; x += infoPtr->bitmapSize.cx)
-		    GRAPH_DrawBitmap( hdc, infoPtr->hbitmapWallPaper,
-				      x, y, 0, 0, 
-				      infoPtr->bitmapSize.cx,
-				      infoPtr->bitmapSize.cy, FALSE );
+		    BitBlt32( hdc, x, y, infoPtr->bitmapSize.cx,
+			      infoPtr->bitmapSize.cy, hMemDC, 0, 0, SRCCOPY );
 	}
 	else
 	{
@@ -117,10 +117,10 @@
 	    y = (rect.top + rect.bottom - infoPtr->bitmapSize.cy) / 2;
 	    if (x < 0) x = 0;
 	    if (y < 0) y = 0;
-	    GRAPH_DrawBitmap( hdc, infoPtr->hbitmapWallPaper, 
-			      x, y, 0, 0, infoPtr->bitmapSize.cx, 
-			      infoPtr->bitmapSize.cy, FALSE );
+	    BitBlt32( hdc, x, y, infoPtr->bitmapSize.cx,
+		      infoPtr->bitmapSize.cy, hMemDC, 0, 0, SRCCOPY );
 	}
+	DeleteDC32( hMemDC );
     }
 
     return 1;
diff --git a/controls/icontitle.c b/controls/icontitle.c
index ae337af..3ea9656 100644
--- a/controls/icontitle.c
+++ b/controls/icontitle.c
@@ -11,7 +11,6 @@
 #include "sysmetrics.h"
 #include "win.h"
 #include "desktop.h"
-#include "graphics.h"
 #include "heap.h"
 
 static  LPCSTR	emptyTitleText = "<...>";
diff --git a/controls/menu.c b/controls/menu.c
index a6110aa..aaa3d23 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -23,13 +23,11 @@
 #include "task.h"
 #include "win.h"
 #include "heap.h"
-#include "menu.h"
 #include "module.h"
 #include "neexe.h"
 #include "nonclient.h"
 #include "user.h"
 #include "message.h"
-#include "graphics.h"
 #include "resource.h"
 #include "tweak.h"
 #include "debug.h"
@@ -952,9 +950,8 @@
 
 	  /* Draw the check mark
 	   *
+	   * FIXME:
 	   * Custom checkmark bitmaps are monochrome but not always 1bpp. 
-	   * In this case we want GRAPH_DrawBitmap() to copy a plane which 
-	   * is 1 for a white pixel and 0 for a black one. 
 	   */
 
 	if (lpitem->fState & MF_CHECKED)
@@ -963,23 +960,35 @@
 		 lpitem->hCheckBit ? lpitem->hCheckBit :
 		 ((lpitem->fType & MFT_RADIOCHECK)
 		  ? hStdRadioCheck : hStdCheck);
-            GRAPH_DrawBitmap( hdc, bm, rect.left,
-			      (y - check_bitmap_height) / 2,
-			      0, 0, check_bitmap_width,
-			      check_bitmap_height, TRUE );
-        } else if (lpitem->hUnCheckBit)
-            GRAPH_DrawBitmap( hdc, lpitem->hUnCheckBit, rect.left,
-			      (y - check_bitmap_height) / 2, 0, 0,
-			      check_bitmap_width, check_bitmap_height, TRUE );
+	    HDC32 hdcMem = CreateCompatibleDC32( hdc );
+
+	    SelectObject32( hdcMem, bm );
+            BitBlt32( hdc, rect.left, (y - check_bitmap_height) / 2,
+		      check_bitmap_width, check_bitmap_height,
+		      hdcMem, 0, 0, SRCCOPY );
+	    DeleteDC32( hdcMem );
+        } else if (lpitem->hUnCheckBit) {
+	    HDC32 hdcMem = CreateCompatibleDC32( hdc );
+
+	    SelectObject32( hdcMem, lpitem->hUnCheckBit );
+            BitBlt32( hdc, rect.left, (y - check_bitmap_height) / 2,
+		      check_bitmap_width, check_bitmap_height,
+		      hdcMem, 0, 0, SRCCOPY );
+	    DeleteDC32( hdcMem );
+	}
 
 	  /* Draw the popup-menu arrow */
 
 	if (lpitem->fType & MF_POPUP)
 	{
-	    GRAPH_DrawBitmap( hdc, hStdMnArrow,
-			      rect.right-arrow_bitmap_width-1,
-			      (y - arrow_bitmap_height) / 2, 0, 0, 
-			      arrow_bitmap_width, arrow_bitmap_height, FALSE );
+	    HDC32 hdcMem = CreateCompatibleDC32( hdc );
+
+	    SelectObject32( hdcMem, hStdMnArrow );
+            BitBlt32( hdc, rect.right - arrow_bitmap_width - 1,
+		      (y - arrow_bitmap_height) / 2,
+		      arrow_bitmap_width, arrow_bitmap_height,
+		      hdcMem, 0, 0, SRCCOPY );
+	    DeleteDC32( hdcMem );
 	}
 
 	rect.left += check_bitmap_width;
@@ -990,9 +999,12 @@
 
     if (lpitem->fType & MF_BITMAP)
     {
-	GRAPH_DrawBitmap( hdc, (HBITMAP32)lpitem->text,
-                          rect.left, rect.top, 0, 0,
-                          rect.right-rect.left, rect.bottom-rect.top, FALSE );
+        HDC32 hdcMem = CreateCompatibleDC32( hdc );
+
+	SelectObject32( hdcMem, (HBITMAP32)lpitem->text );
+	BitBlt32( hdc, rect.left, rect.top, rect.right - rect.left,
+		  rect.bottom - rect.top, hdcMem, 0, 0, SRCCOPY );
+	DeleteDC32( hdcMem );
 	return;
     }
     /* No bitmap - process text if present */
diff --git a/controls/scroll.c b/controls/scroll.c
index f824cdd..0ae3713 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -11,7 +11,6 @@
 #include "windows.h"
 #include "sysmetrics.h"
 #include "scroll.h"
-#include "graphics.h"
 #include "heap.h"
 #include "win.h"
 #include "debug.h"
@@ -494,7 +493,7 @@
 
       /* Draw the scroll bar frame */
 
-    GRAPH_DrawRectangle( hdc, r.left, r.top, r.right - r.left, r.bottom - r.top, 0);
+    Rectangle32( hdc, r.left, r.top, r.right, r.bottom );
 
       /* Draw the scroll rectangles and thumb */
 
@@ -536,8 +535,8 @@
 
     SelectObject32( hdc, GetSysColorBrush32(COLOR_BTNFACE) );
     Rectangle32( hdc, r.left, r.top, r.right, r.bottom );
-    InflateRect32( &r, -1, -1 );
-    GRAPH_DrawReliefRect( hdc, &r, 1, 2, FALSE );
+    r.top++, r.left++;
+    DrawEdge32( hdc, &r, EDGE_RAISED, BF_RECT );
     if (SCROLL_MovingThumb &&
         (SCROLL_TrackingWin == hwnd) &&
         (SCROLL_TrackingBar == nBar))
diff --git a/dlls/comctl32/updown.c b/dlls/comctl32/updown.c
index c5ef912..f8a3368 100644
--- a/dlls/comctl32/updown.c
+++ b/dlls/comctl32/updown.c
@@ -32,7 +32,6 @@
 #include "winnls.h"
 #include "sysmetrics.h"
 #include "updown.h"
-#include "graphics.h"
 #include "win.h"
 #include "debug.h"
 
diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c
index 5ad7faa..83439ff 100644
--- a/dlls/shell32/shell32_main.c
+++ b/dlls/shell32/shell32_main.c
@@ -19,7 +19,6 @@
 #include "resource.h"
 #include "dlgs.h"
 #include "win.h"
-#include "graphics.h"
 #include "cursoricon.h"
 #include "interfaces.h"
 #include "sysmetrics.h"
@@ -690,8 +689,11 @@
 	    PAINTSTRUCT32 ps;
 	    HDC32 hDC = BeginPaint32( hWnd, &ps );
 
-	    if( __get_dropline( hWnd, &rect ) )
-		GRAPH_DrawLines( hDC, (LPPOINT32)&rect, 1, GetStockObject32( BLACK_PEN ) );
+	    if( __get_dropline( hWnd, &rect ) ) {
+	        SelectObject32( hDC, GetStockObject32( BLACK_PEN ) );
+	        MoveToEx32( hDC, rect.left, rect.top, NULL );
+		LineTo32( hDC, rect.right, rect.bottom );
+	    }
 	    EndPaint32( hWnd, &ps );
 	}
 	break;
diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c
index 9268d02..598a437 100644
--- a/dlls/shell32/shellord.c
+++ b/dlls/shell32/shellord.c
@@ -24,7 +24,6 @@
 #include "resource.h"
 #include "dlgs.h"
 #include "win.h"
-#include "graphics.h"
 #include "cursoricon.h"
 #include "interfaces.h"
 #include "shlobj.h"
diff --git a/graphics/metafiledrv/graphics.c b/graphics/metafiledrv/graphics.c
index 2c4c5a8..4ad49fb 100644
--- a/graphics/metafiledrv/graphics.c
+++ b/graphics/metafiledrv/graphics.c
@@ -5,7 +5,6 @@
  */
 
 #include <stdlib.h>
-#include "graphics.h"
 #include "gdi.h"
 #include "dc.h"
 #include "metafile.h"
diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c
index 93aedc5..da28d8d 100644
--- a/graphics/x11drv/graphics.c
+++ b/graphics/x11drv/graphics.c
@@ -27,7 +27,6 @@
 #include "x11font.h"
 #include "bitmap.h"
 #include "gdi.h"
-#include "graphics.h"
 #include "dc.h"
 #include "bitmap.h"
 #include "callback.h"
@@ -326,7 +325,7 @@
 
 
 /***********************************************************************
- *           GRAPH_DrawArc
+ *           X11DRV_DrawArc
  *
  * Helper functions for Arc(), Chord() and Pie().
  * 'lines' is the number of lines to draw: 0 for Arc, 1 for Chord, 2 for Pie.
diff --git a/include/graphics.h b/include/graphics.h
deleted file mode 100644
index 72c1da2..0000000
--- a/include/graphics.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Internal graphics functions prototypes
- *
- * Copyright 1994 Alexandre Julliard
- *
- */
-
-#ifndef __WINE_GRAPHICS_H
-#define __WINE_GRAPHICS_H
-
-#include "windows.h"
-
-extern void GRAPH_DrawReliefRect( HDC32 hdc, const RECT32 *rect,
-                                  INT32 highlight_size, INT32 shadow_size,
-                                  BOOL32 pressed );
-extern void GRAPH_DrawGenericReliefRect( HDC32 hdc, const  RECT32 *rect,
-                                         INT32 highlight_size,
-                                         INT32 shadow_size, HBRUSH32 highlight,
-                                         HBRUSH32 shadow );
-extern BOOL32 GRAPH_DrawLines( HDC32 hdc, LPPOINT32 pXY, INT32 N, HPEN32 hPen);
-extern void GRAPH_DrawRectangle( HDC32 hdc, INT32 x, INT32 y, 
-				 INT32 width, INT32 height, HPEN32 hPen);
-extern BOOL32 GRAPH_DrawBitmap( HDC32 hdc, HBITMAP32 hbitmap,
-                                INT32 xdest, INT32 ydest, INT32 xsrc,
-                                INT32 ysrc, INT32 width, INT32 height, BOOL32 bMono );
-extern BOOL32 GRAPH_SelectClipMask( HDC32 hdc, HBITMAP32 hMono,
-                                    INT32 x, INT32 y );
-
-#endif /* __WINE_GRAPHICS_H */
diff --git a/misc/shell.c b/misc/shell.c
index 4d63ed5..2511dd5 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -18,7 +18,6 @@
 #include "resource.h"
 #include "dlgs.h"
 #include "win.h"
-#include "graphics.h"
 #include "cursoricon.h"
 #include "interfaces.h"
 #include "sysmetrics.h"
diff --git a/windows/Makefile.in b/windows/Makefile.in
index 1f5fca8..19fd99a 100644
--- a/windows/Makefile.in
+++ b/windows/Makefile.in
@@ -18,7 +18,6 @@
 	driver.c \
 	event.c \
 	focus.c \
-	graphics.c \
 	hook.c \
 	input.c \
 	keyboard.c \
diff --git a/windows/graphics.c b/windows/graphics.c
deleted file mode 100644
index 66104f9..0000000
--- a/windows/graphics.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * X-specific shortcuts to speed up WM code.
- * No coordinate transformations except origin translation.
- *
- * Copyright 1993, 1994 Alexandre Julliard
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include "ts_xlib.h"
-#include "ts_xutil.h"
-#include <X11/Intrinsic.h>
-#include "graphics.h"
-#include "color.h"
-#include "bitmap.h"
-#include "gdi.h"
-#include "dc.h"
-#include "x11drv.h"
-
-#define MAX_DRAWLINES 8
-
-
-/**********************************************************************
- *          GRAPH_DrawLines
- *
- * Draw multiple unconnected lines (limited by MAX_DRAWLINES).
- */
-BOOL32 GRAPH_DrawLines( HDC32 hdc, LPPOINT32 pXY, INT32 N, HPEN32 hPen )
-{
-    BOOL32	bRet = FALSE;
-    DC*         dc;
-
-    assert( N <= MAX_DRAWLINES );
-    if( (dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC )) )
-    {
-	HPEN32  hPrevPen  = 0;
-	X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dc->physDev;
-
-	if( hPen ) hPrevPen = SelectObject32( hdc, hPen );
-	if( X11DRV_SetupGCForPen( dc ) )
-	{
-	    XSegment	l[MAX_DRAWLINES];
-	    INT32 	i, j;
-
-	    for( i = 0; i < N; i++ )
-	    {
-		 j = 2 * i;
-		 l[i].x1 = pXY[j].x + dc->w.DCOrgX; 
-		 l[i].x2 = pXY[j + 1].x + dc->w.DCOrgX;
-		 l[i].y1 = pXY[j].y + dc->w.DCOrgY;
-		 l[i].y2 = pXY[j + 1].y + dc->w.DCOrgY;
-	    }
-	    TSXDrawSegments( display, physDev->drawable, physDev->gc, l, N );
-	    bRet = TRUE;
-	}
-	if( hPrevPen ) SelectObject32( hdc, hPrevPen );
-	GDI_HEAP_UNLOCK( hdc );
-    }
-    return bRet;
-}
-
-/**********************************************************************
- * 
- *          GRAPH_DrawBitmap
- *
- * Short-cut function to blit a bitmap into a device.
- * Faster than CreateCompatibleDC() + SelectBitmap() + BitBlt() + DeleteDC().
- */
-BOOL32 GRAPH_DrawBitmap( HDC32 hdc, HBITMAP32 hbitmap, 
-			 INT32 xdest, INT32 ydest, INT32 xsrc, INT32 ysrc, 
-                         INT32 width, INT32 height, BOOL32 bMono )
-{
-    BITMAPOBJ *bmp;
-    DC *dc;
-    BOOL32 ret = TRUE;
-    X11DRV_PHYSBITMAP *pbitmap;
-    X11DRV_PDEVICE *physDev;
-
-    if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return FALSE;
-    if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
-    {
-        GDI_HEAP_UNLOCK( hdc );
-        return FALSE;
-    }
-    physDev = (X11DRV_PDEVICE *)dc->physDev;
-
-    /* HACK for now */
-    if(!bmp->DDBitmap)
-        X11DRV_CreateBitmap( hbitmap );
-    pbitmap = bmp->DDBitmap->physBitmap;
-
-    xdest += dc->w.DCOrgX; ydest += dc->w.DCOrgY;
-
-    TSXSetFunction( display, physDev->gc, GXcopy );
-    if (bmp->bitmap.bmBitsPixel == 1)
-    {
-        TSXSetForeground( display, physDev->gc, physDev->backgroundPixel );
-        TSXSetBackground( display, physDev->gc, physDev->textPixel );
-        TSXCopyPlane( display, pbitmap->pixmap, physDev->drawable, physDev->gc,
-                    xsrc, ysrc, width, height, xdest, ydest, 1 );
-    }
-    else if (bmp->bitmap.bmBitsPixel == dc->w.bitsPerPixel)
-    {
-	if( bMono )
-	{
-	    INT32	plane;
-
-	    if( COLOR_GetMonoPlane(&plane) )
-	    {
-		TSXSetForeground( display, physDev->gc,
-				  physDev->backgroundPixel );
-		TSXSetBackground( display, physDev->gc, physDev->textPixel );
-	    }
-	    else
-	    {
-		TSXSetForeground( display, physDev->gc, physDev->textPixel );
-		TSXSetBackground( display, physDev->gc,
-				  physDev->backgroundPixel );
-	    }
-	    TSXCopyPlane( display, pbitmap->pixmap, physDev->drawable,
-			  physDev->gc, xsrc, ysrc, width, height, xdest, ydest,
-			  plane );
-	}
-	else 
-	{
-	    TSXCopyArea( display, pbitmap->pixmap, physDev->drawable, 
-			 physDev->gc, xsrc, ysrc, width, height, xdest,
-			 ydest );
-	}
-    }
-    else 
-    {
-      ret = FALSE;
-    }
-
-    GDI_HEAP_UNLOCK( hdc );
-    GDI_HEAP_UNLOCK( hbitmap );
-    return ret;
-}
-
-
-/**********************************************************************
- *          GRAPH_DrawReliefRect
- *
- * Used in the standard control code for button edge drawing.
- */
-void GRAPH_DrawReliefRect( HDC32 hdc, const RECT32 *rect, INT32 highlight_size,
-                           INT32 shadow_size, BOOL32 pressed )
-{
-    if(pressed)
-	GRAPH_DrawGenericReliefRect(hdc, rect, highlight_size, shadow_size,
-				    GetSysColorBrush32(COLOR_BTNSHADOW),
-				    GetSysColorBrush32(COLOR_BTNHIGHLIGHT));
-    else
-	GRAPH_DrawGenericReliefRect(hdc, rect, highlight_size, shadow_size,
-				    GetSysColorBrush32(COLOR_BTNHIGHLIGHT),
-				    GetSysColorBrush32(COLOR_BTNSHADOW));
-
-    return;
-}
-
-
-/******************************************************************************
- *             GRAPH_DrawGenericReliefRect
- *
- *   Creates a rectangle with the specified highlight and shadow colors.
- *   Adapted from DrawReliefRect (which is somewhat misnamed).
- */
-void  GRAPH_DrawGenericReliefRect(
-    HDC32  hdc,
-    const  RECT32 *rect,
-    INT32  highlight_size,
-    INT32  shadow_size,
-    HBRUSH32  highlight,
-    HBRUSH32  shadow )
-{
-    DC*		dc;
-    HBRUSH32 	hPrevBrush;
-    INT32 	w, h;
-    RECT32	r = *rect;
-    X11DRV_PDEVICE *physDev;
-
-    if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return;
-    physDev = (X11DRV_PDEVICE *)dc->physDev;
-    OffsetRect32( &r, dc->w.DCOrgX, dc->w.DCOrgY);
-    h = rect->bottom - rect->top;  w = rect->right - rect->left;
-
-    hPrevBrush = SelectObject32(hdc, highlight);
-
-    if ( X11DRV_SetupGCForBrush( dc ) )
-    {
-         INT32	i;
-
-	 TSXSetFunction( display, physDev->gc, GXcopy );
-         for (i = 0; i < highlight_size; i++)
-         {
-	      TSXFillRectangle( display, physDev->drawable, physDev->gc,
-					r.left + i, r.top, 1, h - i );
-	      TSXFillRectangle( display, physDev->drawable, physDev->gc,
-					r.left, r.top + i, w - i, 1 );
-         }
-    }
-
-    SelectObject32( hdc, shadow );
-    if ( X11DRV_SetupGCForBrush( dc ) )
-    {
-	 INT32	i;
-
-	 TSXSetFunction( display, physDev->gc, GXcopy );
-         for (i = 0; i < shadow_size; i++)
-         {
-	      TSXFillRectangle( display, physDev->drawable, physDev->gc,
-			      r.right - i - 1, r.top + i, 1, h - i );
-	      TSXFillRectangle( display, physDev->drawable, physDev->gc,
-			      r.left + i, r.bottom - i - 1, w - i, 1 );
-         }
-    }
-
-    SelectObject32( hdc, hPrevBrush );
-    GDI_HEAP_UNLOCK( hdc );
-}
-
-
-
-/**********************************************************************
- *          GRAPH_DrawRectangle
- */
-void GRAPH_DrawRectangle( HDC32 hdc, INT32 x, INT32 y, 
-				     INT32 w, INT32 h, HPEN32 hPen )
-{
-    DC* dc;
-
-    if( (dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC )) ) 
-    {
-        HPEN32	hPrevPen  = 0; 
-	X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dc->physDev;
-
-	if( hPen ) hPrevPen = SelectObject32( hdc, hPen );
-	if( X11DRV_SetupGCForPen( dc ) )
-	    TSXDrawRectangle( display, physDev->drawable, physDev->gc, 
-			    x + dc->w.DCOrgX, y + dc->w.DCOrgY, w - 1, h - 1);
-	if( hPrevPen ) SelectObject32( hdc, hPrevPen );
-	GDI_HEAP_UNLOCK( hdc );
-    }
-}
-
-/**********************************************************************
- *          GRAPH_SelectClipMask
- */
-BOOL32 GRAPH_SelectClipMask( HDC32 hdc, HBITMAP32 hMonoBitmap, INT32 x, INT32 y)
-{
-    BITMAPOBJ *bmp = NULL;
-    DC *dc;
-    X11DRV_PHYSBITMAP *pbitmap = NULL;
-    X11DRV_PDEVICE *physDev;
-
-    if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return FALSE;
-    physDev = (X11DRV_PDEVICE *)dc->physDev;
-    if ( hMonoBitmap ) 
-    {
-       if ( !(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hMonoBitmap, BITMAP_MAGIC)) 
-	   || bmp->bitmap.bmBitsPixel != 1 ) 
-       {
-	   GDI_HEAP_UNLOCK( hdc );
-	   return FALSE;
-       }
-
-       /* HACK for now */
-       if(!bmp->DDBitmap)
-	   X11DRV_CreateBitmap( hMonoBitmap );
-       pbitmap = bmp->DDBitmap->physBitmap;
-       TSXSetClipOrigin( display, physDev->gc, dc->w.DCOrgX + x,
-			 dc->w.DCOrgY + y );
-    }
-
-    TSXSetClipMask( display, physDev->gc, (bmp) ? pbitmap->pixmap : None );
-
-    GDI_HEAP_UNLOCK( hdc );
-    GDI_HEAP_UNLOCK( hMonoBitmap );
-    return TRUE;
-}
-
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 5d65d63..cc1cc76 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -18,7 +18,6 @@
 #include "hook.h"
 #include "scroll.h"
 #include "nonclient.h"
-#include "graphics.h"
 #include "queue.h"
 #include "selectors.h"
 #include "tweak.h"
@@ -950,15 +949,19 @@
 {
     RECT32 rect;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
+    HDC32 hdcMem;
 
     if( !(wndPtr->flags & WIN_MANAGED) )
     {
       NC_GetInsideRect( hwnd, &rect );
-      GRAPH_DrawBitmap( hdc, (IsZoomed32(hwnd) 
+      hdcMem = CreateCompatibleDC32( hdc );
+      SelectObject32( hdcMem,  (IsZoomed32(hwnd) 
 			     ? (down ? hbitmapRestoreD : hbitmapRestore)
-			     : (down ? hbitmapMaximizeD : hbitmapMaximize)),
-		        rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
-		        0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE, FALSE );
+			     : (down ? hbitmapMaximizeD : hbitmapMaximize)) );
+      BitBlt32( hdc, rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
+		SYSMETRICS_CXSIZE + 1, SYSMETRICS_CYSIZE, hdcMem, 0, 0,
+		SRCCOPY );
+      DeleteDC32( hdcMem );
     }
 }
 
@@ -970,14 +973,18 @@
 {
     RECT32 rect;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
+    HDC32 hdcMem;
 
     if( !(wndPtr->flags & WIN_MANAGED) )
     {
       NC_GetInsideRect( hwnd, &rect );
+      hdcMem = CreateCompatibleDC32( hdc );
+      SelectObject32( hdcMem, (down ? hbitmapMinimizeD : hbitmapMinimize) );
       if (wndPtr->dwStyle & WS_MAXIMIZEBOX) rect.right -= SYSMETRICS_CXSIZE+1;
-      GRAPH_DrawBitmap( hdc, (down ? hbitmapMinimizeD : hbitmapMinimize),
-		        rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
-		        0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE, FALSE );
+      BitBlt32( hdc, rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
+		SYSMETRICS_CXSIZE + 1, SYSMETRICS_CYSIZE, hdcMem, 0, 0,
+		SRCCOPY );
+      DeleteDC32( hdcMem );
     }
 }
 
@@ -1100,6 +1107,7 @@
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     SIZE32  bmsz;
     HBITMAP32  bm;
+    HDC32 hdcMem;
 
     if( !(wndPtr->flags & WIN_MANAGED) &&
 	GetBitmapDimensionEx32((bm = IsZoomed32(hwnd) ?
@@ -1112,10 +1120,12 @@
 	if (wndPtr->dwStyle & WS_SYSMENU)
 	    rect.right -= sysMetrics[SM_CYCAPTION] + 1;
 	
-	GRAPH_DrawBitmap( hdc, bm, rect.right -
-			  (sysMetrics[SM_CXSIZE] + bmsz.cx) / 2,
-			  rect.top + (sysMetrics[SM_CYCAPTION] - 1 - bmsz.cy) / 2,
-			  0, 0, bmsz.cx, bmsz.cy, FALSE );
+	hdcMem = CreateCompatibleDC32( hdc );
+	SelectObject32( hdc, bm );
+	BitBlt32( hdc, rect.right - (sysMetrics[SM_CXSIZE] + bmsz.cx) / 2,
+		  rect.top + (sysMetrics[SM_CYCAPTION] - 1 - bmsz.cy) / 2,
+		  bmsz.cx, bmsz.cy, hdcMem, 0, 0, SRCCOPY );
+	DeleteDC32( hdcMem );
     }
 
     return;
@@ -1150,6 +1160,7 @@
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     SIZE32  bmsz;
     HBITMAP32  bm;
+    HDC32 hdcMem;
 
     if( !(wndPtr->flags & WIN_MANAGED) &&
 	GetBitmapDimensionEx32((bm = down ? hbitmapMinimizeD :
@@ -1164,10 +1175,12 @@
 	    rect.right += -1 -
 		(sysMetrics[SM_CXSIZE] + bmsz.cx) / 2;
 
-	GRAPH_DrawBitmap( hdc, bm, rect.right -
-			  (sysMetrics[SM_CXSIZE] + bmsz.cx) / 2,
-			  rect.top + (sysMetrics[SM_CYCAPTION] - 1 - bmsz.cy) / 2,
-			  0, 0, bmsz.cx, bmsz.cy, FALSE );
+	hdcMem = CreateCompatibleDC32( hdc );
+	SelectObject32( hdc, bm );
+	BitBlt32( hdc, rect.right - (sysMetrics[SM_CXSIZE] + bmsz.cx) / 2,
+		  rect.top + (sysMetrics[SM_CYCAPTION] - 1 - bmsz.cy) / 2,
+		  bmsz.cx, bmsz.cy, hdcMem, 0, 0, SRCCOPY );
+	DeleteDC32( hdcMem );
     }
 
     return;
@@ -1219,39 +1232,35 @@
     } 
     else
     {
-	POINT32 lpt[16];
-    
+        INT32 decYOff = SYSMETRICS_CXFRAME + SYSMETRICS_CXSIZE;
+	INT32 decXOff = SYSMETRICS_CYFRAME + SYSMETRICS_CYSIZE;
+
       /* Draw inner rectangle */
 
-	GRAPH_DrawRectangle( hdc, rect->left + width,
-                                  rect->top + height,
-                                  rect->right - rect->left - 2*width ,
-                                  rect->bottom - rect->top - 2*height,
-                                  (HPEN32)0 );
+	SelectObject32( hdc, GetStockObject32(NULL_BRUSH) );
+	Rectangle32( hdc, rect->left + width, rect->top + height,
+		     rect->right - width , rect->bottom - height );
 
       /* Draw the decorations */
 
-	lpt[4].x = lpt[0].x = rect->left;
-	lpt[5].x = lpt[1].x = rect->left + width;
-	lpt[6].x = lpt[2].x = rect->right - 1;
-	lpt[7].x = lpt[3].x = rect->right - width - 1;
+	MoveToEx32( hdc, rect->left, rect->top + decYOff, NULL );
+	LineTo32( hdc, rect->left + width, rect->top + decYOff );
+	MoveToEx32( hdc, rect->right - 1, rect->top + decYOff, NULL );
+	LineTo32( hdc, rect->right - width - 1, rect->top + decYOff );
+	MoveToEx32( hdc, rect->left, rect->bottom - decYOff, NULL );
+	LineTo32( hdc, rect->left + width, rect->bottom - decYOff );
+	MoveToEx32( hdc, rect->right - 1, rect->bottom - decYOff, NULL );
+	LineTo32( hdc, rect->right - width - 1, rect->bottom - decYOff );
 
-	lpt[0].y = lpt[1].y = lpt[2].y = lpt[3].y = 
-		  rect->top + SYSMETRICS_CYFRAME + SYSMETRICS_CYSIZE;
-	lpt[4].y = lpt[5].y = lpt[6].y = lpt[7].y =
-		  rect->bottom - SYSMETRICS_CYFRAME - SYSMETRICS_CYSIZE;
+	MoveToEx32( hdc, rect->left + decXOff, rect->top, NULL );
+	LineTo32( hdc, rect->left + decXOff, rect->top + height);
+	MoveToEx32( hdc, rect->left + decXOff, rect->bottom - 1, NULL );
+	LineTo32( hdc, rect->left + decXOff, rect->bottom - height - 1 );
+	MoveToEx32( hdc, rect->right - decXOff, rect->top, NULL );
+	LineTo32( hdc, rect->right - decXOff, rect->top + height );
+	MoveToEx32( hdc, rect->right - decXOff, rect->bottom - 1, NULL );
+	LineTo32( hdc, rect->right - decXOff, rect->bottom - height - 1 );
 
-        lpt[8].x = lpt[9].x = lpt[10].x = lpt[11].x =
-		  rect->left + SYSMETRICS_CXFRAME + SYSMETRICS_CXSIZE;
-	lpt[12].x = lpt[13].x = lpt[14].x = lpt[15].x = 
-		  rect->right - SYSMETRICS_CXFRAME - SYSMETRICS_CYSIZE;
-
-	lpt[12].y = lpt[8].y = rect->top; 
-	lpt[13].y = lpt[9].y = rect->top + height;
-	lpt[14].y = lpt[10].y = rect->bottom - 1;
-	lpt[15].y = lpt[11].y = rect->bottom - height - 1;
-
-	GRAPH_DrawLines( hdc, lpt, 8, (HPEN32)0 );	/* 8 is the maximum */
 	InflateRect32( rect, -width - 1, -height - 1 );
     }
 }
@@ -1453,12 +1462,14 @@
     RECT32  r = *rect;
     WND     *wndPtr = WIN_FindWndPtr( hwnd );
     char    buffer[256];
-    POINT32 sep[2] = { { r.left,  r.bottom - 1 },
-		       { r.right, r.bottom - 1 } };
+    HPEN32  hPrevPen;
 
     if (wndPtr->flags & WIN_MANAGED) return;
 
-    GRAPH_DrawLines( hdc, sep, 1, GetSysColorPen32(COLOR_3DFACE) );
+    hPrevPen = SelectObject32( hdc, GetSysColorPen32(COLOR_3DFACE) );
+    MoveToEx32( hdc, r.left, r.bottom - 1, NULL );
+    LineTo32( hdc, r.right, r.bottom - 1 );
+    SelectObject32( hdc, hPrevPen );
     r.bottom--;
 
     FillRect32( hdc, &r, GetSysColorBrush32(active ? COLOR_ACTIVECAPTION :
@@ -1556,8 +1567,8 @@
         if ((wndPtr->dwStyle & WS_BORDER) || (wndPtr->dwStyle & WS_DLGFRAME) ||
             (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME))
         {
-            GRAPH_DrawRectangle( hdc, 0, 0,
-                                 rect.right, rect.bottom, (HPEN32)0 );
+	    SelectObject32( hdc, GetStockObject32(NULL_BRUSH) );
+            Rectangle32( hdc, 0, 0, rect.right, rect.bottom );
             InflateRect32( &rect, -1, -1 );
         }
 
diff --git a/windows/scroll.c b/windows/scroll.c
index 5bc814d..2db40ff 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -15,7 +15,6 @@
 #include "gdi.h"
 #include "dce.h"
 #include "region.h"
-#include "graphics.h"
 #include "sysmetrics.h"
 #include "debug.h"
 #include "x11drv.h"
