diff --git a/reactos/include/win32k/bitmaps.h b/reactos/include/win32k/bitmaps.h
index 341f8aab979..749a4dd2264 100644
--- a/reactos/include/win32k/bitmaps.h
+++ b/reactos/include/win32k/bitmaps.h
@@ -17,7 +17,7 @@ typedef struct _BITMAPOBJ
 {
   BITMAP      bitmap;
   SIZE        size;   /* For SetBitmapDimension() */
-  
+
   DDBITMAP   *DDBitmap;
 
   /* For device-independent bitmaps: */
@@ -27,12 +27,16 @@ typedef struct _BITMAPOBJ
 /*  Internal interface  */
 
 #define  BITMAPOBJ_AllocBitmap()  \
-  ((PBITMAPOBJ) GDIOBJ_AllocObject (sizeof (BITMAPOBJ), GO_BITMAP_MAGIC))
-#define  BITMAPOBJ_FreeBitmap(hBMObj)  GDIOBJ_FreeObject((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC)
+  ((HBITMAP) GDIOBJ_AllocObj (sizeof (BITMAPOBJ), GO_BITMAP_MAGIC))
+#define  BITMAPOBJ_FreeBitmap(hBMObj)  \
+  GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC)
 #define  BITMAPOBJ_HandleToPtr(hBMObj)  \
-  ((PBITMAPOBJ) GDIOBJ_HandleToPtr ((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC))
-#define  BITMAPOBJ_PtrToHandle(hBMObj)  \
-  ((HBITMAP) GDIOBJ_PtrToHandle ((PGDIOBJ) hBMObj, GO_BITMAP_MAGIC))
+  ((PBITMAPOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC))
+#define  BITMAPOBJ_ReleasePtr(hBMObj)  \
+  GDIOBJ_UnlockObj ((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC)
+
+/*#define  BITMAPOBJ_PtrToHandle(hBMObj)  \
+  ((HBITMAP) GDIOBJ_PtrToHandle ((PGDIOBJ) hBMObj, GO_BITMAP_MAGIC))*/
 #define  BITMAPOBJ_LockBitmap(hBMObj) GDIOBJ_LockObject ((HGDIOBJ) hBMObj)
 #define  BITMAPOBJ_UnlockBitmap(hBMObj) GDIOBJ_UnlockObject ((HGDIOBJ) hBMObj)
 
@@ -41,6 +45,8 @@ HBITMAP  BITMAPOBJ_CopyBitmap (HBITMAP  hBitmap);
 int DIB_GetDIBWidthBytes (int  width, int  depth);
 int DIB_GetDIBImageBytes (int  width, int  height, int  depth);
 int DIB_BitmapInfoSize (const BITMAPINFO * info, WORD coloruse);
+INT BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer);
+BOOL Bitmap_InternalDelete( PBITMAPOBJ pBmp );
 
 /*  User Entry Points  */
 BOOL
@@ -110,7 +116,7 @@ W32kExtFloodFill (
 	HDC		hDC,
 	INT		XStart,
 	INT		YStart,
-	COLORREF	Color, 
+	COLORREF	Color,
 	UINT		FillType
 	);
 BOOL
@@ -169,7 +175,7 @@ W32kMaskBlt (
 	INT	Width,
 	INT	Height,
 	HDC	hDCSrc,
-	INT	XSrc, 
+	INT	XSrc,
 	INT	YSrc,
 	HBITMAP	hMaskBitmap,
 	INT	xMask,
@@ -181,13 +187,13 @@ STDCALL
 W32kPlgBlt (
 	HDC		hDCDest,
 	CONST POINT	* Point,
-	HDC		hDCSrc, 
-	INT		XSrc,  
-	INT		YSrc,  
-	INT		Width, 
+	HDC		hDCSrc,
+	INT		XSrc,
+	INT		YSrc,
+	INT		Width,
 	INT		Height,
 	HBITMAP		hMaskBitmap,
-	INT		xMask,      
+	INT		xMask,
 	INT		yMask
 	);
 LONG
@@ -267,8 +273,8 @@ W32kStretchBlt (
 	HDC	hDCSrc,
 	INT	XOriginSrc,
 	INT	YOriginSrc,
-	INT	WidthSrc,    
-	INT	HeightSrc, 
+	INT	WidthSrc,
+	INT	HeightSrc,
 	DWORD	ROP
 	);
 INT
@@ -279,13 +285,13 @@ W32kStretchDIBits (
 	INT			YDest,
 	INT			DestWidth,
 	INT			DestHeight,
-	INT			XSrc,       
-	INT			YSrc,       
-	INT			SrcWidth,  
-	INT			SrcHeight, 
+	INT			XSrc,
+	INT			YSrc,
+	INT			SrcWidth,
+	INT			SrcHeight,
 	CONST VOID		* Bits,
 	CONST BITMAPINFO	* BitsInfo,
-	UINT			Usage,                 
+	UINT			Usage,
 	DWORD			ROP
 	);
 #endif
diff --git a/reactos/include/win32k/brush.h b/reactos/include/win32k/brush.h
index 3e020c29953..5809a0d970f 100644
--- a/reactos/include/win32k/brush.h
+++ b/reactos/include/win32k/brush.h
@@ -8,14 +8,15 @@
 #define NB_HATCH_STYLES  6
 
 #define  BRUSHOBJ_AllocBrush()  \
-  ((PBRUSHOBJ) GDIOBJ_AllocObject (sizeof (BRUSHOBJ), GO_BRUSH_MAGIC))
-#define  BRUSHOBJ_FreeBrush(hBrush)  GDIOBJ_FreeObject((HGDIOBJ)hBrush)
-#define  BRUSHOBJ_HandleToPtr(hBrush)  \
+  ((HBRUSH) GDIOBJ_AllocObj (sizeof (BRUSHOBJ), GO_BRUSH_MAGIC))
+#define  BRUSHOBJ_FreeBrush(hBrush)  GDIOBJ_FreeObj((HGDIOBJ)hBrush, GO_BRUSH_MAGIC)
+/*#define  BRUSHOBJ_HandleToPtr(hBrush)  \
   ((PBRUSHOBJ) GDIOBJ_HandleToPtr ((HGDIOBJ) hBrush, GO_BRUSH_MAGIC))
 #define  BRUSHOBJ_PtrToHandle(pBrushObj)  \
   ((HBRUSH) GDIOBJ_PtrToHandle ((PGDIOBJ) pBrushObj, GO_BRUSH_MAGIC))
-#define  BRUSHOBJ_LockBrush(hBrush) GDIOBJ_LockObject((HGDIOBJ)hBrush)
-#define  BRUSHOBJ_UnlockBrush(hBrush) GDIOBJ_UnlockObject((HGDIOBJ)hBrush)
+*/
+#define  BRUSHOBJ_LockBrush(hBrush) GDIOBJ_LockObj((HGDIOBJ)hBrush, GO_BRUSH_MAGIC)
+#define  BRUSHOBJ_UnlockBrush(hBrush) GDIOBJ_UnlockObj((HGDIOBJ)hBrush, GO_BRUSH_MAGIC)
 
 HBRUSH
 STDCALL
diff --git a/reactos/include/win32k/dc.h b/reactos/include/win32k/dc.h
index cba38df5d85..28d8dcc7159 100644
--- a/reactos/include/win32k/dc.h
+++ b/reactos/include/win32k/dc.h
@@ -39,7 +39,7 @@ typedef struct _DEVICECAPS
   WORD   pad2[6];       /*  92-102: reserved */
   WORD   sizePalette;   /* 104: entries in system palette */
   WORD   numReserved;   /* 106: reserved entries */
-  WORD   colorRes;      /* 108: color resolution */    
+  WORD   colorRes;      /* 108: color resolution */
 } DEVICECAPS, *PDEVICECAPS;
 
 typedef struct _WIN_DC_INFO
@@ -58,7 +58,7 @@ typedef struct _WIN_DC_INFO
 // #if 0
     HANDLE      hDevice;
     HPALETTE    hPalette;
-    
+
     GdiPath       path;
 // #endif
 
@@ -69,44 +69,44 @@ typedef struct _WIN_DC_INFO
   WORD  backgroundMode;
   COLORREF  backgroundColor;
   COLORREF  textColor;
-  
+
   short  brushOrgX;
   short  brushOrgY;
-  
+
   WORD  textAlign;         /* Text alignment from SetTextAlign() */
   short  charExtra;         /* Spacing from SetTextCharacterExtra() */
   short  breakTotalExtra;   /* Total extra space for justification */
   short  breakCount;        /* Break char. count */
   short  breakExtra;        /* breakTotalExtra / breakCount */
   short  breakRem;          /* breakTotalExtra % breakCount */
-  
+
   RECT   totalExtent;
   BYTE   bitsPerPixel;
-  
+
   INT  MapMode;
   INT  GraphicsMode;      /* Graphics mode */
   INT  DCOrgX;            /* DC origin */
   INT  DCOrgY;
-  
+
 #if 0
     FARPROC     lpfnPrint;         /* AbortProc for Printing */
 #endif
-  
+
   INT  CursPosX;          /* Current position */
   INT  CursPosY;
   INT  ArcDirection;
-  
+
   XFORM  xformWorld2Wnd;    /* World-to-window transformation */
   XFORM  xformWorld2Vport;  /* World-to-viewport transformation */
   XFORM  xformVport2World;  /* Inverse of the above transformation */
-  BOOL  vport2WorldValid;  /* Is xformVport2World valid? */  
+  BOOL  vport2WorldValid;  /* Is xformVport2World valid? */
 } WIN_DC_INFO;
 
   /* DC flags */
 #define DC_MEMORY     0x0001   /* It is a memory DC */
 #define DC_SAVED      0x0002   /* It is a saved DC */
 #define DC_DIRTY      0x0004   /* hVisRgn has to be updated */
-#define DC_THUNKHOOK  0x0008   /* DC hook is in the 16-bit code */ 
+#define DC_THUNKHOOK  0x0008   /* DC hook is in the 16-bit code */
 
 #define  GDI_DC_TYPE  (1)
 
@@ -114,7 +114,7 @@ typedef struct _DC
 {
   HDC  hSelf;
   HDC  hNext;
-  DHPDEV  PDev;  
+  DHPDEV  PDev;
   DEVMODEW  DMW;
   HSURF  FillPatternSurfaces[HS_DDI_MAX];
   GDIINFO  GDIInfo;
@@ -124,7 +124,7 @@ typedef struct _DC
   DRIVER_FUNCTIONS  DriverFunctions;
   PWSTR  DriverName;
   HANDLE  DeviceDriver;
-  
+
   INT  wndOrgX;          /* Window origin */
   INT  wndOrgY;
   INT  wndExtX;          /* Window extent */
@@ -141,17 +141,24 @@ typedef struct _DC
 
 /*  Internal functions  */
 
+/*
 #define  DC_PtrToHandle(pDC)  \
   ((HDC) GDIOBJ_PtrToHandle ((PGDIOBJ) pDC, GO_DC_MAGIC))
+*/
+
 #define  DC_HandleToPtr(hDC)  \
-  ((PDC) GDIOBJ_HandleToPtr ((HGDIOBJ) hDC, GO_DC_MAGIC))
+  ((PDC) GDIOBJ_LockObj ((HGDIOBJ) hDC, GO_DC_MAGIC))
+#define  DC_ReleasePtr(hDC)  \
+  GDIOBJ_UnlockObj ((HGDIOBJ) hDC, GO_DC_MAGIC)
+
 HDC RetrieveDisplayHDC(VOID);
-PDC  DC_AllocDC(LPCWSTR  Driver);
-void  DC_InitDC(PDC  DCToInit);
-PDC  DC_FindOpenDC(LPCWSTR  Driver);
-void  DC_FreeDC(PDC  DCToFree);
+HDC  DC_AllocDC(LPCWSTR  Driver);
+void  DC_InitDC(HDC  DCToInit);
+HDC  DC_FindOpenDC(LPCWSTR  Driver);
+void  DC_FreeDC(HDC  DCToFree);
 HDC  DC_GetNextDC (PDC pDC);
 void  DC_SetNextDC (PDC pDC, HDC hNextDC);
+BOOL DC_InternalDeleteDC( PDC DCToDelete );
 
 void DC_UpdateXforms(PDC  dc);
 BOOL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
diff --git a/reactos/include/win32k/debug1.h b/reactos/include/win32k/debug1.h
index f1131e288a4..7618cb86c65 100644
--- a/reactos/include/win32k/debug1.h
+++ b/reactos/include/win32k/debug1.h
@@ -4,7 +4,7 @@
  * FILE:            include/internal/debug.h
  * PURPOSE:         Useful debugging macros
  * PROGRAMMER:      David Welch (welch@mcmail.com)
- * UPDATE HISTORY: 
+ * UPDATE HISTORY:
  *                28/05/98: Created
  */
 
@@ -25,8 +25,10 @@
 
 #ifndef NASSERT
 #define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); KeBugCheck(0); }
+#define ASSERT(x) assert(x)
 #else
 #define assert(x)
+#define ASSERT(x)
 #endif
 
 #define DPRINT1(args...) do { DbgPrint("(%s:%d) ",__FILE__,__LINE__); DbgPrint(args); ExAllocatePool(NonPagedPool,0); } while(0);
@@ -81,16 +83,16 @@ extern unsigned int old_idt_valid;
  * NOTES:
  *       The variable to watch must be aligned to its length (i.e. a dword
  *	 breakpoint must be aligned to a dword boundary)
- * 
+ *
  *       A fatal exception will be generated on the access to the variable.
  *       It is (at the moment) only really useful for catching undefined
  *       pointers if you know the variable effected but not the buggy
- *       routine. 
- * 
+ *       routine.
+ *
  * FIXME: Extend to call out to kernel debugger on breakpoint
  *        Add support for I/O breakpoints
  * REFERENCES: See the i386 programmer manual for more details
- */ 
+ */
 void set_breakpoint(unsigned int i, unsigned int addr, unsigned int type,
 		    unsigned int len);
 
diff --git a/reactos/include/win32k/gdiobj.h b/reactos/include/win32k/gdiobj.h
index d9c475ed76c..eee272fa501 100644
--- a/reactos/include/win32k/gdiobj.h
+++ b/reactos/include/win32k/gdiobj.h
@@ -1,6 +1,6 @@
 /*
  *  GDI object common header definition
- * 
+ *
  * (RJJ) taken from WINE
  */
 
@@ -56,6 +56,7 @@
 typedef struct _GDIOBJHDR
 {
   WORD  wTableIndex;
+  DWORD dwCount; 		//reference count.
 } GDIOBJHDR, *PGDIOBJHDR;
 
 typedef PVOID PGDIOBJ;
@@ -70,14 +71,15 @@ typedef struct _GDI_HANDLE_ENTRY
 typedef struct _GDI_HANDLE_TABLE
 {
   WORD  wTableSize;
-  GDI_HANDLE_ENTRY  Handles [0];
+  GDI_HANDLE_ENTRY  Handles [1];
 } GDI_HANDLE_TABLE, *PGDI_HANDLE_TABLE;
 
-PGDIOBJ  GDIOBJ_AllocObject(WORD Size, WORD Magic);
-BOOL  GDIOBJ_FreeObject (PGDIOBJ Obj, WORD Magic);
-HGDIOBJ  GDIOBJ_PtrToHandle (PGDIOBJ Obj, WORD Magic);
-PGDIOBJ  GDIOBJ_HandleToPtr (HGDIOBJ Obj, WORD Magic);
+HGDIOBJ  GDIOBJ_AllocObj(WORD Size, WORD Magic);
+BOOL  GDIOBJ_FreeObj (HGDIOBJ Obj, WORD Magic);
+PGDIOBJ  GDIOBJ_LockObj (HGDIOBJ Obj, WORD Magic);
+BOOL     GDIOBJ_UnlockObj (HGDIOBJ Obj, WORD Magic);
 WORD  GDIOBJ_GetHandleMagic (HGDIOBJ ObjectHandle);
+VOID STDCALL W32kDumpGdiObjects( INT Process );
 
 #endif
 
diff --git a/reactos/include/win32k/pen.h b/reactos/include/win32k/pen.h
index 1bf7ce2fdb0..468427212c9 100644
--- a/reactos/include/win32k/pen.h
+++ b/reactos/include/win32k/pen.h
@@ -13,14 +13,16 @@ typedef struct
 /*  Internal interface  */
 
 #define  PENOBJ_AllocPen()  \
-  ((PPENOBJ) GDIOBJ_AllocObject (sizeof (PENOBJ), GO_PEN_MAGIC))
-#define  PENOBJ_FreePen(hBMObj)  GDIOBJ_FreeObject((HGDIOBJ) hBMObj)
+  ((HPEN) GDIOBJ_AllocObj (sizeof (PENOBJ), GO_PEN_MAGIC))
+#define  PENOBJ_FreePen(hBMObj)  GDIOBJ_FreeObj((HGDIOBJ) hBMObj)
+/*
 #define  PENOBJ_HandleToPtr(hBMObj)  \
   ((PPENOBJ) GDIOBJ_HandleToPtr ((HGDIOBJ) hBMObj, GO_PEN_MAGIC))
 #define  PENOBJ_PtrToHandle(hBMObj)  \
   ((HPEN) GDIOBJ_PtrToHandle ((PGDIOBJ) hBMObj, GO_PEN_MAGIC))
-#define  PENOBJ_LockPen(hBMObj) GDIOBJ_LockObject ((HGDIOBJ) hBMObj)
-#define  PENOBJ_UnlockPen(hBMObj) GDIOBJ_UnlockObject ((HGDIOBJ) hBMObj)
+*/
+#define  PENOBJ_LockPen(hBMObj) ((PPENOBJ)GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GO_PEN_MAGIC))
+#define  PENOBJ_UnlockPen(hBMObj) GDIOBJ_UnlockObj ((HGDIOBJ) hBMObj, GO_PEN_MAGIC)
 
 HPEN STDCALL W32kCreatePen(INT  PenStyle,
                     INT  Width,
diff --git a/reactos/include/win32k/region.h b/reactos/include/win32k/region.h
index b6fd2e410c2..ae73c331f2f 100644
--- a/reactos/include/win32k/region.h
+++ b/reactos/include/win32k/region.h
@@ -2,6 +2,28 @@
 #ifndef __WIN32K_REGION_H
 #define __WIN32K_REGION_H
 
+#include <structs.h>
+#include <win32k/gdiobj.h>
+
+/*  Internal functions  */
+/*
+#define  RGNDATA_PtrToHandle(pRgn)  \
+  ((HRGN) GDIOBJ_PtrToHandle ((PGDIOBJ) pRgn, GO_REGION_MAGIC))
+*/
+#define  RGNDATA_HandleToPtr(hRgn)  \
+  ((RGNDATA *) GDIOBJ_LockObj ((HGDIOBJ) hRgn, GO_REGION_MAGIC))
+
+/* call GDIOBJ_ReleaseObj when reference counting is added */
+#define RGNDATA_Release(hRgn) {}
+
+/* GDI logical region object */
+typedef struct tagRGNOBJ
+{
+    GDIOBJHDR   header;
+    RGNDATA*    rgn;
+} RGNOBJ;
+
+/*  User entry points */
 INT STDCALL
 W32kGetBoxRgn(HRGN hRgn, PRECT Rect);
 HRGN STDCALL
@@ -124,4 +146,4 @@ W32kSetRectRgn(HRGN  hRgn,
                      INT  BottomRect);
 
 #endif
-               
+
diff --git a/reactos/include/win32k/text.h b/reactos/include/win32k/text.h
index 27d5d18dc28..31ff77b41a3 100644
--- a/reactos/include/win32k/text.h
+++ b/reactos/include/win32k/text.h
@@ -11,14 +11,16 @@ typedef struct
 /*  Internal interface  */
 
 #define  TEXTOBJ_AllocText() \
-  ((PTEXTOBJ) GDIOBJ_AllocObject (sizeof (TEXTOBJ), GO_FONT_MAGIC))
-#define  TEXTOBJ_FreeText(hBMObj)  GDIOBJ_FreeObject((HGDIOBJ) hBMObj)
+  ((HFONT) GDIOBJ_AllocObj (sizeof (TEXTOBJ), GO_FONT_MAGIC))
+#define  TEXTOBJ_FreeText(hBMObj)  GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GO_FONT_MAGIC)
+/*
 #define  TEXTOBJ_HandleToPtr(hBMObj)  \
   ((PTEXTOBJ) GDIOBJ_HandleToPtr ((HGDIOBJ) hBMObj, GO_FONT_MAGIC))
 #define  TEXTOBJ_PtrToHandle(hBMObj)  \
   ((HFONT) GDIOBJ_PtrToHandle ((PGDIOBJ) hBMObj, GO_FONT_MAGIC))
-#define  TEXTOBJ_LockText(hBMObj) GDIOBJ_LockObject ((HGDIOBJ) hBMObj)
-#define  TEXTOBJ_UnlockText(hBMObj) GDIOBJ_UnlockObject ((HGDIOBJ) hBMObj)
+*/
+#define  TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GO_FONT_MAGIC))
+#define  TEXTOBJ_UnlockText(hBMObj) GDIOBJ_UnlockObj ((HGDIOBJ) hBMObj, GO_FONT_MAGIC)
 
 int
 STDCALL
@@ -252,7 +254,7 @@ W32kTextOut(HDC  hDC,
 UINT
 STDCALL
 W32kTranslateCharsetInfo(PDWORD  Src,
-                               LPCHARSETINFO  CSI,   
+                               LPCHARSETINFO  CSI,
                                DWORD  Flags);
 
 #endif
diff --git a/reactos/lib/gdi32/objects/pen.c b/reactos/lib/gdi32/objects/pen.c
index db41cf19868..51286df1213 100644
--- a/reactos/lib/gdi32/objects/pen.c
+++ b/reactos/lib/gdi32/objects/pen.c
@@ -20,3 +20,10 @@ CreatePenIndirect(CONST LOGPEN *lgpn)
 {
    return W32kCreatePenIndirect((CONST PLOGPEN)lgpn);
 }
+/*
+VOID STDCALL
+DumpGdiObjects( INT process )
+{
+	W32kDumpGdiObjects( process );
+}
+*/
diff --git a/reactos/subsys/win32k/freetype/grfont.c b/reactos/subsys/win32k/freetype/grfont.c
index 365c0b04463..d8e8d41796d 100644
--- a/reactos/subsys/win32k/freetype/grfont.c
+++ b/reactos/subsys/win32k/freetype/grfont.c
@@ -7,6 +7,9 @@
 #include <win32k/bitmaps.h>
 #include "../eng/objects.h"
 
+//#define NDEBUG
+#include <win32k/debug1.h>
+
 // #include "grfont.h"
 // #include <string.h>
 
@@ -275,6 +278,8 @@ const unsigned char  font_8x8[2048] =
 static PSURFOBJ CharCellSurfObj;
 static HBITMAP  hCharCellBitmap;
 
+VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap);
+
 // Set things up for a character cell surface
 void CreateCellCharSurface()
 {
@@ -287,9 +292,10 @@ void CreateCellCharSurface()
    hCharCellBitmap = W32kCreateBitmap(8, 8, 1, 8, NULL); // 8x8, 1 plane, 8 bits per pel
 
    pbo = BITMAPOBJ_HandleToPtr(hCharCellBitmap);
-
+   ASSERT( pbo );
 // VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap)
    BitmapToSurf(0, surfgdi, CharCellSurfObj, pbo); // Make the bitmap a surface
+   BITMAPOBJ_ReleasePtr( hCharCellBitmap );
 }
 
 void  grWriteCellChar(PSURFOBJ  target,
diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c
index fb2687d34fd..fc15d8c6e18 100644
--- a/reactos/subsys/win32k/main/dllmain.c
+++ b/reactos/subsys/win32k/main/dllmain.c
@@ -1,5 +1,5 @@
-/* $Id: dllmain.c,v 1.26 2002/07/04 19:56:37 dwelch Exp $
- * 
+/* $Id: dllmain.c,v 1.27 2002/07/13 21:37:26 ei Exp $
+ *
  *  Entry Point for win32k.sys
  */
 
@@ -17,6 +17,9 @@
 #include <include/class.h>
 #include <include/window.h>
 
+//#define NDEBUG
+#include <win32k/debug1.h>
+
 extern SSDT Win32kSSDT[];
 extern SSPT Win32kSSPT[];
 extern ULONG Win32kNumberOfSysCalls;
@@ -94,6 +97,7 @@ BOOLEAN
 STDCALL
 W32kInitialize (VOID)
 {
+  DPRINT("in W32kInitialize\n");
   InitGdiObjectHandleTable ();
 
   // Create surface used to draw the internal font onto
diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c
index c0d1859d9e9..b018629ef55 100644
--- a/reactos/subsys/win32k/objects/bitmaps.c
+++ b/reactos/subsys/win32k/objects/bitmaps.c
@@ -5,8 +5,8 @@
 //#include <win32k/debug.h>
 #include "../eng/objects.h"
 
-#define NDEBUG
-#include <debug.h>
+//#define NDEBUG
+#include <win32k/debug1.h>
 
 BOOL STDCALL W32kBitBlt(HDC  hDCDest,
                  INT  XDest,
@@ -85,6 +85,9 @@ BOOL STDCALL W32kBitBlt(HDC  hDCDest,
   if(SurfDestAlloc == TRUE) ExFreePool(SurfDest);
   if(SurfSrcAlloc  == TRUE) ExFreePool(SurfSrc);
 
+  DC_ReleasePtr(hDCDest);
+  DC_ReleasePtr(hDCSrc);
+
   return Status;
 }
 
@@ -101,31 +104,34 @@ HBITMAP STDCALL W32kCreateBitmap(INT  Width,
   BitsPerPel = (BYTE) BitsPerPel;
 
   /* Check parameters */
-  if (!Height || !Width) 
+  if (!Height || !Width)
   {
     return 0;
   }
-  if (Planes != 1) 
+  if (Planes != 1)
   {
     UNIMPLEMENTED;
     return  0;
   }
-  if (Height < 0) 
+  if (Height < 0)
   {
     Height = -Height;
   }
-  if (Width < 0) 
+  if (Width < 0)
   {
     Width = -Width;
   }
 
   /* Create the BITMAPOBJ */
-  bmp = BITMAPOBJ_AllocBitmap ();
-  if (!bmp) 
+  hBitmap = BITMAPOBJ_AllocBitmap ();
+  if (!hBitmap)
   {
+	DPRINT("W32kCreateBitmap: BITMAPOBJ_AllocBitmap returned 0\n");
     return 0;
   }
 
+  bmp = BITMAPOBJ_HandleToPtr( hBitmap );
+
   DPRINT("W32kCreateBitmap:%dx%d, %d (%d BPP) colors returning %08x\n", Width, Height,
          1 << (Planes * BitsPerPel), BitsPerPel, bmp);
 
@@ -140,7 +146,6 @@ HBITMAP STDCALL W32kCreateBitmap(INT  Width,
   bmp->bitmap.bmBits = NULL;
   bmp->DDBitmap = NULL;
   bmp->dib = NULL;
-  hBitmap = BITMAPOBJ_PtrToHandle (bmp);
 
   // Allocate memory for bitmap bits
   bmp->bitmap.bmBits = ExAllocatePool(PagedPool, bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight);
@@ -150,9 +155,19 @@ HBITMAP STDCALL W32kCreateBitmap(INT  Width,
     W32kSetBitmapBits(hBitmap, Height * bmp->bitmap.bmWidthBytes, Bits);
   }
 
+  BITMAPOBJ_ReleasePtr( hBitmap );
+
   return  hBitmap;
 }
 
+BOOL Bitmap_InternalDelete( PBITMAPOBJ pBmp )
+{
+	ASSERT( pBmp );
+	ExFreePool(pBmp->bitmap.bmBits);
+	return TRUE;
+}
+
+
 HBITMAP STDCALL W32kCreateCompatibleBitmap(HDC hDC,
                                     INT  Width,
                                     INT  Height)
@@ -169,33 +184,33 @@ HBITMAP STDCALL W32kCreateCompatibleBitmap(HDC hDC,
   {
     return 0;
   }
-  if ((Width >= 0x10000) || (Height >= 0x10000)) 
+  if ((Width >= 0x10000) || (Height >= 0x10000))
   {
     DPRINT("got bad width %d or height %d, please look for reason\n", Width, Height);
   }
-  else 
+  else
   {
     /* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */
     if (!Width || !Height)
     {
       hbmpRet = W32kCreateBitmap (1, 1, 1, 1, NULL);
     }
-    else 
+    else
     {
       hbmpRet = W32kCreateBitmap(Width, Height, 1, dc->w.bitsPerPixel, NULL);
     }
   }
   DPRINT ("\t\t%04x\n", hbmpRet);
-
+  DC_ReleasePtr( hDC );
   return hbmpRet;
 }
 
 HBITMAP STDCALL W32kCreateBitmapIndirect(CONST BITMAP  *BM)
 {
-  return W32kCreateBitmap (BM->bmWidth, 
-                           BM->bmHeight, 
+  return W32kCreateBitmap (BM->bmWidth,
+                           BM->bmHeight,
                            BM->bmPlanes,
-                           BM->bmBitsPixel, 
+                           BM->bmBitsPixel,
                            BM->bmBits);
 }
 
@@ -210,7 +225,7 @@ HBITMAP STDCALL W32kCreateDiscardableBitmap(HDC  hDC,
 BOOL STDCALL W32kExtFloodFill(HDC  hDC,
                       INT  XStart,
                       INT  YStart,
-                      COLORREF  Color, 
+                      COLORREF  Color,
                       UINT  FillType)
 {
   UNIMPLEMENTED;
@@ -228,13 +243,13 @@ BOOL STDCALL W32kGetBitmapDimensionEx(HBITMAP  hBitmap,
                                LPSIZE  Dimension)
 {
   PBITMAPOBJ  bmp;
-  
+
   bmp = BITMAPOBJ_HandleToPtr (hBitmap);
-  if (bmp == NULL) 
+  if (bmp == NULL)
   {
     return FALSE;
   }
-  
+
   *Dimension = bmp->size;
 
   return  TRUE;
@@ -253,7 +268,7 @@ BOOL STDCALL W32kMaskBlt(HDC  hDCDest,
                   INT  Width,
                   INT  Height,
                   HDC  hDCSrc,
-                  INT  XSrc, 
+                  INT  XSrc,
                   INT  YSrc,
                   HBITMAP  hMaskBitmap,
                   INT  xMask,
@@ -265,13 +280,13 @@ BOOL STDCALL W32kMaskBlt(HDC  hDCDest,
 
 BOOL STDCALL W32kPlgBlt(HDC  hDCDest,
                 CONST POINT  *Point,
-                HDC  hDCSrc, 
-                INT  XSrc,  
-                INT  YSrc,  
-                INT  Width, 
+                HDC  hDCSrc,
+                INT  XSrc,
+                INT  YSrc,
+                INT  Width,
                 INT  Height,
                 HBITMAP  hMaskBitmap,
-                INT  xMask,      
+                INT  xMask,
                 INT  yMask)
 {
   UNIMPLEMENTED;
@@ -283,14 +298,14 @@ LONG STDCALL W32kSetBitmapBits(HBITMAP  hBitmap,
 {
   DWORD  height, ret;
   PBITMAPOBJ  bmp;
-  
+
   bmp = BITMAPOBJ_HandleToPtr (hBitmap);
   if (bmp == NULL || Bits == NULL)
   {
     return 0;
   }
 
-  if (Bytes < 0) 
+  if (Bytes < 0)
   {
     DPRINT ("(%ld): Negative number of bytes passed???\n", Bytes );
     Bytes = -Bytes;
@@ -298,35 +313,35 @@ LONG STDCALL W32kSetBitmapBits(HBITMAP  hBitmap,
 
   /* Only get entire lines */
   height = Bytes / bmp->bitmap.bmWidthBytes;
-  if (height > bmp->bitmap.bmHeight) 
+  if (height > bmp->bitmap.bmHeight)
   {
     height = bmp->bitmap.bmHeight;
   }
   Bytes = height * bmp->bitmap.bmWidthBytes;
   DPRINT ("(%08x, bytes:%ld, bits:%p) %dx%d %d colors fetched height: %ld\n",
-          hBitmap, 
-          Bytes, 
-          Bits, 
-          bmp->bitmap.bmWidth, 
+          hBitmap,
+          Bytes,
+          Bits,
+          bmp->bitmap.bmWidth,
           bmp->bitmap.bmHeight,
-          1 << bmp->bitmap.bmBitsPixel, 
+          1 << bmp->bitmap.bmBitsPixel,
           height);
 
 #if 0
   /* FIXME: call DDI specific function here if available  */
-  if(bmp->DDBitmap) 
+  if(bmp->DDBitmap)
   {
     DPRINT ("Calling device specific BitmapBits\n");
     if (bmp->DDBitmap->funcs->pBitmapBits)
     {
       ret = bmp->DDBitmap->funcs->pBitmapBits(hBitmap, (void *) Bits, Bytes, DDB_SET);
-    } 
-    else 
+    }
+    else
     {
       DPRINT ("BitmapBits == NULL??\n");
       ret = 0;
     }
-  } 
+  }
   else
 #endif
     {
@@ -335,12 +350,12 @@ LONG STDCALL W32kSetBitmapBits(HBITMAP  hBitmap,
       {
         bmp->bitmap.bmBits = ExAllocatePool (PagedPool, Bytes);
       }
-      if(!bmp->bitmap.bmBits) 
+      if(!bmp->bitmap.bmBits)
       {
         DPRINT ("Unable to allocate bit buffer\n");
         ret = 0;
-      } 
-      else 
+      }
+      else
       {
         memcpy(bmp->bitmap.bmBits, Bits, Bytes);
         ret = Bytes;
@@ -356,14 +371,14 @@ BOOL STDCALL W32kSetBitmapDimensionEx(HBITMAP  hBitmap,
                                LPSIZE  Size)
 {
   PBITMAPOBJ  bmp;
-  
+
   bmp = BITMAPOBJ_HandleToPtr (hBitmap);
-  if (bmp == NULL) 
+  if (bmp == NULL)
   {
     return FALSE;
   }
-  
-  if (Size) 
+
+  if (Size)
   {
     *Size = bmp->size;
   }
@@ -397,8 +412,8 @@ BOOL STDCALL W32kStretchBlt(HDC  hDCDest,
                      HDC  hDCSrc,
                      INT  XOriginSrc,
                      INT  YOriginSrc,
-                     INT  WidthSrc,    
-                     INT  HeightSrc, 
+                     INT  WidthSrc,
+                     INT  HeightSrc,
                      DWORD  ROP)
 {
   UNIMPLEMENTED;
@@ -406,29 +421,29 @@ BOOL STDCALL W32kStretchBlt(HDC  hDCDest,
 
 /*  Internal Functions  */
 
-INT 
+INT
 BITMAPOBJ_GetWidthBytes (INT bmWidth, INT bpp)
 {
   switch(bpp)
   {
     case 1:
       return 2 * ((bmWidth+15) >> 4);
-      
+
     case 24:
       bmWidth *= 3; /* fall through */
     case 8:
       return bmWidth + (bmWidth & 1);
-      
+
     case 32:
       return bmWidth * 4;
-      
+
     case 16:
     case 15:
       return bmWidth * 2;
 
     case 4:
       return 2 * ((bmWidth+3) >> 2);
-      
+
     default:
       DPRINT ("stub");
   }
@@ -443,19 +458,19 @@ HBITMAP  BITMAPOBJ_CopyBitmap(HBITMAP  hBitmap)
   BITMAP  bm;
 
   bmp = BITMAPOBJ_HandleToPtr (hBitmap);
-  if (bmp == NULL) 
+  if (bmp == NULL)
   {
     return 0;
   }
   res = 0;
-  
+
   bm = bmp->bitmap;
   bm.bmBits = NULL;
   res = W32kCreateBitmapIndirect(&bm);
-  if(res) 
+  if(res)
   {
     char *buf;
-      
+
     buf = ExAllocatePool (NonPagedPool, bm.bmWidthBytes * bm.bmHeight);
     W32kGetBitmapBits (hBitmap, bm.bmWidthBytes * bm.bmHeight, buf);
     W32kSetBitmapBits (res, bm.bmWidthBytes * bm.bmHeight, buf);
diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c
index 9eb392bb824..311828bbd36 100644
--- a/reactos/subsys/win32k/objects/brush.c
+++ b/reactos/subsys/win32k/objects/brush.c
@@ -1,4 +1,4 @@
-/* $Id: brush.c,v 1.13 2001/11/02 06:10:11 rex Exp $
+/* $Id: brush.c,v 1.14 2002/07/13 21:37:26 ei Exp $
  */
 
 
@@ -17,20 +17,25 @@ HBRUSH STDCALL W32kCreateBrushIndirect(CONST LOGBRUSH  *lb)
   PBRUSHOBJ  brushPtr;
   HBRUSH  hBrush;
 
-  brushPtr = BRUSHOBJ_AllocBrush();
-  hBrush = BRUSHOBJ_PtrToHandle (brushPtr);
-
+  hBrush = BRUSHOBJ_AllocBrush();
   if (hBrush == NULL)
   {
     return 0;
   }
 
-  brushPtr->iSolidColor = lb->lbColor;
-  brushPtr->logbrush.lbStyle = lb->lbStyle;
-  brushPtr->logbrush.lbColor = lb->lbColor;
-  brushPtr->logbrush.lbHatch = lb->lbHatch;
+  brushPtr = BRUSHOBJ_LockBrush (hBrush);
+  ASSERT( brushPtr ); //I want to know if this ever occurs
 
-  return  hBrush;
+  if( brushPtr ){
+  	brushPtr->iSolidColor = lb->lbColor;
+  	brushPtr->logbrush.lbStyle = lb->lbStyle;
+  	brushPtr->logbrush.lbColor = lb->lbColor;
+  	brushPtr->logbrush.lbHatch = lb->lbHatch;
+
+  	BRUSHOBJ_UnlockBrush( hBrush );
+  	return  hBrush;
+  }
+  return NULL;
 }
 
 HBRUSH STDCALL W32kCreateDIBPatternBrush(HGLOBAL  hDIBPacked,
@@ -41,7 +46,7 @@ HBRUSH STDCALL W32kCreateDIBPatternBrush(HGLOBAL  hDIBPacked,
   LOGBRUSH  logbrush;
   PBITMAPINFO  info, newInfo;
   INT  size;
-    
+
   DPRINT("%04x\n", hbitmap );
 
   logbrush.lbStyle = BS_DIBPATTERN;
@@ -49,11 +54,11 @@ HBRUSH STDCALL W32kCreateDIBPatternBrush(HGLOBAL  hDIBPacked,
   logbrush.lbHatch = 0;
 
   /* Make a copy of the bitmap */
-  if (!(info = (BITMAPINFO *)GlobalLock( hbitmap ))) 
+  if (!(info = (BITMAPINFO *)GlobalLock( hbitmap )))
   {
     return 0;
   }
-  
+
 
   if (info->bmiHeader.biCompression) size = info->bmiHeader.biSizeImage;
   else
@@ -80,16 +85,16 @@ HBRUSH STDCALL W32kCreateDIBPatternBrushPt(CONST VOID  *PackedDIB,
   LOGBRUSH  logbrush;
   PBITMAPINFO  info;
   PBITMAPINFO  newInfo;
-    
+
   info = (BITMAPINFO *) PackedDIB;
   if (info == NULL)
   {
     return 0;
   }
-  DPRINT ("%p %ldx%ld %dbpp\n", 
-          info, 
+  DPRINT ("%p %ldx%ld %dbpp\n",
+          info,
           info->bmiHeader.biWidth,
-          info->bmiHeader.biHeight, 
+          info->bmiHeader.biHeight,
           info->bmiHeader.biBitCount);
 
   logbrush.lbStyle = BS_DIBPATTERN;
@@ -107,15 +112,17 @@ HBRUSH STDCALL W32kCreateDIBPatternBrushPt(CONST VOID  *PackedDIB,
     size = DIB_GetDIBImageBytes (info->bmiHeader.biWidth, info->bmiHeader.biHeight, info->bmiHeader.biBitCount);
   }
   size += DIB_BitmapInfoSize (info, Usage);
-  
-  logbrush.lbHatch = (INT)GDIOBJ_PtrToHandle (GDIOBJ_AllocObject (size, GO_MAGIC_DONTCARE), GO_MAGIC_DONTCARE);
+
+  logbrush.lbHatch = (LONG) GDIOBJ_AllocObj(size, GO_MAGIC_DONTCARE);
   if (logbrush.lbHatch == 0)
   {
     return 0;
   }
-  newInfo = (PBITMAPINFO) GDIOBJ_HandleToPtr ((HGDIOBJ) logbrush.lbHatch, GO_MAGIC_DONTCARE);
+  newInfo = (PBITMAPINFO) GDIOBJ_LockObj ((HGDIOBJ) logbrush.lbHatch, GO_MAGIC_DONTCARE);
+  ASSERT(newInfo);
   memcpy(newInfo, info, size);
-  
+  GDIOBJ_UnlockObj( (HGDIOBJ) logbrush.lbHatch, GO_MAGIC_DONTCARE );
+
   return  W32kCreateBrushIndirect (&logbrush);
 }
 
@@ -133,7 +140,7 @@ HBRUSH STDCALL W32kCreateHatchBrush(INT  Style,
   logbrush.lbStyle = BS_HATCHED;
   logbrush.lbColor = Color;
   logbrush.lbHatch = Style;
-  
+
   return  W32kCreateBrushIndirect (&logbrush);
 }
 
diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c
index ef46d3a3246..9ca5834bf26 100644
--- a/reactos/subsys/win32k/objects/cliprgn.c
+++ b/reactos/subsys/win32k/objects/cliprgn.c
@@ -3,11 +3,56 @@
 #undef WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <ddk/ntddk.h>
+#include <win32k/dc.h>
 #include <win32k/cliprgn.h>
 
 // #define NDEBUG
 #include <win32k/debug1.h>
 
+HRGN WINAPI SaveVisRgn(HDC hdc)
+{
+  HRGN copy;
+  PRGNDATA obj, copyObj;
+  PDC dc = DC_HandleToPtr(hdc);
+/*ei
+  if (!dc) return 0;
+
+  obj = RGNDATA_HandleToPtr(dc->w.hVisRgn);
+
+  if(!(copy = CreateRectRgn(0, 0, 0, 0)))
+  {
+    GDI_ReleaseObj(dc->w.hVisRgn);
+    GDI_ReleaseObj(hdc);
+    return 0;
+  }
+  CombineRgn(copy, dc->w.hVisRgn, 0, RGN_COPY);
+  copyObj = RGNDATA_HandleToPtr(copy);
+*/
+/*  copyObj->header.hNext = obj->header.hNext;
+  header.hNext = copy; */
+  DC_ReleasePtr( hdc );
+  return copy;
+}
+
+INT16 WINAPI SelectVisRgn(HDC hdc, HRGN hrgn)
+{
+	return ERROR;
+/*ei
+  int retval;
+  DC *dc;
+
+  if (!hrgn) return ERROR;
+  if (!(dc = DC_HandleToPtr(hdc))) return ERROR;
+
+  dc->flags &= ~DC_DIRTY;
+
+  retval = CombineRgn(dc->hVisRgn, hrgn, 0, RGN_COPY);
+  CLIPPING_UpdateGCRegion(dc);
+
+  return retval;
+*/
+}
+
 int STDCALL W32kExcludeClipRect(HDC  hDC,
                          int  LeftRect,
                          int  TopRect,
diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c
index 157b70936b7..9e05b19edc5 100644
--- a/reactos/subsys/win32k/objects/color.c
+++ b/reactos/subsys/win32k/objects/color.c
@@ -19,7 +19,7 @@ int COLOR_max = 256;
 static HPALETTE hPrimaryPalette = 0; // used for WM_PALETTECHANGED
 static HPALETTE hLastRealizedPalette = 0; // UnrealizeObject() needs it
 
-const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] = 
+const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] =
 {
   // first 10 entries in the system palette
   // red  green blue  flags
@@ -50,6 +50,10 @@ const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] =
   { 0xff, 0xff, 0xff, PC_SYS_USED }     // last 10
 };
 
+//forward declarations
+COLORREF COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF color );
+
+
 const PALETTEENTRY* COLOR_GetSystemPaletteTemplate(void)
 {
   return (const PALETTEENTRY*)&COLOR_sysPalTemplate;
@@ -102,7 +106,7 @@ HPALETTE STDCALL W32kCreateHalftonePalette(HDC  hDC)
         Palette.aEntries[i].peRed = r * 51;
         Palette.aEntries[i].peGreen = g * 51;
         Palette.aEntries[i].peBlue = b * 51;
-      }    
+      }
      }
    }
 
@@ -120,7 +124,7 @@ HPALETTE STDCALL W32kCreatePalette(CONST PLOGPALETTE palette)
 {
   PPALOBJ  PalObj;
 
-  HPALETTE NewPalette = (HPALETTE)EngCreatePalette(PAL_INDEXED, palette->palNumEntries, palette->palPalEntry, 0, 0, 0);
+  HPALETTE NewPalette = (HPALETTE)EngCreatePalette(PAL_INDEXED, palette->palNumEntries, (PULONG*) palette->palPalEntry, 0, 0, 0);
   ULONG size;
 
   PalObj = (PPALOBJ)AccessUserObject(NewPalette);
@@ -147,7 +151,7 @@ COLORREF STDCALL W32kGetNearestColor(HDC  hDC,
   PDC dc;
   PPALOBJ palObj;
 
-  if(DC_HandleToPtr(hDC))
+  if( (dc = DC_HandleToPtr(hDC) ) )
   {
     HPALETTE hpal = (dc->w.hPalette)? dc->w.hPalette : W32kGetStockObject(DEFAULT_PALETTE);
     palObj = (PPALOBJ)AccessUserObject(hpal);
@@ -158,9 +162,9 @@ COLORREF STDCALL W32kGetNearestColor(HDC  hDC,
 
     nearest = COLOR_LookupNearestColor(palObj->logpalette->palPalEntry,
                                        palObj->logpalette->palNumEntries, Color);
-
+	// FIXME: release hpal!!
 //    GDI_ReleaseObj( hpal );
-//    GDI_ReleaseObj( hdc );
+    DC_ReleasePtr( hDC );
   }
 
   return nearest;
@@ -196,8 +200,8 @@ UINT STDCALL W32kGetPaletteEntries(HPALETTE  hpal,
   numEntries = palPtr->logpalette->palNumEntries;
   if (StartIndex + Entries > numEntries) Entries = numEntries - StartIndex;
   if (pe)
-  { 
-    if (StartIndex >= numEntries) 
+  {
+    if (StartIndex >= numEntries)
     {
 //      GDI_ReleaseObj( hpalette );
       return 0;
@@ -253,7 +257,7 @@ UINT STDCALL W32kGetSystemPaletteUse(HDC  hDC)
 
 UINT STDCALL W32kRealizePalette(HDC  hDC)
 /*
-The RealizePalette function modifies the palette for the device associated with the specified device context. If the device context is a memory DC, the color table for the bitmap selected into the DC is modified. If the device context is a display DC, the physical palette for that device is modified. 
+The RealizePalette function modifies the palette for the device associated with the specified device context. If the device context is a memory DC, the color table for the bitmap selected into the DC is modified. If the device context is a display DC, the physical palette for that device is modified.
 
 A logical palette is a buffer between color-intensive applications and the system, allowing these applications to use as many colors as needed without interfering with colors displayed by other windows.
 
@@ -332,13 +336,13 @@ BOOL STDCALL W32kResizePalette(HPALETTE  hpal,
   prevsize = sizeof(LOGPALETTE) + (cPrevEnt - 1) * sizeof(PALETTEENTRY) + sizeof(int*) + sizeof(GDIOBJHDR);
   size += sizeof(int*) + sizeof(GDIOBJHDR);
   XlateObj = palPtr->logicalToSystem;
-    
+
   if (!(palPtr = GDI_ReallocObject(size, hPal, palPtr))) return FALSE;
 
   if(XlateObj)
   {
     PXLATEOBJ NewXlateObj = (int*) HeapReAlloc(GetProcessHeap(), 0, XlateObj, cEntries * sizeof(int));
-    if(NewXlateObj == NULL) 
+    if(NewXlateObj == NULL)
     {
       ERR("Can not resize logicalToSystem -- out of memory!");
       GDI_ReleaseObj( hPal );
@@ -475,7 +479,7 @@ COLORREF COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF
 
   else if( spec_type == 1 ) /* PALETTEINDEX */
   {
-    if( (i = color & 0x0000ffff) >= size ) 
+    if( (i = color & 0x0000ffff) >= size )
     {
       DbgPrint("RGB(%lx) : idx %d is out of bounds, assuming NULL\n", color, i);
       color = *(COLORREF*)palPalEntry;
diff --git a/reactos/subsys/win32k/objects/coord.c b/reactos/subsys/win32k/objects/coord.c
index 0aaa61f3c8a..138294cb5c5 100644
--- a/reactos/subsys/win32k/objects/coord.c
+++ b/reactos/subsys/win32k/objects/coord.c
@@ -1,4 +1,4 @@
-/* $Id: coord.c,v 1.7 2002/07/04 19:56:37 dwelch Exp $
+/* $Id: coord.c,v 1.8 2002/07/13 21:37:26 ei Exp $
  *
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
@@ -24,7 +24,7 @@ BOOL STDCALL W32kCombineTransform(LPXFORM  XFormResult,
                            CONST LPXFORM  xform2)
 {
   XFORM  xformTemp;
-    
+
   /* Check for illegal parameters */
   if (!XFormResult || !xform1 || !xform2)
   {
@@ -47,34 +47,35 @@ BOOL STDCALL W32kCombineTransform(LPXFORM  XFormResult,
 
 VOID STATIC
 CoordDPtoLP(PDC Dc, LPPOINT Point)
-{ 
+{
 FLOAT x, y;
   x = (FLOAT)Point->x;
   y = (FLOAT)Point->y;
   Point->x = x * Dc->w.xformVport2World.eM11 +
     y * Dc->w.xformVport2World.eM21 + Dc->w.xformVport2World.eDx;
   Point->y = x * Dc->w.xformVport2World.eM12 +
-    y * Dc->w.xformVport2World.eM22 + Dc->w.xformVport2World.eDy; 
+    y * Dc->w.xformVport2World.eM22 + Dc->w.xformVport2World.eDy;
 }
 
-BOOL STDCALL 
+BOOL STDCALL
 W32kDPtoLP(HDC  hDC,
 	   LPPOINT  Points,
 	   int  Count)
 {
-  PDC Dc;  
+  PDC Dc;
   ULONG i;
-  
+
   Dc = DC_HandleToPtr (hDC);
-  if (Dc == NULL || !Dc->w.vport2WorldValid) 
+  if (Dc == NULL || !Dc->w.vport2WorldValid)
     {
       return(FALSE);
     }
-  
+
   for (i = 0; i < Count; i++)
     {
       CoordDPtoLP(Dc, &Points[i]);
     }
+  DC_ReleasePtr( hDC );
   return(TRUE);
 }
 
@@ -84,15 +85,15 @@ W32kGetGraphicsMode(HDC  hDC)
 {
   PDC  dc;
   int  GraphicsMode;
-  
+
   dc = DC_HandleToPtr (hDC);
-  if (!dc) 
+  if (!dc)
   {
     return  0;
   }
-  
+
   GraphicsMode = dc->w.GraphicsMode;
-  
+  DC_ReleasePtr( hDC );
   return  GraphicsMode;
 }
 
@@ -102,7 +103,7 @@ W32kGetWorldTransform(HDC  hDC,
                       LPXFORM  XForm)
 {
   PDC  dc;
-  
+
   dc = DC_HandleToPtr (hDC);
   if (!dc)
   {
@@ -113,7 +114,7 @@ W32kGetWorldTransform(HDC  hDC,
     return  FALSE;
   }
   *XForm = dc->w.xformWorld2Wnd;
-    
+  DC_ReleasePtr( hDC );
   return  TRUE;
 }
 
@@ -132,19 +133,20 @@ CoordLPtoDP(PDC Dc, LPPOINT Point)
 BOOL STDCALL
 W32kLPtoDP(HDC hDC, LPPOINT Points, INT Count)
 {
-  PDC Dc;  
+  PDC Dc;
   ULONG i;
-  
+
   Dc = DC_HandleToPtr (hDC);
-  if (Dc == NULL) 
+  if (Dc == NULL)
     {
       return(FALSE);
     }
-  
+
   for (i = 0; i < Count; i++)
     {
       CoordLPtoDP(Dc, &Points[i]);
     }
+  DC_ReleasePtr( hDC );
   return(TRUE);
 }
 
@@ -155,7 +157,7 @@ W32kModifyWorldTransform(HDC  hDC,
                                DWORD  Mode)
 {
   PDC  dc;
-  
+
   dc = DC_HandleToPtr (hDC);
   if (!dc)
   {
@@ -166,7 +168,7 @@ W32kModifyWorldTransform(HDC  hDC,
   {
     return FALSE;
   }
-    
+
   /* Check that graphics mode is GM_ADVANCED */
   if (dc->w.GraphicsMode!=GM_ADVANCED)
   {
@@ -178,24 +180,25 @@ W32kModifyWorldTransform(HDC  hDC,
       dc->w.xformWorld2Wnd.eM11 = 1.0f;
       dc->w.xformWorld2Wnd.eM12 = 0.0f;
       dc->w.xformWorld2Wnd.eM21 = 0.0f;
-      dc->w.xformWorld2Wnd.eM22 = 1.0f; 
+      dc->w.xformWorld2Wnd.eM22 = 1.0f;
       dc->w.xformWorld2Wnd.eDx  = 0.0f;
       dc->w.xformWorld2Wnd.eDy  = 0.0f;
       break;
-      
+
     case MWT_LEFTMULTIPLY:
       W32kCombineTransform(&dc->w.xformWorld2Wnd, XForm, &dc->w.xformWorld2Wnd );
       break;
-      
+
     case MWT_RIGHTMULTIPLY:
       W32kCombineTransform(&dc->w.xformWorld2Wnd, &dc->w.xformWorld2Wnd, XForm);
       break;
-      
+
     default:
+	  DC_ReleasePtr( hDC );
       return FALSE;
   }
   DC_UpdateXforms (dc);
-
+  DC_ReleasePtr( hDC );
   return  TRUE;
 }
 
@@ -250,7 +253,7 @@ W32kSetGraphicsMode(HDC  hDC,
 {
   INT ret;
   DC *dc;
-  
+
   dc = DC_HandleToPtr (hDC);
   if (!dc)
   {
@@ -262,14 +265,15 @@ W32kSetGraphicsMode(HDC  hDC,
    * matrix. However, in Windows, this is not the case. This doesn't
    * make a lot of sense to me, but that's the way it is.
    */
-  
-  if ((Mode != GM_COMPATIBLE) && (Mode != GM_ADVANCED)) 
+
+  if ((Mode != GM_COMPATIBLE) && (Mode != GM_ADVANCED))
   {
+	DC_ReleasePtr( hDC );
     return 0;
   }
   ret = dc->w.GraphicsMode;
   dc->w.GraphicsMode = Mode;
-  
+  DC_ReleasePtr( hDC );
   return  ret;
 }
 
@@ -327,26 +331,27 @@ W32kSetWorldTransform(HDC  hDC,
                             CONST LPXFORM  XForm)
 {
   PDC  dc;
-  
+
   dc = DC_HandleToPtr (hDC);
   if (!dc)
   {
-//    SetLastError( ERROR_INVALID_HANDLE );
     return  FALSE;
   }
   if (!XForm)
   {
+	DC_ReleasePtr( hDC );
     return  FALSE;
   }
-    
+
   /* Check that graphics mode is GM_ADVANCED */
   if (dc->w.GraphicsMode != GM_ADVANCED)
   {
+  	DC_ReleasePtr( hDC );
     return  FALSE;
   }
   dc->w.xformWorld2Wnd = *XForm;
   DC_UpdateXforms (dc);
-
+  DC_ReleasePtr( hDC );
   return  TRUE;
 }
 
diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c
index e9bf702741a..cec4c715f92 100644
--- a/reactos/subsys/win32k/objects/dc.c
+++ b/reactos/subsys/win32k/objects/dc.c
@@ -1,7 +1,7 @@
-/* $Id: dc.c,v 1.31 2002/02/16 00:51:02 jfilby Exp $
+/* $Id: dc.c,v 1.32 2002/07/13 21:37:26 ei Exp $
  *
  * DC.C - Device context functions
- * 
+ *
  */
 
 #undef WIN32_LEAN_AND_MEAN
@@ -19,9 +19,10 @@
 #include <win32k/text.h>
 #include "../eng/objects.h"
 
-#define NDEBUG
+//#define NDEBUG
 #include <win32k/debug1.h>
 
+
 /* FIXME: DCs should probably be thread safe  */
 
 /*
@@ -39,11 +40,12 @@ func_type STDCALL  func_name( HDC hdc ) \
     return 0;                       \
   }                                 \
   ft = dc->dc_field;                \
+  DC_ReleasePtr( hdc );				\
   return ft;                        \
 }
 
-/* DC_GET_VAL_EX is used to define functions returning a POINT or a SIZE. It is 
- * important that the function has the right signature, for the implementation 
+/* DC_GET_VAL_EX is used to define functions returning a POINT or a SIZE. It is
+ * important that the function has the right signature, for the implementation
  * we can do whatever we want.
  */
 #define DC_GET_VAL_EX( func_name, ret_x, ret_y, type ) \
@@ -56,6 +58,7 @@ BOOL STDCALL  func_name( HDC hdc, LP##type pt ) \
   }                                 \
   ((LPPOINT)pt)->x = dc->ret_x;     \
   ((LPPOINT)pt)->y = dc->ret_y;     \
+  DC_ReleasePtr( hdc );				\
   return  TRUE;                     \
 }
 
@@ -74,9 +77,12 @@ INT STDCALL  func_name( HDC hdc, INT mode ) \
   }                                         \
   prevMode = dc->dc_field;                  \
   dc->dc_field = mode;                      \
+  DC_ReleasePtr( hdc );						\
   return prevMode;                          \
 }
 
+VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap);
+
 //  ---------------------------------------------------------  File Statics
 
 static void  W32kSetDCState16(HDC  hDC, HDC  hDCSave);
@@ -93,17 +99,23 @@ HDC STDCALL  W32kCreateCompatableDC(HDC  hDC)
   PDC  NewDC, OrigDC = NULL;
   HBITMAP  hBitmap;
   SIZEL onebyone;
+  HDC hNewDC;
 
   OrigDC = DC_HandleToPtr(hDC);
   if (OrigDC == NULL)
   {
-    NewDC = DC_AllocDC(L"DISPLAY");
-  } else {
+    hNewDC = DC_AllocDC(L"DISPLAY");
+	if( hNewDC )
+		NewDC = DC_HandleToPtr( hNewDC );
+  }
+  else {
     /*  Allocate a new DC based on the original DC's device  */
-    NewDC = DC_AllocDC(OrigDC->DriverName);
+    hNewDC = DC_AllocDC(OrigDC->DriverName);
+	if( hNewDC )
+		NewDC = DC_HandleToPtr( hNewDC );
   }
 
-  if (NewDC == NULL) 
+  if (NewDC == NULL)
   {
     return  NULL;
   }
@@ -116,7 +128,7 @@ HDC STDCALL  W32kCreateCompatableDC(HDC  hDC)
   } else {
     NewDC->PDev = OrigDC->PDev;
     NewDC->DMW = OrigDC->DMW;
-    memcpy(NewDC->FillPatternSurfaces, 
+    memcpy(NewDC->FillPatternSurfaces,
            OrigDC->FillPatternSurfaces,
            sizeof OrigDC->FillPatternSurfaces);
     NewDC->GDIInfo = OrigDC->GDIInfo;
@@ -143,13 +155,13 @@ HDC STDCALL  W32kCreateCompatableDC(HDC  hDC)
     NewDC->vportExtY = OrigDC->vportExtY;
   }
 
-  DC_InitDC(NewDC);
+  DC_InitDC(hNewDC);
 
   /* Create default bitmap */
   if (!(hBitmap = W32kCreateBitmap( 1, 1, 1, 1, NULL )))
   {
-    DC_FreeDC(NewDC);
-      
+	DC_ReleasePtr( hNewDC );
+    DC_FreeDC( hNewDC );
     return NULL;
   }
   NewDC->w.flags        = DC_MEMORY;
@@ -163,8 +175,10 @@ HDC STDCALL  W32kCreateCompatableDC(HDC  hDC)
     NewDC->w.textColor = OrigDC->w.textColor;
     NewDC->w.textAlign = OrigDC->w.textAlign;
   }
+  DC_ReleasePtr( hDC );
+  DC_ReleasePtr( hNewDC );
 
-  return  DC_PtrToHandle(NewDC);
+  return  hNewDC;
 }
 
 #include <ddk/ntddvid.h>
@@ -175,27 +189,30 @@ HDC STDCALL  W32kCreateDC(LPCWSTR  Driver,
                   CONST PDEVMODEW  InitData)
 {
   PGD_ENABLEDRIVER  GDEnableDriver;
+  HDC  hNewDC;
   PDC  NewDC;
   HDC  hDC = NULL;
   DRVENABLEDATA  DED;
-  HDC hNewDC;
   PSURFOBJ SurfObj;
 
   /*  Check for existing DC object  */
-  if ((NewDC = DC_FindOpenDC(Driver)) != NULL)
+  if ((hNewDC = DC_FindOpenDC(Driver)) != NULL)
   {
-    hDC = DC_PtrToHandle(NewDC);
+    hDC = hNewDC;
     return  W32kCreateCompatableDC(hDC);
   }
 
   DPRINT("NAME: %S\n", Driver); // FIXME: Should not crash if NULL
 
   /*  Allocate a DC object  */
-  if ((NewDC = DC_AllocDC(Driver)) == NULL)
+  if ((hNewDC = DC_AllocDC(Driver)) == NULL)
   {
     return  NULL;
   }
 
+  NewDC = DC_HandleToPtr( hNewDC );
+  ASSERT( NewDC );
+
   /*  Open the miniport driver  */
   if ((NewDC->DeviceDriver = DRIVER_FindMPDriver(Driver)) == NULL)
   {
@@ -238,7 +255,7 @@ HDC STDCALL  W32kCreateDC(LPCWSTR  Driver,
   NewDC->DMW.dmFields = 0x000fc000;
 
   /* FIXME: get mode selection information from somewhere  */
-  
+
   NewDC->DMW.dmLogPixels = 96;
   NewDC->DMW.dmBitsPerPel = 4;
   NewDC->DMW.dmPelsWidth = 640;
@@ -288,16 +305,16 @@ HDC STDCALL  W32kCreateDC(LPCWSTR  Driver,
   DPRINT("Bits per pel: %u\n", NewDC->w.bitsPerPixel);
 
   /*  Initialize the DC state  */
-  DC_InitDC(NewDC);
-  hNewDC = DC_PtrToHandle(NewDC);
+  DC_InitDC(hNewDC);
 
   W32kSetTextColor(hNewDC, RGB(0xff, 0xff, 0xff));
   W32kSetTextAlign(hNewDC, TA_BASELINE);
-
+  DC_ReleasePtr( hNewDC );
   return hNewDC;
 
 Failure:
-  DC_FreeDC(NewDC);
+  DC_ReleasePtr( hNewDC );
+  DC_FreeDC(hNewDC);
   return  NULL;
 }
 
@@ -313,7 +330,7 @@ HDC STDCALL W32kCreateIC(LPCWSTR  Driver,
 BOOL STDCALL W32kDeleteDC(HDC  DCHandle)
 {
   PDC  DCToDelete;
-  
+
   DCToDelete = DC_HandleToPtr(DCHandle);
   if (DCToDelete == NULL)
     {
@@ -338,7 +355,7 @@ BOOL STDCALL W32kDeleteDC(HDC  DCHandle)
   {
     PDC  savedDC;
     HDC  savedHDC;
-      
+
     savedHDC = DC_GetNextDC (DCToDelete);
     savedDC = DC_HandleToPtr (savedHDC);
     if (savedDC == NULL)
@@ -347,9 +364,10 @@ BOOL STDCALL W32kDeleteDC(HDC  DCHandle)
     }
     DC_SetNextDC (DCToDelete, DC_GetNextDC (savedDC));
     DCToDelete->saveLevel--;
+	DC_ReleasePtr( savedHDC );
     W32kDeleteDC (savedHDC);
   }
-  
+
   /*  Free GDI resources allocated to this DC  */
   if (!(DCToDelete->w.flags & DC_SAVED))
   {
@@ -357,57 +375,30 @@ BOOL STDCALL W32kDeleteDC(HDC  DCHandle)
     W32kSelectObject (DCHandle, STOCK_BLACK_PEN);
     W32kSelectObject (DCHandle, STOCK_WHITE_BRUSH);
     W32kSelectObject (DCHandle, STOCK_SYSTEM_FONT);
-    DC_LockDC (DCHandle); W32kSelectObject does not recognize stock objects yet  */ 
-    if (DCToDelete->w.flags & DC_MEMORY) 
+    DC_LockDC (DCHandle); W32kSelectObject does not recognize stock objects yet  */
+    if (DCToDelete->w.flags & DC_MEMORY)
     {
       W32kDeleteObject (DCToDelete->w.hFirstBitmap);
     }
   }
-  if (DCToDelete->w.hClipRgn) 
+  if (DCToDelete->w.hClipRgn)
   {
     W32kDeleteObject (DCToDelete->w.hClipRgn);
   }
-  if (DCToDelete->w.hVisRgn) 
+  if (DCToDelete->w.hVisRgn)
   {
     W32kDeleteObject (DCToDelete->w.hVisRgn);
   }
-  if (DCToDelete->w.hGCClipRgn) 
+  if (DCToDelete->w.hGCClipRgn)
   {
     W32kDeleteObject (DCToDelete->w.hGCClipRgn);
   }
 #if 0 /* FIXME */
   PATH_DestroyGdiPath (&DCToDelete->w.path);
 #endif
-      
+  DC_ReleasePtr( DCToDelete );
   DC_FreeDC (DCToDelete);
-  
-  return TRUE;
-}
 
-BOOL STDCALL  W32kDeleteObject(HGDIOBJ hObject)
-{
-  PGDIOBJ  Obj;
-  PGDIOBJHDR  ObjHdr;
-  WORD  magic;
-
-  magic = GDIOBJ_GetHandleMagic (hObject);
-  Obj = GDIOBJ_HandleToPtr( hObject, GO_MAGIC_DONTCARE );
-  if( !Obj )
-    return FALSE;
-  ObjHdr = (PGDIOBJHDR)(((PCHAR)Obj) - sizeof (GDIOBJHDR));
-  switch( magic )
-  {
-    case GO_BITMAP_MAGIC: {
-      DPRINT( "Deleting bitmap\n" );
-      ExFreePool( ((PBITMAPOBJ)Obj)->bitmap.bmBits );
-      BITMAPOBJ_FreeBitmap( Obj );
-      break;
-    }
-    default: {
-      DPRINT( "W32kDeleteObject: Deleting object of unknown type %x\n", magic );
-      return FALSE;
-    }
-  }
   return TRUE;
 }
 
@@ -443,54 +434,58 @@ DC_GET_VAL_EX( W32kGetCurrentPositionEx, w.CursPosX, w.CursPosY, POINT )
 BOOL STDCALL W32kGetDCOrgEx(HDC  hDC,
                      LPPOINT  Point)
 {
-  DC * dc;
+  PDC dc;
 
-  if (!Point) 
+  if (!Point)
   {
     return FALSE;
   }
   dc = DC_HandleToPtr(hDC);
-  if (dc == NULL) 
+  if (dc == NULL)
   {
     return FALSE;
   }
 
   Point->x = Point->y = 0;
 
-  Point->x += dc->w.DCOrgX; 
+  Point->x += dc->w.DCOrgX;
   Point->y += dc->w.DCOrgY;
-  
+  DC_ReleasePtr( hDC );
   return  TRUE;
 }
 
 HDC STDCALL W32kGetDCState16(HDC  hDC)
 {
   PDC  newdc, dc;
-    
+  HDC hnewdc;
+
   dc = DC_HandleToPtr(hDC);
-  if (dc == NULL) 
+  if (dc == NULL)
   {
     return 0;
   }
-  
-  newdc = DC_AllocDC(NULL);
-  if (newdc == NULL)
+
+  hnewdc = DC_AllocDC(NULL);
+  if (hnewdc == NULL)
   {
+	DC_ReleasePtr( hDC );
     return 0;
   }
+  newdc = DC_HandleToPtr( hnewdc );
+  ASSERT( newdc );
 
   newdc->w.flags            = dc->w.flags | DC_SAVED;
 #if 0
   newdc->w.devCaps          = dc->w.devCaps;
 #endif
-  newdc->w.hPen             = dc->w.hPen;       
-  newdc->w.hBrush           = dc->w.hBrush;     
-  newdc->w.hFont            = dc->w.hFont;      
-  newdc->w.hBitmap          = dc->w.hBitmap;    
+  newdc->w.hPen             = dc->w.hPen;
+  newdc->w.hBrush           = dc->w.hBrush;
+  newdc->w.hFont            = dc->w.hFont;
+  newdc->w.hBitmap          = dc->w.hBitmap;
   newdc->w.hFirstBitmap     = dc->w.hFirstBitmap;
 #if 0
   newdc->w.hDevice          = dc->w.hDevice;
-  newdc->w.hPalette         = dc->w.hPalette;   
+  newdc->w.hPalette         = dc->w.hPalette;
 #endif
   newdc->w.totalExtent      = dc->w.totalExtent;
   newdc->w.bitsPerPixel     = dc->w.bitsPerPixel;
@@ -534,7 +529,7 @@ HDC STDCALL W32kGetDCState16(HDC  hDC)
   newdc->vportExtX          = dc->vportExtX;
   newdc->vportExtY          = dc->vportExtY;
 
-  newdc->hSelf = DC_PtrToHandle(newdc);
+  newdc->hSelf = hnewdc;
   newdc->saveLevel = 0;
 
 #if 0
@@ -555,8 +550,8 @@ HDC STDCALL W32kGetDCState16(HDC  hDC)
   {
     newdc->w.hClipRgn = 0;
   }
-  
-  return  newdc->hSelf;
+  DC_ReleasePtr( hnewdc );
+  return  hnewdc;
 }
 
 INT STDCALL W32kGetDeviceCaps(HDC  hDC,
@@ -565,9 +560,9 @@ INT STDCALL W32kGetDeviceCaps(HDC  hDC,
   PDC  dc;
   INT  ret;
   POINT  pt;
-    
+
   dc = DC_HandleToPtr(hDC);
-  if (dc == NULL) 
+  if (dc == NULL)
   {
     return 0;
   }
@@ -581,35 +576,35 @@ INT STDCALL W32kGetDeviceCaps(HDC  hDC,
         return pt.x;
       }
       break;
-      
+
     case PHYSICALHEIGHT:
       if(W32kEscape(hDC, GETPHYSPAGESIZE, 0, NULL, (LPVOID)&pt) > 0)
       {
         return pt.y;
       }
       break;
-      
+
     case PHYSICALOFFSETX:
       if(W32kEscape(hDC, GETPRINTINGOFFSET, 0, NULL, (LPVOID)&pt) > 0)
       {
         return pt.x;
       }
       break;
-      
+
     case PHYSICALOFFSETY:
       if(W32kEscape(hDC, GETPRINTINGOFFSET, 0, NULL, (LPVOID)&pt) > 0)
       {
         return pt.y;
       }
       break;
-      
+
     case SCALINGFACTORX:
       if(W32kEscape(hDC, GETSCALINGFACTOR, 0, NULL, (LPVOID)&pt) > 0)
       {
         return pt.x;
       }
       break;
-      
+
     case SCALINGFACTORY:
       if(W32kEscape(hDC, GETSCALINGFACTOR, 0, NULL, (LPVOID)&pt) > 0)
       {
@@ -622,11 +617,12 @@ INT STDCALL W32kGetDeviceCaps(HDC  hDC,
   {
     return 0;
   }
-    
+
   DPRINT("(%04x,%d): returning %d\n",
          hDC, Index, *(WORD *)(((char *)dc->w.devCaps) + Index));
   ret = *(WORD *)(((char *)dc->w.devCaps) + Index);
 
+  DC_ReleasePtr( hDC );
   return ret;
 }
 
@@ -639,10 +635,10 @@ INT STDCALL W32kGetObjectA(HANDLE handle, INT count, LPVOID buffer)
   INT  result = 0;
   WORD  magic;
 
-  if (!count) 
+  if (!count)
     return  0;
-  gdiObject = GDIOBJ_HandleToPtr (handle, GO_MAGIC_DONTCARE);
-  if (gdiObject == 0) 
+  gdiObject = GDIOBJ_LockObj (handle, GO_MAGIC_DONTCARE);
+  if (gdiObject == 0)
     return  0;
 
   magic = GDIOBJ_GetHandleMagic (handle);
@@ -651,10 +647,10 @@ INT STDCALL W32kGetObjectA(HANDLE handle, INT count, LPVOID buffer)
 /*    case GO_PEN_MAGIC:
       result = PEN_GetObject((PENOBJ *)gdiObject, count, buffer);
       break;
-    case GO_BRUSH_MAGIC: 
+    case GO_BRUSH_MAGIC:
       result = BRUSH_GetObject((BRUSHOBJ *)gdiObject, count, buffer);
       break; */
-    case GO_BITMAP_MAGIC: 
+    case GO_BITMAP_MAGIC:
       result = BITMAP_GetObject((BITMAPOBJ *)gdiObject, count, buffer);
       break;
 /*    case GO_FONT_MAGIC:
@@ -684,7 +680,7 @@ INT STDCALL W32kGetObjectA(HANDLE handle, INT count, LPVOID buffer)
       DbgPrint("Invalid GDI Magic %04x\n", magic);
       break;
   }
-
+  GDIOBJ_UnlockObj (handle, GO_MAGIC_DONTCARE);
   return  result;
 }
 
@@ -694,10 +690,10 @@ INT STDCALL W32kGetObjectW(HANDLE handle, INT count, LPVOID buffer)
   INT  result = 0;
   WORD  magic;
 
-  if (!count) 
+  if (!count)
     return 0;
-  gdiObject = GDIOBJ_HandleToPtr(handle, GO_MAGIC_DONTCARE);
-  if (gdiObject == 0) 
+  gdiObject = GDIOBJ_LockObj(handle, GO_MAGIC_DONTCARE);
+  if (gdiObject == 0)
     return 0;
 
   magic = GDIOBJ_GetHandleMagic (handle);
@@ -706,10 +702,10 @@ INT STDCALL W32kGetObjectW(HANDLE handle, INT count, LPVOID buffer)
 /*    case GO_PEN_MAGIC:
       result = PEN_GetObject((PENOBJ *)gdiObject, count, buffer);
       break;
-    case GO_BRUSH_MAGIC: 
+    case GO_BRUSH_MAGIC:
       result = BRUSH_GetObject((BRUSHOBJ *)gdiObject, count, buffer);
        break; */
-    case GO_BITMAP_MAGIC: 
+    case GO_BITMAP_MAGIC:
       result = BITMAP_GetObject((BITMAPOBJ *)gdiObject, count, buffer);
       break;
 /*    case GO_FONT_MAGIC:
@@ -727,10 +723,10 @@ INT STDCALL W32kGetObjectW(HANDLE handle, INT count, LPVOID buffer)
       // FIXME("Magic %04x not implemented\n", gdiObject->magic);
       break;
   }
-
+  GDIOBJ_UnlockObj(handle, GO_MAGIC_DONTCARE);
   return  result;
 }
- 
+
 INT STDCALL W32kGetObject(HANDLE handle, INT count, LPVOID buffer)
 {
   return W32kGetObjectW(handle, count, buffer);
@@ -742,20 +738,20 @@ DWORD STDCALL W32kGetObjectType(HANDLE handle)
   INT result = 0;
   WORD  magic;
 
-  ptr = GDIOBJ_HandleToPtr(handle, GO_MAGIC_DONTCARE);
-  if (ptr == 0) 
+  ptr = GDIOBJ_LockObj(handle, GO_MAGIC_DONTCARE);
+  if (ptr == 0)
     return 0;
-    
+
   magic = GDIOBJ_GetHandleMagic (handle);
   switch(magic)
   {
     case GO_PEN_MAGIC:
       result = OBJ_PEN;
       break;
-    case GO_BRUSH_MAGIC: 
+    case GO_BRUSH_MAGIC:
       result = OBJ_BRUSH;
       break;
-    case GO_BITMAP_MAGIC: 
+    case GO_BITMAP_MAGIC:
       result = OBJ_BITMAP;
       break;
     case GO_FONT_MAGIC:
@@ -789,7 +785,7 @@ DWORD STDCALL W32kGetObjectType(HANDLE handle)
       // FIXME("Magic %04x not implemented\n", magic);
       break;
   }
-
+  GDIOBJ_UnlockObj(handle, GO_MAGIC_DONTCARE);
   return result;
 }
 
@@ -814,26 +810,26 @@ BOOL STDCALL W32kRestoreDC(HDC  hDC, INT  SaveLevel)
   BOOL  success;
 
   dc = DC_HandleToPtr(hDC);
-  if(!dc) 
+  if(!dc)
   {
     return FALSE;
   }
-  
-  if (SaveLevel == -1) 
+
+  if (SaveLevel == -1)
   {
     SaveLevel = dc->saveLevel;
   }
-  
+
   if ((SaveLevel < 1) || (SaveLevel > dc->saveLevel))
   {
     return FALSE;
   }
-    
+
   success = TRUE;
   while (dc->saveLevel >= SaveLevel)
   {
     HDC hdcs = DC_GetNextDC (dc);
-      
+
     dcs = DC_HandleToPtr (hdcs);
     if (dcs == NULL)
     {
@@ -852,9 +848,10 @@ BOOL STDCALL W32kRestoreDC(HDC  hDC, INT  SaveLevel)
         }
 #endif
       }
+	  DC_ReleasePtr( hdcs );
     W32kDeleteDC (hdcs);
   }
-  
+  DC_ReleasePtr( hDC );
   return  success;
 }
 
@@ -889,10 +886,12 @@ INT STDCALL W32kSaveDC(HDC  hDC)
     return 0;
   }
 #endif
-    
+
   DC_SetNextDC (dcs, DC_GetNextDC (dc));
   DC_SetNextDC (dc, hdcs);
   ret = ++dc->saveLevel;
+  DC_ReleasePtr( hdcs );
+  DC_ReleasePtr( hDC );
 
   return  ret;
 }
@@ -925,8 +924,9 @@ HGDIOBJ STDCALL W32kSelectObject(HDC  hDC, HGDIOBJ  hGDIObj)
       // Convert the color of the pen to the format of the DC
       PalGDI = (PPALGDI)AccessInternalObject(dc->w.hPalette);
       XlateObj = (PXLATEOBJ)EngCreateXlate(PalGDI->Mode, PAL_RGB, dc->w.hPalette, NULL);
-      pen = GDIOBJ_HandleToPtr(dc->w.hPen, GO_PEN_MAGIC);
+      pen = GDIOBJ_LockObj(dc->w.hPen, GO_PEN_MAGIC);
       pen->logpen.lopnColor = XLATEOBJ_iXlate(XlateObj, pen->logpen.lopnColor);
+	  GDIOBJ_UnlockObj( dc->w.hPen, GO_PEN_MAGIC);
       break;
     case GO_BRUSH_MAGIC:
       objOrg = (HGDIOBJ)dc->w.hBrush;
@@ -973,11 +973,11 @@ HGDIOBJ STDCALL W32kSelectObject(HDC  hDC, HGDIOBJ  hGDIObj)
     default:
       return NULL;
   }
-
+  DC_ReleasePtr( hDC );
   return objOrg;
 }
 
-DC_SET_MODE( W32kSetBkMode, w.backgroundMode, TRANSPARENT, OPAQUE ) 
+DC_SET_MODE( W32kSetBkMode, w.backgroundMode, TRANSPARENT, OPAQUE )
 DC_SET_MODE( W32kSetPolyFillMode, w.polyFillMode, ALTERNATE, WINDING )
 // DC_SET_MODE( W32kSetRelAbs, w.relAbsMode, ABSOLUTE, RELATIVE )
 DC_SET_MODE( W32kSetROP2, w.ROPmode, R2_BLACK, R2_WHITE )
@@ -987,31 +987,32 @@ COLORREF STDCALL W32kSetBkColor(HDC hDC, COLORREF color)
 {
   COLORREF  oldColor;
   PDC  dc = DC_HandleToPtr(hDC);
-  
-  if (!dc) 
+
+  if (!dc)
   {
     return 0x80000000;
   }
-  
+
   oldColor = dc->w.backgroundColor;
   dc->w.backgroundColor = color;
-  
+  DC_ReleasePtr( hDC );
   return  oldColor;
 }
 
 static void  W32kSetDCState16(HDC  hDC, HDC  hDCSave)
 {
   PDC  dc, dcs;
-    
+
   dc = DC_HandleToPtr(hDC);
   if (dc == NULL)
   {
     return;
   }
-  
+
   dcs = DC_HandleToPtr(hDCSave);
   if (dcs == NULL)
   {
+	DC_ReleasePtr( hDC );
     return;
   }
   if (!dcs->w.flags & DC_SAVED)
@@ -1064,7 +1065,7 @@ static void  W32kSetDCState16(HDC  hDC, HDC  hDCSave)
   dc->w.xformVport2World = dcs->w.xformVport2World;
   dc->w.vport2WorldValid = dcs->w.vport2WorldValid;
 #endif
-  
+
   dc->wndOrgX            = dcs->wndOrgX;
   dc->wndOrgY            = dcs->wndOrgY;
   dc->wndExtX            = dcs->wndExtX;
@@ -1073,16 +1074,16 @@ static void  W32kSetDCState16(HDC  hDC, HDC  hDCSave)
   dc->vportOrgY          = dcs->vportOrgY;
   dc->vportExtX          = dcs->vportExtX;
   dc->vportExtY          = dcs->vportExtY;
-  
-  if (!(dc->w.flags & DC_MEMORY)) 
+
+  if (!(dc->w.flags & DC_MEMORY))
   {
     dc->w.bitsPerPixel = dcs->w.bitsPerPixel;
   }
-  
+
 #if 0
   if (dcs->w.hClipRgn)
   {
-    if (!dc->w.hClipRgn) 
+    if (!dc->w.hClipRgn)
     {
       dc->w.hClipRgn = W32kCreateRectRgn( 0, 0, 0, 0 );
     }
@@ -1090,16 +1091,16 @@ static void  W32kSetDCState16(HDC  hDC, HDC  hDCSave)
   }
   else
   {
-    if (dc->w.hClipRgn) 
+    if (dc->w.hClipRgn)
     {
       W32kDeleteObject( dc->w.hClipRgn );
     }
-      
+
     dc->w.hClipRgn = 0;
   }
   CLIPPING_UpdateGCRegion( dc );
 #endif
-  
+
   W32kSelectObject( hDC, dcs->w.hBitmap );
   W32kSelectObject( hDC, dcs->w.hBrush );
   W32kSelectObject( hDC, dcs->w.hFont );
@@ -1110,57 +1111,70 @@ static void  W32kSetDCState16(HDC  hDC, HDC  hDCSave)
 #if 0
   GDISelectPalette16( hDC, dcs->w.hPalette, FALSE );
 #endif
-  
+
+  DC_ReleasePtr( hDCSave );
+  DC_ReleasePtr( hDC );
 }
 
 //  ----------------------------------------------------  Private Interface
 
-PDC  DC_AllocDC(LPCWSTR  Driver)
+HDC  DC_AllocDC(LPCWSTR  Driver)
 {
-  PDC  NewDC;
-  
-  NewDC = (PDC) GDIOBJ_AllocObject(sizeof(DC), GO_DC_MAGIC);
-  if (NewDC == NULL)
-  {
-    return  NULL;
-  }
-  if (Driver != NULL)
-  {
-    NewDC->DriverName = ExAllocatePool(PagedPool, (wcslen(Driver) + 1) * sizeof(WCHAR));
-    wcscpy(NewDC->DriverName, Driver);
-  }
-  
-  return  NewDC;
+  	PDC  NewDC;
+  	HDC  hDC;
+
+  	hDC = (HDC) GDIOBJ_AllocObj(sizeof(DC), GO_DC_MAGIC);
+  	if (hDC == NULL)
+  	{
+  	  return  NULL;
+  	}
+
+	NewDC = (PDC) GDIOBJ_LockObj( hDC, GO_DC_MAGIC );
+
+  	if (Driver != NULL)
+  	{
+  	  NewDC->DriverName = ExAllocatePool(PagedPool, (wcslen(Driver) + 1) * sizeof(WCHAR));
+  	  wcscpy(NewDC->DriverName, Driver);
+  	}
+
+	GDIOBJ_UnlockObj( hDC, GO_DC_MAGIC );
+  	return  hDC;
 }
 
-PDC  DC_FindOpenDC(LPCWSTR  Driver)
+HDC  DC_FindOpenDC(LPCWSTR  Driver)
 {
   return NULL;
 }
 
-void  DC_InitDC(PDC  DCToInit)
+void  DC_InitDC(HDC  DCHandle)
 {
-  HDC  DCHandle;
-  
-  DCHandle = DC_PtrToHandle(DCToInit);
 //  W32kRealizeDefaultPalette(DCHandle);
-  W32kSetTextColor(DCHandle, DCToInit->w.textColor);
-  W32kSetBkColor(DCHandle, DCToInit->w.backgroundColor);
-  W32kSelectObject(DCHandle, DCToInit->w.hPen);
-  W32kSelectObject(DCHandle, DCToInit->w.hBrush);
-  W32kSelectObject(DCHandle, DCToInit->w.hFont);
+  PDC DCToInit;
+  if( (DCToInit = DC_HandleToPtr( DCHandle ) ) ){
+	  W32kSetTextColor(DCHandle, DCToInit->w.textColor);
+	  W32kSetBkColor(DCHandle, DCToInit->w.backgroundColor);
+	  W32kSelectObject(DCHandle, DCToInit->w.hPen);
+	  W32kSelectObject(DCHandle, DCToInit->w.hBrush);
+	  W32kSelectObject(DCHandle, DCToInit->w.hFont);
+  }
+  DPRINT("DC_InitDC: can't get dc for handle %d\n", DCHandle );
 //  CLIPPING_UpdateGCRegion(DCToInit);
 }
 
-void  DC_FreeDC(PDC  DCToFree)
+void  DC_FreeDC(HDC  DCToFree)
 {
-  ExFreePool(DCToFree->DriverName);
-  if (!GDIOBJ_FreeObject((PGDIOBJ)DCToFree, GO_DC_MAGIC))
+  if (!GDIOBJ_FreeObj(DCToFree, GO_DC_MAGIC))
   {
     DPRINT("DC_FreeDC failed\n");
   }
 }
 
+BOOL DC_InternalDeleteDC( PDC DCToDelete )
+{
+	ExFreePool(DCToDelete->DriverName);
+	return TRUE;
+}
+
 HDC  DC_GetNextDC (PDC pDC)
 {
   return pDC->hNext;
@@ -1171,12 +1185,12 @@ void  DC_SetNextDC (PDC pDC, HDC hNextDC)
   pDC->hNext = hNextDC;
 }
 
-void 
+void
 DC_UpdateXforms(PDC  dc)
 {
   XFORM  xformWnd2Vport;
   FLOAT  scaleX, scaleY;
-  
+
   /* Construct a transformation to do the window-to-viewport conversion */
   scaleX = (FLOAT)dc->vportExtX / (FLOAT)dc->wndExtX;
   scaleY = (FLOAT)dc->vportExtY / (FLOAT)dc->wndExtY;
@@ -1186,32 +1200,32 @@ DC_UpdateXforms(PDC  dc)
   xformWnd2Vport.eM22 = scaleY;
   xformWnd2Vport.eDx  = (FLOAT)dc->vportOrgX - scaleX * (FLOAT)dc->wndOrgX;
   xformWnd2Vport.eDy  = (FLOAT)dc->vportOrgY - scaleY * (FLOAT)dc->wndOrgY;
-  
+
   /* Combine with the world transformation */
   W32kCombineTransform(&dc->w.xformWorld2Vport, &dc->w.xformWorld2Wnd, &xformWnd2Vport);
-  
+
   /* Create inverse of world-to-viewport transformation */
   dc->w.vport2WorldValid = DC_InvertXform(&dc->w.xformWorld2Vport, &dc->w.xformVport2World);
 }
 
-BOOL 
-DC_InvertXform(const XFORM *xformSrc, 
+BOOL
+DC_InvertXform(const XFORM *xformSrc,
                XFORM *xformDest)
 {
   FLOAT  determinant;
-  
+
   determinant = xformSrc->eM11*xformSrc->eM22 - xformSrc->eM12*xformSrc->eM21;
   if (determinant > -1e-12 && determinant < 1e-12)
   {
     return  FALSE;
   }
-  
+
   xformDest->eM11 =  xformSrc->eM22 / determinant;
   xformDest->eM12 = -xformSrc->eM12 / determinant;
   xformDest->eM21 = -xformSrc->eM21 / determinant;
   xformDest->eM22 =  xformSrc->eM11 / determinant;
   xformDest->eDx  = -xformSrc->eDx * xformDest->eM11 - xformSrc->eDy * xformDest->eM21;
   xformDest->eDy  = -xformSrc->eDx * xformDest->eM12 - xformSrc->eDy * xformDest->eM22;
-  
+
   return  TRUE;
 }
diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c
index cf441c54aa2..7c839bb47c7 100644
--- a/reactos/subsys/win32k/objects/dib.c
+++ b/reactos/subsys/win32k/objects/dib.c
@@ -7,6 +7,8 @@
 #include "../eng/objects.h"
 #include <ntos/minmax.h>
 
+VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap);
+
 UINT STDCALL W32kSetDIBColorTable(HDC  hDC,
                            UINT  StartIndex,
                            UINT  Entries,
@@ -78,16 +80,17 @@ INT STDCALL W32kSetDIBits(HDC  hDC,
 
 
   // Check parameters
-  if (!(dc = DC_HandleToPtr(hDC))) return 0;
+  if (!(dc = DC_HandleToPtr(hDC)))
+     return 0;
 
-  if (!(bitmap = (BITMAPOBJ *)GDIOBJ_HandleToPtr(hBitmap, GO_BITMAP_MAGIC)))
+  if (!(bitmap = (BITMAPOBJ *)GDIOBJ_LockObj(hBitmap, GO_BITMAP_MAGIC)))
   {
-    // GDI_ReleaseObj(hDC);
+    DC_ReleasePtr(hDC);
     return 0;
   }
 
   // Get RGB values
-  if (ColorUse == DIB_PAL_COLORS) 
+  if (ColorUse == DIB_PAL_COLORS)
     lpRGB = DIB_MapPaletteColors(hDC, bmi);
   else
     lpRGB = &bmi->bmiColors[0];
@@ -132,11 +135,12 @@ INT STDCALL W32kSetDIBits(HDC  hDC,
   EngDeleteSurface(SourceBitmap);
   EngDeleteSurface(DestBitmap);
 
-//  if (ColorUse == DIB_PAL_COLORS) 
+//  if (ColorUse == DIB_PAL_COLORS)
 //    WinFree((LPSTR)lpRGB);
 
 //  GDI_ReleaseObj(hBitmap); unlock?
-//  GDI_ReleaseObj(hDC);
+  GDIOBJ_UnlockObj(hBitmap, GO_BITMAP_MAGIC);
+  DC_ReleasePtr(hDC);
 
   return result;
 }
@@ -182,13 +186,13 @@ INT STDCALL W32kStretchDIBits(HDC  hDC,
                        INT  YDest,
                        INT  DestWidth,
                        INT  DestHeight,
-                       INT  XSrc,       
-                       INT  YSrc,       
-                       INT  SrcWidth,  
-                       INT  SrcHeight, 
+                       INT  XSrc,
+                       INT  YSrc,
+                       INT  SrcWidth,
+                       INT  SrcHeight,
                        CONST VOID  *Bits,
                        CONST BITMAPINFO  *BitsInfo,
-                       UINT  Usage,                 
+                       UINT  Usage,
                        DWORD  ROP)
 {
   UNIMPLEMENTED;
@@ -200,20 +204,20 @@ LONG STDCALL W32kGetBitmapBits(HBITMAP  hBitmap,
 {
   PBITMAPOBJ  bmp;
   LONG  height, ret;
-  
+
   bmp = BITMAPOBJ_HandleToPtr (hBitmap);
-  if (!bmp) 
+  if (!bmp)
   {
     return 0;
   }
-    
+
   /* If the bits vector is null, the function should return the read size */
   if (Bits == NULL)
   {
     return bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight;
   }
 
-  if (Count < 0) 
+  if (Count < 0)
   {
     DPRINT ("(%ld): Negative number of bytes passed???\n", Count);
     Count = -Count;
@@ -221,7 +225,7 @@ LONG STDCALL W32kGetBitmapBits(HBITMAP  hBitmap,
 
   /* Only get entire lines */
   height = Count / bmp->bitmap.bmWidthBytes;
-  if (height > bmp->bitmap.bmHeight) 
+  if (height > bmp->bitmap.bmHeight)
   {
     height = bmp->bitmap.bmHeight;
   }
@@ -237,7 +241,7 @@ LONG STDCALL W32kGetBitmapBits(HBITMAP  hBitmap,
          1 << bmp->bitmap.bmBitsPixel, height );
 #if 0
   /* FIXME: Call DDI CopyBits here if available  */
-  if(bmp->DDBitmap) 
+  if(bmp->DDBitmap)
   {
     DPRINT("Calling device specific BitmapBits\n");
     if(bmp->DDBitmap->funcs->pBitmapBits)
@@ -245,21 +249,21 @@ LONG STDCALL W32kGetBitmapBits(HBITMAP  hBitmap,
       ret = bmp->DDBitmap->funcs->pBitmapBits(hbitmap, bits, count,
                                               DDB_GET);
     }
-    else 
+    else
     {
       ERR_(bitmap)("BitmapBits == NULL??\n");
       ret = 0;
     }
-  } 
-  else 
+  }
+  else
 #endif
   {
-    if(!bmp->bitmap.bmBits) 
+    if(!bmp->bitmap.bmBits)
     {
       DPRINT ("Bitmap is empty\n");
       ret = 0;
-    } 
-    else 
+    }
+    else
     {
       memcpy(Bits, bmp->bitmap.bmBits, Count);
       ret = Count;
@@ -375,6 +379,7 @@ HBITMAP STDCALL W32kCreateDIBSection(HDC hDC,
   if ((dc = DC_HandleToPtr(hDC)))
   {
     hbitmap = DIB_CreateDIBSection(dc, bmi, Usage, Bits, hSection, dwOffset, 0);
+	DC_ReleasePtr( hDC );
   }
 
   if (bDesktopDC)
@@ -393,16 +398,16 @@ HBITMAP DIB_CreateDIBSection(
   DIBSECTION *dib = NULL;
   int *colorMap = NULL;
   int nColorMap;
-  
+
   // Fill BITMAP32 structure with DIB data
   BITMAPINFOHEADER *bi = &bmi->bmiHeader;
   INT effHeight, totalSize;
   BITMAP bm;
-  
+
   DbgPrint("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n",
 	bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount,
 	bi->biSizeImage, bi->biClrUsed, usage == DIB_PAL_COLORS? "PAL" : "RGB");
-  
+
   effHeight = bi->biHeight >= 0 ? bi->biHeight : -bi->biHeight;
   bm.bmType = 0;
   bm.bmWidth = bi->biWidth;
@@ -412,7 +417,7 @@ HBITMAP DIB_CreateDIBSection(
   bm.bmPlanes = bi->biPlanes;
   bm.bmBitsPixel = bi->biBitCount;
   bm.bmBits = NULL;
-  
+
   // Get storage location for DIB bits.  Only use biSizeImage if it's valid and
   // we're dealing with a compressed bitmap.  Otherwise, use width * height.
   totalSize = bi->biSizeImage && bi->biCompression != BI_RGB
@@ -420,13 +425,13 @@ HBITMAP DIB_CreateDIBSection(
 
 /*
   if (section)
-    bm.bmBits = MapViewOfFile(section, FILE_MAP_ALL_ACCESS, 
+    bm.bmBits = MapViewOfFile(section, FILE_MAP_ALL_ACCESS,
 			      0L, offset, totalSize);
   else if (ovr_pitch && offset)
     bm.bmBits = (LPVOID) offset;
   else { */
     offset = 0;
-/*    bm.bmBits = VirtualAlloc(NULL, totalSize, 
+/*    bm.bmBits = VirtualAlloc(NULL, totalSize,
 			     MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); */
 
   bm.bmBits = ExAllocatePool(NonPagedPool, totalSize);
@@ -476,7 +481,7 @@ HBITMAP DIB_CreateDIBSection(
   }
 
   // Create Device Dependent Bitmap and add DIB pointer
-  if (dib) 
+  if (dib)
   {
     res = W32kCreateDIBitmap(dc->hSelf, bi, 0, NULL, bmi, usage);
     if (res)
@@ -500,11 +505,11 @@ HBITMAP DIB_CreateDIBSection(
       else if (!offset)
       VirtualFree(bm.bmBits, 0L, MEM_RELEASE), bm.bmBits = NULL;
     } */
-      
+
     if (colorMap) { ExFreePool(colorMap); colorMap = NULL; }
     if (dib) { ExFreePool(dib); dib = NULL; }
     if (bmp) { bmp = NULL; }
-    if (res) { GDIOBJ_FreeObject(res, GO_BITMAP_MAGIC); res = 0; }
+    if (res) { GDIOBJ_FreeObj(res, GO_BITMAP_MAGIC); res = 0; }
   }
 
   // Install fault handler, if possible
@@ -525,6 +530,9 @@ HBITMAP DIB_CreateDIBSection(
     }
   } */
 
+  if( bmp )
+	BITMAPOBJ_ReleasePtr(res);
+
   // Return BITMAP handle and storage location
   if (bm.bmBits && bits) *bits = bm.bmBits;
   return res;
@@ -540,7 +548,7 @@ HBITMAP DIB_CreateDIBSection(
 int DIB_GetDIBWidthBytes(int  width, int  depth)
 {
   int words;
-  
+
   switch(depth)
   {
     case 1:  words = (width + 31) / 32; break;
@@ -549,7 +557,7 @@ int DIB_GetDIBWidthBytes(int  width, int  depth)
     case 15:
     case 16: words = (width + 1) / 2; break;
     case 24: words = (width * 3 + 3)/4; break;
-      
+
     default:
       DPRINT("(%d): Unsupported depth\n", depth );
       /* fall through */
@@ -642,7 +650,7 @@ PBITMAPOBJ DIBtoDDB(HGLOBAL hPackedDIB, HDC hdc) // FIXME: This should be remove
   // GlobalUnlock(hPackedDIB);
 
   // Retrieve the internal Pixmap from the DDB
-  pBmp = (BITMAPOBJ *)GDIOBJ_HandleToPtr(hBmp, GO_BITMAP_MAGIC);
+  pBmp = (BITMAPOBJ *)GDIOBJ_LockObj(hBmp, GO_BITMAP_MAGIC);
 
   return pBmp;
 }
diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c
index 721bdb7e22a..df72e91da22 100644
--- a/reactos/subsys/win32k/objects/fillshap.c
+++ b/reactos/subsys/win32k/objects/fillshap.c
@@ -81,15 +81,23 @@ W32kRectangle(HDC  hDC,
   SURFOBJ	*SurfObj = (SURFOBJ*)AccessUserObject(dc->Surface);
   PBRUSHOBJ	BrushObj;
   BOOL ret;
-  PRECTL	RectBounds = GDIOBJ_HandleToPtr(dc->w.hGCClipRgn, GO_REGION_MAGIC);
+  PRECTL	RectBounds;
+  PENOBJ * pen;
 
-  if(!dc) return FALSE;
+  if(!dc)
+   return FALSE;
+
+  RectBounds = GDIOBJ_LockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC);
+  //ei not yet implemented ASSERT(RectBounds);
 
   if(PATH_IsPathOpen(dc->w.path)) {
     ret = PATH_Rectangle(hDC, LeftRect, TopRect, RightRect, BottomRect);
   } else {
     // Draw the rectangle with the current pen
-    BrushObj = (PBRUSHOBJ)PenToBrushObj(dc, GDIOBJ_HandleToPtr(dc->w.hPen, GO_PEN_MAGIC));
+	pen = (PENOBJ*) GDIOBJ_LockObj(dc->w.hPen, GO_PEN_MAGIC);
+	ASSERT(pen);
+	BrushObj = (PBRUSHOBJ)PenToBrushObj(dc, pen);
+	GDIOBJ_UnlockObj( dc->w.hPen, GO_PEN_MAGIC );
 
     ret = EngLineTo(SurfObj,
                     NULL, // ClipObj,
@@ -123,7 +131,8 @@ W32kRectangle(HDC  hDC,
   }
 
 // FIXME: Move current position in DC?
-
+  GDIOBJ_UnlockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC);
+  DC_ReleasePtr( hDC );
   return TRUE;
 }
 
@@ -131,8 +140,8 @@ BOOL
 STDCALL
 W32kRoundRect(HDC  hDC,
                     int  LeftRect,
-                    int  TopRect,  
-                    int  RightRect, 
+                    int  TopRect,
+                    int  RightRect,
                     int  BottomRect,
                     int  Width,
                     int  Height)
diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c
index ccc1f128380..10f818b55bc 100644
--- a/reactos/subsys/win32k/objects/gdiobj.c
+++ b/reactos/subsys/win32k/objects/gdiobj.c
@@ -1,7 +1,7 @@
 /*
  * GDIOBJ.C - GDI object manipulation routines
  *
- * $Id: gdiobj.c,v 1.11 2001/11/02 06:10:11 rex Exp $
+ * $Id: gdiobj.c,v 1.12 2002/07/13 21:37:27 ei Exp $
  *
  */
 
@@ -12,6 +12,10 @@
 #include <win32k/brush.h>
 #include <win32k/pen.h>
 #include <win32k/text.h>
+#include <win32k/dc.h>
+#include <win32k/bitmaps.h>
+//#define NDEBUG
+#include <win32k/debug1.h>
 
 //  GDI stock objects
 
@@ -100,21 +104,25 @@ HBITMAP hPseudoStockBitmap; /* 1x1 bitmap for memory DCs */
 
 static PGDI_HANDLE_TABLE  HandleTable = 0;
 static FAST_MUTEX  HandleTableMutex;
+static FAST_MUTEX  RefCountHandling;
+
+#define GDI_HANDLE_NUMBER  0x4000
 
 static PGDI_HANDLE_TABLE
 GDIOBJ_iAllocHandleTable (WORD Size)
 {
   PGDI_HANDLE_TABLE  handleTable;
 
-//  ExAcquireFastMutexUnsafe (&HandleTableMutex);
-  handleTable = ExAllocatePool(PagedPool, 
-                               sizeof (GDI_HANDLE_TABLE) + 
+  ExAcquireFastMutexUnsafe (&HandleTableMutex);
+  handleTable = ExAllocatePool(PagedPool,
+                               sizeof (GDI_HANDLE_TABLE) +
                                  sizeof (GDI_HANDLE_ENTRY) * Size);
-  memset (handleTable, 
-          0, 
+  ASSERT( handleTable );
+  memset (handleTable,
+          0,
           sizeof (GDI_HANDLE_TABLE) + sizeof (GDI_HANDLE_ENTRY) * Size);
   handleTable->wTableSize = Size;
-//  ExReleaseFastMutexUnsafe (&HandleTableMutex);
+  ExReleaseFastMutexUnsafe (&HandleTableMutex);
 
   return  handleTable;
 }
@@ -122,7 +130,10 @@ GDIOBJ_iAllocHandleTable (WORD Size)
 static PGDI_HANDLE_ENTRY
 GDIOBJ_iGetHandleEntryForIndex (WORD TableIndex)
 {
-  return  &HandleTable->Handles [TableIndex];
+  //DPRINT("GDIOBJ_iGetHandleEntryForIndex: TableIndex: %d,\n handle: %x, ptr: %x\n", TableIndex, HandleTable->Handles [TableIndex], &(HandleTable->Handles [TableIndex])  );
+  //DPRINT("GIG: HandleTable: %x, Handles: %x, \n TableIndex: %x, pt: %x\n", HandleTable,  HandleTable->Handles, TableIndex, ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex));
+  DPRINT("GIG: Hndl: %x, mag: %x\n", ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex), ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex)->wMagic);
+  return  ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex);
 }
 
 static WORD
@@ -130,7 +141,7 @@ GDIOBJ_iGetNextOpenHandleIndex (void)
 {
   WORD  tableIndex;
 
-//  ExAcquireFastMutexUnsafe (&HandleTableMutex);
+  ExAcquireFastMutexUnsafe (&HandleTableMutex);
   for (tableIndex = 1; tableIndex < HandleTable->wTableSize; tableIndex++)
   {
     if (HandleTable->Handles [tableIndex].wMagic == 0)
@@ -139,12 +150,156 @@ GDIOBJ_iGetNextOpenHandleIndex (void)
       break;
     }
   }
-//  ExReleaseFastMutexUnsafe (&HandleTableMutex);
-  
+  ExReleaseFastMutexUnsafe (&HandleTableMutex);
+
   return  (tableIndex < HandleTable->wTableSize) ? tableIndex : 0;
 }
 
-PGDIOBJ  GDIOBJ_AllocObject(WORD Size, WORD Magic)
+/*-----------------7/12/2002 11:38AM----------------
+ * Allocate memory for GDI object and return handle to it
+ * Use GDIOBJ_Lock to obtain pointer to the new object.
+ * --------------------------------------------------*/
+HGDIOBJ GDIOBJ_AllocObj(WORD Size, WORD Magic)
+{
+  	PGDIOBJHDR  newObject;
+  	PGDI_HANDLE_ENTRY  handleEntry;
+
+	DPRINT("GDIOBJ_AllocObj: size: %d, magic: %x\n", Size, Magic);
+  	newObject = ExAllocatePool (PagedPool, Size + sizeof (GDIOBJHDR));
+  	if (newObject == NULL)
+  	{
+  	  return  NULL;
+  	}
+  	RtlZeroMemory (newObject, Size + sizeof (GDIOBJHDR));
+
+  	newObject->wTableIndex = GDIOBJ_iGetNextOpenHandleIndex ();
+	newObject->dwCount = 0;
+  	handleEntry = GDIOBJ_iGetHandleEntryForIndex (newObject->wTableIndex);
+  	handleEntry->wMagic = Magic;
+  	handleEntry->hProcessId = PsGetCurrentProcessId ();
+  	handleEntry->pObject = newObject;
+	DPRINT("GDIOBJ_AllocObj: object handle %d\n", newObject->wTableIndex );
+  	return  (HGDIOBJ) newObject->wTableIndex;
+}
+
+BOOL  GDIOBJ_FreeObj(HGDIOBJ hObj, WORD Magic)
+{
+  	PGDIOBJHDR  objectHeader;
+  	PGDI_HANDLE_ENTRY  handleEntry;
+	PGDIOBJ 	Obj;
+	BOOL 	bRet = TRUE;
+
+  	handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD)hObj & 0xffff);
+	DPRINT("GDIOBJ_FreeObj: hObj: %d, magic: %x, handleEntry: %x\n", hObj, Magic, handleEntry );
+  	if (handleEntry == 0 || (handleEntry->wMagic != Magic && handleEntry->wMagic != GO_MAGIC_DONTCARE )
+	     || handleEntry->hProcessId != PsGetCurrentProcessId ())
+  	  return  FALSE;
+
+	objectHeader = (PGDIOBJHDR) handleEntry->pObject;
+	ASSERT(objectHeader);
+
+  	// check that the reference count is zero. if not then set flag
+  	// and delete object when releaseobj is called
+  	ExAcquireFastMutex(&RefCountHandling);
+  	if( ( objectHeader->dwCount & ~0x80000000 ) > 0 ){
+  		objectHeader->dwCount |= 0x80000000;
+		DPRINT("GDIOBJ_FreeObj: delayed object deletion");
+  		ExReleaseFastMutex(&RefCountHandling);
+		return TRUE;
+  	}
+  	ExReleaseFastMutex(&RefCountHandling);
+
+	//allow object to delete internal data
+	Obj = (PGDIOBJ)((PCHAR)handleEntry->pObject + sizeof(GDIOBJHDR));
+	switch( handleEntry->wMagic ){
+ 		case GO_REGION_MAGIC:
+
+ 		case GO_PEN_MAGIC:
+ 		case GO_PALETTE_MAGIC:
+ 		case GO_BITMAP_MAGIC:
+			bRet = Bitmap_InternalDelete( (PBITMAPOBJ) Obj );
+			break;
+ 		case GO_DC_MAGIC:
+			bRet = DC_InternalDeleteDC( (PDC) Obj );
+			break;
+ 		case GO_DISABLED_DC_MAGIC:
+ 		case GO_META_DC_MAGIC:
+ 		case GO_METAFILE_MAGIC:
+ 		case GO_METAFILE_DC_MAGIC:
+ 		case GO_ENHMETAFILE_MAGIC:
+ 		case GO_ENHMETAFILE_DC_MAGIC:
+
+ 		case GO_BRUSH_MAGIC:
+ 		case GO_FONT_MAGIC:
+			break;
+	}
+  	handleEntry->hProcessId = 0;
+	ExFreePool (handleEntry->pObject);
+	handleEntry->pObject = 0;
+  	// (RJJ) set wMagic last to avoid race condition
+  	handleEntry->wMagic = 0;
+
+
+  	return  TRUE;
+}
+
+PGDIOBJ GDIOBJ_LockObj( HGDIOBJ hObj, WORD Magic )
+{
+  	PGDI_HANDLE_ENTRY handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD) hObj & 0xffff);
+  	PGDIOBJHDR  objectHeader;
+
+	DPRINT("GDIOBJ_LockObj: hObj: %d, magic: %x, \n handleEntry: %x, mag %x\n", hObj, Magic, handleEntry, handleEntry->wMagic);
+  	if (handleEntry == 0 || (handleEntry->wMagic != Magic && handleEntry->wMagic != GO_MAGIC_DONTCARE )
+	     || handleEntry->hProcessId != PsGetCurrentProcessId () )
+  	  return  NULL;
+
+	objectHeader = (PGDIOBJHDR) handleEntry->pObject;
+	ASSERT(objectHeader);
+
+	ExAcquireFastMutex(&RefCountHandling);
+	objectHeader->dwCount++;
+	ExReleaseFastMutex(&RefCountHandling);
+
+	DPRINT("GDIOBJ_LockObj: PGDIOBJ %x\n",  ((PCHAR)objectHeader + sizeof(GDIOBJHDR)) );
+	return (PGDIOBJ)((PCHAR)objectHeader + sizeof(GDIOBJHDR));
+}
+
+BOOL GDIOBJ_UnlockObj( HGDIOBJ hObj, WORD Magic )
+{
+  	PGDI_HANDLE_ENTRY handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD) hObj & 0xffff);
+  	PGDIOBJHDR  objectHeader;
+
+	DPRINT("GDIOBJ_UnlockObj: hObj: %d, magic: %x, \n handleEntry: %x\n", hObj, Magic, handleEntry);
+  	if (handleEntry == 0 || (handleEntry->wMagic != Magic && handleEntry->wMagic != GO_MAGIC_DONTCARE )
+	      || handleEntry->hProcessId != PsGetCurrentProcessId ())
+  	  return  FALSE;
+
+	objectHeader = (PGDIOBJHDR) handleEntry->pObject;
+	ASSERT(objectHeader);
+
+  	ExAcquireFastMutex(&RefCountHandling);
+	if( ( objectHeader->dwCount & ~0x80000000 ) == 0 ){
+		ExReleaseFastMutex(&RefCountHandling);
+		DPRINT( "GDIOBJ_UnLockObj: unlock object that is not locked\n" );
+		return FALSE;
+	}
+
+	objectHeader = (PGDIOBJHDR) handleEntry->pObject;
+	ASSERT(objectHeader);
+	objectHeader->dwCount--;
+
+	if( objectHeader->dwCount  == 0x80000000 ){
+		//delayed object release
+		ExReleaseFastMutex(&RefCountHandling);
+		DPRINT("GDIOBJ_UnlockObj: delayed delete\n");
+		return GDIOBJ_FreeObj( hObj, Magic );
+	}
+	ExReleaseFastMutex(&RefCountHandling);
+	return TRUE;
+}
+
+/*
+PGDIOBJ GDIOBJ_AllocObject(WORD Size, WORD Magic)
 {
   PGDIOBJHDR  newObject;
   PGDI_HANDLE_ENTRY  handleEntry;
@@ -159,7 +314,7 @@ PGDIOBJ  GDIOBJ_AllocObject(WORD Size, WORD Magic)
   newObject->wTableIndex = GDIOBJ_iGetNextOpenHandleIndex ();
   handleEntry = GDIOBJ_iGetHandleEntryForIndex (newObject->wTableIndex);
   handleEntry->wMagic = Magic;
-  handleEntry->hProcessId = 0; // PsGetCurrentProcessId ();
+  handleEntry->hProcessId = PsGetCurrentProcessId ();
   handleEntry->pObject = newObject;
 
   return  (PGDIOBJ)(((PCHAR) newObject) + sizeof (GDIOBJHDR));
@@ -187,16 +342,16 @@ HGDIOBJ  GDIOBJ_PtrToHandle (PGDIOBJ Obj, WORD Magic)
 {
   PGDIOBJHDR  objectHeader;
   PGDI_HANDLE_ENTRY  handleEntry;
-  
-  if (Obj == NULL) 
+
+  if (Obj == NULL)
     return  NULL;
   objectHeader = (PGDIOBJHDR) (((PCHAR)Obj) - sizeof (GDIOBJHDR));
   handleEntry = GDIOBJ_iGetHandleEntryForIndex (objectHeader->wTableIndex);
-  if (handleEntry == 0 || 
+  if (handleEntry == 0 ||
       handleEntry->wMagic != Magic ||
-      handleEntry->hProcessId != 0 /* PsGetCurrentProcess () */)
+      handleEntry->hProcessId != PsGetCurrentProcessId () )
     return  NULL;
-  
+
   return  (HGDIOBJ) objectHeader->wTableIndex;
 }
 
@@ -208,13 +363,14 @@ PGDIOBJ  GDIOBJ_HandleToPtr (HGDIOBJ ObjectHandle, WORD Magic)
     return NULL;
 
   handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD)ObjectHandle & 0xffff);
-  if (handleEntry == 0 || 
+  if (handleEntry == 0 ||
       (Magic != GO_MAGIC_DONTCARE && handleEntry->wMagic != Magic) ||
-      handleEntry->hProcessId != 0 /* PsGetCurrentProcess () */)
+      handleEntry->hProcessId != PsGetCurrentProcessId () )
     return  NULL;
 
   return  (PGDIOBJ) (((PCHAR)handleEntry->pObject) + sizeof (GDIOBJHDR));
 }
+*/
 
 WORD  GDIOBJ_GetHandleMagic (HGDIOBJ ObjectHandle)
 {
@@ -224,8 +380,8 @@ WORD  GDIOBJ_GetHandleMagic (HGDIOBJ ObjectHandle)
     return  0;
 
   handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD)ObjectHandle & 0xffff);
-  if (handleEntry == 0 || 
-      handleEntry->hProcessId != 0 /* PsGetCurrentProcess () */)
+  if (handleEntry == 0 ||
+      handleEntry->hProcessId != PsGetCurrentProcessId ())
     return  0;
 
   return  handleEntry->wMagic;
@@ -234,9 +390,13 @@ WORD  GDIOBJ_GetHandleMagic (HGDIOBJ ObjectHandle)
 VOID
 InitGdiObjectHandleTable (void)
 {
-  DbgPrint ("InitGdiObjectHandleTable\n");
-//  ExInitializeFastMutex (&HandleTableMutex);
-  HandleTable = GDIOBJ_iAllocHandleTable (0x1000);
+  DPRINT ("InitGdiObjectHandleTable\n");
+  ExInitializeFastMutex (&HandleTableMutex);
+  ExInitializeFastMutex (&RefCountHandling);
+  //per http://www.wd-mag.com/articles/1999/9902/9902b/9902b.htm?topic=articles
+  //gdi handle table can hold 0x4000 handles
+  HandleTable = GDIOBJ_iAllocHandleTable (GDI_HANDLE_NUMBER);
+  DPRINT("HandleTable: %x\n", HandleTable );
 }
 
 VOID CreateStockObjects(void)
@@ -276,3 +436,50 @@ HGDIOBJ STDCALL  W32kGetStockObject(INT  Object)
 
   return StockObjects[Object]; // FIXME........
 }
+
+BOOL STDCALL  W32kDeleteObject(HGDIOBJ hObject)
+{
+/* ei: Now this is handled in gdiobj.c
+  PGDIOBJ  Obj;
+  PGDIOBJHDR  ObjHdr;
+  WORD  magic;
+
+  magic = GDIOBJ_GetHandleMagic (hObject);
+  Obj = GDIOBJ_HandleToPtr( hObject, GO_MAGIC_DONTCARE );
+  if( !Obj )
+    return FALSE;
+  ObjHdr = (PGDIOBJHDR)(((PCHAR)Obj) - sizeof (GDIOBJHDR));
+  switch( magic )
+  {
+    case GO_BITMAP_MAGIC: {
+      DPRINT( "Deleting bitmap\n" );
+      ExFreePool( ((PBITMAPOBJ)Obj)->bitmap.bmBits );
+      BITMAPOBJ_FreeBitmap( Obj );
+      break;
+    }
+    default: {
+      DPRINT( "W32kDeleteObject: Deleting object of unknown type %x\n", magic );
+      return FALSE;
+    }
+  }
+  return TRUE;
+ */
+  return GDIOBJ_FreeObj( hObject, GO_MAGIC_DONTCARE );
+}
+
+// dump all the objects for process. if process == 0 dump all the objects
+VOID STDCALL W32kDumpGdiObjects( INT Process )
+{
+	DWORD i;
+  	PGDI_HANDLE_ENTRY handleEntry;
+  	PGDIOBJHDR  objectHeader;
+
+	for( i=1; i < GDI_HANDLE_NUMBER; i++ ){
+		handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD) i & 0xffff);
+		if( handleEntry && handleEntry->wMagic != 0 ){
+			objectHeader = (PGDIOBJHDR) handleEntry->pObject;
+			DPRINT("\nHandle: %d, magic: %x \n process: %d, locks: %d", i, handleEntry->wMagic, handleEntry->hProcessId, objectHeader->dwCount);
+		}
+	}
+
+}
diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c
index 36e85124310..e4c8cf72f7c 100644
--- a/reactos/subsys/win32k/objects/line.c
+++ b/reactos/subsys/win32k/objects/line.c
@@ -28,11 +28,11 @@ STDCALL
 W32kArc(HDC  hDC,
               int  LeftRect,
               int  TopRect,
-              int  RightRect, 
+              int  RightRect,
               int  BottomRect,
               int  XStartArc,
               int  YStartArc,
-              int  XEndArc,  
+              int  XEndArc,
               int  YEndArc)
 {
   DC *dc = DC_HandleToPtr(hDC);
@@ -42,6 +42,7 @@ W32kArc(HDC  hDC,
     return PATH_Arc(hDC, LeftRect, TopRect, RightRect, BottomRect,
                     XStartArc, YStartArc, XEndArc, YEndArc);
 
+  DC_ReleasePtr( hDC );
 //   EngArc(dc, LeftRect, TopRect, RightRect, BottomRect, UNIMPLEMENTED
 //          XStartArc, YStartArc, XEndArc, YEndArc);
 }
@@ -74,7 +75,7 @@ W32kArcTo(HDC  hDC,
   {
     W32kMoveToEx(hDC, XRadial2, YRadial2, NULL);
   }
-
+  DC_ReleasePtr( hDC );
   return result;
 }
 
@@ -84,7 +85,7 @@ W32kGetArcDirection(HDC  hDC)
 {
   PDC dc;
   int ret;
-  
+
   dc = DC_HandleToPtr (hDC);
   if (!dc)
   {
@@ -92,7 +93,7 @@ W32kGetArcDirection(HDC  hDC)
   }
 
   ret = dc->w.ArcDirection;
-  
+  DC_ReleasePtr( hDC );
   return ret;
 }
 
@@ -105,24 +106,35 @@ W32kLineTo(HDC  hDC,
   DC		*dc = DC_HandleToPtr(hDC);
   SURFOBJ	*SurfObj = (SURFOBJ*)AccessUserObject(dc->Surface);
   BOOL ret;
+  PPENOBJ   pen;
+  PRGNDATA  reg;
 
   if(!dc) return FALSE;
 
   if(PATH_IsPathOpen(dc->w.path)) {
     ret = PATH_LineTo(hDC, XEnd, YEnd);
   } else {
+  	pen = (PPENOBJ) GDIOBJ_LockObj(dc->w.hPen, GO_PEN_MAGIC);
+	reg = (PRGNDATA)GDIOBJ_LockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC);
+
+	ASSERT( pen );
+	// not yet implemented ASSERT( reg );
+
     ret = EngLineTo(SurfObj,
                     NULL, // ClipObj
-                    PenToBrushObj(dc, GDIOBJ_HandleToPtr(dc->w.hPen, GO_PEN_MAGIC)),
+                    PenToBrushObj(dc, pen),
                     dc->w.CursPosX, dc->w.CursPosY, XEnd, YEnd,
-                    GDIOBJ_HandleToPtr(dc->w.hGCClipRgn, GO_REGION_MAGIC), // Bounding rectangle
+                    reg, // Bounding rectangle
                     dc->w.ROPmode); // MIX
+
+	GDIOBJ_UnlockObj( dc->w.hGCClipRgn, GO_REGION_MAGIC );
+	GDIOBJ_UnlockObj( dc->w.hPen, GO_PEN_MAGIC);
   }
   if(ret) {
     dc->w.CursPosX = XEnd;
     dc->w.CursPosY = YEnd;
   }
-
+  DC_ReleasePtr( hDC );
   return ret;
 }
 
@@ -144,9 +156,11 @@ W32kMoveToEx(HDC  hDC,
   dc->w.CursPosX = X;
   dc->w.CursPosY = Y;
 
-  if(PATH_IsPathOpen(dc->w.path))
+  if(PATH_IsPathOpen(dc->w.path)){
+  	DC_ReleasePtr( hDC );
     return PATH_MoveTo(hDC);
-
+  }
+  DC_ReleasePtr( hDC );
   return FALSE;
 }
 
@@ -159,8 +173,10 @@ W32kPolyBezier(HDC  hDC,
   DC *dc = DC_HandleToPtr(hDC);
   if(!dc) return FALSE;
 
-  if(PATH_IsPathOpen(dc->w.path))
+  if(PATH_IsPathOpen(dc->w.path)){
+	DC_ReleasePtr( hDC );
     return PATH_PolyBezier(hDC, pt, Count);
+  }
 
   /* We'll convert it into line segments and draw them using Polyline */
   {
@@ -173,6 +189,7 @@ W32kPolyBezier(HDC  hDC,
     DbgPrint("Pts = %p, no = %d\n", Pts, nOut);
     ret = W32kPolyline(dc->hSelf, Pts, nOut);
     ExFreePool(Pts);
+	DC_ReleasePtr( hDC );
     return ret;
   }
 }
@@ -204,6 +221,7 @@ W32kPolyBezierTo(HDC  hDC,
     dc->w.CursPosX = pt[Count-1].x;
     dc->w.CursPosY = pt[Count-1].y;
   }
+  DC_ReleasePtr( hDC );
   return ret;
 }
 
@@ -255,6 +273,7 @@ W32kPolylineTo(HDC  hDC,
     dc->w.CursPosX = pt[Count-1].x;
     dc->w.CursPosY = pt[Count-1].y;
   }
+  DC_ReleasePtr( hDC );
   return ret;
 }
 
@@ -284,11 +303,12 @@ W32kSetArcDirection(HDC  hDC,
   if (ArcDirection != AD_COUNTERCLOCKWISE && ArcDirection != AD_CLOCKWISE)
   {
 //    SetLastError(ERROR_INVALID_PARAMETER);
+	DC_ReleasePtr( hDC );
     return 0;
   }
 
   nOldDirection = dc->w.ArcDirection;
   dc->w.ArcDirection = ArcDirection;
-
+  DC_ReleasePtr( hDC );
   return nOldDirection;
 }
diff --git a/reactos/subsys/win32k/objects/objconv.c b/reactos/subsys/win32k/objects/objconv.c
index bf1914f20c6..9dbbe03e076 100644
--- a/reactos/subsys/win32k/objects/objconv.c
+++ b/reactos/subsys/win32k/objects/objconv.c
@@ -13,6 +13,10 @@
 #include <win32k/pen.h>
 #include "../eng/objects.h"
 
+//#define NDEBUG
+#include <win32k/debug1.h>
+
+
 PBRUSHOBJ PenToBrushObj(PDC dc, PENOBJ *pen)
 {
   BRUSHOBJ *BrushObj;
@@ -26,17 +30,21 @@ PBRUSHOBJ PenToBrushObj(PDC dc, PENOBJ *pen)
 
 VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap)
 {
-  if(Bitmap->dib)
-  {
-    SurfGDI->BitsPerPixel = Bitmap->dib->dsBm.bmBitsPixel;
-    SurfObj->lDelta       = Bitmap->dib->dsBm.bmWidthBytes;
-    SurfObj->pvBits       = Bitmap->dib->dsBm.bmBits;
-    SurfObj->cjBits       = Bitmap->dib->dsBm.bmHeight * Bitmap->dib->dsBm.bmWidthBytes;
-  } else {
-    SurfGDI->BitsPerPixel = Bitmap->bitmap.bmBitsPixel;
-    SurfObj->lDelta	  = Bitmap->bitmap.bmWidthBytes;
-    SurfObj->pvBits	  = Bitmap->bitmap.bmBits;
-    SurfObj->cjBits       = Bitmap->bitmap.bmHeight * Bitmap->bitmap.bmWidthBytes;
+  ASSERT( SurfGDI );
+  if( Bitmap ){
+  	if(Bitmap->dib)
+  	{
+  	  SurfGDI->BitsPerPixel = Bitmap->dib->dsBm.bmBitsPixel;
+  	  SurfObj->lDelta       = Bitmap->dib->dsBm.bmWidthBytes;
+  	  SurfObj->pvBits       = Bitmap->dib->dsBm.bmBits;
+  	  SurfObj->cjBits       = Bitmap->dib->dsBm.bmHeight * Bitmap->dib->dsBm.bmWidthBytes;
+  	} else {
+  	  SurfGDI->BitsPerPixel = Bitmap->bitmap.bmBitsPixel;
+  	  SurfObj->lDelta	  = Bitmap->bitmap.bmWidthBytes;
+  	  SurfObj->pvBits	  = Bitmap->bitmap.bmBits;
+  	  SurfObj->cjBits       = Bitmap->bitmap.bmHeight * Bitmap->bitmap.bmWidthBytes;
+  	}
+	SurfObj->sizlBitmap	= Bitmap->size; // FIXME: alloc memory for our own struct?
   }
 
   SurfObj->dhsurf	= NULL;
@@ -44,7 +52,6 @@ VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap
   SurfObj->dhpdev	= NULL;
   SurfObj->hdev		= NULL;
   SurfObj->pvScan0	= SurfObj->pvBits; // start of bitmap
-  SurfObj->sizlBitmap	= Bitmap->size; // FIXME: alloc memory for our own struct?
   SurfObj->iUniq	 = 0; // not sure..
   SurfObj->iBitmapFormat = BitmapFormat(SurfGDI->BitsPerPixel, BI_RGB);
   SurfObj->iType	 = STYPE_BITMAP;
diff --git a/reactos/subsys/win32k/objects/path.c b/reactos/subsys/win32k/objects/path.c
index 9145de40f3c..c61ec65fd36 100644
--- a/reactos/subsys/win32k/objects/path.c
+++ b/reactos/subsys/win32k/objects/path.c
@@ -203,11 +203,11 @@ BOOL PATH_AssignGdiPath(GdiPath *pPathDest, const GdiPath *pPathSrc)
 BOOL PATH_MoveTo(HDC hdc)
 {
   GdiPath *pPath;
-   
+
   /* Get pointer to path */
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     /* FIXME: Do we have to call SetLastError? */
@@ -230,11 +230,11 @@ BOOL PATH_LineTo(HDC hdc, INT x, INT y)
 {
   GdiPath *pPath;
   POINT point, pointCurPos;
-   
+
   /* Get pointer to path */
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
@@ -244,7 +244,7 @@ BOOL PATH_LineTo(HDC hdc, INT x, INT y)
   point.y=y;
   if(!W32kLPtoDP(hdc, &point, 1))
     return FALSE;
-   
+
   /* Add a PT_MOVETO if necessary */
   if(pPath->newStroke)
   {
@@ -255,7 +255,7 @@ BOOL PATH_LineTo(HDC hdc, INT x, INT y)
     if(!PATH_AddEntry(pPath, &pointCurPos, PT_MOVETO))
       return FALSE;
   }
-   
+
   /* Add a PT_LINETO entry */
   return PATH_AddEntry(pPath, &point, PT_LINETO);
 }
@@ -274,7 +274,7 @@ BOOL PATH_Rectangle(HDC hdc, INT x1, INT y1, INT x2, INT y2)
   /* Get pointer to path */
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
@@ -286,7 +286,7 @@ BOOL PATH_Rectangle(HDC hdc, INT x1, INT y1, INT x2, INT y2)
   corners[1].y=y2;
   if(!W32kLPtoDP(hdc, corners, 2))
     return FALSE;
-   
+
   /* Make sure first corner is top left and second corner is bottom right */
   if(corners[0].x>corners[1].x)
   {
@@ -300,7 +300,7 @@ BOOL PATH_Rectangle(HDC hdc, INT x1, INT y1, INT x2, INT y2)
     corners[0].y=corners[1].y;
     corners[1].y=temp;
   }
-   
+
   /* In GM_COMPATIBLE, don't include bottom and right edges */
   if(W32kGetGraphicsMode(hdc)==GM_COMPATIBLE)
   {
@@ -342,7 +342,7 @@ BOOL PATH_Rectangle(HDC hdc, INT x1, INT y1, INT x2, INT y2)
 }
 
 /* PATH_Ellipse
- * 
+ *
  * Should be called when a call to Ellipse is performed on a DC that has
  * an open path. This adds four Bezier splines representing the ellipse
  * to the path. Returns TRUE if successful, else FALSE.
@@ -374,27 +374,33 @@ BOOL PATH_Arc(HDC hdc, INT x1, INT y1, INT x2, INT y2,
 
   /* FIXME: This function should check for all possible error returns */
   /* FIXME: Do we have to respect newStroke? */
-   
+
   /* Get pointer to DC */
   pDC=DC_HandleToPtr(hdc);
   if(pDC==NULL)
     return FALSE;
 
   /* Get pointer to path */
-  if(!PATH_GetPathFromHDC(hdc, &pPath))
+  if(!PATH_GetPathFromHDC(hdc, &pPath)){
+	DC_ReleasePtr( hdc );
     return FALSE;
-   
+  }
+
   /* Check that path is open */
-  if(pPath->state!=PATH_Open)
+  if(pPath->state!=PATH_Open){
+	DC_ReleasePtr( hdc );
     return FALSE;
+  }
 
   /* FIXME: Do we have to close the current figure? */
-   
+
   /* Check for zero height / width */
   /* FIXME: Only in GM_COMPATIBLE? */
-  if(x1==x2 || y1==y2)
+  if(x1==x2 || y1==y2){
+	DC_ReleasePtr( hdc );
     return TRUE;
-   
+  }
+
   /* Convert points to device coordinates */
   corners[0].x=(FLOAT)x1;
   corners[0].y=(FLOAT)y1;
@@ -453,7 +459,7 @@ BOOL PATH_Arc(HDC hdc, INT x1, INT y1, INT x2, INT y2,
     corners[1].x--;
     corners[1].y--;
   }
-   
+
   /* Add the arc to the path with one Bezier spline per quadrant that the
    * arc spans */
   start=TRUE;
@@ -494,6 +500,7 @@ BOOL PATH_Arc(HDC hdc, INT x1, INT y1, INT x2, INT y2,
     start=FALSE;
   }  while(!end);
 
+  DC_ReleasePtr( hdc );
   return TRUE;
 }
 
@@ -505,7 +512,7 @@ BOOL PATH_PolyBezierTo(HDC hdc, const POINT *pts, DWORD cbPoints)
 
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
@@ -529,7 +536,7 @@ BOOL PATH_PolyBezierTo(HDC hdc, const POINT *pts, DWORD cbPoints)
   }
   return TRUE;
 }
-   
+
 BOOL PATH_PolyBezier(HDC hdc, const POINT *pts, DWORD cbPoints)
 {
   GdiPath *pPath;
@@ -538,7 +545,7 @@ BOOL PATH_PolyBezier(HDC hdc, const POINT *pts, DWORD cbPoints)
 
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
    /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
@@ -560,7 +567,7 @@ BOOL PATH_Polyline(HDC hdc, const POINT *pts, DWORD cbPoints)
 
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
@@ -573,7 +580,7 @@ BOOL PATH_Polyline(HDC hdc, const POINT *pts, DWORD cbPoints)
   }
   return TRUE;
 }
-   
+
 BOOL PATH_PolylineTo(HDC hdc, const POINT *pts, DWORD cbPoints)
 {
   GdiPath *pPath;
@@ -582,7 +589,7 @@ BOOL PATH_PolylineTo(HDC hdc, const POINT *pts, DWORD cbPoints)
 
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
@@ -617,7 +624,7 @@ BOOL PATH_Polygon(HDC hdc, const POINT *pts, DWORD cbPoints)
 
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
@@ -642,7 +649,7 @@ BOOL PATH_PolyPolygon( HDC hdc, const POINT* pts, const INT* counts,
 
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
@@ -670,7 +677,7 @@ BOOL PATH_PolyPolyline( HDC hdc, const POINT* pts, const DWORD* counts,
 
   if(!PATH_GetPathFromHDC(hdc, &pPath))
     return FALSE;
-   
+
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
@@ -685,7 +692,7 @@ BOOL PATH_PolyPolyline( HDC hdc, const POINT* pts, const DWORD* counts,
   }
   return TRUE;
 }
-   
+
 /***********************************************************************
  * Internal functions
  */
@@ -738,7 +745,7 @@ static BOOL PATH_FlattenPath(GdiPath *pPath)
   PATH_EmptyPath(&newPath);
   return TRUE;
 }
-	  
+
 /* PATH_PathToRegion
  *
  * Creates a region from the specified path using the specified polygon
@@ -760,7 +767,7 @@ static BOOL PATH_PathToRegion(const GdiPath *pPath, INT nPolyFillMode,
   PATH_FlattenPath(pPath);
 
   /* FIXME: What happens when number of points is zero? */
-   
+
   /* First pass: Find out how many strokes there are in the path */
   /* FIXME: We could eliminate this with some bookkeeping in GdiPath */
   numStrokes=0;
@@ -775,7 +782,7 @@ static BOOL PATH_PathToRegion(const GdiPath *pPath, INT nPolyFillMode,
 //    SetLastError(ERROR_NOT_ENOUGH_MEMORY);
     return FALSE;
   }
-   
+
   /* Second pass: remember number of points in each polygon */
   iStroke=-1;  /* Will get incremented to 0 at beginning of first stroke */
   for(i=0; i<pPath->numEntriesUsed; i++)
@@ -828,7 +835,7 @@ static void PATH_EmptyPath(GdiPath *pPath)
 BOOL PATH_AddEntry(GdiPath *pPath, const POINT *pPoint, BYTE flags)
 {
   assert(pPath!=NULL);
-   
+
   /* FIXME: If newStroke is true, perhaps we want to check that we're
    * getting a PT_MOVETO
    */
@@ -836,7 +843,7 @@ BOOL PATH_AddEntry(GdiPath *pPath, const POINT *pPoint, BYTE flags)
   /* Check that path is open */
   if(pPath->state!=PATH_Open)
     return FALSE;
-   
+
   /* Reserve enough memory for an extra path entry */
   if(!PATH_ReserveEntries(pPath, pPath->numEntriesUsed+1))
     return FALSE;
@@ -866,7 +873,7 @@ static BOOL PATH_ReserveEntries(GdiPath *pPath, INT numEntries)
   INT   numEntriesToAllocate;
   POINT *pPointsNew;
   BYTE    *pFlagsNew;
-   
+
   assert(pPath!=NULL);
   assert(numEntries>=0);
 
@@ -927,9 +934,10 @@ static BOOL PATH_GetPathFromHDC(HDC hdc, GdiPath **ppPath)
   if(pDC)
   {
     *ppPath=&pDC->w.path;
+	DC_ReleasePtr( hdc );
     return TRUE;
-  } else
-    return FALSE;
+  }
+  return FALSE;
 }
 
 /* PATH_DoArcPart
@@ -972,7 +980,7 @@ static BOOL PATH_DoArcPart(GdiPath *pPath, FLOAT_POINT corners[],
       xNorm[i]=cos(angleStart);
       yNorm[i]=sin(angleStart);
     }
-   
+
   /* Add starting point to path if desired */
   if(addMoveTo)
   {
diff --git a/reactos/subsys/win32k/objects/pen.c b/reactos/subsys/win32k/objects/pen.c
index 34b51ecf798..d46cc60ddf3 100644
--- a/reactos/subsys/win32k/objects/pen.c
+++ b/reactos/subsys/win32k/objects/pen.c
@@ -12,7 +12,7 @@ W32kCreatePen(INT PenStyle, INT Width, COLORREF Color)
 {
   LOGPEN logpen;
 
-  logpen.lopnStyle = PenStyle; 
+  logpen.lopnStyle = PenStyle;
   logpen.lopnWidth.x = Width;
   logpen.lopnWidth.y = 0;
   logpen.lopnColor = Color;
@@ -29,14 +29,16 @@ W32kCreatePenIndirect(CONST PLOGPEN lgpn)
 
   if (lgpn->lopnStyle > PS_INSIDEFRAME) return 0;
 
-  penPtr = PENOBJ_AllocPen();
-  hpen   = PENOBJ_PtrToHandle(penPtr);
+  hpen = PENOBJ_AllocPen();
   if (!hpen) return 0;
 
+  penPtr   = PENOBJ_LockPen( hpen );
+  ASSERT( penPtr );
+
   penPtr->logpen.lopnStyle = lgpn->lopnStyle;
   penPtr->logpen.lopnWidth = lgpn->lopnWidth;
   penPtr->logpen.lopnColor = lgpn->lopnColor;
-
+  PENOBJ_UnlockPen( hpen );
   return hpen;
 }
 
diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c
index 1d4cffd6b05..e42aeb10196 100644
--- a/reactos/subsys/win32k/objects/region.c
+++ b/reactos/subsys/win32k/objects/region.c
@@ -11,11 +11,13 @@
 INT STDCALL
 W32kGetBoxRgn(HRGN hRgn, PRECT Rect)
 {
+	return 0;
 }
 
 HRGN STDCALL
 W32kCropRgn(HRGN hDest, HRGN hSrc, const RECT* Rect, const POINT* Point)
 {
+	return NULL;
 }
 
 INT STDCALL
@@ -67,7 +69,7 @@ W32kCreateRectRgn(INT  LeftRect,
 {
   RGNDATA* Region;
   PRECT Rect;
-
+/*
   DPRINT("W32kCreateRectRgn(LeftRect %d, TopRect %d, RightRect %d, "
 	 "BottomRect %d)\n", LeftRect, TopRect, RightRect, BottomRect);
 
@@ -83,6 +85,8 @@ W32kCreateRectRgn(INT  LeftRect,
   Region->rdh.rcBound = *Rect;
 
   return(GDIOBJ_PtrToHandle((PGDIOBJ)Region, 0));
+*/
+return NULL;
 }
 
 HRGN STDCALL
diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c
index 8303ecfac7f..e4f58e2135c 100644
--- a/reactos/subsys/win32k/objects/text.c
+++ b/reactos/subsys/win32k/objects/text.c
@@ -95,7 +95,7 @@ W32kAddFontResource(LPCWSTR  Filename)
     DbgPrint("could not allocate memory for module");
     return 0;
   }
-   
+
   //  Load driver into memory chunk
   Status = NtReadFile(FileHandle, 0, 0, 0, &Iosb, buffer, FileStdInfo.EndOfFile.u.LowPart, 0, 0);
   if (!NT_SUCCESS(Status))
@@ -177,10 +177,10 @@ W32kCreateFont(int  Height,
   logfont.lfClipPrecision = ClipPrecision;
   logfont.lfQuality = Quality;
   logfont.lfPitchAndFamily = PitchAndFamily;
-   
+
   if(Face)
     memcpy(logfont.lfFaceName, Face, sizeof(logfont.lfFaceName));
-  else 
+  else
     logfont.lfFaceName[0] = '\0';
 
   return W32kCreateFontIndirect(&logfont);
@@ -195,15 +195,19 @@ W32kCreateFontIndirect(CONST LPLOGFONT  lf)
 
   if (lf)
   {
-    if(fontPtr = TEXTOBJ_AllocText())
+    if(hFont = TEXTOBJ_AllocText())
     {
-      memcpy(&fontPtr->logfont, lf, sizeof(LOGFONT));
+	  fontPtr = TEXTOBJ_LockText( hFont );
+	  ASSERT( fontPtr );  //I want to know when this happens
+	  if( fontPtr ){
+      	memcpy(&fontPtr->logfont, lf, sizeof(LOGFONT));
 
-      if (lf->lfEscapement != lf->lfOrientation) {
-        /* this should really depend on whether GM_ADVANCED is set */
-        fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement;
-      }
-      hFont = TEXTOBJ_PtrToHandle(fontPtr);
+      	if (lf->lfEscapement != lf->lfOrientation) {
+      	  /* this should really depend on whether GM_ADVANCED is set */
+      	  fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement;
+      	}
+		TEXTOBJ_UnlockText( hFont );
+	  }
     }
   }
 
@@ -521,34 +525,34 @@ W32kSetTextAlign(HDC  hDC,
 {
   UINT prevAlign;
   DC *dc;
-  
+
   dc = DC_HandleToPtr(hDC);
-  if (!dc) 
+  if (!dc)
     {
       return  0;
     }
   prevAlign = dc->w.textAlign;
   dc->w.textAlign = Mode;
-  
+  DC_ReleasePtr( hDC );
   return  prevAlign;
 }
 
 COLORREF
 STDCALL
-W32kSetTextColor(HDC hDC, 
+W32kSetTextColor(HDC hDC,
                  COLORREF color)
 {
   COLORREF  oldColor;
   PDC  dc = DC_HandleToPtr(hDC);
-  
-  if (!dc) 
+
+  if (!dc)
   {
     return 0x80000000;
   }
 
   oldColor = dc->w.textColor;
   dc->w.textColor = color;
-
+  DC_ReleasePtr( hDC );
   return  oldColor;
 }
 
@@ -580,8 +584,8 @@ W32kTextOut(HDC  hDC,
   FT_Bool use_kerning;
   RECTL DestRect, MaskRect;
   POINTL SourcePoint, BrushOrigin;
-  HBRUSH hBrush;
-  PBRUSHOBJ Brush;
+  HBRUSH hBrush = NULL;
+  PBRUSHOBJ Brush = NULL;
   HBITMAP HSourceGlyph;
   PSURFOBJ SourceGlyphSurf;
   SIZEL bitSize;
@@ -594,7 +598,10 @@ W32kTextOut(HDC  hDC,
   PPALGDI PalDestGDI;
   PXLATEOBJ XlateObj;
 
-  TextObj = TEXTOBJ_HandleToPtr(dc->w.hFont);
+  if( !dc )
+	return FALSE;
+
+  TextObj = TEXTOBJ_LockText(dc->w.hFont);
 
   for(i=0; i<FontsLoaded; i++)
   {
@@ -605,7 +612,7 @@ W32kTextOut(HDC  hDC,
   if(hFont == 0)
   {
     DbgPrint("Specified font %s is not loaded\n", TextObj->logfont.lfFaceName);
-    return FALSE;
+	goto fail;
   }
 
   FontObj = (PFONTOBJ)AccessUserObject(hFont);
@@ -635,14 +642,14 @@ W32kTextOut(HDC  hDC,
   error = FT_Set_Pixel_Sizes(face, TextObj->logfont.lfHeight, TextObj->logfont.lfWidth);
   if(error) {
     DbgPrint("Error in setting pixel sizes: %u\n", error);
-    return FALSE;
+	goto fail;
   }
 
   // Create the brush
   PalDestGDI = (PPALGDI)AccessInternalObject(dc->w.hPalette);
   XlateObj = (PXLATEOBJ)EngCreateXlate(PalDestGDI->Mode, PAL_RGB, dc->w.hPalette, NULL);
   hBrush = W32kCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.textColor));
-  Brush = BRUSHOBJ_HandleToPtr(hBrush);
+  Brush = BRUSHOBJ_LockBrush(hBrush);
   EngDeleteXlate(XlateObj);
 
   SourcePoint.x = 0;
@@ -655,9 +662,12 @@ W32kTextOut(HDC  hDC,
   // Do we use the current TEXTOBJ's logfont.lfOrientation or the DC's textAlign?
   if (dc->w.textAlign & TA_BASELINE) {
     yoff = 0;
-  } else if (dc->w.textAlign & TA_BOTTOM) {
+  }
+  else
+  if (dc->w.textAlign & TA_BOTTOM) {
     yoff = -face->size->metrics.descender / 64;
-  } else { // TA_TOP
+  }
+  else { // TA_TOP
     yoff = face->size->metrics.ascender / 64;
   }
 
@@ -670,7 +680,7 @@ W32kTextOut(HDC  hDC,
     error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
     if(error) {
       DbgPrint("WARNING: Failed to load and render glyph! [index: %u]\n", glyph_index);
-      return FALSE;
+      goto fail;
     }
     glyph = face->glyph;
 
@@ -687,7 +697,7 @@ W32kTextOut(HDC  hDC,
       error = FT_Render_Glyph(glyph, ft_render_mode_mono);
       if(error) {
         DbgPrint("WARNING: Failed to render glyph!\n");
-        return FALSE;
+		goto fail;
       }
       pitch = glyph->bitmap.pitch;
     } else {
@@ -719,12 +729,26 @@ W32kTextOut(HDC  hDC,
 
     String++;
   }
+  TEXTOBJ_UnlockText( dc->w.hFont );
+  BRUSHOBJ_UnlockBrush(hBrush);
+  W32kDeleteObject( hBrush );
+  DC_ReleasePtr( hDC );
+  return TRUE;
+
+fail:
+  TEXTOBJ_UnlockText( dc->w.hFont );
+  if( hBrush ){
+    BRUSHOBJ_UnlockBrush(hBrush);
+    W32kDeleteObject( hBrush );
+  }
+  DC_ReleasePtr( hDC );
+  return FALSE;
 }
 
 UINT
 STDCALL
 W32kTranslateCharsetInfo(PDWORD  Src,
-                               LPCHARSETINFO  CSI,   
+                               LPCHARSETINFO  CSI,
                                DWORD  Flags)
 {
   UNIMPLEMENTED;