diff --git a/dlls/ttydrv/objects.c b/dlls/ttydrv/objects.c
index 3d27f24..2c14c77 100644
--- a/dlls/ttydrv/objects.c
+++ b/dlls/ttydrv/objects.c
@@ -5,10 +5,7 @@
  */
 
 #include "bitmap.h"
-#include "brush.h"
-#include "font.h"
 #include "gdi.h"
-#include "pen.h"
 #include "ttydrv.h"
 #include "debugtools.h"
 
@@ -23,11 +20,11 @@
 /***********************************************************************
  *		TTYDRV_DC_BRUSH_SelectObject
  */
-static HBRUSH TTYDRV_DC_BRUSH_SelectObject(DC *dc, HBRUSH hbrush, BRUSHOBJ *brush)
+static HBRUSH TTYDRV_DC_BRUSH_SelectObject(DC *dc, HBRUSH hbrush)
 {
   HBRUSH hPreviousBrush;
 
-  TRACE("(%p, 0x%04x, %p)\n", dc, hbrush, brush);
+  TRACE("(%p, 0x%04x)\n", dc, hbrush);
 
   hPreviousBrush = dc->hBrush;
   dc->hBrush = hbrush;
@@ -38,11 +35,11 @@
 /***********************************************************************
  *		TTYDRV_DC_FONT_SelectObject
  */
-static HFONT TTYDRV_DC_FONT_SelectObject(DC* dc, HFONT hfont, FONTOBJ *font)
+static HFONT TTYDRV_DC_FONT_SelectObject(DC* dc, HFONT hfont)
 {
   HFONT hPreviousFont;
 
-  TRACE("(%p, 0x%04x, %p)\n", dc, hfont, font);
+  TRACE("(%p, 0x%04x)\n", dc, hfont);
 
   hPreviousFont = dc->hFont;
   dc->hFont = hfont;
@@ -53,11 +50,11 @@
 /***********************************************************************
  *		TTYDRV_DC_PEN_SelectObject
  */
-static HPEN TTYDRV_DC_PEN_SelectObject(DC *dc, HBRUSH hpen, PENOBJ *pen)
+static HPEN TTYDRV_DC_PEN_SelectObject(DC *dc, HBRUSH hpen)
 {
   HPEN hPreviousPen;
 
-  TRACE("(%p, 0x%04x, %p)\n", dc, hpen, pen);
+  TRACE("(%p, 0x%04x)\n", dc, hpen);
 
   hPreviousPen = dc->hPen;
   dc->hPen = hpen;
@@ -81,13 +78,13 @@
       result = TTYDRV_DC_BITMAP_SelectObject(dc, handle, (BITMAPOBJ *) ptr);
       break;
     case BRUSH_MAGIC:
-      result = TTYDRV_DC_BRUSH_SelectObject(dc, handle, (BRUSHOBJ *) ptr);
+      result = TTYDRV_DC_BRUSH_SelectObject(dc, handle);
       break;
     case FONT_MAGIC:
-      result = TTYDRV_DC_FONT_SelectObject(dc, handle, (FONTOBJ *) ptr);	  
+      result = TTYDRV_DC_FONT_SelectObject(dc, handle);
       break;
     case PEN_MAGIC:
-      result = TTYDRV_DC_PEN_SelectObject(dc, handle, (PENOBJ *) ptr);
+      result = TTYDRV_DC_PEN_SelectObject(dc, handle);
       break;
     case REGION_MAGIC:
       /* FIXME: Shouldn't be handled here */
diff --git a/dlls/wineps/brush.c b/dlls/wineps/brush.c
index 9c2ef86..0b621fc 100644
--- a/dlls/wineps/brush.c
+++ b/dlls/wineps/brush.c
@@ -6,9 +6,7 @@
  */
 
 #include "psdrv.h"
-#include "brush.h"
 #include "debugtools.h"
-#include "gdi.h"
 #include "winbase.h"
 
 DEFAULT_DEBUG_CHANNEL(psdrv);
@@ -16,35 +14,36 @@
 /***********************************************************************
  *           PSDRV_BRUSH_SelectObject
  */
-HBRUSH PSDRV_BRUSH_SelectObject( DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
+HBRUSH PSDRV_BRUSH_SelectObject( DC * dc, HBRUSH hbrush )
 {
+    LOGBRUSH logbrush;
     HBRUSH prevbrush = dc->hBrush;
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
 
+    if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0;
+
     TRACE("hbrush = %08x\n", hbrush);
     dc->hBrush = hbrush;
 
-    switch(brush->logbrush.lbStyle) {
+    switch(logbrush.lbStyle) {
 
     case BS_SOLID:
-        PSDRV_CreateColor(physDev, &physDev->brush.color, 
-			  brush->logbrush.lbColor);
+        PSDRV_CreateColor(physDev, &physDev->brush.color, logbrush.lbColor);
 	break;
 
     case BS_NULL:
         break;
 
     case BS_HATCHED:
-        PSDRV_CreateColor(physDev, &physDev->brush.color, 
-			  brush->logbrush.lbColor);
+        PSDRV_CreateColor(physDev, &physDev->brush.color, logbrush.lbColor);
         break;
 
     case BS_PATTERN:
-        FIXME("Unsupported brush style %d\n", brush->logbrush.lbStyle);
+        FIXME("Unsupported brush style %d\n", logbrush.lbStyle);
 	break;
 
     default:
-        FIXME("Unrecognized brush style %d\n", brush->logbrush.lbStyle);
+        FIXME("Unrecognized brush style %d\n", logbrush.lbStyle);
 	break;
     }
 
@@ -60,16 +59,17 @@
  */
 static BOOL PSDRV_SetBrush(DC *dc)
 {
+    LOGBRUSH logbrush;
     BOOL ret = TRUE;
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
-    BRUSHOBJ *brush = (BRUSHOBJ *)GDI_GetObjPtr( dc->hBrush, BRUSH_MAGIC );
 
-    if(!brush) {
+    if (!GetObjectA( dc->hBrush, sizeof(logbrush), &logbrush ))
+    {
         ERR("Can't get BRUSHOBJ\n");
 	return FALSE;
     }
-    
-    switch (brush->logbrush.lbStyle) {
+
+    switch (logbrush.lbStyle) {
     case BS_SOLID:
     case BS_HATCHED:
         PSDRV_WriteSetColor(dc, &physDev->brush.color);
@@ -84,7 +84,6 @@
 
     }
     physDev->brush.set = TRUE;
-    GDI_ReleaseObj( dc->hBrush );
     return TRUE;
 }
 
@@ -123,16 +122,17 @@
  */
 BOOL PSDRV_Brush(DC *dc, BOOL EO)
 {
+    LOGBRUSH logbrush;
     BOOL ret = TRUE;
-    BRUSHOBJ *brush = (BRUSHOBJ *)GDI_GetObjPtr( dc->hBrush, BRUSH_MAGIC );
     PSDRV_PDEVICE *physDev = dc->physDev;
 
-    if(!brush) {
+    if (!GetObjectA( dc->hBrush, sizeof(logbrush), &logbrush ))
+    {
         ERR("Can't get BRUSHOBJ\n");
 	return FALSE;
     }
 
-    switch (brush->logbrush.lbStyle) {
+    switch (logbrush.lbStyle) {
     case BS_SOLID:
         PSDRV_SetBrush(dc);
 	PSDRV_WriteGSave(dc);
@@ -143,7 +143,7 @@
     case BS_HATCHED:
         PSDRV_SetBrush(dc);
 
-	switch(brush->logbrush.lbHatch) {
+	switch(logbrush.lbHatch) {
 	case HS_VERTICAL:
 	case HS_CROSS:
 	    PSDRV_WriteGSave(dc);
@@ -151,7 +151,7 @@
 	    PSDRV_WriteHatch(dc);
 	    PSDRV_WriteStroke(dc);
 	    PSDRV_WriteGRestore(dc);
-	    if(brush->logbrush.lbHatch == HS_VERTICAL)
+	    if(logbrush.lbHatch == HS_VERTICAL)
 	        break;
 	    /* else fallthrough for HS_CROSS */
 
@@ -172,7 +172,7 @@
 	    PSDRV_WriteHatch(dc);
 	    PSDRV_WriteStroke(dc);
 	    PSDRV_WriteGRestore(dc);
-	    if(brush->logbrush.lbHatch == HS_FDIAGONAL)
+	    if(logbrush.lbHatch == HS_FDIAGONAL)
 	        break;
 	    /* else fallthrough for HS_DIAGCROSS */
 	    
@@ -199,12 +199,11 @@
         {
 	    BITMAP bm;
 	    BYTE *bits;
-	    GetObjectA(brush->logbrush.lbHatch, sizeof(BITMAP), &bm);
+	    GetObjectA(logbrush.lbHatch, sizeof(BITMAP), &bm);
 	    TRACE("BS_PATTERN %dx%d %d bpp\n", bm.bmWidth, bm.bmHeight,
 		  bm.bmBitsPixel);
 	    bits = HeapAlloc(PSDRV_Heap, 0, bm.bmWidthBytes * bm.bmHeight);
-	    GetBitmapBits(brush->logbrush.lbHatch,
-			  bm.bmWidthBytes * bm.bmHeight, bits);
+	    GetBitmapBits(logbrush.lbHatch, bm.bmWidthBytes * bm.bmHeight, bits);
 
 	    if(physDev->pi->ppd->LanguageLevel > 1) {
 	        PSDRV_WriteGSave(dc);
@@ -223,8 +222,6 @@
         ret = FALSE;
 	break;
     }
-
-    GDI_ReleaseObj( dc->hBrush );
     return ret;
 }
 
diff --git a/dlls/wineps/font.c b/dlls/wineps/font.c
index 1a849e4..ea54585 100644
--- a/dlls/wineps/font.c
+++ b/dlls/wineps/font.c
@@ -9,7 +9,6 @@
 #include "winspool.h"
 #include "psdrv.h"
 #include "debugtools.h"
-#include "gdi.h"
 #include "winerror.h"
 
 DEFAULT_DEBUG_CHANNEL(psdrv);
@@ -18,34 +17,34 @@
 /***********************************************************************
  *           PSDRV_FONT_SelectObject
  */
-HFONT16 PSDRV_FONT_SelectObject( DC * dc, HFONT16 hfont,
-				 FONTOBJ *font )
+HFONT PSDRV_FONT_SelectObject( DC * dc, HFONT hfont )
 {
+    LOGFONTW lf;
     HFONT16 prevfont = dc->hFont;
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
-    LOGFONTW *lf = &(font->logfont);
     BOOL bd = FALSE, it = FALSE;
     AFMLISTENTRY *afmle;
     AFM *afm;
     FONTFAMILY *family;
     char FaceName[LF_FACESIZE];
 
+    if (!GetObjectW( hfont, sizeof(lf), &lf )) return 0;
 
     TRACE("FaceName = %s Height = %ld Italic = %d Weight = %ld\n",
-	  debugstr_w(lf->lfFaceName), lf->lfHeight, lf->lfItalic,
-	  lf->lfWeight);
+	  debugstr_w(lf.lfFaceName), lf.lfHeight, lf.lfItalic,
+	  lf.lfWeight);
 
     dc->hFont = hfont;
 
-    if(lf->lfItalic)
+    if(lf.lfItalic)
         it = TRUE;
-    if(lf->lfWeight > 550)
+    if(lf.lfWeight > 550)
         bd = TRUE;
-    WideCharToMultiByte(CP_ACP, 0, lf->lfFaceName, -1,
+    WideCharToMultiByte(CP_ACP, 0, lf.lfFaceName, -1,
 			FaceName, sizeof(FaceName), NULL, NULL);
     
     if(FaceName[0] == '\0') {
-        switch(lf->lfPitchAndFamily & 0xf0) {
+        switch(lf.lfPitchAndFamily & 0xf0) {
 	case FF_DONTCARE:
 	    break;
 	case FF_ROMAN:
@@ -65,7 +64,7 @@
     }
 
     if(FaceName[0] == '\0') {
-        switch(lf->lfPitchAndFamily & 0x0f) {
+        switch(lf.lfPitchAndFamily & 0x0f) {
 	case VARIABLE_PITCH:
 	    strcpy(FaceName, "Times");
 	    break;
@@ -138,7 +137,7 @@
     afm = afmle->afm;
 
     physDev->font.afm = afm;
-    physDev->font.tm.tmHeight = INTERNAL_YWSTODS(dc, lf->lfHeight);
+    physDev->font.tm.tmHeight = INTERNAL_YWSTODS(dc, lf.lfHeight);
     if(physDev->font.tm.tmHeight < 0) {
         physDev->font.tm.tmHeight *= - (afm->FullAscender - afm->Descender) /
 				       (afm->Ascender - afm->Descender);
@@ -147,7 +146,7 @@
     physDev->font.size = physDev->font.tm.tmHeight * 1000.0 /
 				(afm->FullAscender - afm->Descender);
     physDev->font.scale = physDev->font.size / 1000.0;
-    physDev->font.escapement = lf->lfEscapement;
+    physDev->font.escapement = lf.lfEscapement;
     physDev->font.tm.tmAscent = afm->FullAscender * physDev->font.scale;
     physDev->font.tm.tmDescent = -afm->Descender * physDev->font.scale;
     physDev->font.tm.tmInternalLeading = (afm->FullAscender - afm->Ascender)
@@ -160,8 +159,8 @@
                                            physDev->font.scale;
     physDev->font.tm.tmWeight = afm->Weight;
     physDev->font.tm.tmItalic = afm->ItalicAngle != 0.0;
-    physDev->font.tm.tmUnderlined = lf->lfUnderline;
-    physDev->font.tm.tmStruckOut = lf->lfStrikeOut;
+    physDev->font.tm.tmUnderlined = lf.lfUnderline;
+    physDev->font.tm.tmStruckOut = lf.lfStrikeOut;
     physDev->font.tm.tmFirstChar = 32;
     physDev->font.tm.tmLastChar = 251;
     physDev->font.tm.tmDefaultChar = 128;
diff --git a/dlls/wineps/objects.c b/dlls/wineps/objects.c
index a1c7d67..58202fb 100644
--- a/dlls/wineps/objects.c
+++ b/dlls/wineps/objects.c
@@ -6,10 +6,6 @@
  */
 
 #include "psdrv.h"
-#include "font.h"
-#include "pen.h"
-#include "brush.h"
-#include "bitmap.h"
 #include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(psdrv);
@@ -17,8 +13,7 @@
 /***********************************************************************
  *           PSDRV_BITMAP_SelectObject
  */
-static HBITMAP16 PSDRV_BITMAP_SelectObject( DC * dc, HBITMAP16 hbitmap,
-                                            BITMAPOBJ * bmp )
+static HBITMAP PSDRV_BITMAP_SelectObject( DC * dc, HBITMAP hbitmap )
 {
     FIXME("stub\n");
     return 0;
@@ -30,33 +25,32 @@
  */
 HGDIOBJ PSDRV_SelectObject( DC *dc, HGDIOBJ handle )
 {
-    GDIOBJHDR * ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE );
     HGDIOBJ ret = 0;
 
-    if (!ptr) return 0;
     TRACE("hdc=%04x %04x\n", dc->hSelf, handle );
-    
-    switch(GDIMAGIC(ptr->wMagic))
+
+    switch(GetObjectType( handle ))
     {
-      case PEN_MAGIC:
-	  ret = PSDRV_PEN_SelectObject( dc, handle, (PENOBJ *)ptr );
+    case OBJ_PEN:
+	  ret = PSDRV_PEN_SelectObject( dc, handle );
 	  break;
-      case BRUSH_MAGIC:
-	  ret = PSDRV_BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );
+    case OBJ_BRUSH:
+	  ret = PSDRV_BRUSH_SelectObject( dc, handle );
 	  break;
-      case BITMAP_MAGIC:
-	  ret = PSDRV_BITMAP_SelectObject( dc, handle, (BITMAPOBJ *)ptr );
+    case OBJ_BITMAP:
+	  ret = PSDRV_BITMAP_SelectObject( dc, handle );
 	  break;
-      case FONT_MAGIC:
-	  ret = PSDRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
+    case OBJ_FONT:
+	  ret = PSDRV_FONT_SelectObject( dc, handle );
 	  break;
-      case REGION_MAGIC:
+    case OBJ_REGION:
 	  ret = (HGDIOBJ)SelectClipRgn( dc->hSelf, handle );
 	  break;
+    case 0:  /* invalid handle */
+        break;
       default:
-	  ERR("Unknown object magic %04x\n", GDIMAGIC(ptr->wMagic));
+	  ERR("Unknown object type %ld\n", GetObjectType(handle) );
 	  break;
     }
-    GDI_ReleaseObj( handle );
     return ret;
 }
diff --git a/dlls/wineps/pen.c b/dlls/wineps/pen.c
index 6710620..f2d13e2 100644
--- a/dlls/wineps/pen.c
+++ b/dlls/wineps/pen.c
@@ -5,7 +5,6 @@
  *
  */
 
-#include "pen.h"
 #include "psdrv.h"
 #include "debugtools.h"
 
@@ -20,20 +19,24 @@
 /***********************************************************************
  *           PSDRV_PEN_SelectObject
  */
-extern HPEN PSDRV_PEN_SelectObject( DC * dc, HPEN hpen, PENOBJ * pen )
+HPEN PSDRV_PEN_SelectObject( DC * dc, HPEN hpen )
 {
+    LOGPEN logpen;
     HPEN prevpen = dc->hPen;
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
 
-    TRACE("hpen = %08x colour = %08lx\n", hpen, pen->logpen.lopnColor);
+    if (!GetObjectA( hpen, sizeof(logpen), &logpen )) return 0;
+
+    TRACE("hpen = %08x colour = %08lx\n", hpen, logpen.lopnColor);
+
     dc->hPen = hpen;
 
-    physDev->pen.width = INTERNAL_XWSTODS(dc, pen->logpen.lopnWidth.x);
+    physDev->pen.width = INTERNAL_XWSTODS(dc, logpen.lopnWidth.x);
     if(physDev->pen.width < 0)
         physDev->pen.width = -physDev->pen.width;
 
-    PSDRV_CreateColor(physDev, &physDev->pen.color, pen->logpen.lopnColor);
-    physDev->pen.style = pen->logpen.lopnStyle & PS_STYLE_MASK;
+    PSDRV_CreateColor(physDev, &physDev->pen.color, logpen.lopnColor);
+    physDev->pen.style = logpen.lopnStyle & PS_STYLE_MASK;
  
     switch(physDev->pen.style) {
     case PS_DASH:
diff --git a/dlls/wineps/psdrv.h b/dlls/wineps/psdrv.h
index 9081442..40b58d9 100644
--- a/dlls/wineps/psdrv.h
+++ b/dlls/wineps/psdrv.h
@@ -8,9 +8,7 @@
  */
 #include "windef.h"
 #include "wingdi.h"
-#include "font.h"
-#include "pen.h"
-#include "brush.h"
+#include "gdi.h"
 #include "wine/wingdi16.h"
 #include "winspool.h"
 
@@ -293,10 +291,9 @@
 extern void PSDRV_FreeAFMList( FONTFAMILY *head );
 
 extern BOOL WINAPI PSDRV_Init(HINSTANCE hinst, DWORD reason, LPVOID reserved);
-extern HFONT16 PSDRV_FONT_SelectObject( DC *dc, HFONT16 hfont, FONTOBJ *font);
-extern HPEN PSDRV_PEN_SelectObject( DC * dc, HPEN hpen, PENOBJ * pen );
-extern HBRUSH PSDRV_BRUSH_SelectObject( DC * dc, HBRUSH hbrush,
-					  BRUSHOBJ * brush );
+extern HFONT PSDRV_FONT_SelectObject( DC *dc, HFONT hfont );
+extern HPEN PSDRV_PEN_SelectObject( DC * dc, HPEN hpen );
+extern HBRUSH PSDRV_BRUSH_SelectObject( DC * dc, HBRUSH hbrush );
 
 extern BOOL PSDRV_Brush(DC *dc, BOOL EO);
 extern BOOL PSDRV_SetFont( DC *dc );
diff --git a/graphics/enhmetafiledrv/objects.c b/graphics/enhmetafiledrv/objects.c
index 56132a9..c75b6e4 100644
--- a/graphics/enhmetafiledrv/objects.c
+++ b/graphics/enhmetafiledrv/objects.c
@@ -9,10 +9,7 @@
 #include <string.h>
 
 #include "bitmap.h"
-#include "brush.h"
-#include "font.h"
 #include "enhmetafiledrv.h"
-#include "pen.h"
 #include "debugtools.h"
 #include "heap.h"
 
@@ -33,9 +30,11 @@
 DWORD EMFDRV_CreateBrushIndirect( DC *dc, HBRUSH hBrush )
 {
     DWORD index = 0;
-    BRUSHOBJ *brushObj = (BRUSHOBJ *)GDI_GetObjPtr( hBrush, BRUSH_MAGIC );
+    LOGBRUSH logbrush;
 
-    switch (brushObj->logbrush.lbStyle) {
+    if (!GetObjectA( hBrush, sizeof(logbrush), &logbrush )) return 0;
+
+    switch (logbrush.lbStyle) {
     case BS_SOLID:
     case BS_HATCHED:
     case BS_NULL:
@@ -44,7 +43,7 @@
 	emr.emr.iType = EMR_CREATEBRUSHINDIRECT;
 	emr.emr.nSize = sizeof(emr);
 	emr.ihBrush = index = EMFDRV_AddHandleDC( dc );
-	emr.lb = brushObj->logbrush;
+	emr.lb = logbrush;
 
 	if(!EMFDRV_WriteRecord( dc, &emr.emr ))
 	    index = 0;
@@ -54,7 +53,7 @@
       {
 	EMRCREATEDIBPATTERNBRUSHPT *emr;
 	DWORD bmSize, biSize, size;
-	BITMAPINFO *info = GlobalLock16(brushObj->logbrush.lbHatch);
+	BITMAPINFO *info = GlobalLock16(logbrush.lbHatch);
 
 	if (info->bmiHeader.biCompression)
             bmSize = info->bmiHeader.biSizeImage;
@@ -62,14 +61,14 @@
 	    bmSize = DIB_GetDIBImageBytes(info->bmiHeader.biWidth,
 					  info->bmiHeader.biHeight,
 					  info->bmiHeader.biBitCount);
-	biSize = DIB_BitmapInfoSize(info, LOWORD(brushObj->logbrush.lbColor)); 
+	biSize = DIB_BitmapInfoSize(info, LOWORD(logbrush.lbColor));
 	size = sizeof(EMRCREATEDIBPATTERNBRUSHPT) + biSize + bmSize;
 	emr = HeapAlloc( GetProcessHeap(), 0, size );
 	if(!emr) break;
 	emr->emr.iType = EMR_CREATEDIBPATTERNBRUSHPT;
 	emr->emr.nSize = size;
 	emr->ihBrush = index = EMFDRV_AddHandleDC( dc );
-	emr->iUsage = LOWORD(brushObj->logbrush.lbColor);
+	emr->iUsage = LOWORD(logbrush.lbColor);
 	emr->offBmi = sizeof(EMRCREATEDIBPATTERNBRUSHPT);
 	emr->cbBmi = biSize;
 	emr->offBits = sizeof(EMRCREATEDIBPATTERNBRUSHPT) + biSize;
@@ -79,19 +78,18 @@
 	if(!EMFDRV_WriteRecord( dc, &emr->emr ))
 	    index = 0;
 	HeapFree( GetProcessHeap(), 0, emr );
-	GlobalUnlock16(brushObj->logbrush.lbHatch);
+	GlobalUnlock16(logbrush.lbHatch);
       }
       break;
 
     case BS_PATTERN:
         FIXME("Unsupported style %x\n",
-	      brushObj->logbrush.lbStyle);
+	      logbrush.lbStyle);
         break;
     default:
-        FIXME("Unknown style %x\n", brushObj->logbrush.lbStyle);
+        FIXME("Unknown style %x\n", logbrush.lbStyle);
 	break;
     }
-    GDI_ReleaseObj( hBrush );
     return index;
 }
 
@@ -141,13 +139,14 @@
 static BOOL EMFDRV_CreateFontIndirect(DC *dc, HFONT hFont )
 {
     DWORD index = 0;
-    FONTOBJ *fontObj = (FONTOBJ *)GDI_GetObjPtr( hFont, FONT_MAGIC );
     EMREXTCREATEFONTINDIRECTW emr;
     int i;
+
+    if (!GetObjectW( hFont, sizeof(emr.elfw.elfLogFont), &emr.elfw.elfLogFont )) return 0;
+
     emr.emr.iType = EMR_EXTCREATEFONTINDIRECTW;
     emr.emr.nSize = (sizeof(emr) + 3) / 4 * 4;
     emr.ihFont = index = EMFDRV_AddHandleDC( dc );
-    memcpy( &(emr.elfw.elfLogFont), &(fontObj->logfont), sizeof(LOGFONTW) );
     emr.elfw.elfFullName[0] = '\0';
     emr.elfw.elfStyle[0]    = '\0';
     emr.elfw.elfVersion     = 0;
@@ -170,7 +169,6 @@
 
     if(!EMFDRV_WriteRecord( dc, &emr.emr ))
         index = 0;
-    GDI_ReleaseObj( hFont );
     return index;
 }
 
@@ -223,17 +221,16 @@
 static HPEN EMFDRV_CreatePenIndirect(DC *dc, HPEN hPen )
 {
     EMRCREATEPEN emr;
-    PENOBJ *penObj = (PENOBJ *)GDI_GetObjPtr( hPen, PEN_MAGIC );
     DWORD index = 0;
 
+    if (!GetObjectA( hPen, sizeof(emr.lopn), &emr.lopn )) return 0;
+
     emr.emr.iType = EMR_CREATEPEN;
     emr.emr.nSize = sizeof(emr);
     emr.ihPen = index = EMFDRV_AddHandleDC( dc );
-    emr.lopn = penObj->logpen;
 
     if(!EMFDRV_WriteRecord( dc, &emr.emr ))
         index = 0;
-    GDI_ReleaseObj( hPen );
     return index;
 }
 
diff --git a/graphics/metafiledrv/objects.c b/graphics/metafiledrv/objects.c
index e616e35..cbaba57 100644
--- a/graphics/metafiledrv/objects.c
+++ b/graphics/metafiledrv/objects.c
@@ -9,21 +9,18 @@
 #include <string.h>
 
 #include "bitmap.h"
-#include "brush.h"
 #include "font.h"
 #include "metafiledrv.h"
-#include "pen.h"
 #include "debugtools.h"
 #include "heap.h"
 
 DEFAULT_DEBUG_CHANNEL(metafile);
-DECLARE_DEBUG_CHANNEL(gdi);
+
 
 /***********************************************************************
  *           MFDRV_BITMAP_SelectObject
  */
-static HBITMAP16 MFDRV_BITMAP_SelectObject( DC * dc, HBITMAP16 hbitmap,
-                                            BITMAPOBJ * bmp )
+static HBITMAP MFDRV_BITMAP_SelectObject( DC * dc, HBITMAP hbitmap )
 {
     return 0;
 }
@@ -38,19 +35,21 @@
     INT16 index = -1;
     DWORD size;
     METARECORD *mr;
-    BRUSHOBJ *brushObj = (BRUSHOBJ *)GDI_GetObjPtr( hBrush, BRUSH_MAGIC );
-    if(!brushObj) return -1;
-    
-    switch(brushObj->logbrush.lbStyle) {
+    LOGBRUSH logbrush;
+
+    if (!GetObjectA( hBrush, sizeof(logbrush), &logbrush )) return -1;
+
+    switch(logbrush.lbStyle)
+    {
     case BS_SOLID:
     case BS_NULL:
     case BS_HATCHED:
         {
 	    LOGBRUSH16 lb16;
 
-	    lb16.lbStyle = brushObj->logbrush.lbStyle;
-	    lb16.lbColor = brushObj->logbrush.lbColor;
-	    lb16.lbHatch = brushObj->logbrush.lbHatch;
+	    lb16.lbStyle = logbrush.lbStyle;
+	    lb16.lbColor = logbrush.lbColor;
+	    lb16.lbHatch = logbrush.lbHatch;
 	    size = sizeof(METARECORD) + sizeof(LOGBRUSH16) - 2;
 	    mr = HeapAlloc( GetProcessHeap(), 0, size );
 	    mr->rdSize = size / 2;
@@ -65,7 +64,7 @@
 	    BITMAPINFO *info;
 	    DWORD bmSize;
 
-	    GetObjectA(brushObj->logbrush.lbHatch, sizeof(bm), &bm);
+	    GetObjectA(logbrush.lbHatch, sizeof(bm), &bm);
 	    if(bm.bmBitsPixel != 1 || bm.bmPlanes != 1) {
 	        FIXME("Trying to store a colour pattern brush\n");
 		goto done;
@@ -91,7 +90,7 @@
 	    info->bmiHeader.biBitCount = 1;
 	    bits = ((BYTE *)info) + sizeof(BITMAPINFO) + sizeof(RGBQUAD);
 
-	    GetDIBits(dc->hSelf, brushObj->logbrush.lbHatch, 0, bm.bmHeight,
+	    GetDIBits(dc->hSelf, logbrush.lbHatch, 0, bm.bmHeight,
 		      bits, info, DIB_RGB_COLORS);
 	    *(DWORD *)info->bmiColors = 0;
 	    *(DWORD *)(info->bmiColors + 1) = 0xffffff;
@@ -103,27 +102,26 @@
 	      BITMAPINFO *info;
 	      DWORD bmSize, biSize;
 
-	      info = GlobalLock16((HGLOBAL16)brushObj->logbrush.lbHatch);
+	      info = GlobalLock16((HGLOBAL16)logbrush.lbHatch);
 	      if (info->bmiHeader.biCompression)
 		  bmSize = info->bmiHeader.biSizeImage;
 	      else
 		  bmSize = DIB_GetDIBImageBytes(info->bmiHeader.biWidth,
 						info->bmiHeader.biHeight,
 						info->bmiHeader.biBitCount);
-	      biSize = DIB_BitmapInfoSize(info,
-					  LOWORD(brushObj->logbrush.lbColor)); 
+	      biSize = DIB_BitmapInfoSize(info, LOWORD(logbrush.lbColor));
 	      size = sizeof(METARECORD) + biSize + bmSize + 2;
 	      mr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
 	      if(!mr) goto done;
 	      mr->rdFunction = META_DIBCREATEPATTERNBRUSH;
 	      mr->rdSize = size / 2;
-	      *(mr->rdParm) = brushObj->logbrush.lbStyle;
-	      *(mr->rdParm + 1) = LOWORD(brushObj->logbrush.lbColor);
+	      *(mr->rdParm) = logbrush.lbStyle;
+	      *(mr->rdParm + 1) = LOWORD(logbrush.lbColor);
 	      memcpy(mr->rdParm + 2, info, biSize + bmSize);
 	      break;
 	}
 	default:
-	    FIXME("Unkonwn brush style %x\n", brushObj->logbrush.lbStyle);
+	    FIXME("Unkonwn brush style %x\n", logbrush.lbStyle);
 	    return -1;
     }
     index = MFDRV_AddHandleDC( dc );
@@ -131,7 +129,6 @@
         index = -1;
     HeapFree(GetProcessHeap(), 0, mr);
 done:
-    GDI_ReleaseObj( hBrush );
     return index;
 }
 
@@ -139,8 +136,7 @@
 /***********************************************************************
  *           MFDRV_BRUSH_SelectObject
  */
-static HBRUSH MFDRV_BRUSH_SelectObject( DC *dc, HBRUSH hbrush,
-					BRUSHOBJ * brush )
+static HBRUSH MFDRV_BRUSH_SelectObject( DC *dc, HBRUSH hbrush )
 {
     INT16 index;
     METARECORD mr;
@@ -181,12 +177,12 @@
 /***********************************************************************
  *           MFDRV_FONT_SelectObject
  */
-static HFONT16 MFDRV_FONT_SelectObject( DC * dc, HFONT16 hfont,
-                                        FONTOBJ * font )
+static HFONT MFDRV_FONT_SelectObject( DC * dc, HFONT hfont )
 {
     HFONT16 prevHandle = dc->hFont;
     LOGFONT16 lf16;
-    FONT_LogFontWTo16(&(font->logfont), &lf16);
+
+    if (!GetObject16( hfont, sizeof(lf16), &lf16 )) return 0;
     if (MFDRV_CreateFontIndirect(dc, hfont, &lf16))
         return prevHandle;
     return 0;
@@ -218,18 +214,13 @@
 /***********************************************************************
  *           MFDRV_PEN_SelectObject
  */
-static HPEN MFDRV_PEN_SelectObject( DC * dc, HPEN hpen, PENOBJ * pen )
+static HPEN MFDRV_PEN_SelectObject( DC * dc, HPEN hpen )
 {
     LOGPEN16 logpen;
     HPEN prevHandle = dc->hPen;
 
-    logpen.lopnStyle = pen->logpen.lopnStyle;
-    logpen.lopnWidth.x = pen->logpen.lopnWidth.x;
-    logpen.lopnWidth.y = pen->logpen.lopnWidth.y;
-    logpen.lopnColor = pen->logpen.lopnColor;
-
+    if (!GetObject16( hpen, sizeof(logpen), &logpen )) return 0;
     if (MFDRV_CreatePenIndirect( dc, hpen, &logpen )) return prevHandle;
-
     return 0;
 }
 
@@ -239,32 +230,15 @@
  */
 HGDIOBJ MFDRV_SelectObject( DC *dc, HGDIOBJ handle )
 {
-    GDIOBJHDR * ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE );
-    HGDIOBJ ret = 0;
+    TRACE("hdc=%04x %04x\n", dc->hSelf, handle );
 
-    if (!ptr) return 0;
-    TRACE_(gdi)("hdc=%04x %04x\n", dc->hSelf, handle );
-    
-    switch(GDIMAGIC(ptr->wMagic))
+    switch(GetObjectType( handle ))
     {
-      case PEN_MAGIC:
-	  ret = MFDRV_PEN_SelectObject( dc, handle, (PENOBJ *)ptr );
-	  break;
-      case BRUSH_MAGIC:
-	  ret = MFDRV_BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );
-	  break;
-      case BITMAP_MAGIC:
-	  ret = MFDRV_BITMAP_SelectObject( dc, handle, (BITMAPOBJ *)ptr );
-	  break;
-      case FONT_MAGIC:
-	  ret = MFDRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
-	  break;
-      case REGION_MAGIC:
-	  ret = (HGDIOBJ)SelectClipRgn( dc->hSelf, handle );
-	  break;
+    case OBJ_PEN:    return MFDRV_PEN_SelectObject( dc, handle );
+    case OBJ_BRUSH:  return MFDRV_BRUSH_SelectObject( dc, handle );
+    case OBJ_BITMAP: return MFDRV_BITMAP_SelectObject( dc, handle );
+    case OBJ_FONT:   return MFDRV_FONT_SelectObject( dc, handle );
+    case OBJ_REGION: return (HGDIOBJ)SelectClipRgn( dc->hSelf, handle );
     }
-    GDI_ReleaseObj( handle );
-    return ret;
+    return 0;
 }
-
-
diff --git a/graphics/win16drv/brush.c b/graphics/win16drv/brush.c
index 8867ee3..48cbb4c 100644
--- a/graphics/win16drv/brush.c
+++ b/graphics/win16drv/brush.c
@@ -5,26 +5,22 @@
  */
 
 #include <stdlib.h>
-#include "brush.h"
 #include "win16drv.h"
 #include "heap.h"
 #include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(win16drv);
 
-HBRUSH WIN16DRV_BRUSH_SelectObject( DC * dc, HBRUSH hbrush,
-                                      BRUSHOBJ * brush )
+HBRUSH WIN16DRV_BRUSH_SelectObject( DC * dc, HBRUSH hbrush )
 {
     WIN16DRV_PDEVICE *physDev = (WIN16DRV_PDEVICE *)dc->physDev;
     HBRUSH16	 prevHandle = dc->hBrush;
     int		 nSize;
-    LOGBRUSH16 	 lBrush16;
+    LOGBRUSH16 lBrush16;
+
+    if (!GetObject16( hbrush, sizeof(lBrush16), &lBrush16 )) return 0;
+
     dc->hBrush = hbrush;
-    lBrush16.lbStyle = brush->logbrush.lbStyle;
-    lBrush16.lbColor = brush->logbrush.lbColor;
-    lBrush16.lbHatch = brush->logbrush.lbHatch;
-
-
     if ( physDev->BrushInfo )
     {
         TRACE("UnRealizing BrushInfo\n");
diff --git a/graphics/win16drv/font.c b/graphics/win16drv/font.c
index e39c9f3..0bfe6aa 100644
--- a/graphics/win16drv/font.c
+++ b/graphics/win16drv/font.c
@@ -72,17 +72,18 @@
     return TRUE;
 }
 
-HFONT WIN16DRV_FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font)
+HFONT WIN16DRV_FONT_SelectObject( DC * dc, HFONT hfont)
 {
     WIN16DRV_PDEVICE *physDev = (WIN16DRV_PDEVICE *)dc->physDev;
     HPEN prevHandle = dc->hFont;
     int	nSize;
 
+    if (!GetObject16( hfont, sizeof(physDev->lf), &physDev->lf )) return 0;
+
     dc->hFont = hfont;
 
-    TRACE("WIN16DRV_FONT_SelectObject %s h=%ld\n",
-	  debugstr_w(font->logfont.lfFaceName), font->logfont.lfHeight);
-
+    TRACE("WIN16DRV_FONT_SelectObject %s h=%d\n",
+          debugstr_a(physDev->lf.lfFaceName), physDev->lf.lfHeight);
 
     if( physDev->FontInfo )
     {
@@ -92,7 +93,6 @@
 				      physDev->FontInfo, 0);
     }
 
-    FONT_LogFontWTo16(&font->logfont, &physDev->lf);
     nSize = PRTDRV_RealizeObject (physDev->segptrPDEVICE, DRVOBJ_FONT,
                                   &physDev->lf, 0, 0); 
 
diff --git a/graphics/win16drv/objects.c b/graphics/win16drv/objects.c
index 824cd45..47d4c35 100644
--- a/graphics/win16drv/objects.c
+++ b/graphics/win16drv/objects.c
@@ -9,10 +9,6 @@
 #include <stdlib.h>
 #include <stdio.h>
 
-#include "bitmap.h"
-#include "brush.h"
-#include "font.h"
-#include "pen.h"
 #include "win16drv.h"
 
 #include "debugtools.h"
@@ -20,45 +16,22 @@
 DEFAULT_DEBUG_CHANNEL(gdi);
 
 
-extern HBITMAP WIN16DRV_BITMAP_SelectObject( DC * dc, HBITMAP hbitmap,
-                                             BITMAPOBJ * bmp );
-extern HBRUSH WIN16DRV_BRUSH_SelectObject( DC * dc, HBRUSH hbrush,
-                                           BRUSHOBJ * brush );
-extern HFONT WIN16DRV_FONT_SelectObject( DC * dc, HFONT hfont,
-                                         FONTOBJ * font );
-extern HPEN WIN16DRV_PEN_SelectObject( DC * dc, HPEN hpen, PENOBJ * pen );
-
-
 /***********************************************************************
  *           WIN16DRV_SelectObject
  */
 HGDIOBJ WIN16DRV_SelectObject( DC *dc, HGDIOBJ handle )
 {
-    GDIOBJHDR *ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE );
-    HGDIOBJ ret = 0;
-
-    if (!ptr) return 0;
     TRACE("hdc=%04x %04x\n", dc->hSelf, handle );
-    
-    switch(GDIMAGIC(ptr->wMagic))
+
+    switch(GetObjectType( handle ))
     {
-    case PEN_MAGIC:
-        ret = WIN16DRV_PEN_SelectObject( dc, handle, (PENOBJ *)ptr );	  
-        break;
-    case BRUSH_MAGIC:
-        ret = WIN16DRV_BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );	  
-        break;
-    case BITMAP_MAGIC:
-        FIXME("WIN16DRV_SelectObject for BITMAP not implemented\n");
-        ret = 1;
-        break;
-    case FONT_MAGIC:
-        ret = WIN16DRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
-	break;
-    case REGION_MAGIC:
-	ret = (HGDIOBJ)SelectClipRgn( dc->hSelf, handle );
-	break;
+    case OBJ_PEN:    return WIN16DRV_PEN_SelectObject( dc, handle );
+    case OBJ_BRUSH:  return WIN16DRV_BRUSH_SelectObject( dc, handle );
+    case OBJ_FONT:   return WIN16DRV_FONT_SelectObject( dc, handle );
+    case OBJ_REGION: return (HGDIOBJ)SelectClipRgn( dc->hSelf, handle );
+    case OBJ_BITMAP:
+        FIXME("BITMAP not implemented\n");
+        return 1;
     }
-    GDI_ReleaseObj( handle );
-    return ret;
+    return 0;
 }
diff --git a/graphics/win16drv/pen.c b/graphics/win16drv/pen.c
index 4be49de..6f315fa 100644
--- a/graphics/win16drv/pen.c
+++ b/graphics/win16drv/pen.c
@@ -4,7 +4,6 @@
  * Copyright 1997 John Harvey
  */
 
-#include "pen.h"
 #include "win16drv.h"
 #include "heap.h"
 #include "debugtools.h"
@@ -14,18 +13,16 @@
 /***********************************************************************
  *           PEN_SelectObject
  */
-HPEN WIN16DRV_PEN_SelectObject( DC * dc, HPEN hpen, PENOBJ * pen )
+HPEN WIN16DRV_PEN_SelectObject( DC * dc, HPEN hpen )
 {
     WIN16DRV_PDEVICE *physDev = (WIN16DRV_PDEVICE *)dc->physDev;
     HPEN prevHandle = dc->hPen;
     int		 nSize;
     LOGPEN16 	 lPen16;
+
+    if (!GetObject16( hpen, sizeof(lPen16), &lPen16 )) return 0;
+
     dc->hPen = hpen;
-    TRACE("In WIN16DRV_PEN_SelectObject\n");
-    lPen16.lopnStyle   = pen->logpen.lopnStyle;
-    lPen16.lopnWidth.x = pen->logpen.lopnWidth.x;
-    lPen16.lopnWidth.y = pen->logpen.lopnWidth.y;
-    lPen16.lopnColor   = pen->logpen.lopnColor;
 
     if ( physDev->PenInfo )
     {
diff --git a/include/win16drv.h b/include/win16drv.h
index ae3430f..96f00bc 100644
--- a/include/win16drv.h
+++ b/include/win16drv.h
@@ -236,6 +236,10 @@
 					 LPCSTR lpszPort, WORD fwCapability,
 					 LPSTR lpszOutput, LPDEVMODEA lpdm);
 
+extern HBRUSH WIN16DRV_BRUSH_SelectObject( DC * dc, HBRUSH hbrush );
+extern HFONT WIN16DRV_FONT_SelectObject( DC * dc, HFONT hfont );
+extern HPEN WIN16DRV_PEN_SelectObject( DC * dc, HPEN hpen );
+
 /*
  * Wine 16bit driver global variables
  */
