Adapted to the interface/implementation separation.
Now uses ICOM_THIS to access the implementation structures.
Replaced 'this' with 'This' for ICOM_THIS.
Direct access to the virtual table has been eliminated too.

diff --git a/graphics/d3dcommon.c b/graphics/d3dcommon.c
index 007b53e..5a31652 100644
--- a/graphics/d3dcommon.c
+++ b/graphics/d3dcommon.c
@@ -124,7 +124,7 @@
     switch (dwRenderStateType) {
 
     case D3DRENDERSTATE_TEXTUREHANDLE: {    /*  1 */
-      LPDIRECT3DTEXTURE2 tex = (LPDIRECT3DTEXTURE2) dwRenderState;
+      IDirect3DTexture2Impl* tex = (IDirect3DTexture2Impl*) dwRenderState;
       
       if (tex == NULL) {
 	glBindTexture(GL_TEXTURE_2D, 0);
diff --git a/graphics/d3ddevices.c b/graphics/d3ddevices.c
index 4626a17..8ab7d53 100644
--- a/graphics/d3ddevices.c
+++ b/graphics/d3ddevices.c
@@ -39,28 +39,28 @@
 };
 
 
-static IDirect3DDevice2_VTable OpenGL_vtable;
-static IDirect3DDevice_VTable OpenGL_vtable_dx3;
+static ICOM_VTABLE(IDirect3DDevice2) OpenGL_vtable;
+static ICOM_VTABLE(IDirect3DDevice) OpenGL_vtable_dx3;
 
 /*******************************************************************************
  *				OpenGL static functions
  */
-static void set_context(LPDIRECT3DDEVICE2 this) {
-  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) this;
+static void set_context(IDirect3DDevice2Impl* This) {
+  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This;
 
   OSMesaMakeCurrent(odev->ctx, odev->buffer,
 		    GL_UNSIGNED_BYTE,
-		    this->surface->s.surface_desc.dwWidth,
-		    this->surface->s.surface_desc.dwHeight);
+		    This->surface->s.surface_desc.dwWidth,
+		    This->surface->s.surface_desc.dwHeight);
 }
 
-static void set_context_dx3(LPDIRECT3DDEVICE this) {
-  OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) this;
+static void set_context_dx3(IDirect3DDeviceImpl* This) {
+  OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) This;
 
   OSMesaMakeCurrent(odev->ctx, odev->buffer,
 		    GL_UNSIGNED_BYTE,
-		    this->surface->s.surface_desc.dwWidth,
-		    this->surface->s.surface_desc.dwHeight);
+		    This->surface->s.surface_desc.dwWidth,
+		    This->surface->s.surface_desc.dwHeight);
 }
 
 static void fill_opengl_primcaps(D3DPRIMCAPS *pc)
@@ -132,7 +132,7 @@
   return cb((void*)&IID_D3DDEVICE2_OpenGL,"WINE Direct3D using OpenGL","direct3d",&d1,&d2,context);
 }
 
-int is_OpenGL(REFCLSID rguid, LPDIRECTDRAWSURFACE surface, LPDIRECT3DDEVICE2 *device, LPDIRECT3D2 d3d)
+int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d)
 {
   if (/* Default device */
       (rguid == NULL) ||
@@ -193,48 +193,52 @@
  *				Common IDirect3DDevice2
  */
 
-static HRESULT WINAPI IDirect3DDevice2_QueryInterface(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_QueryInterface(LPDIRECT3DDEVICE2 iface,
 						      REFIID riid,
 						      LPVOID* ppvObj)
 {
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
   char xrefiid[50];
   
   WINE_StringFromCLSID((LPCLSID)riid,xrefiid);
-  FIXME(ddraw, "(%p)->(%s,%p): stub\n", this, xrefiid,ppvObj);
+  FIXME(ddraw, "(%p)->(%s,%p): stub\n", This, xrefiid,ppvObj);
   
   return S_OK;
 }
 
 
 
-static ULONG WINAPI IDirect3DDevice2_AddRef(LPDIRECT3DDEVICE2 this)
+static ULONG WINAPI IDirect3DDevice2Impl_AddRef(LPDIRECT3DDEVICE2 iface)
 {
-  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", This, This->ref );
   
-  return ++(this->ref);
+  return ++(This->ref);
 }
 
 
 
-static ULONG WINAPI IDirect3DDevice2_Release(LPDIRECT3DDEVICE2 this)
+static ULONG WINAPI IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface)
 {
-  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
   
-  if (!--(this->ref)) {
-    HeapFree(GetProcessHeap(),0,this);
+  if (!--(This->ref)) {
+    HeapFree(GetProcessHeap(),0,This);
     return 0;
   }
   
-  return this->ref;
+  return This->ref;
 }
 
 
 /*** IDirect3DDevice2 methods ***/
-static HRESULT WINAPI IDirect3DDevice2_GetCaps(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_GetCaps(LPDIRECT3DDEVICE2 iface,
 					       LPD3DDEVICEDESC lpdescsoft,
 					       LPD3DDEVICEDESC lpdeschard)
 {
-  FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lpdescsoft, lpdeschard);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, lpdescsoft, lpdeschard);
   
   fill_opengl_caps(lpdescsoft, lpdeschard);
   
@@ -243,51 +247,57 @@
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_SwapTextureHandles(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_SwapTextureHandles(LPDIRECT3DDEVICE2 iface,
 							  LPDIRECT3DTEXTURE2 lptex1,
 							  LPDIRECT3DTEXTURE2 lptex2)
 {
-  FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lptex1, lptex2);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, lptex1, lptex2);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_GetStats(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_GetStats(LPDIRECT3DDEVICE2 iface,
 						LPD3DSTATS lpstats)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpstats);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpstats);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_AddViewport(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_AddViewport(LPDIRECT3DDEVICE2 iface,
 						   LPDIRECT3DVIEWPORT2 lpvp)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvp);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, ilpvp);
   
   /* Adds this viewport to the viewport list */
-  lpvp->next = this->viewport_list;
-  this->viewport_list = lpvp;
+  ilpvp->next = This->viewport_list;
+  This->viewport_list = ilpvp;
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_DeleteViewport(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_DeleteViewport(LPDIRECT3DDEVICE2 iface,
 						      LPDIRECT3DVIEWPORT2 lpvp)
 {
-  LPDIRECT3DVIEWPORT2 cur, prev;
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvp);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+  IDirect3DViewport2Impl *cur, *prev;
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpvp);
   
   /* Finds this viewport in the list */
   prev = NULL;
-  cur = this->viewport_list;
-  while ((cur != NULL) && (cur != lpvp)) {
+  cur = This->viewport_list;
+  while ((cur != NULL) && (cur != ilpvp)) {
     prev = cur;
     cur = cur->next;
   }
@@ -296,7 +306,7 @@
   
   /* And remove it */
   if (prev == NULL)
-    this->viewport_list = cur->next;
+    This->viewport_list = cur->next;
   else
     prev->next = cur->next;
   
@@ -305,28 +315,31 @@
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_NextViewport(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_NextViewport(LPDIRECT3DDEVICE2 iface,
 						    LPDIRECT3DVIEWPORT2 lpvp,
 						    LPDIRECT3DVIEWPORT2* lplpvp,
 						    DWORD dwFlags)
 {
-  FIXME(ddraw, "(%p)->(%p,%p,%08lx): stub\n", this, lpvp, lpvp, dwFlags);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+  IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp;
+  FIXME(ddraw, "(%p)->(%p,%p,%08lx): stub\n", This, lpvp, lpvp, dwFlags);
   
   switch (dwFlags) {
   case D3DNEXT_NEXT:
-    *lplpvp = lpvp->next;
+    *ilplpvp = ilpvp->next;
     break;
     
   case D3DNEXT_HEAD:
-    *lplpvp = this->viewport_list;
+    *ilplpvp = This->viewport_list;
     break;
     
   case D3DNEXT_TAIL:
-    lpvp = this->viewport_list;
-    while (lpvp->next != NULL)
-      lpvp = lpvp->next;
+    ilpvp = This->viewport_list;
+    while (ilpvp->next != NULL)
+      ilpvp = ilpvp->next;
     
-    *lplpvp = lpvp;
+    *ilplpvp = ilpvp;
     break;
     
   default:
@@ -428,22 +441,24 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DDevice2_EnumTextureFormats(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_EnumTextureFormats(LPDIRECT3DDEVICE2 iface,
 							  LPD3DENUMTEXTUREFORMATSCALLBACK cb,
 							  LPVOID context)
 {
-  FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, cb, context);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, cb, context);
   
   return enum_texture_format_OpenGL(cb, context);
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_BeginScene(LPDIRECT3DDEVICE2 this)
+static HRESULT WINAPI IDirect3DDevice2Impl_BeginScene(LPDIRECT3DDEVICE2 iface)
 {
-  /* OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) this; */
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  /* OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This; */
   
-  FIXME(ddraw, "(%p)->(): stub\n", this);
+  FIXME(ddraw, "(%p)->(): stub\n", This);
   
   /* Here, we should get the DDraw surface and 'copy it' to the
      OpenGL surface.... */
@@ -453,20 +468,21 @@
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_EndScene(LPDIRECT3DDEVICE2 this)
+static HRESULT WINAPI IDirect3DDevice2Impl_EndScene(LPDIRECT3DDEVICE2 iface)
 {
-  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) this;
-  LPDIRECTDRAWSURFACE3 surf = (LPDIRECTDRAWSURFACE3) this->surface;
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This;
+  LPDIRECTDRAWSURFACE3 surf = (LPDIRECTDRAWSURFACE3) This->surface;
   DDSURFACEDESC sdesc;
   int x,y;
   unsigned char *src;
   unsigned short *dest;
   
-  FIXME(ddraw, "(%p)->(): stub\n", this);
+  FIXME(ddraw, "(%p)->(): stub\n", This);
 
   /* Here we copy back the OpenGL scene to the the DDraw surface */
   /* First, lock the surface */
-  surf->lpvtbl->fnLock(surf,NULL,&sdesc,DDLOCK_WRITEONLY,0);
+  IDirectDrawSurface3_Lock(surf,NULL,&sdesc,DDLOCK_WRITEONLY,0);
 
   /* The copy the OpenGL buffer to this surface */
   
@@ -493,18 +509,19 @@
   }
 
   /* Unlock the surface */
-  surf->lpvtbl->fnUnlock(surf,sdesc.y.lpSurface);
+  IDirectDrawSurface3_Unlock(surf,sdesc.y.lpSurface);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_GetDirect3D(LPDIRECT3DDEVICE2 this, LPDIRECT3D2 *lpd3d2)
+static HRESULT WINAPI IDirect3DDevice2Impl_GetDirect3D(LPDIRECT3DDEVICE2 iface, LPDIRECT3D2 *lpd3d2)
 {
-  TRACE(ddraw, "(%p)->(%p): stub\n", this, lpd3d2);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p): stub\n", This, lpd3d2);
   
-  *lpd3d2 = this->d3d;
+  *lpd3d2 = (LPDIRECT3D2)This->d3d;
   
   return DD_OK;
 }
@@ -512,112 +529,122 @@
 
 
 /*** DrawPrimitive API ***/
-static HRESULT WINAPI IDirect3DDevice2_SetCurrentViewport(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_SetCurrentViewport(LPDIRECT3DDEVICE2 iface,
 							  LPDIRECT3DVIEWPORT2 lpvp)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvp);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, ilpvp);
   
   /* Should check if the viewport was added or not */
   
   /* Set this viewport as the current viewport */
-  this->current_viewport = lpvp;
+  This->current_viewport = ilpvp;
   
   /* Activate this viewport */
-  lpvp->device.active_device2 = this;
-  lpvp->activate(lpvp);
+  ilpvp->device.active_device2 = This;
+  ilpvp->activate(ilpvp);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_GetCurrentViewport(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_GetCurrentViewport(LPDIRECT3DDEVICE2 iface,
 							  LPDIRECT3DVIEWPORT2 *lplpvp)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lplpvp);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lplpvp);
   
   /* Returns the current viewport */
-  *lplpvp = this->current_viewport;
+  *lplpvp = (LPDIRECT3DVIEWPORT2)This->current_viewport;
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_SetRenderTarget(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_SetRenderTarget(LPDIRECT3DDEVICE2 iface,
 						       LPDIRECTDRAWSURFACE lpdds,
 						       DWORD dwFlags)
 {
-  FIXME(ddraw, "(%p)->(%p,%08lx): stub\n", this, lpdds, dwFlags);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%08lx): stub\n", This, lpdds, dwFlags);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_GetRenderTarget(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_GetRenderTarget(LPDIRECT3DDEVICE2 iface,
 						       LPDIRECTDRAWSURFACE *lplpdds)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lplpdds);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lplpdds);
   
   /* Returns the current rendering target (the surface on wich we render) */
-  *lplpdds = this->surface;
+  *lplpdds = (LPDIRECTDRAWSURFACE)This->surface;
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_Begin(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_Begin(LPDIRECT3DDEVICE2 iface,
 					     D3DPRIMITIVETYPE d3dp,
 					     D3DVERTEXTYPE d3dv,
 					     DWORD dwFlags)
 {
-  FIXME(ddraw, "(%p)->(%d,%d,%08lx): stub\n", this, d3dp, d3dv, dwFlags);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%d,%d,%08lx): stub\n", This, d3dp, d3dv, dwFlags);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_BeginIndexed(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_BeginIndexed(LPDIRECT3DDEVICE2 iface,
 						    D3DPRIMITIVETYPE d3dp,
 						    D3DVERTEXTYPE d3dv,
 						    LPVOID lpvert,
 						    DWORD numvert,
 						    DWORD dwFlags)
 {
-  FIXME(ddraw, "(%p)->(%d,%d,%p,%ld,%08lx): stub\n", this, d3dp, d3dv, lpvert, numvert, dwFlags);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvert, numvert, dwFlags);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_Vertex(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_Vertex(LPDIRECT3DDEVICE2 iface,
 					      LPVOID lpvert)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvert);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpvert);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_Index(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_Index(LPDIRECT3DDEVICE2 iface,
 					     WORD index)
 {
-  FIXME(ddraw, "(%p)->(%d): stub\n", this, index);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%d): stub\n", This, index);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_End(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_End(LPDIRECT3DDEVICE2 iface,
 					   DWORD dwFlags)
 {
-  FIXME(ddraw, "(%p)->(%08lx): stub\n", this, dwFlags);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%08lx): stub\n", This, dwFlags);
   
   return DD_OK;
 }
@@ -625,24 +652,26 @@
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_GetRenderState(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_GetRenderState(LPDIRECT3DDEVICE2 iface,
 						      D3DRENDERSTATETYPE d3drs,
 						      LPDWORD lprstate)
 {
-  FIXME(ddraw, "(%p)->(%d,%p): stub\n", this, d3drs, lprstate);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%d,%p): stub\n", This, d3drs, lprstate);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_SetRenderState(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_SetRenderState(LPDIRECT3DDEVICE2 iface,
 						      D3DRENDERSTATETYPE dwRenderStateType,
 						      DWORD dwRenderState)
 {
-  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) this;
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This;
 
-  TRACE(ddraw, "(%p)->(%d,%ld)\n", this, dwRenderStateType, dwRenderState);
+  TRACE(ddraw, "(%p)->(%d,%ld)\n", This, dwRenderStateType, dwRenderState);
   
   /* Call the render state functions */
   set_render_state(dwRenderStateType, dwRenderState, &(odev->rs));
@@ -652,26 +681,28 @@
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_GetLightState(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_GetLightState(LPDIRECT3DDEVICE2 iface,
 						     D3DLIGHTSTATETYPE d3dls,
 						     LPDWORD lplstate)
 {
-  FIXME(ddraw, "(%p)->(%d,%p): stub\n", this, d3dls, lplstate);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%d,%p): stub\n", This, d3dls, lplstate);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_SetLightState(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_SetLightState(LPDIRECT3DDEVICE2 iface,
 						     D3DLIGHTSTATETYPE dwLightStateType,
 						     DWORD dwLightState)
 {
-  FIXME(ddraw, "(%p)->(%d,%08lx): stub\n", this, dwLightStateType, dwLightState);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%d,%08lx): stub\n", This, dwLightStateType, dwLightState);
   
   switch (dwLightStateType) {
   case D3DLIGHTSTATE_MATERIAL: {  /* 1 */
-    LPDIRECT3DMATERIAL2 mat = (LPDIRECT3DMATERIAL2) dwLightState;
+    IDirect3DMaterial2Impl* mat = (IDirect3DMaterial2Impl*) dwLightState;
     
     if (mat != NULL) {
       mat->activate(mat);
@@ -715,13 +746,14 @@
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_SetTransform(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_SetTransform(LPDIRECT3DDEVICE2 iface,
 						    D3DTRANSFORMSTATETYPE d3dts,
 						    LPD3DMATRIX lpmatrix)
 {
-  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) this;
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This;
   
-  FIXME(ddraw, "(%p)->(%d,%p): stub\n", this, d3dts, lpmatrix);
+  FIXME(ddraw, "(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix);
   
   /* Using a trial and failure approach, I found that the order of 
      Direct3D transformations that works best is :
@@ -784,22 +816,24 @@
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_GetTransform(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_GetTransform(LPDIRECT3DDEVICE2 iface,
 						    D3DTRANSFORMSTATETYPE d3dts,
 						    LPD3DMATRIX lpmatrix)
 {
-  FIXME(ddraw, "(%p)->(%d,%p): stub\n", this, d3dts, lpmatrix);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_MultiplyTransform(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_MultiplyTransform(LPDIRECT3DDEVICE2 iface,
 							 D3DTRANSFORMSTATETYPE d3dts,
 							 LPD3DMATRIX lpmatrix)
 {
-  FIXME(ddraw, "(%p)->(%d,%p): stub\n", this, d3dts, lpmatrix);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix);
   
   return DD_OK;
 }
@@ -840,7 +874,7 @@
       glMatrixMode(GL_PROJECTION);						\
       glLoadIdentity();								\
 										\
-      if (this->current_viewport == NULL) {					\
+      if (This->current_viewport == NULL) {					\
 	ERR(ddraw, "No current viewport !\n");					\
 	/* Using standard values */						\
 	height = 640.0;								\
@@ -848,16 +882,16 @@
 	minZ = -10.0;								\
 	maxZ = 10.0;								\
       } else {									\
-	if (this->current_viewport->use_vp2) {					\
-	  height = (GLdouble) this->current_viewport->viewport.vp2.dwHeight;	\
-	  width  = (GLdouble) this->current_viewport->viewport.vp2.dwWidth;	\
-	  minZ   = (GLdouble) this->current_viewport->viewport.vp2.dvMinZ;	\
-	  maxZ   = (GLdouble) this->current_viewport->viewport.vp2.dvMaxZ;	\
+	if (This->current_viewport->use_vp2) {					\
+	  height = (GLdouble) This->current_viewport->viewport.vp2.dwHeight;	\
+	  width  = (GLdouble) This->current_viewport->viewport.vp2.dwWidth;	\
+	  minZ   = (GLdouble) This->current_viewport->viewport.vp2.dvMinZ;	\
+	  maxZ   = (GLdouble) This->current_viewport->viewport.vp2.dvMaxZ;	\
 	} else {								\
-	  height = (GLdouble) this->current_viewport->viewport.vp1.dwHeight;	\
-	  width  = (GLdouble) this->current_viewport->viewport.vp1.dwWidth;	\
-	  minZ   = (GLdouble) this->current_viewport->viewport.vp1.dvMinZ;	\
-	  maxZ   = (GLdouble) this->current_viewport->viewport.vp1.dvMaxZ;	\
+	  height = (GLdouble) This->current_viewport->viewport.vp1.dwHeight;	\
+	  width  = (GLdouble) This->current_viewport->viewport.vp1.dwWidth;	\
+	  minZ   = (GLdouble) This->current_viewport->viewport.vp1.dvMinZ;	\
+	  maxZ   = (GLdouble) This->current_viewport->viewport.vp1.dvMaxZ;	\
 	}									\
       }										\
 										\
@@ -965,17 +999,18 @@
   TRACE(ddraw, "End\n");
 
 
-static HRESULT WINAPI IDirect3DDevice2_DrawPrimitive(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_DrawPrimitive(LPDIRECT3DDEVICE2 iface,
 						     D3DPRIMITIVETYPE d3dp,
 						     D3DVERTEXTYPE d3dv,
 						     LPVOID lpvertex,
 						     DWORD vertcount,
 						     DWORD dwFlags)
 {
-  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) this;
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This;
   int vx_index;
   
-  TRACE(ddraw, "(%p)->(%d,%d,%p,%ld,%08lx): stub\n", this, d3dp, d3dv, lpvertex, vertcount, dwFlags);
+  TRACE(ddraw, "(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, dwFlags);
 
   DRAW_PRIMITIVE(vertcount, vx_index);
     
@@ -984,7 +1019,7 @@
     
 
       
-static HRESULT WINAPI IDirect3DDevice2_DrawIndexedPrimitive(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_DrawIndexedPrimitive(LPDIRECT3DDEVICE2 iface,
 							    D3DPRIMITIVETYPE d3dp,
 							    D3DVERTEXTYPE d3dv,
 							    LPVOID lpvertex,
@@ -993,10 +1028,11 @@
 							    DWORD indexcount,
 							    DWORD dwFlags)
 {
-  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) this;
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  OpenGL_IDirect3DDevice2 *odev = (OpenGL_IDirect3DDevice2 *) This;
   int vx_index;
   
-  TRACE(ddraw, "(%p)->(%d,%d,%p,%ld,%p,%ld,%08lx): stub\n", this, d3dp, d3dv, lpvertex, vertcount, lpindexes, indexcount, dwFlags);
+  TRACE(ddraw, "(%p)->(%d,%d,%p,%ld,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, lpindexes, indexcount, dwFlags);
   
   DRAW_PRIMITIVE(indexcount, lpindexes[vx_index]);
   
@@ -1005,20 +1041,22 @@
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_SetClipStatus(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_SetClipStatus(LPDIRECT3DDEVICE2 iface,
 						     LPD3DCLIPSTATUS lpcs)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpcs);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpcs);
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice2_GetClipStatus(LPDIRECT3DDEVICE2 this,
+static HRESULT WINAPI IDirect3DDevice2Impl_GetClipStatus(LPDIRECT3DDEVICE2 iface,
 						     LPD3DCLIPSTATUS lpcs)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpcs);
+  ICOM_THIS(IDirect3DDevice2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpcs);
   
   return DD_OK;
 }
@@ -1033,48 +1071,48 @@
  *				OpenGL-specific VTable
  */
 
-static IDirect3DDevice2_VTable OpenGL_vtable = {
-  IDirect3DDevice2_QueryInterface,
-  IDirect3DDevice2_AddRef,
-  IDirect3DDevice2_Release,
+static ICOM_VTABLE(IDirect3DDevice2) OpenGL_vtable = {
+  IDirect3DDevice2Impl_QueryInterface,
+  IDirect3DDevice2Impl_AddRef,
+  IDirect3DDevice2Impl_Release,
   /*** IDirect3DDevice2 methods ***/
-  IDirect3DDevice2_GetCaps,
-  IDirect3DDevice2_SwapTextureHandles,
-  IDirect3DDevice2_GetStats,
-  IDirect3DDevice2_AddViewport,
-  IDirect3DDevice2_DeleteViewport,
-  IDirect3DDevice2_NextViewport,
-  IDirect3DDevice2_EnumTextureFormats,
-  IDirect3DDevice2_BeginScene,
-  IDirect3DDevice2_EndScene,
-  IDirect3DDevice2_GetDirect3D,
+  IDirect3DDevice2Impl_GetCaps,
+  IDirect3DDevice2Impl_SwapTextureHandles,
+  IDirect3DDevice2Impl_GetStats,
+  IDirect3DDevice2Impl_AddViewport,
+  IDirect3DDevice2Impl_DeleteViewport,
+  IDirect3DDevice2Impl_NextViewport,
+  IDirect3DDevice2Impl_EnumTextureFormats,
+  IDirect3DDevice2Impl_BeginScene,
+  IDirect3DDevice2Impl_EndScene,
+  IDirect3DDevice2Impl_GetDirect3D,
   
   /*** DrawPrimitive API ***/
-  IDirect3DDevice2_SetCurrentViewport,
-  IDirect3DDevice2_GetCurrentViewport,
+  IDirect3DDevice2Impl_SetCurrentViewport,
+  IDirect3DDevice2Impl_GetCurrentViewport,
   
-  IDirect3DDevice2_SetRenderTarget,
-  IDirect3DDevice2_GetRenderTarget,
+  IDirect3DDevice2Impl_SetRenderTarget,
+  IDirect3DDevice2Impl_GetRenderTarget,
   
-  IDirect3DDevice2_Begin,
-  IDirect3DDevice2_BeginIndexed,
-  IDirect3DDevice2_Vertex,
-  IDirect3DDevice2_Index,
-  IDirect3DDevice2_End,
+  IDirect3DDevice2Impl_Begin,
+  IDirect3DDevice2Impl_BeginIndexed,
+  IDirect3DDevice2Impl_Vertex,
+  IDirect3DDevice2Impl_Index,
+  IDirect3DDevice2Impl_End,
   
-  IDirect3DDevice2_GetRenderState,
-  IDirect3DDevice2_SetRenderState,
-  IDirect3DDevice2_GetLightState,
-  IDirect3DDevice2_SetLightState,
-  IDirect3DDevice2_SetTransform,
-  IDirect3DDevice2_GetTransform,
-  IDirect3DDevice2_MultiplyTransform,
+  IDirect3DDevice2Impl_GetRenderState,
+  IDirect3DDevice2Impl_SetRenderState,
+  IDirect3DDevice2Impl_GetLightState,
+  IDirect3DDevice2Impl_SetLightState,
+  IDirect3DDevice2Impl_SetTransform,
+  IDirect3DDevice2Impl_GetTransform,
+  IDirect3DDevice2Impl_MultiplyTransform,
   
-  IDirect3DDevice2_DrawPrimitive,
-  IDirect3DDevice2_DrawIndexedPrimitive,
+  IDirect3DDevice2Impl_DrawPrimitive,
+  IDirect3DDevice2Impl_DrawIndexedPrimitive,
   
-  IDirect3DDevice2_SetClipStatus,
-  IDirect3DDevice2_GetClipStatus,
+  IDirect3DDevice2Impl_SetClipStatus,
+  IDirect3DDevice2Impl_GetClipStatus,
 };
 
 /*******************************************************************************
@@ -1097,7 +1135,7 @@
   0.0, 0.0, 0.0, 1.0
 };
 
-int is_OpenGL_dx3(REFCLSID rguid, LPDIRECTDRAWSURFACE surface, LPDIRECT3DDEVICE *device)
+int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDeviceImpl** device)
 {
   if (!memcmp(&IID_D3DDEVICE_OpenGL,rguid,sizeof(IID_D3DDEVICE_OpenGL))) {
     OpenGL_IDirect3DDevice *odev;
@@ -1145,57 +1183,62 @@
 /*******************************************************************************
  *				Direct3DDevice
  */
-static HRESULT WINAPI IDirect3DDevice_QueryInterface(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_QueryInterface(LPDIRECT3DDEVICE iface,
 						     REFIID riid,
 						     LPVOID* ppvObj)
 {
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
   char xrefiid[50];
   
   WINE_StringFromCLSID((LPCLSID)riid,xrefiid);
-  FIXME(ddraw, "(%p)->(%s,%p): stub\n", this, xrefiid,ppvObj);
+  FIXME(ddraw, "(%p)->(%s,%p): stub\n", This, xrefiid,ppvObj);
   
   return S_OK;
 }
 
 
 
-static ULONG WINAPI IDirect3DDevice_AddRef(LPDIRECT3DDEVICE this)
+static ULONG WINAPI IDirect3DDeviceImpl_AddRef(LPDIRECT3DDEVICE iface)
 {
-  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", This, This->ref );
   
-  return ++(this->ref);
+  return ++(This->ref);
 }
 
 
 
-static ULONG WINAPI IDirect3DDevice_Release(LPDIRECT3DDEVICE this)
+static ULONG WINAPI IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface)
 {
-  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
   
-  if (!--(this->ref)) {
-    HeapFree(GetProcessHeap(),0,this);
+  if (!--(This->ref)) {
+    HeapFree(GetProcessHeap(),0,This);
     return 0;
   }
   
-  return this->ref;
+  return This->ref;
 }
 
-static HRESULT WINAPI IDirect3DDevice_Initialize(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_Initialize(LPDIRECT3DDEVICE iface,
 						 LPDIRECT3D lpd3d,
 						 LPGUID lpGUID,
 						 LPD3DDEVICEDESC lpd3ddvdesc)
 {
-  TRACE(ddraw, "(%p)->(%p,%p,%p): stub\n", this, lpd3d,lpGUID, lpd3ddvdesc);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p,%p): stub\n", This, lpd3d,lpGUID, lpd3ddvdesc);
   
   return DDERR_ALREADYINITIALIZED;
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_GetCaps(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_GetCaps(LPDIRECT3DDEVICE iface,
 					      LPD3DDEVICEDESC lpD3DHWDevDesc,
 					      LPD3DDEVICEDESC lpD3DSWDevDesc)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpD3DHWDevDesc, lpD3DSWDevDesc);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpD3DHWDevDesc, lpD3DSWDevDesc);
 
   fill_opengl_caps(lpD3DHWDevDesc, lpD3DSWDevDesc);  
   
@@ -1203,76 +1246,84 @@
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_SwapTextureHandles(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_SwapTextureHandles(LPDIRECT3DDEVICE iface,
 							 LPDIRECT3DTEXTURE lpD3DTex1,
 							 LPDIRECT3DTEXTURE lpD3DTex2)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpD3DTex1, lpD3DTex2);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpD3DTex1, lpD3DTex2);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DDevice_CreateExecuteBuffer(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_CreateExecuteBuffer(LPDIRECT3DDEVICE iface,
 							  LPD3DEXECUTEBUFFERDESC lpDesc,
 							  LPDIRECT3DEXECUTEBUFFER *lplpDirect3DExecuteBuffer,
 							  IUnknown *pUnkOuter)
 {
-  TRACE(ddraw, "(%p)->(%p,%p,%p)\n", this, lpDesc, lplpDirect3DExecuteBuffer, pUnkOuter);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p,%p)\n", This, lpDesc, lplpDirect3DExecuteBuffer, pUnkOuter);
 
-  *lplpDirect3DExecuteBuffer = d3dexecutebuffer_create(this, lpDesc);
+  *lplpDirect3DExecuteBuffer = d3dexecutebuffer_create(This, lpDesc);
   
   return DD_OK;
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_GetStats(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_GetStats(LPDIRECT3DDEVICE iface,
 					       LPD3DSTATS lpD3DStats)
 {
-  TRACE(ddraw, "(%p)->(%p): stub\n", this, lpD3DStats);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p): stub\n", This, lpD3DStats);
   
   return DD_OK;
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_Execute(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_Execute(LPDIRECT3DDEVICE iface,
 					      LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
 					      LPDIRECT3DVIEWPORT lpDirect3DViewport,
 					      DWORD dwFlags)
 {
-  TRACE(ddraw, "(%p)->(%p,%p,%08ld): stub\n", this, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p,%08ld): stub\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags);
 
   /* Put this as the default context */
 
   /* Execute... */
-  lpDirect3DExecuteBuffer->execute(lpDirect3DExecuteBuffer, this, lpDirect3DViewport);
+  ((IDirect3DExecuteBufferImpl*)lpDirect3DExecuteBuffer)->execute(lpDirect3DExecuteBuffer, iface, lpDirect3DViewport);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DDevice_AddViewport(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_AddViewport(LPDIRECT3DDEVICE iface,
 						  LPDIRECT3DVIEWPORT lpvp)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvp);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, ilpvp);
   
   /* Adds this viewport to the viewport list */
-  lpvp->next = this->viewport_list;
-  this->viewport_list = lpvp;
+  ilpvp->next = This->viewport_list;
+  This->viewport_list = ilpvp;
   
   return DD_OK;
 }
 
 
 
-static HRESULT WINAPI IDirect3DDevice_DeleteViewport(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_DeleteViewport(LPDIRECT3DDEVICE iface,
 						     LPDIRECT3DVIEWPORT lpvp)
 {
-  LPDIRECT3DVIEWPORT cur, prev;
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvp);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+  IDirect3DViewport2Impl *cur, *prev;
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpvp);
   
   /* Finds this viewport in the list */
   prev = NULL;
-  cur = this->viewport_list;
-  while ((cur != NULL) && (cur != lpvp)) {
+  cur = This->viewport_list;
+  while ((cur != NULL) && (cur != ilpvp)) {
     prev = cur;
     cur = cur->next;
   }
@@ -1281,7 +1332,7 @@
   
   /* And remove it */
   if (prev == NULL)
-    this->viewport_list = cur->next;
+    This->viewport_list = cur->next;
   else
     prev->next = cur->next;
   
@@ -1290,28 +1341,31 @@
 
 
 
-static HRESULT WINAPI IDirect3DDevice_NextViewport(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_NextViewport(LPDIRECT3DDEVICE iface,
 						   LPDIRECT3DVIEWPORT lpvp,
 						   LPDIRECT3DVIEWPORT* lplpvp,
 						   DWORD dwFlags)
 {
-  FIXME(ddraw, "(%p)->(%p,%p,%08lx): stub\n", this, lpvp, lpvp, dwFlags);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
+  IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp;
+  FIXME(ddraw, "(%p)->(%p,%p,%08lx): stub\n", This, ilpvp, ilplpvp, dwFlags);
   
   switch (dwFlags) {
   case D3DNEXT_NEXT:
-    *lplpvp = lpvp->next;
+    *ilplpvp = ilpvp->next;
     break;
     
   case D3DNEXT_HEAD:
-    *lplpvp = this->viewport_list;
+    *ilplpvp = This->viewport_list;
     break;
     
   case D3DNEXT_TAIL:
-    lpvp = this->viewport_list;
-    while (lpvp->next != NULL)
-      lpvp = lpvp->next;
+    ilpvp = This->viewport_list;
+    while (ilpvp->next != NULL)
+      ilpvp = ilpvp->next;
     
-    *lplpvp = lpvp;
+    *ilplpvp = ilpvp;
     break;
     
   default:
@@ -1321,43 +1375,47 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DDevice_Pick(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_Pick(LPDIRECT3DDEVICE iface,
 					   LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
 					   LPDIRECT3DVIEWPORT lpDirect3DViewport,
 					   DWORD dwFlags,
 					   LPD3DRECT lpRect)
 {
-  TRACE(ddraw, "(%p)->(%p,%p,%08lx,%p): stub\n", this, lpDirect3DExecuteBuffer, lpDirect3DViewport,
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p,%08lx,%p): stub\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport,
 	dwFlags, lpRect);
   
   return DD_OK;
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_GetPickRecords(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_GetPickRecords(LPDIRECT3DDEVICE iface,
 						     LPDWORD lpCount,
 						     LPD3DPICKRECORD lpD3DPickRec)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpCount, lpD3DPickRec);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpCount, lpD3DPickRec);
   
   return DD_OK;
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_EnumTextureFormats(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_EnumTextureFormats(LPDIRECT3DDEVICE iface,
 							 LPD3DENUMTEXTUREFORMATSCALLBACK lpd3dEnumTextureProc,
 							 LPVOID lpArg)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpd3dEnumTextureProc, lpArg);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpd3dEnumTextureProc, lpArg);
   
   return enum_texture_format_OpenGL(lpd3dEnumTextureProc, lpArg);
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_CreateMatrix(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_CreateMatrix(LPDIRECT3DDEVICE iface,
 						   LPD3DMATRIXHANDLE lpD3DMatHandle)
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpD3DMatHandle);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpD3DMatHandle);
 
   *lpD3DMatHandle = (D3DMATRIXHANDLE) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(D3DMATRIX));
   
@@ -1365,11 +1423,12 @@
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_SetMatrix(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_SetMatrix(LPDIRECT3DDEVICE iface,
 						D3DMATRIXHANDLE d3dMatHandle,
 						const LPD3DMATRIX lpD3DMatrix)
 {
-  TRACE(ddraw, "(%p)->(%08lx,%p)\n", this, d3dMatHandle, lpD3DMatrix);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%08lx,%p)\n", This, d3dMatHandle, lpD3DMatrix);
 
   dump_mat(lpD3DMatrix);
   
@@ -1379,11 +1438,12 @@
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_GetMatrix(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_GetMatrix(LPDIRECT3DDEVICE iface,
 						D3DMATRIXHANDLE D3DMatHandle,
 						LPD3DMATRIX lpD3DMatrix)
 {
-  TRACE(ddraw, "(%p)->(%08lx,%p)\n", this, D3DMatHandle, lpD3DMatrix);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%08lx,%p)\n", This, D3DMatHandle, lpD3DMatrix);
 
   *lpD3DMatrix = *((D3DMATRIX *) D3DMatHandle);
   
@@ -1391,10 +1451,11 @@
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_DeleteMatrix(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_DeleteMatrix(LPDIRECT3DDEVICE iface,
 						   D3DMATRIXHANDLE d3dMatHandle)
 {
-  TRACE(ddraw, "(%p)->(%08lx)\n", this, d3dMatHandle);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%08lx)\n", This, d3dMatHandle);
 
   HeapFree(GetProcessHeap(),0, (void *) d3dMatHandle);
   
@@ -1402,14 +1463,15 @@
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_BeginScene(LPDIRECT3DDEVICE this)
+static HRESULT WINAPI IDirect3DDeviceImpl_BeginScene(LPDIRECT3DDEVICE iface)
 {
-  /* OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) this; */
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  /* OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) This; */
   
-  FIXME(ddraw, "(%p)->(): stub\n", this);
+  FIXME(ddraw, "(%p)->(): stub\n", This);
   
   /* We get the pointer to the surface (should be done on flip) */
-  /* odev->zb->pbuf = this->surface->s.surface_desc.y.lpSurface; */
+  /* odev->zb->pbuf = This->surface->s.surface_desc.y.lpSurface; */
   
   return DD_OK;
 }
@@ -1417,20 +1479,21 @@
 
 /* This is for the moment copy-pasted from IDirect3DDevice2...
    Will make a common function ... */
-static HRESULT WINAPI IDirect3DDevice_EndScene(LPDIRECT3DDEVICE this)
+static HRESULT WINAPI IDirect3DDeviceImpl_EndScene(LPDIRECT3DDEVICE iface)
 {
-  OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) this;
-  LPDIRECTDRAWSURFACE3 surf = (LPDIRECTDRAWSURFACE3) this->surface;
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) This;
+  LPDIRECTDRAWSURFACE3 surf = (LPDIRECTDRAWSURFACE3) This->surface;
   DDSURFACEDESC sdesc;
   int x,y;
   unsigned char *src;
   unsigned short *dest;
   
-  FIXME(ddraw, "(%p)->(): stub\n", this);
+  FIXME(ddraw, "(%p)->(): stub\n", This);
 
   /* Here we copy back the OpenGL scene to the the DDraw surface */
   /* First, lock the surface */
-  surf->lpvtbl->fnLock(surf,NULL,&sdesc,DDLOCK_WRITEONLY,0);
+  IDirectDrawSurface3_Lock(surf,NULL,&sdesc,DDLOCK_WRITEONLY,0);
 
   /* The copy the OpenGL buffer to this surface */
   
@@ -1458,16 +1521,17 @@
   }
 
   /* Unlock the surface */
-  surf->lpvtbl->fnUnlock(surf,sdesc.y.lpSurface);
+  IDirectDrawSurface3_Unlock(surf,sdesc.y.lpSurface);
   
   return DD_OK;  
 }
 
 
-static HRESULT WINAPI IDirect3DDevice_GetDirect3D(LPDIRECT3DDEVICE this,
+static HRESULT WINAPI IDirect3DDeviceImpl_GetDirect3D(LPDIRECT3DDEVICE iface,
 						  LPDIRECT3D *lpDirect3D)
 {
-  TRACE(ddraw, "(%p)->(%p): stub\n", this, lpDirect3D);
+  ICOM_THIS(IDirect3DDeviceImpl,iface);
+  TRACE(ddraw, "(%p)->(%p): stub\n", This, lpDirect3D);
 
   return DD_OK;
 }
@@ -1477,29 +1541,29 @@
 /*******************************************************************************
  *				Direct3DDevice VTable
  */
-static IDirect3DDevice_VTable OpenGL_vtable_dx3 = {
-  IDirect3DDevice_QueryInterface,
-  IDirect3DDevice_AddRef,
-  IDirect3DDevice_Release,
-  IDirect3DDevice_Initialize,
-  IDirect3DDevice_GetCaps,
-  IDirect3DDevice_SwapTextureHandles,
-  IDirect3DDevice_CreateExecuteBuffer,
-  IDirect3DDevice_GetStats,
-  IDirect3DDevice_Execute,
-  IDirect3DDevice_AddViewport,
-  IDirect3DDevice_DeleteViewport,
-  IDirect3DDevice_NextViewport,
-  IDirect3DDevice_Pick,
-  IDirect3DDevice_GetPickRecords,
-  IDirect3DDevice_EnumTextureFormats,
-  IDirect3DDevice_CreateMatrix,
-  IDirect3DDevice_SetMatrix,
-  IDirect3DDevice_GetMatrix,
-  IDirect3DDevice_DeleteMatrix,
-  IDirect3DDevice_BeginScene,
-  IDirect3DDevice_EndScene,
-  IDirect3DDevice_GetDirect3D,
+static ICOM_VTABLE(IDirect3DDevice) OpenGL_vtable_dx3 = {
+  IDirect3DDeviceImpl_QueryInterface,
+  IDirect3DDeviceImpl_AddRef,
+  IDirect3DDeviceImpl_Release,
+  IDirect3DDeviceImpl_Initialize,
+  IDirect3DDeviceImpl_GetCaps,
+  IDirect3DDeviceImpl_SwapTextureHandles,
+  IDirect3DDeviceImpl_CreateExecuteBuffer,
+  IDirect3DDeviceImpl_GetStats,
+  IDirect3DDeviceImpl_Execute,
+  IDirect3DDeviceImpl_AddViewport,
+  IDirect3DDeviceImpl_DeleteViewport,
+  IDirect3DDeviceImpl_NextViewport,
+  IDirect3DDeviceImpl_Pick,
+  IDirect3DDeviceImpl_GetPickRecords,
+  IDirect3DDeviceImpl_EnumTextureFormats,
+  IDirect3DDeviceImpl_CreateMatrix,
+  IDirect3DDeviceImpl_SetMatrix,
+  IDirect3DDeviceImpl_GetMatrix,
+  IDirect3DDeviceImpl_DeleteMatrix,
+  IDirect3DDeviceImpl_BeginScene,
+  IDirect3DDeviceImpl_EndScene,
+  IDirect3DDeviceImpl_GetDirect3D,
 };
 
 #else /* HAVE_MESAGL */
@@ -1508,7 +1572,7 @@
   return 0;
 }
 
-int is_OpenGL(REFCLSID rguid, LPDIRECTDRAWSURFACE surface, LPDIRECT3DDEVICE2 *device, LPDIRECT3D2 d3d)
+int is_OpenGL(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d)
 {
   return 0;
 }
@@ -1517,7 +1581,7 @@
   return 0;
 }
 
-int is_OpenGL_dx3(REFCLSID rguid, LPDIRECTDRAWSURFACE surface, LPDIRECT3DDEVICE *device)
+int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDeviceImpl** device)
 {
   return 0;
 }
diff --git a/graphics/d3dexecutebuffer.c b/graphics/d3dexecutebuffer.c
index 0b3d21e..4539ec1 100644
--- a/graphics/d3dexecutebuffer.c
+++ b/graphics/d3dexecutebuffer.c
@@ -46,7 +46,7 @@
   D3DVALUE v;
 } OGL_LVertex;
 
-static IDirect3DExecuteBuffer_VTable executebuffer_vtable;
+static ICOM_VTABLE(IDirect3DExecuteBuffer) executebuffer_vtable;
 
 /*******************************************************************************
  *				ExecuteBuffer static functions
@@ -169,18 +169,20 @@
 static void execute(LPDIRECT3DEXECUTEBUFFER lpBuff,
 		    LPDIRECT3DDEVICE dev,
 		    LPDIRECT3DVIEWPORT vp) {
-  /* DWORD bs = lpBuff->desc.dwBufferSize; */
-  DWORD vs = lpBuff->data.dwVertexOffset;
-  /* DWORD vc = lpBuff->data.dwVertexCount; */
-  DWORD is = lpBuff->data.dwInstructionOffset;
-  /* DWORD il = lpBuff->data.dwInstructionLength; */
+  IDirect3DExecuteBufferImpl* ilpBuff=(IDirect3DExecuteBufferImpl*)lpBuff;
+  IDirect3DViewport2Impl* ivp=(IDirect3DViewport2Impl*)vp;
+  /* DWORD bs = ilpBuff->desc.dwBufferSize; */
+  DWORD vs = ilpBuff->data.dwVertexOffset;
+  /* DWORD vc = ilpBuff->data.dwVertexCount; */
+  DWORD is = ilpBuff->data.dwInstructionOffset;
+  /* DWORD il = ilpBuff->data.dwInstructionLength; */
   
-  void *instr = lpBuff->desc.lpData + is;
+  void *instr = ilpBuff->desc.lpData + is;
   OpenGL_IDirect3DDevice *odev = (OpenGL_IDirect3DDevice *) dev;
   
   TRACE(ddraw, "ExecuteData : \n");
   if (TRACE_ON(ddraw))
-  _dump_executedata(&(lpBuff->data));
+  _dump_executedata(&(ilpBuff->data));
   
   while (1) {
     LPD3DINSTRUCTION current = (LPD3DINSTRUCTION) instr;
@@ -213,13 +215,13 @@
 	0.0, 0.0,  1.0, 1.0
       };
       
-      OGL_Vertex  *vx    = (OGL_Vertex  *) lpBuff->vertex_data;
-      OGL_LVertex *l_vx  = (OGL_LVertex *) lpBuff->vertex_data;
-      D3DTLVERTEX *tl_vx = (D3DTLVERTEX *) lpBuff->vertex_data;
+      OGL_Vertex  *vx    = (OGL_Vertex  *) ilpBuff->vertex_data;
+      OGL_LVertex *l_vx  = (OGL_LVertex *) ilpBuff->vertex_data;
+      D3DTLVERTEX *tl_vx = (D3DTLVERTEX *) ilpBuff->vertex_data;
       
       TRACE(ddraw, "TRIANGLE         (%d)\n", count);
 
-      switch (lpBuff->vertex_type) {
+      switch (ilpBuff->vertex_type) {
       case D3DVT_VERTEX:
 	/* This time, there is lighting */
 	glEnable(GL_LIGHTING);
@@ -271,7 +273,7 @@
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         
-        if (vp == NULL) {
+        if (ivp == NULL) {
           ERR(ddraw, "No current viewport !\n");
           /* Using standard values */
           height = 640.0;
@@ -279,10 +281,10 @@
           minZ = -10.0;
           maxZ = 10.0;
         } else {
-          height = (GLdouble) vp->viewport.vp1.dwHeight;
-          width  = (GLdouble) vp->viewport.vp1.dwWidth;
-          minZ   = (GLdouble) vp->viewport.vp1.dvMinZ;
-          maxZ   = (GLdouble) vp->viewport.vp1.dvMaxZ;
+          height = (GLdouble) ivp->viewport.vp1.dwHeight;
+          width  = (GLdouble) ivp->viewport.vp1.dwWidth;
+          minZ   = (GLdouble) ivp->viewport.vp1.dvMinZ;
+          maxZ   = (GLdouble) ivp->viewport.vp1.dvMaxZ;
 
 	  if (minZ == maxZ) {
 	    /* I do not know why, but many Dx 3.0 games have minZ = maxZ = 0.0 */
@@ -299,7 +301,7 @@
 	break;
       }
 
-      switch (lpBuff->vertex_type) {
+      switch (ilpBuff->vertex_type) {
       case D3DVT_VERTEX:
 	TRIANGLE_LOOP(DO_VERTEX);
 	break;
@@ -397,7 +399,7 @@
 	/* Handle the state transform */
 	switch (ci->t.dlstLightStateType) {
 	case D3DLIGHTSTATE_MATERIAL: {
-	  LPDIRECT3DMATERIAL mat = (LPDIRECT3DMATERIAL) ci->v.dwArg[0];
+	  IDirect3DMaterial2Impl* mat = (IDirect3DMaterial2Impl*) ci->v.dwArg[0];
 	  TRACE(ddraw, "  MATERIAL\n");
 	  
 	  if (mat != NULL) {
@@ -522,14 +524,14 @@
 	/* Enough for the moment */
 	if (ci->dwFlags == D3DPROCESSVERTICES_TRANSFORMLIGHT) {
 	  int nb;
-	  D3DVERTEX  *src = ((LPD3DVERTEX)  (lpBuff->desc.lpData + vs)) + ci->wStart;
-	  OGL_Vertex *dst = ((OGL_Vertex *) (lpBuff->vertex_data)) + ci->wDest;
+	  D3DVERTEX  *src = ((LPD3DVERTEX)  (ilpBuff->desc.lpData + vs)) + ci->wStart;
+	  OGL_Vertex *dst = ((OGL_Vertex *) (ilpBuff->vertex_data)) + ci->wDest;
 	  D3DMATRIX *mat = odev->world_mat;
 
 	  TRACE(ddraw, "  World Matrix : (%p)\n", mat);
 	  dump_mat(mat);
 
-	  lpBuff->vertex_type = D3DVT_VERTEX;
+	  ilpBuff->vertex_type = D3DVT_VERTEX;
 	  
 	  for (nb = 0; nb < ci->dwCount; nb++) {
 	    /* For the moment, no normal transformation... */
@@ -551,14 +553,14 @@
 	  }
 	} else if (ci->dwFlags == D3DPROCESSVERTICES_TRANSFORM) {
 	  int nb;
-	  D3DLVERTEX *src  = ((LPD3DLVERTEX) (lpBuff->desc.lpData + vs)) + ci->wStart;
-	  OGL_LVertex *dst = ((OGL_LVertex *) (lpBuff->vertex_data)) + ci->wDest;
+	  D3DLVERTEX *src  = ((LPD3DLVERTEX) (ilpBuff->desc.lpData + vs)) + ci->wStart;
+	  OGL_LVertex *dst = ((OGL_LVertex *) (ilpBuff->vertex_data)) + ci->wDest;
 	  D3DMATRIX *mat = odev->world_mat;
 
 	  TRACE(ddraw, "  World Matrix : (%p)\n", mat);
 	  dump_mat(mat);
 
-	  lpBuff->vertex_type = D3DVT_LVERTEX;
+	  ilpBuff->vertex_type = D3DVT_LVERTEX;
 	  
 	  for (nb = 0; nb < ci->dwCount; nb++) {
 	    dst->c  = src->c.color;
@@ -576,10 +578,10 @@
 	    dst++;
 	  }
 	} else if (ci->dwFlags == D3DPROCESSVERTICES_COPY) {
-	  D3DTLVERTEX *src = ((LPD3DTLVERTEX) (lpBuff->desc.lpData + vs)) + ci->wStart;
-	  D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (lpBuff->vertex_data)) + ci->wDest;
+	  D3DTLVERTEX *src = ((LPD3DTLVERTEX) (ilpBuff->desc.lpData + vs)) + ci->wStart;
+	  D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (ilpBuff->vertex_data)) + ci->wDest;
 
-	  lpBuff->vertex_type = D3DVT_TLVERTEX;
+	  ilpBuff->vertex_type = D3DVT_TLVERTEX;
 	  
 	  memcpy(dst, src, ci->dwCount * sizeof(D3DTLVERTEX));
 	} else {
@@ -611,7 +613,7 @@
       for (i = 0; i < count; i++) {
 	LPD3DBRANCH ci = (LPD3DBRANCH) instr;
 	
-	if ((lpBuff->data.dsStatus.dwStatus & ci->dwMask) == ci->dwValue) {
+	if ((ilpBuff->data.dsStatus.dwStatus & ci->dwMask) == ci->dwValue) {
 	  if (!ci->bNegate) {
 	    TRACE(ddraw," Should branch to %ld\n", ci->dwOffset);
 	  }
@@ -638,7 +640,7 @@
       for (i = 0; i < count; i++) {
 	LPD3DSTATUS ci = (LPD3DSTATUS) instr;
 	
-	lpBuff->data.dsStatus = *ci;
+	ilpBuff->data.dsStatus = *ci;
 	
 	instr += size;
       }
@@ -658,11 +660,11 @@
 /*******************************************************************************
  *				ExecuteBuffer Creation functions
  */
-LPDIRECT3DEXECUTEBUFFER d3dexecutebuffer_create(LPDIRECT3DDEVICE d3ddev, LPD3DEXECUTEBUFFERDESC lpDesc)
+LPDIRECT3DEXECUTEBUFFER d3dexecutebuffer_create(IDirect3DDeviceImpl* d3ddev, LPD3DEXECUTEBUFFERDESC lpDesc)
 {
-  LPDIRECT3DEXECUTEBUFFER eb;
+  IDirect3DExecuteBufferImpl* eb;
   
-  eb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DExecuteBuffer));
+  eb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DExecuteBufferImpl));
   eb->ref = 1;
   eb->lpvtbl = &executebuffer_vtable;
   eb->d3ddev = d3ddev;
@@ -693,97 +695,104 @@
 
   eb->execute = execute;
   
-  return eb;
+  return (LPDIRECT3DEXECUTEBUFFER)eb;
 }
 
 /*******************************************************************************
- *				IDirect3DLight methods
+ *				IDirect3ExecuteBuffer methods
  */
 
-static HRESULT WINAPI IDirect3DExecuteBuffer_QueryInterface(LPDIRECT3DEXECUTEBUFFER this,
+static HRESULT WINAPI IDirect3DExecuteBufferImpl_QueryInterface(LPDIRECT3DEXECUTEBUFFER iface,
 							    REFIID riid,
 							    LPVOID* ppvObj)
 {
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
   char xrefiid[50];
   
   WINE_StringFromCLSID((LPCLSID)riid,xrefiid);
-  FIXME(ddraw, "(%p)->(%s,%p): stub\n", this, xrefiid,ppvObj);
+  FIXME(ddraw, "(%p)->(%s,%p): stub\n", This, xrefiid,ppvObj);
   
   return S_OK;
 }
 
 
 
-static ULONG WINAPI IDirect3DExecuteBuffer_AddRef(LPDIRECT3DEXECUTEBUFFER this)
+static ULONG WINAPI IDirect3DExecuteBufferImpl_AddRef(LPDIRECT3DEXECUTEBUFFER iface)
 {
-  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", This, This->ref );
   
-  return ++(this->ref);
+  return ++(This->ref);
 }
 
 
 
-static ULONG WINAPI IDirect3DExecuteBuffer_Release(LPDIRECT3DEXECUTEBUFFER this)
+static ULONG WINAPI IDirect3DExecuteBufferImpl_Release(LPDIRECT3DEXECUTEBUFFER iface)
 {
-  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
   
-  if (!--(this->ref)) {
-    if ((this->desc.lpData != NULL) && this->need_free)
-      HeapFree(GetProcessHeap(),0,this->desc.lpData);
+  if (!--(This->ref)) {
+    if ((This->desc.lpData != NULL) && This->need_free)
+      HeapFree(GetProcessHeap(),0,This->desc.lpData);
 
-    if (this->vertex_data != NULL)
-      HeapFree(GetProcessHeap(),0,this->vertex_data);
+    if (This->vertex_data != NULL)
+      HeapFree(GetProcessHeap(),0,This->vertex_data);
 
-    HeapFree(GetProcessHeap(),0,this);
+    HeapFree(GetProcessHeap(),0,This);
     return 0;
   }
   
-  return this->ref;
+  return This->ref;
 }
 
-static HRESULT WINAPI IDirect3DExecuteBuffer_Initialize(LPDIRECT3DEXECUTEBUFFER this,
+static HRESULT WINAPI IDirect3DExecuteBufferImpl_Initialize(LPDIRECT3DEXECUTEBUFFER iface,
 							LPDIRECT3DDEVICE lpDirect3DDevice,
 							LPD3DEXECUTEBUFFERDESC lpDesc)
 {
-  FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lpDirect3DDevice, lpDesc);
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, lpDirect3DDevice, lpDesc);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DExecuteBuffer_Lock(LPDIRECT3DEXECUTEBUFFER this,
+static HRESULT WINAPI IDirect3DExecuteBufferImpl_Lock(LPDIRECT3DEXECUTEBUFFER iface,
 						  LPD3DEXECUTEBUFFERDESC lpDesc)
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpDesc);
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpDesc);
 
   /* Copies the buffer description */
-  *lpDesc = this->desc;
+  *lpDesc = This->desc;
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DExecuteBuffer_Unlock(LPDIRECT3DEXECUTEBUFFER this)
+static HRESULT WINAPI IDirect3DExecuteBufferImpl_Unlock(LPDIRECT3DEXECUTEBUFFER iface)
 {
-  TRACE(ddraw, "(%p)->()\n", this);
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  TRACE(ddraw, "(%p)->()\n", This);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DExecuteBuffer_SetExecuteData(LPDIRECT3DEXECUTEBUFFER this,
+static HRESULT WINAPI IDirect3DExecuteBufferImpl_SetExecuteData(LPDIRECT3DEXECUTEBUFFER iface,
 							    LPD3DEXECUTEDATA lpData)
 {
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
   DWORD nbvert;
 
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpData);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpData);
 
-  this->data = *lpData;
+  This->data = *lpData;
 
   /* Get the number of vertices in the execute buffer */
-  nbvert = this->data.dwVertexCount;
+  nbvert = This->data.dwVertexCount;
     
   /* Prepares the transformed vertex buffer */
-  if (this->vertex_data != NULL)
-    HeapFree(GetProcessHeap(), 0, this->vertex_data);
-  this->vertex_data = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,nbvert * sizeof(OGL_Vertex));
+  if (This->vertex_data != NULL)
+    HeapFree(GetProcessHeap(), 0, This->vertex_data);
+  This->vertex_data = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,nbvert * sizeof(OGL_Vertex));
 
 
   if (TRACE_ON(ddraw)) {
@@ -793,31 +802,34 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DExecuteBuffer_GetExecuteData(LPDIRECT3DEXECUTEBUFFER this,
+static HRESULT WINAPI IDirect3DExecuteBufferImpl_GetExecuteData(LPDIRECT3DEXECUTEBUFFER iface,
 							    LPD3DEXECUTEDATA lpData)
 {
-  TRACE(ddraw, "(%p)->(%p): stub\n", this, lpData);
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  TRACE(ddraw, "(%p)->(%p): stub\n", This, lpData);
 
-  *lpData = this->data;
+  *lpData = This->data;
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DExecuteBuffer_Validate(LPDIRECT3DEXECUTEBUFFER this,
+static HRESULT WINAPI IDirect3DExecuteBufferImpl_Validate(LPDIRECT3DEXECUTEBUFFER iface,
 						      LPDWORD lpdwOffset,
 						      LPD3DVALIDATECALLBACK lpFunc,
 						      LPVOID lpUserArg,
 						      DWORD dwReserved)
 {
-  TRACE(ddraw, "(%p)->(%p,%p,%p,%lu)\n", this, lpdwOffset, lpFunc, lpUserArg, dwReserved);
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p,%p,%lu)\n", This, lpdwOffset, lpFunc, lpUserArg, dwReserved);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DExecuteBuffer_Optimize(LPDIRECT3DEXECUTEBUFFER this,
+static HRESULT WINAPI IDirect3DExecuteBufferImpl_Optimize(LPDIRECT3DEXECUTEBUFFER iface,
 						      DWORD dwReserved)
 {
-  TRACE(ddraw, "(%p)->(%lu)\n", this, dwReserved);
+  ICOM_THIS(IDirect3DExecuteBufferImpl,iface);
+  TRACE(ddraw, "(%p)->(%lu)\n", This, dwReserved);
 
   return DD_OK;
 }
@@ -826,19 +838,19 @@
 /*******************************************************************************
  *				IDirect3DLight VTable
  */
-static IDirect3DExecuteBuffer_VTable executebuffer_vtable = {
+static ICOM_VTABLE(IDirect3DExecuteBuffer) executebuffer_vtable = {
   /*** IUnknown methods ***/
-  IDirect3DExecuteBuffer_QueryInterface,
-  IDirect3DExecuteBuffer_AddRef,
-  IDirect3DExecuteBuffer_Release,
+  IDirect3DExecuteBufferImpl_QueryInterface,
+  IDirect3DExecuteBufferImpl_AddRef,
+  IDirect3DExecuteBufferImpl_Release,
   /*** IDirect3DExecuteBuffer methods ***/
-  IDirect3DExecuteBuffer_Initialize,
-  IDirect3DExecuteBuffer_Lock,
-  IDirect3DExecuteBuffer_Unlock,
-  IDirect3DExecuteBuffer_SetExecuteData,
-  IDirect3DExecuteBuffer_GetExecuteData,
-  IDirect3DExecuteBuffer_Validate,
-  IDirect3DExecuteBuffer_Optimize
+  IDirect3DExecuteBufferImpl_Initialize,
+  IDirect3DExecuteBufferImpl_Lock,
+  IDirect3DExecuteBufferImpl_Unlock,
+  IDirect3DExecuteBufferImpl_SetExecuteData,
+  IDirect3DExecuteBufferImpl_GetExecuteData,
+  IDirect3DExecuteBufferImpl_Validate,
+  IDirect3DExecuteBufferImpl_Optimize
 };
 
 #endif /* HAVE_MESAGL */
diff --git a/graphics/d3dlight.c b/graphics/d3dlight.c
index 7b19e25..ae9b3a0 100644
--- a/graphics/d3dlight.c
+++ b/graphics/d3dlight.c
@@ -17,7 +17,7 @@
 
 #ifdef HAVE_MESAGL
 
-static IDirect3DLight_VTable light_vtable;
+static ICOM_VTABLE(IDirect3DLight) light_vtable;
 
 enum {
   D3D_1,
@@ -31,8 +31,8 @@
   0.0, 0.0, 0.0, 0.0
 };
 
-static void update(LPDIRECT3DLIGHT this) {
-  switch (this->light.dltType) {
+static void update(IDirect3DLightImpl* This) {
+  switch (This->light.dltType) {
   case D3DLIGHT_POINT:         /* 1 */
     TRACE(ddraw, "Activating POINT\n");
     break;
@@ -46,24 +46,24 @@
     
     TRACE(ddraw, "Activating DIRECTIONAL\n");
     TRACE(ddraw, "  direction : %f %f %f\n",
-	  this->light.dvDirection.x.x,
-	  this->light.dvDirection.y.y,
-	  this->light.dvDirection.z.z);
-    _dump_colorvalue(" color    ", this->light.dcvColor);
+	  This->light.dvDirection.x.x,
+	  This->light.dvDirection.y.y,
+	  This->light.dvDirection.z.z);
+    _dump_colorvalue(" color    ", This->light.dcvColor);
 
-    glLightfv(this->light_num,
+    glLightfv(This->light_num,
 	      GL_AMBIENT,
 	      (float *) zero_value);
 
-    glLightfv(this->light_num,
+    glLightfv(This->light_num,
 	      GL_DIFFUSE,
-	      (float *) &(this->light.dcvColor));
+	      (float *) &(This->light.dcvColor));
 
-    direction[0] = -this->light.dvDirection.x.x;
-    direction[1] = -this->light.dvDirection.y.y;
-    direction[2] = -this->light.dvDirection.z.z;
+    direction[0] = -This->light.dvDirection.x.x;
+    direction[1] = -This->light.dvDirection.y.y;
+    direction[2] = -This->light.dvDirection.z.z;
     direction[3] = 0.0; /* This is a directional light */
-    glLightfv(this->light_num,
+    glLightfv(This->light_num,
 	      GL_POSITION,
 	      (float *) direction);
   } break;
@@ -78,14 +78,14 @@
   }
 }
 
-static void activate(LPDIRECT3DLIGHT this) {
-  update(this);
+static void activate(IDirect3DLightImpl* This) {
+  update(This);
 
   /* If was not active, activate it */
-  if (this->is_active == 0) {
-    glEnable(this->light_num);
+  if (This->is_active == 0) {
+    glEnable(This->light_num);
 
-    this->is_active = 1;
+    This->is_active = 1;
   }
 
   return ;
@@ -94,80 +94,83 @@
 /*******************************************************************************
  *				Light Creation functions
  */
-LPDIRECT3DLIGHT d3dlight_create(LPDIRECT3D2 d3d)
+LPDIRECT3DLIGHT d3dlight_create(IDirect3D2Impl* d3d2)
 {
-  LPDIRECT3DLIGHT mat;
+  IDirect3DLightImpl* light;
   
-  mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DLight));
-  mat->ref = 1;
-  mat->lpvtbl = &light_vtable;
-  mat->d3d.d3d2 = d3d;
-  mat->type = D3D_2;
+  light = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DLightImpl));
+  light->ref = 1;
+  light->lpvtbl = &light_vtable;
+  light->d3d.d3d2 = d3d2;
+  light->type = D3D_2;
 
-  mat->next = NULL;
-  mat->prev = NULL;
-  mat->activate = activate;
-  mat->is_active = 0;
+  light->next = NULL;
+  light->prev = NULL;
+  light->activate = activate;
+  light->is_active = 0;
   
-  return mat;
+  return (LPDIRECT3DLIGHT)light;
 }
 
-LPDIRECT3DLIGHT d3dlight_create_dx3(LPDIRECT3D d3d)
+LPDIRECT3DLIGHT d3dlight_create_dx3(IDirect3DImpl* d3d1)
 {
-  LPDIRECT3DLIGHT mat;
+  IDirect3DLightImpl* light;
   
-  mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DLight));
-  mat->ref = 1;
-  mat->lpvtbl = &light_vtable;
+  light = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DLightImpl));
+  light->ref = 1;
+  light->lpvtbl = &light_vtable;
   
-  mat->d3d.d3d = d3d;
-  mat->type = D3D_1;
+  light->d3d.d3d1 = d3d1;
+  light->type = D3D_1;
   
-  mat->next = NULL;
-  mat->prev = NULL;
-  mat->activate = activate;
-  mat->is_active = 0;
+  light->next = NULL;
+  light->prev = NULL;
+  light->activate = activate;
+  light->is_active = 0;
   
-  return mat;
+  return (LPDIRECT3DLIGHT)light;
 }
 
 /*******************************************************************************
  *				IDirect3DLight methods
  */
 
-static HRESULT WINAPI IDirect3DLight_QueryInterface(LPDIRECT3DLIGHT this,
+static HRESULT WINAPI IDirect3DLightImpl_QueryInterface(LPDIRECT3DLIGHT iface,
 						    REFIID riid,
 						    LPVOID* ppvObj)
 {
+  ICOM_THIS(IDirect3DLightImpl,iface);
   char xrefiid[50];
   
   WINE_StringFromCLSID((LPCLSID)riid,xrefiid);
-  FIXME(ddraw, "(%p)->(%s,%p): stub\n", this, xrefiid,ppvObj);
+  FIXME(ddraw, "(%p)->(%s,%p): stub\n", This, xrefiid,ppvObj);
   
   return S_OK;
 }
 
 
 
-static ULONG WINAPI IDirect3DLight_AddRef(LPDIRECT3DLIGHT this)
+static ULONG WINAPI IDirect3DLightImpl_AddRef(LPDIRECT3DLIGHT iface)
 {
-  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DLightImpl,iface);
+  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", This, This->ref );
   
-  return ++(this->ref);
+  return ++(This->ref);
 }
 
 
 
-static ULONG WINAPI IDirect3DLight_Release(LPDIRECT3DLIGHT this)
+static ULONG WINAPI IDirect3DLightImpl_Release(LPDIRECT3DLIGHT iface)
 {
-  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DLightImpl,iface);
+  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
   
-  if (!--(this->ref)) {
-    HeapFree(GetProcessHeap(),0,this);
+  if (!--(This->ref)) {
+    HeapFree(GetProcessHeap(),0,This);
     return 0;
   }
   
-  return this->ref;
+  return This->ref;
 }
 
 /*** IDirect3DLight methods ***/
@@ -176,54 +179,57 @@
   fprintf(stderr, "  dwSize : %ld\n", light->dwSize);
 }
 
-static HRESULT WINAPI IDirect3DLight_GetLight(LPDIRECT3DLIGHT this,
+static HRESULT WINAPI IDirect3DLightImpl_GetLight(LPDIRECT3DLIGHT iface,
 					      LPD3DLIGHT lpLight)
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpLight);
+  ICOM_THIS(IDirect3DLightImpl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpLight);
   if (TRACE_ON(ddraw))
     dump_light(lpLight);
   
   /* Copies the light structure */
-  switch (this->type) {
+  switch (This->type) {
   case D3D_1:
-    *((LPD3DLIGHT)lpLight) = *((LPD3DLIGHT) &(this->light));
+    *((LPD3DLIGHT)lpLight) = *((LPD3DLIGHT) &(This->light));
     break;
   case D3D_2:
-    *((LPD3DLIGHT2)lpLight) = *((LPD3DLIGHT2) &(this->light));
+    *((LPD3DLIGHT2)lpLight) = *((LPD3DLIGHT2) &(This->light));
     break;
   }
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DLight_SetLight(LPDIRECT3DLIGHT this,
+static HRESULT WINAPI IDirect3DLightImpl_SetLight(LPDIRECT3DLIGHT iface,
 					      LPD3DLIGHT lpLight)
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpLight);
+  ICOM_THIS(IDirect3DLightImpl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpLight);
   if (TRACE_ON(ddraw))
     dump_light(lpLight);
   
   /* Stores the light */
-  switch (this->type) {
+  switch (This->type) {
   case D3D_1:
-    *((LPD3DLIGHT) &(this->light)) = *((LPD3DLIGHT)lpLight);
+    *((LPD3DLIGHT) &(This->light)) = *((LPD3DLIGHT)lpLight);
     break;
   case D3D_2:
-    *((LPD3DLIGHT2) &(this->light)) = *((LPD3DLIGHT2)lpLight);
+    *((LPD3DLIGHT2) &(This->light)) = *((LPD3DLIGHT2)lpLight);
     break;
   }
   
-  if (this->is_active)
-    update(this);
+  if (This->is_active)
+    update(This);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DLight_Initialize(LPDIRECT3DLIGHT this,
+static HRESULT WINAPI IDirect3DLightImpl_Initialize(LPDIRECT3DLIGHT iface,
 						LPDIRECT3D lpDirect3D)
 
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpDirect3D);
+  ICOM_THIS(IDirect3DLightImpl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpDirect3D);
 
   return DDERR_ALREADYINITIALIZED;
 }
@@ -232,26 +238,26 @@
 /*******************************************************************************
  *				IDirect3DLight VTable
  */
-static IDirect3DLight_VTable light_vtable = {
+static ICOM_VTABLE(IDirect3DLight) light_vtable = {
   /*** IUnknown methods ***/
-  IDirect3DLight_QueryInterface,
-  IDirect3DLight_AddRef,
-  IDirect3DLight_Release,
+  IDirect3DLightImpl_QueryInterface,
+  IDirect3DLightImpl_AddRef,
+  IDirect3DLightImpl_Release,
   /*** IDirect3DLight methods ***/
-  IDirect3DLight_Initialize,
-  IDirect3DLight_SetLight,
-  IDirect3DLight_GetLight
+  IDirect3DLightImpl_Initialize,
+  IDirect3DLightImpl_SetLight,
+  IDirect3DLightImpl_GetLight
 };
 
 #else /* HAVE_MESAGL */
 
 /* These function should never be called if MesaGL is not present */
-LPDIRECT3DLIGHT d3dlight_create_dx3(LPDIRECT3D d3d) {
+LPDIRECT3DLIGHT d3dlight_create_dx3(IDirect3DImpl* d3d1) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
 
-LPDIRECT3DLIGHT d3dlight_create(LPDIRECT3D2 d3d) {
+LPDIRECT3DLIGHT d3dlight_create(IDirect3D2Impl* d3d2) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
diff --git a/graphics/d3dmaterial.c b/graphics/d3dmaterial.c
index 50f9b2a..b25f4b6 100644
--- a/graphics/d3dmaterial.c
+++ b/graphics/d3dmaterial.c
@@ -16,43 +16,43 @@
 
 #ifdef HAVE_MESAGL
 
-static IDirect3DMaterial2_VTable material2_vtable;
-static IDirect3DMaterial_VTable material_vtable;
+static ICOM_VTABLE(IDirect3DMaterial2) material2_vtable;
+static ICOM_VTABLE(IDirect3DMaterial) material_vtable;
 
 /*******************************************************************************
  *				Matrial2 static functions
  */
-static void activate(LPDIRECT3DMATERIAL2 this) {
-  TRACE(ddraw, "Activating material %p\n", this);
+static void activate(IDirect3DMaterial2Impl* This) {
+  TRACE(ddraw, "Activating material %p\n", This);
   
   /* First, set the rendering context */
-  if (this->use_d3d2)
-    this->device.active_device2->set_context(this->device.active_device2);
+  if (This->use_d3d2)
+    This->device.active_device2->set_context(This->device.active_device2);
   else
-    this->device.active_device1->set_context(this->device.active_device1);
+    This->device.active_device1->set_context(This->device.active_device1);
 
   /* Set the current Material */
-  _dump_colorvalue("Diffuse", this->mat.a.diffuse);
+  _dump_colorvalue("Diffuse", This->mat.a.diffuse);
   glMaterialfv(GL_FRONT,
 	       GL_DIFFUSE,
-	       (float *) &(this->mat.a.diffuse));
-  _dump_colorvalue("Ambient", this->mat.b.ambient);
+	       (float *) &(This->mat.a.diffuse));
+  _dump_colorvalue("Ambient", This->mat.b.ambient);
   glMaterialfv(GL_FRONT,
 	       GL_AMBIENT,
-	       (float *) &(this->mat.b.ambient));
-  _dump_colorvalue("Specular", this->mat.c.specular);
+	       (float *) &(This->mat.b.ambient));
+  _dump_colorvalue("Specular", This->mat.c.specular);
   glMaterialfv(GL_FRONT,
 	       GL_SPECULAR,
-	       (float *) &(this->mat.c.specular));
-  _dump_colorvalue("Emissive", this->mat.d.emissive);
+	       (float *) &(This->mat.c.specular));
+  _dump_colorvalue("Emissive", This->mat.d.emissive);
   glMaterialfv(GL_FRONT,
 	       GL_EMISSION,
-	       (float *) &(this->mat.d.emissive));
+	       (float *) &(This->mat.d.emissive));
   
-  TRACE(ddraw, "Size  : %ld\n", this->mat.dwSize);
-  TRACE(ddraw, "Power : %f\n", this->mat.e.power);
+  TRACE(ddraw, "Size  : %ld\n", This->mat.dwSize);
+  TRACE(ddraw, "Power : %f\n", This->mat.e.power);
 
-  TRACE(ddraw, "Texture handle : %08lx\n", (DWORD)this->mat.hTexture);
+  TRACE(ddraw, "Texture handle : %08lx\n", (DWORD)This->mat.hTexture);
   
   return ;
 }
@@ -60,32 +60,32 @@
 /*******************************************************************************
  *				Matrial2 Creation functions
  */
-LPDIRECT3DMATERIAL2 d3dmaterial2_create(LPDIRECT3D2 d3d)
+LPDIRECT3DMATERIAL2 d3dmaterial2_create(IDirect3D2Impl* d3d2)
 {
-  LPDIRECT3DMATERIAL2 mat;
+  IDirect3DMaterial2Impl* mat;
   
-  mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2));
+  mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2Impl));
   mat->ref = 1;
   mat->lpvtbl = &material2_vtable;
 
   mat->use_d3d2 = 1;
-  mat->d3d.d3d2 = d3d;
+  mat->d3d.d3d2 = d3d2;
 
   mat->activate = activate;
   
-  return mat;
+  return (LPDIRECT3DMATERIAL2)mat;
 }
 
-LPDIRECT3DMATERIAL d3dmaterial_create(LPDIRECT3D d3d)
+LPDIRECT3DMATERIAL d3dmaterial_create(IDirect3DImpl* d3d1)
 {
-  LPDIRECT3DMATERIAL2 mat;
+  IDirect3DMaterial2Impl* mat;
   
-  mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2));
+  mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2Impl));
   mat->ref = 1;
-  mat->lpvtbl = (LPDIRECT3DMATERIAL2_VTABLE) &material_vtable;
+  mat->lpvtbl = (ICOM_VTABLE(IDirect3DMaterial2)*)&material_vtable;
 
   mat->use_d3d2 = 0;
-  mat->d3d.d3d1 = d3d;
+  mat->d3d.d3d1 = d3d1;
 
   mat->activate = activate;
   
@@ -96,39 +96,42 @@
  *				IDirect3DMaterial2 methods
  */
 
-static HRESULT WINAPI IDirect3DMaterial2_QueryInterface(LPDIRECT3DMATERIAL2 this,
+static HRESULT WINAPI IDirect3DMaterial2Impl_QueryInterface(LPDIRECT3DMATERIAL2 iface,
 							REFIID riid,
 							LPVOID* ppvObj)
 {
+  ICOM_THIS(IDirect3DMaterial2Impl,iface);
   char xrefiid[50];
   
   WINE_StringFromCLSID((LPCLSID)riid,xrefiid);
-  FIXME(ddraw, "(%p)->(%s,%p): stub\n", this, xrefiid,ppvObj);
+  FIXME(ddraw, "(%p)->(%s,%p): stub\n", This, xrefiid,ppvObj);
   
   return S_OK;
 }
 
 
 
-static ULONG WINAPI IDirect3DMaterial2_AddRef(LPDIRECT3DMATERIAL2 this)
+static ULONG WINAPI IDirect3DMaterial2Impl_AddRef(LPDIRECT3DMATERIAL2 iface)
 {
-  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", This, This->ref );
   
-  return ++(this->ref);
+  return ++(This->ref);
 }
 
 
 
-static ULONG WINAPI IDirect3DMaterial2_Release(LPDIRECT3DMATERIAL2 this)
+static ULONG WINAPI IDirect3DMaterial2Impl_Release(LPDIRECT3DMATERIAL2 iface)
 {
-  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
   
-  if (!--(this->ref)) {
-    HeapFree(GetProcessHeap(),0,this);
+  if (!--(This->ref)) {
+    HeapFree(GetProcessHeap(),0,This);
     return 0;
   }
   
-  return this->ref;
+  return This->ref;
 }
 
 /*** IDirect3DMaterial2 methods ***/
@@ -137,68 +140,74 @@
   fprintf(stderr, "  dwSize : %ld\n", mat->dwSize);
 }
 
-static HRESULT WINAPI IDirect3DMaterial2_GetMaterial(LPDIRECT3DMATERIAL2 this,
+static HRESULT WINAPI IDirect3DMaterial2Impl_GetMaterial(LPDIRECT3DMATERIAL2 iface,
 						     LPD3DMATERIAL lpMat)
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpMat);
+  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpMat);
   if (TRACE_ON(ddraw))
     dump_material(lpMat);
   
   /* Copies the material structure */
-  *lpMat = this->mat;
+  *lpMat = This->mat;
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DMaterial2_SetMaterial(LPDIRECT3DMATERIAL2 this,
+static HRESULT WINAPI IDirect3DMaterial2Impl_SetMaterial(LPDIRECT3DMATERIAL2 iface,
 						     LPD3DMATERIAL lpMat)
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpMat);
+  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpMat);
   if (TRACE_ON(ddraw))
     dump_material(lpMat);
   
   /* Stores the material */
-  this->mat = *lpMat;
+  This->mat = *lpMat;
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DMaterial2_GetHandle(LPDIRECT3DMATERIAL2 this,
+static HRESULT WINAPI IDirect3DMaterial2Impl_GetHandle(LPDIRECT3DMATERIAL2 iface,
 						   LPDIRECT3DDEVICE2 lpD3DDevice2,
 						   LPD3DMATERIALHANDLE lpMatHandle)
 
 {
-  FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lpD3DDevice2, lpMatHandle);
+  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, lpD3DDevice2, lpMatHandle);
 
-  if (this->use_d3d2)
-    this->device.active_device2 = lpD3DDevice2;
+  if (This->use_d3d2)
+    This->device.active_device2 = (IDirect3DDevice2Impl*)lpD3DDevice2;
   else
-    this->device.active_device1 = (LPDIRECT3DDEVICE) lpD3DDevice2;
+    This->device.active_device1 = (IDirect3DDeviceImpl*)lpD3DDevice2;
   
-  *lpMatHandle = (DWORD) this; /* lpD3DDevice2->store_material(this); */
+  *lpMatHandle = (DWORD) This; /* lpD3DDevice2->store_material(This); */
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DMaterial_Reserve(LPDIRECT3DMATERIAL this)
+static HRESULT WINAPI IDirect3DMaterialImpl_Reserve(LPDIRECT3DMATERIAL iface)
 {
-  FIXME(ddraw, "(%p)->(): stub\n", this);
+  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  FIXME(ddraw, "(%p)->(): stub\n", This);
 
   return DDERR_INVALIDPARAMS;
 }
 						  
-static HRESULT WINAPI IDirect3DMaterial_Unreserve(LPDIRECT3DMATERIAL this)
+static HRESULT WINAPI IDirect3DMaterialImpl_Unreserve(LPDIRECT3DMATERIAL iface)
 {
-  FIXME(ddraw, "(%p)->(): stub\n", this);
+  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  FIXME(ddraw, "(%p)->(): stub\n", This);
 
   return DDERR_INVALIDPARAMS;
 }
 
-static HRESULT WINAPI IDirect3DMaterial_Initialize(LPDIRECT3DMATERIAL this,
+static HRESULT WINAPI IDirect3DMaterialImpl_Initialize(LPDIRECT3DMATERIAL iface,
 						   LPDIRECT3D lpDirect3D)
 
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpDirect3D);
+  ICOM_THIS(IDirect3DMaterial2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpDirect3D);
   
   return DDERR_ALREADYINITIALIZED;
 }
@@ -207,43 +216,43 @@
 /*******************************************************************************
  *				IDirect3DMaterial VTable
  */
-static IDirect3DMaterial_VTable material_vtable = {
+static ICOM_VTABLE(IDirect3DMaterial) material_vtable = {
   /*** IUnknown methods ***/
-  IDirect3DMaterial2_QueryInterface,
-  IDirect3DMaterial2_AddRef,
-  IDirect3DMaterial2_Release,
+  IDirect3DMaterial2Impl_QueryInterface,
+  IDirect3DMaterial2Impl_AddRef,
+  IDirect3DMaterial2Impl_Release,
   /*** IDirect3DMaterial methods ***/
-  IDirect3DMaterial_Initialize,
-  IDirect3DMaterial2_SetMaterial,
-  IDirect3DMaterial2_GetMaterial,
-  IDirect3DMaterial2_GetHandle,
-  IDirect3DMaterial_Reserve,
-  IDirect3DMaterial_Unreserve
+  IDirect3DMaterialImpl_Initialize,
+  IDirect3DMaterial2Impl_SetMaterial,
+  IDirect3DMaterial2Impl_GetMaterial,
+  IDirect3DMaterial2Impl_GetHandle,
+  IDirect3DMaterialImpl_Reserve,
+  IDirect3DMaterialImpl_Unreserve
 };
 
 
 /*******************************************************************************
  *				IDirect3DMaterial2 VTable
  */
-static IDirect3DMaterial2_VTable material2_vtable = {
+static ICOM_VTABLE(IDirect3DMaterial2) material2_vtable = {
   /*** IUnknown methods ***/
-  IDirect3DMaterial2_QueryInterface,
-  IDirect3DMaterial2_AddRef,
-  IDirect3DMaterial2_Release,
+  IDirect3DMaterial2Impl_QueryInterface,
+  IDirect3DMaterial2Impl_AddRef,
+  IDirect3DMaterial2Impl_Release,
   /*** IDirect3DMaterial methods ***/
-  IDirect3DMaterial2_SetMaterial,
-  IDirect3DMaterial2_GetMaterial,
-  IDirect3DMaterial2_GetHandle
+  IDirect3DMaterial2Impl_SetMaterial,
+  IDirect3DMaterial2Impl_GetMaterial,
+  IDirect3DMaterial2Impl_GetHandle
 };
 
 #else /* HAVE_MESAGL */
 
-LPDIRECT3DMATERIAL d3dmaterial_create(LPDIRECT3D d3d) {
+LPDIRECT3DMATERIAL d3dmaterial_create(IDirect3DImpl* d3d1) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
 
-LPDIRECT3DMATERIAL2 d3dmaterial2_create(LPDIRECT3D2 d3d) {
+LPDIRECT3DMATERIAL2 d3dmaterial2_create(IDirect3D2Impl* d3d2) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
diff --git a/graphics/d3dtexture.c b/graphics/d3dtexture.c
index ee22e11..2dfeadf 100644
--- a/graphics/d3dtexture.c
+++ b/graphics/d3dtexture.c
@@ -23,37 +23,37 @@
    texture memory) */
 #undef TEXTURE_SNOOP
 
-static IDirect3DTexture2_VTable texture2_vtable;
-static IDirect3DTexture_VTable texture_vtable;
+static ICOM_VTABLE(IDirect3DTexture2) texture2_vtable;
+static ICOM_VTABLE(IDirect3DTexture) texture_vtable;
 
 /*******************************************************************************
  *				Texture2 Creation functions
  */
-LPDIRECT3DTEXTURE2 d3dtexture2_create(LPDIRECTDRAWSURFACE4 surf)
+LPDIRECT3DTEXTURE2 d3dtexture2_create(IDirectDrawSurface4Impl* surf)
 {
-  LPDIRECT3DTEXTURE2 mat;
+  IDirect3DTexture2Impl* tex;
   
-  mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DTexture2));
-  mat->ref = 1;
-  mat->lpvtbl = &texture2_vtable;
-  mat->surface = surf;
+  tex = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DTexture2Impl));
+  tex->ref = 1;
+  tex->lpvtbl = &texture2_vtable;
+  tex->surface = surf;
   
-  return mat;
+  return (LPDIRECT3DTEXTURE2)tex;
 }
 
 /*******************************************************************************
  *				Texture Creation functions
  */
-LPDIRECT3DTEXTURE d3dtexture_create(LPDIRECTDRAWSURFACE4 surf)
+LPDIRECT3DTEXTURE d3dtexture_create(IDirectDrawSurface4Impl* surf)
 {
-  LPDIRECT3DTEXTURE mat;
+  IDirect3DTexture2Impl* tex;
   
-  mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DTexture));
-  mat->ref = 1;
-  mat->lpvtbl = (IDirect3DTexture2_VTable*) &texture_vtable;
-  mat->surface = surf;
+  tex = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DTexture2Impl));
+  tex->ref = 1;
+  tex->lpvtbl = (ICOM_VTABLE(IDirect3DTexture2)*)&texture_vtable;
+  tex->surface = surf;
   
-  return mat;
+  return (LPDIRECT3DTEXTURE)tex;
 }
 
 
@@ -61,137 +61,149 @@
  *				IDirect3DTexture2 methods
  */
 
-static HRESULT WINAPI IDirect3DTexture2_QueryInterface(LPDIRECT3DTEXTURE2 this,
+static HRESULT WINAPI IDirect3DTexture2Impl_QueryInterface(LPDIRECT3DTEXTURE2 iface,
 							REFIID riid,
 							LPVOID* ppvObj)
 {
+  ICOM_THIS(IDirect3DTexture2Impl,iface);
   char xrefiid[50];
   
   WINE_StringFromCLSID((LPCLSID)riid,xrefiid);
-  FIXME(ddraw, "(%p)->(%s,%p): stub\n", this, xrefiid,ppvObj);
+  FIXME(ddraw, "(%p)->(%s,%p): stub\n", This, xrefiid,ppvObj);
   
   return S_OK;
 }
 
 
 
-static ULONG WINAPI IDirect3DTexture2_AddRef(LPDIRECT3DTEXTURE2 this)
+static ULONG WINAPI IDirect3DTexture2Impl_AddRef(LPDIRECT3DTEXTURE2 iface)
 {
-  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", This, This->ref );
   
-  return ++(this->ref);
+  return ++(This->ref);
 }
 
 
 
-static ULONG WINAPI IDirect3DTexture2_Release(LPDIRECT3DTEXTURE2 this)
+static ULONG WINAPI IDirect3DTexture2Impl_Release(LPDIRECT3DTEXTURE2 iface)
 {
-  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
   
-  if (!--(this->ref)) {
+  if (!--(This->ref)) {
     /* Delete texture from OpenGL */
-    glDeleteTextures(1, &(this->tex_name));
+    glDeleteTextures(1, &(This->tex_name));
     
     /* Release surface */
-    this->surface->lpvtbl->fnRelease(this->surface);
+    IDirectDrawSurface4_Release((IDirectDrawSurface4*)This->surface);
     
-    HeapFree(GetProcessHeap(),0,this);
+    HeapFree(GetProcessHeap(),0,This);
     return 0;
   }
   
-  return this->ref;
+  return This->ref;
 }
 
 /*** IDirect3DTexture methods ***/
-static HRESULT WINAPI IDirect3DTexture_GetHandle(LPDIRECT3DTEXTURE this,
+static HRESULT WINAPI IDirect3DTextureImpl_GetHandle(LPDIRECT3DTEXTURE iface,
 						 LPDIRECT3DDEVICE lpD3DDevice,
 						 LPD3DTEXTUREHANDLE lpHandle)
 {
-  FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lpD3DDevice, lpHandle);
+  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  IDirect3DDeviceImpl* ilpD3DDevice=(IDirect3DDeviceImpl*)lpD3DDevice;
+  FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, ilpD3DDevice, lpHandle);
 
-  *lpHandle = (DWORD) this;
+  *lpHandle = (D3DTEXTUREHANDLE) This;
   
   /* Now, bind a new texture */
-  lpD3DDevice->set_context(lpD3DDevice);
-  this->D3Ddevice = (void *) lpD3DDevice;
-  if (this->tex_name == 0)
-    glGenTextures(1, &(this->tex_name));
+  ilpD3DDevice->set_context(ilpD3DDevice);
+  This->D3Ddevice = (void *) ilpD3DDevice;
+  if (This->tex_name == 0)
+    glGenTextures(1, &(This->tex_name));
 
-  TRACE(ddraw, "OpenGL texture handle is : %d\n", this->tex_name);
+  TRACE(ddraw, "OpenGL texture handle is : %d\n", This->tex_name);
   
   return D3D_OK;
 }
 
-static HRESULT WINAPI IDirect3DTexture_Initialize(LPDIRECT3DTEXTURE this,
+static HRESULT WINAPI IDirect3DTextureImpl_Initialize(LPDIRECT3DTEXTURE iface,
 						  LPDIRECT3DDEVICE lpD3DDevice,
 						  LPDIRECTDRAWSURFACE lpSurface)
 {
-  TRACE(ddraw, "(%p)->(%p,%p)\n", this, lpD3DDevice, lpSurface);
+  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p)\n", This, lpD3DDevice, lpSurface);
 
   return DDERR_ALREADYINITIALIZED;
 }
 
-static HRESULT WINAPI IDirect3DTexture_Unload(LPDIRECT3DTEXTURE this)
+static HRESULT WINAPI IDirect3DTextureImpl_Unload(LPDIRECT3DTEXTURE iface)
 {
-  FIXME(ddraw, "(%p)->(): stub\n", this);
+  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  FIXME(ddraw, "(%p)->(): stub\n", This);
 
   return D3D_OK;
 }
 
 /*** IDirect3DTexture2 methods ***/
-static HRESULT WINAPI IDirect3DTexture2_GetHandle(LPDIRECT3DTEXTURE2 this,
+static HRESULT WINAPI IDirect3DTexture2Impl_GetHandle(LPDIRECT3DTEXTURE2 iface,
 						  LPDIRECT3DDEVICE2 lpD3DDevice2,
 						  LPD3DTEXTUREHANDLE lpHandle)
 {
-  TRACE(ddraw, "(%p)->(%p,%p)\n", this, lpD3DDevice2, lpHandle);
+  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  IDirect3DDevice2Impl* ilpD3DDevice2=(IDirect3DDevice2Impl*)lpD3DDevice2;
+  TRACE(ddraw, "(%p)->(%p,%p)\n", This, ilpD3DDevice2, lpHandle);
 
   /* For 32 bits OSes, handles = pointers */
-  *lpHandle = (DWORD) this;
+  *lpHandle = (D3DTEXTUREHANDLE) This;
   
   /* Now, bind a new texture */
-  lpD3DDevice2->set_context(lpD3DDevice2);
-  this->D3Ddevice = (void *) lpD3DDevice2;
-  if (this->tex_name == 0)
-  glGenTextures(1, &(this->tex_name));
+  ilpD3DDevice2->set_context(ilpD3DDevice2);
+  This->D3Ddevice = (void *) ilpD3DDevice2;
+  if (This->tex_name == 0)
+  glGenTextures(1, &(This->tex_name));
 
-  TRACE(ddraw, "OpenGL texture handle is : %d\n", this->tex_name);
+  TRACE(ddraw, "OpenGL texture handle is : %d\n", This->tex_name);
   
   return D3D_OK;
 }
 
 /* Common methods */
-static HRESULT WINAPI IDirect3DTexture2_PaletteChanged(LPDIRECT3DTEXTURE2 this,
+static HRESULT WINAPI IDirect3DTexture2Impl_PaletteChanged(LPDIRECT3DTEXTURE2 iface,
 						       DWORD dwStart,
 						       DWORD dwCount)
 {
-  FIXME(ddraw, "(%p)->(%8ld,%8ld): stub\n", this, dwStart, dwCount);
+  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  FIXME(ddraw, "(%p)->(%8ld,%8ld): stub\n", This, dwStart, dwCount);
 
   return D3D_OK;
 }
 
 /* NOTE : if you experience crashes in this function, you must have a buggy
           version of Mesa. See the file d3dtexture.c for a cure */
-static HRESULT WINAPI IDirect3DTexture2_Load(LPDIRECT3DTEXTURE2 this,
+static HRESULT WINAPI IDirect3DTexture2Impl_Load(LPDIRECT3DTEXTURE2 iface,
 					     LPDIRECT3DTEXTURE2 lpD3DTexture2)
 {
+  ICOM_THIS(IDirect3DTexture2Impl,iface);
+  IDirect3DTexture2Impl* ilpD3DTexture2=(IDirect3DTexture2Impl*)lpD3DTexture2;
   DDSURFACEDESC	*src_d, *dst_d;
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpD3DTexture2);
+  TRACE(ddraw, "(%p)->(%p)\n", This, ilpD3DTexture2);
 
-  TRACE(ddraw, "Copied to surface %p, surface %p\n", this->surface, lpD3DTexture2->surface);
+  TRACE(ddraw, "Copied to surface %p, surface %p\n", This->surface, ilpD3DTexture2->surface);
 
   /* Suppress the ALLOCONLOAD flag */
-  this->surface->s.surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD;
+  This->surface->s.surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD;
 
   /* Copy one surface on the other */
-  dst_d = &(this->surface->s.surface_desc);
-  src_d = &(lpD3DTexture2->surface->s.surface_desc);
+  dst_d = &(This->surface->s.surface_desc);
+  src_d = &(ilpD3DTexture2->surface->s.surface_desc);
 
   if ((src_d->dwWidth != dst_d->dwWidth) || (src_d->dwHeight != dst_d->dwHeight)) {
     /* Should also check for same pixel format, lPitch, ... */
     ERR(ddraw, "Error in surface sizes\n");
     return D3DERR_TEXTURE_LOAD_FAILED;
   } else {
-    /* LPDIRECT3DDEVICE2 d3dd = (LPDIRECT3DDEVICE2) this->D3Ddevice; */
+    /* LPDIRECT3DDEVICE2 d3dd = (LPDIRECT3DDEVICE2) This->D3Ddevice; */
     /* I should put a macro for the calculus of bpp */
     int bpp = (src_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8 ?
 	       1 /* 8 bit of palette index */:
@@ -206,15 +218,15 @@
     glGetIntegerv(GL_TEXTURE_BINDING_2D, &current_texture);
 
     /* If the GetHandle was not done, get the texture name here */
-    if (this->tex_name == 0)
-      glGenTextures(1, &(this->tex_name));
-    glBindTexture(GL_TEXTURE_2D, this->tex_name);
+    if (This->tex_name == 0)
+      glGenTextures(1, &(This->tex_name));
+    glBindTexture(GL_TEXTURE_2D, This->tex_name);
 
     if (src_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) {
       /* ****************
 	 Paletted Texture
 	 **************** */
-      LPDIRECTDRAWPALETTE pal = this->surface->s.palette;
+      IDirectDrawPaletteImpl* pal = This->surface->s.palette;
       BYTE table[256][4];
       int i;
       
@@ -228,9 +240,9 @@
 	table[i][0] = pal->palents[i].peRed;
 	table[i][1] = pal->palents[i].peGreen;
 	table[i][2] = pal->palents[i].peBlue;
-	if ((this->surface->s.surface_desc.dwFlags & DDSD_CKSRCBLT) &&
-	    (i >= this->surface->s.surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue) &&
-	    (i <= this->surface->s.surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue))
+	if ((This->surface->s.surface_desc.dwFlags & DDSD_CKSRCBLT) &&
+	    (i >= This->surface->s.surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue) &&
+	    (i <= This->surface->s.surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue))
 	  table[i][3] = 0x00;
 	else
 	table[i][3] = 0xFF;
@@ -242,7 +254,7 @@
 	char buf[32];
 	int x, y;
 	
-	sprintf(buf, "%d.pnm", this->tex_name);
+	sprintf(buf, "%d.pnm", This->tex_name);
 	f = fopen(buf, "wb");
 	fprintf(f, "P6\n%d %d\n255\n", src_d->dwWidth, src_d->dwHeight);
 	for (y = 0; y < src_d->dwHeight; y++) {
@@ -296,7 +308,7 @@
 	    char buf[32];
 	    int x, y;
 	    
-	    sprintf(buf, "%d.pnm", this->tex_name);
+	    sprintf(buf, "%d.pnm", This->tex_name);
 	    f = fopen(buf, "wb");
 	    fprintf(f, "P6\n%d %d\n255\n", src_d->dwWidth, src_d->dwHeight);
 	    for (y = 0; y < src_d->dwHeight; y++) {
@@ -325,7 +337,7 @@
 	    char buf[32];
 	    int x, y;
 	    
-	    sprintf(buf, "%d.pnm", this->tex_name);
+	    sprintf(buf, "%d.pnm", This->tex_name);
 	    f = fopen(buf, "wb");
 	    fprintf(f, "P6\n%d %d\n255\n", src_d->dwWidth, src_d->dwHeight);
 	    for (y = 0; y < src_d->dwHeight; y++) {
@@ -395,42 +407,42 @@
 /*******************************************************************************
  *				IDirect3DTexture2 VTable
  */
-static IDirect3DTexture2_VTable texture2_vtable = {
+static ICOM_VTABLE(IDirect3DTexture2) texture2_vtable = {
   /*** IUnknown methods ***/
-  IDirect3DTexture2_QueryInterface,
-  IDirect3DTexture2_AddRef,
-  IDirect3DTexture2_Release,
+  IDirect3DTexture2Impl_QueryInterface,
+  IDirect3DTexture2Impl_AddRef,
+  IDirect3DTexture2Impl_Release,
   /*** IDirect3DTexture methods ***/
-  IDirect3DTexture2_GetHandle,
-  IDirect3DTexture2_PaletteChanged,
-  IDirect3DTexture2_Load
+  IDirect3DTexture2Impl_GetHandle,
+  IDirect3DTexture2Impl_PaletteChanged,
+  IDirect3DTexture2Impl_Load
 };
 
 /*******************************************************************************
  *				IDirect3DTexture VTable
  */
-static IDirect3DTexture_VTable texture_vtable = {
+static ICOM_VTABLE(IDirect3DTexture) texture_vtable = {
   /*** IUnknown methods ***/
-  IDirect3DTexture2_QueryInterface,
-  IDirect3DTexture2_AddRef,
-  IDirect3DTexture2_Release,
+  IDirect3DTexture2Impl_QueryInterface,
+  IDirect3DTexture2Impl_AddRef,
+  IDirect3DTexture2Impl_Release,
   /*** IDirect3DTexture methods ***/
-  IDirect3DTexture_Initialize,
-  IDirect3DTexture_GetHandle,
-  IDirect3DTexture2_PaletteChanged,
-  IDirect3DTexture2_Load,
-  IDirect3DTexture_Unload
+  IDirect3DTextureImpl_Initialize,
+  IDirect3DTextureImpl_GetHandle,
+  IDirect3DTexture2Impl_PaletteChanged,
+  IDirect3DTexture2Impl_Load,
+  IDirect3DTextureImpl_Unload
 };
 
 #else /* HAVE_MESAGL */
 
 /* These function should never be called if MesaGL is not present */
-LPDIRECT3DTEXTURE2 d3dtexture2_create(LPDIRECTDRAWSURFACE4 surf) {
+LPDIRECT3DTEXTURE2 d3dtexture2_create(IDirectDrawSurface4Impl* surf) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
 
-LPDIRECT3DTEXTURE d3dtexture_create(LPDIRECTDRAWSURFACE4 surf) {
+LPDIRECT3DTEXTURE d3dtexture_create(IDirectDrawSurface4Impl* surf) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
diff --git a/graphics/d3dviewport.c b/graphics/d3dviewport.c
index 393cdd7..b7f1d3c 100644
--- a/graphics/d3dviewport.c
+++ b/graphics/d3dviewport.c
@@ -17,16 +17,16 @@
 
 #ifdef HAVE_MESAGL
 
-static IDirect3DViewport2_VTable viewport2_vtable;
+static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable;
 
 /*******************************************************************************
  *				Viewport1/2 static functions
  */
-static void activate(LPDIRECT3DVIEWPORT2 this) {
-  LPDIRECT3DLIGHT l;
+static void activate(IDirect3DViewport2Impl* This) {
+  IDirect3DLightImpl* l;
   
   /* Activate all the lights associated with this context */
-  l = this->lights;
+  l = This->lights;
 
   while (l != NULL) {
     l->activate(l);
@@ -37,14 +37,14 @@
 /*******************************************************************************
  *				Viewport1/2 Creation functions
  */
-LPDIRECT3DVIEWPORT2 d3dviewport2_create(LPDIRECT3D2 d3d)
+LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2)
 {
-  LPDIRECT3DVIEWPORT2 vp;
+  IDirect3DViewport2Impl* vp;
   
-  vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2));
+  vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
   vp->ref = 1;
   vp->lpvtbl = &viewport2_vtable;
-  vp->d3d.d3d2 = d3d;
+  vp->d3d.d3d2 = d3d2;
   vp->use_d3d2 = 1;
 
   vp->device.active_device2 = NULL;
@@ -54,17 +54,17 @@
 
   vp->nextlight = GL_LIGHT0;
   
-  return vp;
+  return (LPDIRECT3DVIEWPORT2)vp;
 }
 
-LPDIRECT3DVIEWPORT d3dviewport_create(LPDIRECT3D d3d)
+LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1)
 {
-  LPDIRECT3DVIEWPORT2 vp;
+  IDirect3DViewport2Impl* vp;
   
-  vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2));
+  vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
   vp->ref = 1;
   vp->lpvtbl = &viewport2_vtable;
-  vp->d3d.d3d1 = d3d;
+  vp->d3d.d3d1 = d3d1;
   vp->use_d3d2 = 0;
 
   vp->device.active_device1 = NULL;
@@ -81,70 +81,76 @@
  *				IDirect3DViewport2 methods
  */
 
-static HRESULT WINAPI IDirect3DViewport2_QueryInterface(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_QueryInterface(LPDIRECT3DVIEWPORT2 iface,
 							REFIID riid,
 							LPVOID* ppvObj)
 {
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
   char xrefiid[50];
   
   WINE_StringFromCLSID((LPCLSID)riid,xrefiid);
-  FIXME(ddraw, "(%p)->(%s,%p): stub\n", this, xrefiid,ppvObj);
+  FIXME(ddraw, "(%p)->(%s,%p): stub\n", This, xrefiid,ppvObj);
   
   return S_OK;
 }
 
 
 
-static ULONG WINAPI IDirect3DViewport2_AddRef(LPDIRECT3DVIEWPORT2 this)
+static ULONG WINAPI IDirect3DViewport2Impl_AddRef(LPDIRECT3DVIEWPORT2 iface)
 {
-  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  TRACE(ddraw, "(%p)->()incrementing from %lu.\n", This, This->ref );
   
-  return ++(this->ref);
+  return ++(This->ref);
 }
 
 
 
-static ULONG WINAPI IDirect3DViewport2_Release(LPDIRECT3DVIEWPORT2 this)
+static ULONG WINAPI IDirect3DViewport2Impl_Release(LPDIRECT3DVIEWPORT2 iface)
 {
-  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
   
-  if (!--(this->ref)) {
-    HeapFree(GetProcessHeap(),0,this);
+  if (!--(This->ref)) {
+    HeapFree(GetProcessHeap(),0,This);
     return 0;
   }
   
-  return this->ref;
+  return This->ref;
 }
 
 /*** IDirect3DViewport methods ***/
-static HRESULT WINAPI IDirect3DViewport2_Initialize(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_Initialize(LPDIRECT3DVIEWPORT2 iface,
 						    LPDIRECT3D d3d)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, d3d);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, d3d);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_GetViewport(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_GetViewport(LPDIRECT3DVIEWPORT2 iface,
 						     LPD3DVIEWPORT lpvp)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvp);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpvp);
   
-  if (this->use_vp2 != 0)
+  if (This->use_vp2 != 0)
     return DDERR_INVALIDPARAMS;
 
-  *lpvp = this->viewport.vp1;
+  *lpvp = This->viewport.vp1;
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_SetViewport(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_SetViewport(LPDIRECT3DVIEWPORT2 iface,
 						     LPD3DVIEWPORT lpvp)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpvp);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpvp);
 
-  this->use_vp2 = 0;
-  this->viewport.vp1 = *lpvp;
+  This->use_vp2 = 0;
+  This->viewport.vp1 = *lpvp;
   
   TRACE(ddraw, "dwSize = %ld   dwX = %ld   dwY = %ld\n",
 	lpvp->dwSize, lpvp->dwX, lpvp->dwY);
@@ -161,76 +167,83 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_TransformVertices(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_TransformVertices(LPDIRECT3DVIEWPORT2 iface,
 							   DWORD dwVertexCount,
 							   LPD3DTRANSFORMDATA lpData,
 							   DWORD dwFlags,
 							   LPDWORD lpOffScreen)
 {
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
   FIXME(ddraw, "(%p)->(%8ld,%p,%08lx,%p): stub\n",
-	this, dwVertexCount, lpData, dwFlags, lpOffScreen);
+	This, dwVertexCount, lpData, dwFlags, lpOffScreen);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_LightElements(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_LightElements(LPDIRECT3DVIEWPORT2 iface,
 						       DWORD dwElementCount,
 						       LPD3DLIGHTDATA lpData)
 {
-  FIXME(ddraw, "(%p)->(%8ld,%p): stub\n", this, dwElementCount, lpData);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%8ld,%p): stub\n", This, dwElementCount, lpData);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_SetBackground(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_SetBackground(LPDIRECT3DVIEWPORT2 iface,
 						       D3DMATERIALHANDLE hMat)
 {
-  FIXME(ddraw, "(%p)->(%08lx): stub\n", this, (DWORD) hMat);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%08lx): stub\n", This, (DWORD) hMat);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_GetBackground(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_GetBackground(LPDIRECT3DVIEWPORT2 iface,
 						       LPD3DMATERIALHANDLE lphMat,
 						       LPBOOL lpValid)
 {
-  FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lphMat, lpValid);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, lphMat, lpValid);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
 							    LPDIRECTDRAWSURFACE lpDDSurface)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpDDSurface);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpDDSurface);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
 							    LPDIRECTDRAWSURFACE* lplpDDSurface,
 							    LPBOOL lpValid)
 {
-  FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lplpDDSurface, lpValid);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p): stub\n", This, lplpDDSurface, lpValid);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_Clear(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_Clear(LPDIRECT3DVIEWPORT2 iface,
 					       DWORD dwCount,
 					       LPD3DRECT lpRects,
 					       DWORD dwFlags)
 {
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
   GLboolean ztest;
-  FIXME(ddraw, "(%p)->(%8ld,%p,%08lx): stub\n", this, dwCount, lpRects, dwFlags);
+  FIXME(ddraw, "(%p)->(%8ld,%p,%08lx): stub\n", This, dwCount, lpRects, dwFlags);
 
   /* For the moment, ignore the rectangles */
-  if (this->device.active_device1 != NULL) {
+  if (This->device.active_device1 != NULL) {
     /* Get the rendering context */
-    if (this->use_d3d2)
-      this->device.active_device2->set_context(this->device.active_device2);
+    if (This->use_d3d2)
+      This->device.active_device2->set_context(This->device.active_device2);
     else
-      this->device.active_device1->set_context(this->device.active_device1);
+      This->device.active_device1->set_context(This->device.active_device1);
   }
 
     /* Clears the screen */
@@ -242,67 +255,73 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_AddLight(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_AddLight(LPDIRECT3DVIEWPORT2 iface,
 						  LPDIRECT3DLIGHT lpLight)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpLight);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  IDirect3DLightImpl* ilpLight=(IDirect3DLightImpl*)lpLight;
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, ilpLight);
 
   /* Add the light in the 'linked' chain */
-  lpLight->next = this->lights;
-  this->lights = lpLight;
+  ilpLight->next = This->lights;
+  This->lights = ilpLight;
 
   /* If active, activate the light */
-  if (this->device.active_device1 != NULL) {
+  if (This->device.active_device1 != NULL) {
     /* Get the rendering context */
-    if (this->use_d3d2)
-      this->device.active_device2->set_context(this->device.active_device2);
+    if (This->use_d3d2)
+      This->device.active_device2->set_context(This->device.active_device2);
     else
-      this->device.active_device1->set_context(this->device.active_device1);
+      This->device.active_device1->set_context(This->device.active_device1);
     
     /* Activate the light */
-    lpLight->light_num = this->nextlight++;
-    lpLight->activate(lpLight);
+    ilpLight->light_num = This->nextlight++;
+    ilpLight->activate(ilpLight);
   }
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_DeleteLight(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_DeleteLight(LPDIRECT3DVIEWPORT2 iface,
 						     LPDIRECT3DLIGHT lpLight)
 {
-  FIXME(ddraw, "(%p)->(%p): stub\n", this, lpLight);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p): stub\n", This, lpLight);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_NextLight(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_NextLight(LPDIRECT3DVIEWPORT2 iface,
 						   LPDIRECT3DLIGHT lpLight,
 						   LPDIRECT3DLIGHT* lplpLight,
 						   DWORD dwFlags)
 {
-  FIXME(ddraw, "(%p)->(%p,%p,%08lx): stub\n", this, lpLight, lplpLight, dwFlags);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p,%08lx): stub\n", This, lpLight, lplpLight, dwFlags);
   
   return DD_OK;
 }
 
 /*** IDirect3DViewport2 methods ***/
-static HRESULT WINAPI IDirect3DViewport2_GetViewport2(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_GetViewport2(LPDIRECT3DVIEWPORT2 iface,
 						      LPD3DVIEWPORT2 lpViewport2)
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpViewport2);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpViewport2);
 
-  if (this->use_vp2 != 1)
+  if (This->use_vp2 != 1)
     return DDERR_INVALIDPARAMS;
 
-  *lpViewport2 = this->viewport.vp2;
+  *lpViewport2 = This->viewport.vp2;
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3DViewport2_SetViewport2(LPDIRECT3DVIEWPORT2 this,
+static HRESULT WINAPI IDirect3DViewport2Impl_SetViewport2(LPDIRECT3DVIEWPORT2 iface,
 						      LPD3DVIEWPORT2 lpViewport2)
 {
-  TRACE(ddraw, "(%p)->(%p)\n", this, lpViewport2);
+  ICOM_THIS(IDirect3DViewport2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p)\n", This, lpViewport2);
 
   TRACE(ddraw, "dwSize = %ld   dwX = %ld   dwY = %ld\n",
 	lpViewport2->dwSize, lpViewport2->dwX, lpViewport2->dwY);
@@ -315,8 +334,8 @@
   TRACE(ddraw, "dvMinZ = %f   dvMaxZ = %f\n",
 	lpViewport2->dvMinZ, lpViewport2->dvMaxZ);
 
-  this->viewport.vp2 = *lpViewport2;
-  this->use_vp2 = 1;
+  This->viewport.vp2 = *lpViewport2;
+  This->use_vp2 = 1;
   
   return DD_OK;
 }
@@ -325,38 +344,38 @@
 /*******************************************************************************
  *				IDirect3DViewport1/2 VTable
  */
-static IDirect3DViewport2_VTable viewport2_vtable = {
+static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable = {
   /*** IUnknown methods ***/
-  IDirect3DViewport2_QueryInterface,
-  IDirect3DViewport2_AddRef,
-  IDirect3DViewport2_Release,
+  IDirect3DViewport2Impl_QueryInterface,
+  IDirect3DViewport2Impl_AddRef,
+  IDirect3DViewport2Impl_Release,
   /*** IDirect3DViewport methods ***/
-  IDirect3DViewport2_Initialize,
-  IDirect3DViewport2_GetViewport,
-  IDirect3DViewport2_SetViewport,
-  IDirect3DViewport2_TransformVertices,
-  IDirect3DViewport2_LightElements,
-  IDirect3DViewport2_SetBackground,
-  IDirect3DViewport2_GetBackground,
-  IDirect3DViewport2_SetBackgroundDepth,
-  IDirect3DViewport2_GetBackgroundDepth,
-  IDirect3DViewport2_Clear,
-  IDirect3DViewport2_AddLight,
-  IDirect3DViewport2_DeleteLight,
-  IDirect3DViewport2_NextLight,
+  IDirect3DViewport2Impl_Initialize,
+  IDirect3DViewport2Impl_GetViewport,
+  IDirect3DViewport2Impl_SetViewport,
+  IDirect3DViewport2Impl_TransformVertices,
+  IDirect3DViewport2Impl_LightElements,
+  IDirect3DViewport2Impl_SetBackground,
+  IDirect3DViewport2Impl_GetBackground,
+  IDirect3DViewport2Impl_SetBackgroundDepth,
+  IDirect3DViewport2Impl_GetBackgroundDepth,
+  IDirect3DViewport2Impl_Clear,
+  IDirect3DViewport2Impl_AddLight,
+  IDirect3DViewport2Impl_DeleteLight,
+  IDirect3DViewport2Impl_NextLight,
   /*** IDirect3DViewport2 methods ***/
-  IDirect3DViewport2_GetViewport2,
-  IDirect3DViewport2_SetViewport2
+  IDirect3DViewport2Impl_GetViewport2,
+  IDirect3DViewport2Impl_SetViewport2
 };
 
 #else /* HAVE_MESAGL */
 
-LPDIRECT3DVIEWPORT d3dviewport_create(LPDIRECT3D d3d) {
+LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
 
-LPDIRECT3DVIEWPORT2 d3dviewport2_create(LPDIRECT3D2 d3d) {
+LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
diff --git a/graphics/ddraw.c b/graphics/ddraw.c
index 0b710b0..638ff69 100644
--- a/graphics/ddraw.c
+++ b/graphics/ddraw.c
@@ -64,6 +64,7 @@
 #include "monitor.h"
 
 /* This for all the enumeration and creation of D3D-related objects */
+#include "ddraw_private.h"
 #include "d3d_private.h"
 
 /* define this if you want to play Diablo using XF86DGA. (bug workaround) */
@@ -91,14 +92,14 @@
     {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79}
 };
 
-static struct IDirectDrawSurface4_VTable	dga_dds4vt, xlib_dds4vt;
-static struct IDirectDraw_VTable		dga_ddvt, xlib_ddvt;
-static struct IDirectDraw2_VTable		dga_dd2vt, xlib_dd2vt;
-static struct IDirectDraw4_VTable		dga_dd4vt, xlib_dd4vt;
-static struct IDirectDrawClipper_VTable	ddclipvt;
-static struct IDirectDrawPalette_VTable dga_ddpalvt, xlib_ddpalvt;
-static struct IDirect3D_VTable			d3dvt;
-static struct IDirect3D2_VTable			d3d2vt;
+static struct ICOM_VTABLE(IDirectDrawSurface4)	dga_dds4vt, xlib_dds4vt;
+static struct ICOM_VTABLE(IDirectDraw)		dga_ddvt, xlib_ddvt;
+static struct ICOM_VTABLE(IDirectDraw2)		dga_dd2vt, xlib_dd2vt;
+static struct ICOM_VTABLE(IDirectDraw4)		dga_dd4vt, xlib_dd4vt;
+static struct ICOM_VTABLE(IDirectDrawClipper)	ddclipvt;
+static struct ICOM_VTABLE(IDirectDrawPalette) dga_ddpalvt, xlib_ddpalvt;
+static struct ICOM_VTABLE(IDirect3D)			d3dvt;
+static struct ICOM_VTABLE(IDirect3D2)			d3d2vt;
 
 #ifdef HAVE_LIBXXF86VM
 static XF86VidModeModeInfo *orig_mode = NULL;
@@ -512,17 +513,18 @@
  * DDS and DDS2 use those functions. (Function calls did not change (except
  * using different DirectDrawSurfaceX version), just added flags and functions)
  */
-static HRESULT WINAPI IDirectDrawSurface4_Lock(
-    LPDIRECTDRAWSURFACE4 this,LPRECT lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE hnd
+static HRESULT WINAPI IDirectDrawSurface4Impl_Lock(
+    LPDIRECTDRAWSURFACE4 iface,LPRECT lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE hnd
 ) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
         TRACE(ddraw, "(%p)->Lock(%p,%p,%08lx,%08lx)\n",
-		this,lprect,lpddsd,flags,(DWORD)hnd);
+		This,lprect,lpddsd,flags,(DWORD)hnd);
 	if (flags & ~(DDLOCK_WAIT|DDLOCK_READONLY|DDLOCK_WRITEONLY))
 	    WARN(ddraw, "(%p)->Lock(%p,%p,%08lx,%08lx)\n",
-			 this,lprect,lpddsd,flags,(DWORD)hnd);
+			 This,lprect,lpddsd,flags,(DWORD)hnd);
 
 	/* First, copy the Surface description */
-	*lpddsd = this->s.surface_desc;
+	*lpddsd = This->s.surface_desc;
 	TRACE(ddraw,"locked surface: height=%ld, width=%ld, pitch=%ld\n",
 	      lpddsd->dwHeight,lpddsd->dwWidth,lpddsd->lPitch);
 
@@ -531,101 +533,105 @@
 		FIXME(ddraw,"	lprect: %dx%d-%dx%d\n",
 			lprect->top,lprect->left,lprect->bottom,lprect->right
 		);
-		lpddsd->y.lpSurface = this->s.surface_desc.y.lpSurface +
-			(lprect->top*this->s.surface_desc.lPitch) +
-			(lprect->left*(this->s.surface_desc.ddpfPixelFormat.x.dwRGBBitCount / 8));
+		lpddsd->y.lpSurface = This->s.surface_desc.y.lpSurface +
+			(lprect->top*This->s.surface_desc.lPitch) +
+			(lprect->left*(This->s.surface_desc.ddpfPixelFormat.x.dwRGBBitCount / 8));
 	} else {
-		assert(this->s.surface_desc.y.lpSurface);
+		assert(This->s.surface_desc.y.lpSurface);
 	}
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface4_Unlock(
-	LPDIRECTDRAWSURFACE4 this,LPVOID surface
+static HRESULT WINAPI DGA_IDirectDrawSurface4Impl_Unlock(
+	LPDIRECTDRAWSURFACE4 iface,LPVOID surface
 ) {
-	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	TRACE(ddraw,"(%p)->Unlock(%p)\n",This,surface);
 	return DD_OK;
 }
 
-static void Xlib_copy_surface_on_screen(LPDIRECTDRAWSURFACE4 this) {
-  if (this->s.ddraw->d.pixel_convert != NULL)
-    this->s.ddraw->d.pixel_convert(this->s.surface_desc.y.lpSurface,
-				   this->t.xlib.image->data,
-				   this->s.surface_desc.dwWidth,
-				   this->s.surface_desc.dwHeight,
-				   this->s.surface_desc.lPitch,
-				   this->s.palette);
+static void Xlib_copy_surface_on_screen(IDirectDrawSurface4Impl* This) {
+  if (This->s.ddraw->d.pixel_convert != NULL)
+    This->s.ddraw->d.pixel_convert(This->s.surface_desc.y.lpSurface,
+				   This->t.xlib.image->data,
+				   This->s.surface_desc.dwWidth,
+				   This->s.surface_desc.dwHeight,
+				   This->s.surface_desc.lPitch,
+				   This->s.palette);
 
 #ifdef HAVE_LIBXXSHM
-    if (this->s.ddraw->e.xlib.xshm_active)
+    if (This->s.ddraw->e.xlib.xshm_active)
       TSXShmPutImage(display,
-		     this->s.ddraw->d.drawable,
+		     This->s.ddraw->d.drawable,
 		     DefaultGCOfScreen(X11DRV_GetXScreen()),
-		     this->t.xlib.image,
+		     This->t.xlib.image,
 		     0, 0, 0, 0,
-		     this->t.xlib.image->width,
-		     this->t.xlib.image->height,
+		     This->t.xlib.image->width,
+		     This->t.xlib.image->height,
 		     False);
     else
 #endif
 	TSXPutImage(		display,
-				this->s.ddraw->d.drawable,
+				This->s.ddraw->d.drawable,
 				DefaultGCOfScreen(X11DRV_GetXScreen()),
-				this->t.xlib.image,
+				This->t.xlib.image,
 				0, 0, 0, 0,
-				this->t.xlib.image->width,
-		  this->t.xlib.image->height);
+				This->t.xlib.image->width,
+		  This->t.xlib.image->height);
 }
 
-static HRESULT WINAPI Xlib_IDirectDrawSurface4_Unlock(
-	LPDIRECTDRAWSURFACE4 this,LPVOID surface)
+static HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_Unlock(
+	LPDIRECTDRAWSURFACE4 iface,LPVOID surface)
 {
-	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	TRACE(ddraw,"(%p)->Unlock(%p)\n",This,surface);
   
-	if (!this->s.ddraw->d.paintable)
+	if (!This->s.ddraw->d.paintable)
 		return DD_OK;
 
   /* Only redraw the screen when unlocking the buffer that is on screen */
-	if ((this->t.xlib.image != NULL) &&
-	    (this->s.surface_desc.ddsCaps.dwCaps & DDSCAPS_VISIBLE)) {
-	  Xlib_copy_surface_on_screen(this);
+	if ((This->t.xlib.image != NULL) &&
+	    (This->s.surface_desc.ddsCaps.dwCaps & DDSCAPS_VISIBLE)) {
+	  Xlib_copy_surface_on_screen(This);
 	  
-	if (this->s.palette && this->s.palette->cm)
-		TSXSetWindowColormap(display,this->s.ddraw->d.drawable,this->s.palette->cm);
+	if (This->s.palette && This->s.palette->cm)
+		TSXSetWindowColormap(display,This->s.ddraw->d.drawable,This->s.palette->cm);
 	}
 
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface4_Flip(
-	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
+static HRESULT WINAPI DGA_IDirectDrawSurface4Impl_Flip(
+	LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
 ) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+        IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto;
 #ifdef HAVE_LIBXXF86DGA
-	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
-	if (!flipto) {
-		if (this->s.backbuffer)
-			flipto = this->s.backbuffer;
+	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags);
+	if (!iflipto) {
+		if (This->s.backbuffer)
+			iflipto = This->s.backbuffer;
 		else
-			flipto = this;
+			iflipto = This;
 	}
-	TSXF86DGASetViewPort(display,DefaultScreen(display),0,flipto->t.dga.fb_height);
+	TSXF86DGASetViewPort(display,DefaultScreen(display),0,iflipto->t.dga.fb_height);
 
-	if (flipto->s.palette && flipto->s.palette->cm) {
-		TSXF86DGAInstallColormap(display,DefaultScreen(display),flipto->s.palette->cm);
+	if (iflipto->s.palette && iflipto->s.palette->cm) {
+		TSXF86DGAInstallColormap(display,DefaultScreen(display),iflipto->s.palette->cm);
 	}
 	while (!TSXF86DGAViewPortChanged(display,DefaultScreen(display),2)) {
 	}
-	if (flipto!=this) {
+	if (iflipto!=This) {
 		int	tmp;
 		LPVOID	ptmp;
 
-		tmp = this->t.dga.fb_height;
-		this->t.dga.fb_height = flipto->t.dga.fb_height;
-		flipto->t.dga.fb_height = tmp;
+		tmp = This->t.dga.fb_height;
+		This->t.dga.fb_height = iflipto->t.dga.fb_height;
+		iflipto->t.dga.fb_height = tmp;
 
-		ptmp = this->s.surface_desc.y.lpSurface;
-		this->s.surface_desc.y.lpSurface = flipto->s.surface_desc.y.lpSurface;
-		flipto->s.surface_desc.y.lpSurface = ptmp;
+		ptmp = This->s.surface_desc.y.lpSurface;
+		This->s.surface_desc.y.lpSurface = iflipto->s.surface_desc.y.lpSurface;
+		iflipto->s.surface_desc.y.lpSurface = ptmp;
 	}
 	return DD_OK;
 #else /* defined(HAVE_LIBXXF86DGA) */
@@ -633,34 +639,36 @@
 #endif /* defined(HAVE_LIBXXF86DGA) */
 }
 
-static HRESULT WINAPI Xlib_IDirectDrawSurface4_Flip(
-	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
+static HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_Flip(
+	LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
 ) {
-	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
-	if (!this->s.ddraw->d.paintable)
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+        IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto;
+	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags);
+	if (!This->s.ddraw->d.paintable)
 		return DD_OK;
 
-	if (!flipto) {
-		if (this->s.backbuffer)
-			flipto = this->s.backbuffer;
+	if (!iflipto) {
+		if (This->s.backbuffer)
+			iflipto = This->s.backbuffer;
 		else
-			flipto = this;
+			iflipto = This;
 	}
   
-	Xlib_copy_surface_on_screen(this);
+	Xlib_copy_surface_on_screen(This);
 	
-	if (flipto->s.palette && flipto->s.palette->cm) {
-	  TSXSetWindowColormap(display,this->s.ddraw->d.drawable,flipto->s.palette->cm);
+	if (iflipto->s.palette && iflipto->s.palette->cm) {
+	  TSXSetWindowColormap(display,This->s.ddraw->d.drawable,iflipto->s.palette->cm);
 	}
-	if (flipto!=this) {
+	if (iflipto!=This) {
 		XImage *tmp;
 		LPVOID	*surf;
-		tmp = this->t.xlib.image;
-		this->t.xlib.image = flipto->t.xlib.image;
-		flipto->t.xlib.image = tmp;
-		surf = this->s.surface_desc.y.lpSurface;
-		this->s.surface_desc.y.lpSurface = flipto->s.surface_desc.y.lpSurface;
-		flipto->s.surface_desc.y.lpSurface = surf;
+		tmp = This->t.xlib.image;
+		This->t.xlib.image = iflipto->t.xlib.image;
+		iflipto->t.xlib.image = tmp;
+		surf = This->s.surface_desc.y.lpSurface;
+		This->s.surface_desc.y.lpSurface = iflipto->s.surface_desc.y.lpSurface;
+		iflipto->s.surface_desc.y.lpSurface = surf;
 	}
 	return DD_OK;
 }
@@ -670,91 +678,95 @@
  * DirectDrawPalette object to a surface. The surface uses this palette for all
  * subsequent operations. The palette change takes place immediately.
  */
-static HRESULT WINAPI Xlib_IDirectDrawSurface4_SetPalette(
-	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWPALETTE pal
+static HRESULT WINAPI Xlib_IDirectDrawSurface4Impl_SetPalette(
+	LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE pal
 ) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+        IDirectDrawPaletteImpl* ipal=(IDirectDrawPaletteImpl*)pal;
 	int i;
-	TRACE(ddraw,"(%p)->(%p)\n",this,pal);
+	TRACE(ddraw,"(%p)->(%p)\n",This,ipal);
 
-	if (pal == NULL) {
-          if( this->s.palette != NULL )
-            this->s.palette->lpvtbl->fnRelease( this->s.palette );
-	  this->s.palette = pal;
+	if (ipal == NULL) {
+          if( This->s.palette != NULL )
+            IDirectDrawPalette_Release((IDirectDrawPalette*)This->s.palette);
+	  This->s.palette = ipal;
 
 	  return DD_OK;
 	}
 	
-	if( !(pal->cm) && (this->s.ddraw->d.screen_pixelformat.x.dwRGBBitCount<=8)) 
+	if( !(ipal->cm) && (This->s.ddraw->d.screen_pixelformat.x.dwRGBBitCount<=8)) 
 	{
-		pal->cm = TSXCreateColormap(display,this->s.ddraw->d.drawable,
+		ipal->cm = TSXCreateColormap(display,This->s.ddraw->d.drawable,
 					    DefaultVisualOfScreen(X11DRV_GetXScreen()),AllocAll);
 
     	    	if (!Options.managed)
-			TSXInstallColormap(display,pal->cm);
+			TSXInstallColormap(display,ipal->cm);
 
 		for (i=0;i<256;i++) {
 			XColor xc;
 
-			xc.red = pal->palents[i].peRed<<8;
-			xc.blue = pal->palents[i].peBlue<<8;
-			xc.green = pal->palents[i].peGreen<<8;
+			xc.red = ipal->palents[i].peRed<<8;
+			xc.blue = ipal->palents[i].peBlue<<8;
+			xc.green = ipal->palents[i].peGreen<<8;
 			xc.flags = DoRed|DoBlue|DoGreen;
 			xc.pixel = i;
-			TSXStoreColor(display,pal->cm,&xc);
+			TSXStoreColor(display,ipal->cm,&xc);
 		}
-		TSXInstallColormap(display,pal->cm);
+		TSXInstallColormap(display,ipal->cm);
         }
 
         /* According to spec, we are only supposed to 
          * AddRef if this is not the same palette.
          */
-        if( this->s.palette != pal )
+        if( This->s.palette != ipal )
         {
-          if( pal != NULL )
-            pal->lpvtbl->fnAddRef( pal );
-          if( this->s.palette != NULL )
-            this->s.palette->lpvtbl->fnRelease( this->s.palette );
-	  this->s.palette = pal; 
+          if( ipal != NULL )
+            IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal );
+          if( This->s.palette != NULL )
+            IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.palette );
+	  This->s.palette = ipal; 
 
           /* I think that we need to attach it to all backbuffers...*/
-          if( this->s.backbuffer ) {
-             if( this->s.backbuffer->s.palette )
-               this->s.backbuffer->s.palette->lpvtbl->fnRelease(
-                 this->s.backbuffer->s.palette );
-             this->s.backbuffer->s.palette = pal;
-             if( pal )
-                pal->lpvtbl->fnAddRef( pal );
+          if( This->s.backbuffer ) {
+             if( This->s.backbuffer->s.palette )
+               IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.backbuffer->s.palette );
+             This->s.backbuffer->s.palette = ipal;
+             if( ipal )
+                IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal );
            }
           /* Perform the refresh */
-          TSXSetWindowColormap(display,this->s.ddraw->d.drawable,this->s.palette->cm);
+          TSXSetWindowColormap(display,This->s.ddraw->d.drawable,This->s.palette->cm);
         }
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface4_SetPalette(
-	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWPALETTE pal
+static HRESULT WINAPI DGA_IDirectDrawSurface4Impl_SetPalette(
+	LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE pal
 ) {
-	TRACE(ddraw,"(%p)->(%p)\n",this,pal);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+        IDirectDrawPaletteImpl* ipal=(IDirectDrawPaletteImpl*)pal;
+	TRACE(ddraw,"(%p)->(%p)\n",This,ipal);
 #ifdef HAVE_LIBXXF86DGA
         /* According to spec, we are only supposed to 
          * AddRef if this is not the same palette.
          */
-        if( this->s.palette != pal )
+        if( This->s.palette != ipal )
         {
-          if( pal != NULL ) 
-	  	pal->lpvtbl->fnAddRef( pal );
-          if( this->s.palette != NULL )
-            this->s.palette->lpvtbl->fnRelease( this->s.palette );
-	  this->s.palette = pal; 
+          if( ipal != NULL ) 
+	  	IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal );
+          if( This->s.palette != NULL )
+            IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.palette );
+	  This->s.palette = ipal; 
 
           /* I think that we need to attach it to all backbuffers...*/
-          if( this->s.backbuffer ) {
-             if( this->s.backbuffer->s.palette )
-               this->s.backbuffer->s.palette->lpvtbl->fnRelease(this->s.backbuffer->s.palette );
-             this->s.backbuffer->s.palette = pal;
-             if( pal ) pal->lpvtbl->fnAddRef( pal );
+          if( This->s.backbuffer ) {
+             if( This->s.backbuffer->s.palette )
+               IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.backbuffer->s.palette );
+             This->s.backbuffer->s.palette = ipal;
+             if ( ipal )
+               IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal );
           }
-	  TSXF86DGAInstallColormap(display,DefaultScreen(display),this->s.palette->cm);
+	  TSXF86DGAInstallColormap(display,DefaultScreen(display),This->s.palette->cm);
         }
 	return DD_OK;
 #else /* defined(HAVE_LIBXXF86DGA) */
@@ -764,19 +776,21 @@
 
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_Blt(
-	LPDIRECTDRAWSURFACE4 this,LPRECT rdst,LPDIRECTDRAWSURFACE4 src,LPRECT rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
+static HRESULT WINAPI IDirectDrawSurface4Impl_Blt(
+	LPDIRECTDRAWSURFACE4 iface,LPRECT rdst,LPDIRECTDRAWSURFACE4 src,LPRECT rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
 ) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+        IDirectDrawSurface4Impl* isrc=(IDirectDrawSurface4Impl*)src;
 	RECT	xdst,xsrc;
 	DDSURFACEDESC	ddesc,sdesc;
 	int	i,j;
 
 	  TRACE(ddraw,"(%p)->(%p,%p,%p,%08lx,%p)\n",
-		this,rdst,src,rsrc,dwFlags,lpbltfx);
+		This,rdst,isrc,rsrc,dwFlags,lpbltfx);
 
-	if (src != NULL)
-	  src ->lpvtbl->fnLock(src, NULL,&sdesc,0,0);
-	this->lpvtbl->fnLock(this,NULL,&ddesc,0,0);
+	if (isrc != NULL)
+	  IDirectDrawSurface4_Lock(src, NULL,&sdesc,0,0);
+	IDirectDrawSurface4_Lock(iface,NULL,&ddesc,0,0);
 	
 	if (TRACE_ON(ddraw)) {
 	  if (rdst) TRACE(ddraw,"	destrect :%dx%d-%dx%d\n",rdst->left,rdst->top,rdst->right,rdst->bottom);
@@ -799,7 +813,7 @@
 	if (rsrc) {
 		memcpy(&xsrc,rsrc,sizeof(xsrc));
 	} else {
-		if (src) {
+		if (isrc) {
 		xsrc.top	= 0;
 		xsrc.bottom	= sdesc.dwHeight;
 		xsrc.left	= 0;
@@ -849,11 +863,11 @@
 #endif HAVE_MESAGL
 	}
 	
-	if (!src) {
+	if (!isrc) {
 	    if (dwFlags) {
 	      TRACE(ddraw,"\t(src=NULL):Unsupported flags: "); _dump_DDBLT(dwFlags);
 	    }
-	    this->lpvtbl->fnUnlock(this,ddesc.y.lpSurface);
+	    IDirectDrawSurface4_Unlock(iface,ddesc.y.lpSurface);
 	    return DD_OK;
 	}
 
@@ -903,8 +917,8 @@
 
 		    tmp = sbuf[(((int) sy) * sdesc.lPitch) + ((int) sx)];
 		    
-		    if ((tmp < src->s.surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue) ||
-			(tmp > src->s.surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue))
+		    if ((tmp < isrc->s.surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue) ||
+			(tmp > isrc->s.surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue))
 		      dbuf[(y * ddesc.lPitch) + x] = tmp;
 		  }
 		}
@@ -940,8 +954,8 @@
 		    ((h + xdst.top) * ddesc.lPitch) + xdst.left;
 		  for(i=0;i<srcwidth;i++) {
 		    tmp=*(psrc + i);
-		    if ((tmp < src->s.surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue) ||
-			(tmp > src->s.surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue))
+		    if ((tmp < isrc->s.surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue) ||
+			(tmp > isrc->s.surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue))
 		      *(pdst + i)=tmp;
 		  }
 		}
@@ -959,8 +973,8 @@
 		    ((h + xdst.top) * ddesc.lPitch) + xdst.left;
 		  for(i=0;i<srcwidth;i++) {
 		    tmp=*(psrc + i);
-		    if ((tmp < src->s.surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue) ||
-			(tmp > src->s.surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue))
+		    if ((tmp < isrc->s.surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue) ||
+			(tmp > isrc->s.surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue))
 		      *(pdst + i)=tmp;
 		  }
 		}
@@ -985,21 +999,22 @@
 	  FIXME(ddraw,"\tUnsupported flags: ");_dump_DDBLT(dwFlags);
 	}
 
-	this->lpvtbl->fnUnlock(this,ddesc.y.lpSurface);
-	src ->lpvtbl->fnUnlock(src,sdesc.y.lpSurface);
+	IDirectDrawSurface4_Unlock(iface,ddesc.y.lpSurface);
+	IDirectDrawSurface4_Unlock(src,sdesc.y.lpSurface);
 
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_BltFast(
-	LPDIRECTDRAWSURFACE4 this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE4 src,LPRECT rsrc,DWORD trans
+static HRESULT WINAPI IDirectDrawSurface4Impl_BltFast(
+	LPDIRECTDRAWSURFACE4 iface,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE4 src,LPRECT rsrc,DWORD trans
 ) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
 	int		i,bpp,w,h;
 	DDSURFACEDESC	ddesc,sdesc;
 
 	if (1  || TRACE_ON(ddraw)) {
 	    FIXME(ddraw,"(%p)->(%ld,%ld,%p,%p,%08lx)\n",
-		    this,dstx,dsty,src,rsrc,trans
+		    This,dstx,dsty,src,rsrc,trans
 	    );
 	    FIXME(ddraw,"	trans:");
 	    if (FIXME_ON(ddraw))
@@ -1007,9 +1022,9 @@
 	    FIXME(ddraw,"	srcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom);
 	}
 	/* We need to lock the surfaces, or we won't get refreshes when done. */
-	src ->lpvtbl->fnLock(src, NULL,&sdesc,DDLOCK_READONLY, 0);
-	this->lpvtbl->fnLock(this,NULL,&ddesc,DDLOCK_WRITEONLY,0);
-	bpp = this->s.surface_desc.ddpfPixelFormat.x.dwRGBBitCount / 8;
+	IDirectDrawSurface4_Lock(src, NULL,&sdesc,DDLOCK_READONLY, 0);
+	IDirectDrawSurface4_Lock(iface,NULL,&ddesc,DDLOCK_WRITEONLY,0);
+	bpp = This->s.surface_desc.ddpfPixelFormat.x.dwRGBBitCount / 8;
 	h=rsrc->bottom-rsrc->top;
 	if (h>ddesc.dwHeight-dsty) h=ddesc.dwHeight-dsty;
 	if (h>sdesc.dwHeight-rsrc->top) h=sdesc.dwHeight-rsrc->top;
@@ -1025,36 +1040,39 @@
 			w*bpp
 		);
 	}
-	this->lpvtbl->fnUnlock(this,ddesc.y.lpSurface);
-	src ->lpvtbl->fnUnlock(src,sdesc.y.lpSurface);
+	IDirectDrawSurface4_Unlock(iface,ddesc.y.lpSurface);
+	IDirectDrawSurface4_Unlock(src,sdesc.y.lpSurface);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_BltBatch(
-	LPDIRECTDRAWSURFACE4 this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
+static HRESULT WINAPI IDirectDrawSurface4Impl_BltBatch(
+	LPDIRECTDRAWSURFACE4 iface,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
 ) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
 	FIXME(ddraw,"(%p)->BltBatch(%p,%08lx,%08lx),stub!\n",
-		this,ddbltbatch,x,y
+		This,ddbltbatch,x,y
 	);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetCaps(
-	LPDIRECTDRAWSURFACE4 this,LPDDSCAPS caps
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetCaps(
+	LPDIRECTDRAWSURFACE4 iface,LPDDSCAPS caps
 ) {
-	TRACE(ddraw,"(%p)->GetCaps(%p)\n",this,caps);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	TRACE(ddraw,"(%p)->GetCaps(%p)\n",This,caps);
 	caps->dwCaps = DDSCAPS_PALETTE; /* probably more */
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetSurfaceDesc(
-	LPDIRECTDRAWSURFACE4 this,LPDDSURFACEDESC ddsd
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetSurfaceDesc(
+	LPDIRECTDRAWSURFACE4 iface,LPDDSURFACEDESC ddsd
 ) { 
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
 		TRACE(ddraw, "(%p)->GetSurfaceDesc(%p)\n",
-			     this,ddsd);
+			     This,ddsd);
   
   /* Simply copy the surface description stored in the object */
-  *ddsd = this->s.surface_desc;
+  *ddsd = This->s.surface_desc;
   
   if (TRACE_ON(ddraw)) {
     DUMP("   flags: ");
@@ -1072,101 +1090,105 @@
 	return DD_OK;
 }
 
-static ULONG WINAPI IDirectDrawSurface4_AddRef(LPDIRECTDRAWSURFACE4 this) {
-        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI IDirectDrawSurface4Impl_AddRef(LPDIRECTDRAWSURFACE4 iface) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", This, This->ref );
 
-	return ++(this->ref);
+	return ++(This->ref);
 }
 
-static ULONG WINAPI DGA_IDirectDrawSurface4_Release(LPDIRECTDRAWSURFACE4 this) {
-        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI DGA_IDirectDrawSurface4Impl_Release(LPDIRECTDRAWSURFACE4 iface) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
 
 #ifdef HAVE_LIBXXF86DGA
-	if (!--(this->ref)) {
-		this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
+	if (!--(This->ref)) {
+		IDirectDraw2_Release((IDirectDraw2*)This->s.ddraw);
 		/* clear out of surface list */
-		if (this->t.dga.fb_height == -1) {
-			HeapFree(GetProcessHeap(),0,this->s.surface_desc.y.lpSurface);
+		if (This->t.dga.fb_height == -1) {
+			HeapFree(GetProcessHeap(),0,This->s.surface_desc.y.lpSurface);
 		} else {
-			this->s.ddraw->e.dga.vpmask &= ~(1<<(this->t.dga.fb_height/this->s.ddraw->e.dga.fb_height));
+			This->s.ddraw->e.dga.vpmask &= ~(1<<(This->t.dga.fb_height/This->s.ddraw->e.dga.fb_height));
 		}
 
 		/* Free the backbuffer */
-		if (this->s.backbuffer)
-			this->s.backbuffer->lpvtbl->fnRelease(this->s.backbuffer);
+		if (This->s.backbuffer)
+			IDirectDrawSurface4_Release((IDirectDrawSurface4*)This->s.backbuffer);
 
-		HeapFree(GetProcessHeap(),0,this);
+		HeapFree(GetProcessHeap(),0,This);
 		return 0;
 	}
 #endif /* defined(HAVE_LIBXXF86DGA) */
-	return this->ref;
+	return This->ref;
 }
 
-static ULONG WINAPI Xlib_IDirectDrawSurface4_Release(LPDIRECTDRAWSURFACE4 this) {
-        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI Xlib_IDirectDrawSurface4Impl_Release(LPDIRECTDRAWSURFACE4 iface) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
 
-	if (!--(this->ref)) {
-		this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
+	if (!--(This->ref)) {
+		IDirectDraw2_Release((IDirectDraw2*)This->s.ddraw);
 
-		if( this->s.backbuffer )
-		  this->s.backbuffer->lpvtbl->fnRelease(this->s.backbuffer);
+		if( This->s.backbuffer )
+		  IDirectDrawSurface4_Release((IDirectDrawSurface4*)This->s.backbuffer);
 
-    if (this->t.xlib.image != NULL) {
-      if (this->s.ddraw->d.pixel_convert != NULL) {
+    if (This->t.xlib.image != NULL) {
+      if (This->s.ddraw->d.pixel_convert != NULL) {
 	/* In pixel conversion mode, there are two buffers to release... */
-	HeapFree(GetProcessHeap(),0,this->s.surface_desc.y.lpSurface);
+	HeapFree(GetProcessHeap(),0,This->s.surface_desc.y.lpSurface);
 	
 #ifdef HAVE_LIBXXSHM
-	if (this->s.ddraw->e.xlib.xshm_active) {
-	  TSXShmDetach(display, &(this->t.xlib.shminfo));
-	  TSXDestroyImage(this->t.xlib.image);
-	  shmdt(this->t.xlib.shminfo.shmaddr);
+	if (This->s.ddraw->e.xlib.xshm_active) {
+	  TSXShmDetach(display, &(This->t.xlib.shminfo));
+	  TSXDestroyImage(This->t.xlib.image);
+	  shmdt(This->t.xlib.shminfo.shmaddr);
 	} else {
 #endif
-	  HeapFree(GetProcessHeap(),0,this->t.xlib.image->data);
-	  this->t.xlib.image->data = NULL;
-	  TSXDestroyImage(this->t.xlib.image);
+	  HeapFree(GetProcessHeap(),0,This->t.xlib.image->data);
+	  This->t.xlib.image->data = NULL;
+	  TSXDestroyImage(This->t.xlib.image);
 #ifdef HAVE_LIBXXSHM
 	}
 #endif
 	
       } else {
-		this->t.xlib.image->data = NULL;
+		This->t.xlib.image->data = NULL;
       
 #ifdef HAVE_LIBXXSHM
-      if (this->s.ddraw->e.xlib.xshm_active) {
-	TSXShmDetach(display, &(this->t.xlib.shminfo));
-		TSXDestroyImage(this->t.xlib.image);
-	shmdt(this->t.xlib.shminfo.shmaddr);
+      if (This->s.ddraw->e.xlib.xshm_active) {
+	TSXShmDetach(display, &(This->t.xlib.shminfo));
+		TSXDestroyImage(This->t.xlib.image);
+	shmdt(This->t.xlib.shminfo.shmaddr);
       } else {
 #endif
-	      HeapFree(GetProcessHeap(),0,this->s.surface_desc.y.lpSurface);
-	TSXDestroyImage(this->t.xlib.image);
+	      HeapFree(GetProcessHeap(),0,This->s.surface_desc.y.lpSurface);
+	TSXDestroyImage(This->t.xlib.image);
 #ifdef HAVE_LIBXXSHM	
       }
 #endif
       }
       
-		this->t.xlib.image = 0;
+		This->t.xlib.image = 0;
     } else {
-	    HeapFree(GetProcessHeap(),0,this->s.surface_desc.y.lpSurface);
+	    HeapFree(GetProcessHeap(),0,This->s.surface_desc.y.lpSurface);
     }
 
-		if (this->s.palette)
-                	this->s.palette->lpvtbl->fnRelease(this->s.palette);
+		if (This->s.palette)
+                	IDirectDrawPalette_Release((IDirectDrawPalette*)This->s.palette);
 
-		HeapFree(GetProcessHeap(),0,this);
+		HeapFree(GetProcessHeap(),0,This);
 		return 0;
 	}
   
-	return this->ref;
+	return This->ref;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetAttachedSurface(
-	LPDIRECTDRAWSURFACE4 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE4 *lpdsf
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetAttachedSurface(
+	LPDIRECTDRAWSURFACE4 iface,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE4 *lpdsf
 ) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
         TRACE(ddraw, "(%p)->GetAttachedSurface(%p,%p)\n",
-		     this, lpddsd, lpdsf);
+		     This, lpddsd, lpdsf);
 
 	if (TRACE_ON(ddraw)) {
 		TRACE(ddraw,"	caps ");
@@ -1179,96 +1201,105 @@
 	}
 
 	/* FIXME: should handle more than one backbuffer */
-	*lpdsf = this->s.backbuffer;
+	*lpdsf = (LPDIRECTDRAWSURFACE4)This->s.backbuffer;
  
-        if( this->s.backbuffer )
-          this->s.backbuffer->lpvtbl->fnAddRef( this->s.backbuffer );
+        if( This->s.backbuffer )
+          IDirectDrawSurface4_AddRef( (IDirectDrawSurface4*)This->s.backbuffer );
 
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_Initialize(
-	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd
+static HRESULT WINAPI IDirectDrawSurface4Impl_Initialize(
+	LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd
 ) {
-	TRACE(ddraw,"(%p)->(%p, %p)\n",this,ddraw,lpdsfd);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	TRACE(ddraw,"(%p)->(%p, %p)\n",This,ddraw,lpdsfd);
 
 	return DDERR_ALREADYINITIALIZED;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetPixelFormat(
-	LPDIRECTDRAWSURFACE4 this,LPDDPIXELFORMAT pf
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetPixelFormat(
+	LPDIRECTDRAWSURFACE4 iface,LPDDPIXELFORMAT pf
 ) {
-	TRACE(ddraw,"(%p)->(%p)\n",this,pf);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	TRACE(ddraw,"(%p)->(%p)\n",This,pf);
 
-	*pf = this->s.surface_desc.ddpfPixelFormat;
+	*pf = This->s.surface_desc.ddpfPixelFormat;
 	
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetBltStatus(LPDIRECTDRAWSURFACE4 this,DWORD dwFlags) {
-	FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",this,dwFlags);
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetBltStatus(LPDIRECTDRAWSURFACE4 iface,DWORD dwFlags) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",This,dwFlags);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetOverlayPosition(
-	LPDIRECTDRAWSURFACE4 this,LPLONG x1,LPLONG x2
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetOverlayPosition(
+	LPDIRECTDRAWSURFACE4 iface,LPLONG x1,LPLONG x2
 ) {
-	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,x1,x2);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",This,x1,x2);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_SetClipper(
-	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWCLIPPER clipper
+static HRESULT WINAPI IDirectDrawSurface4Impl_SetClipper(
+	LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWCLIPPER clipper
 ) {
-	FIXME(ddraw,"(%p)->(%p),stub!\n",this,clipper);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	FIXME(ddraw,"(%p)->(%p),stub!\n",This,clipper);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_AddAttachedSurface(
-	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWSURFACE4 surf
+static HRESULT WINAPI IDirectDrawSurface4Impl_AddAttachedSurface(
+	LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 surf
 ) {
-	FIXME(ddraw,"(%p)->(%p),stub!\n",this,surf);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	FIXME(ddraw,"(%p)->(%p),stub!\n",This,surf);
 
-	this->lpvtbl->fnAddRef(this);
+	IDirectDrawSurface4_AddRef(iface);
 	
 	/* This hack will be enough for the moment */
-	if (this->s.backbuffer == NULL)
-	this->s.backbuffer = surf;
+	if (This->s.backbuffer == NULL)
+	  This->s.backbuffer = (IDirectDrawSurface4Impl*)surf;
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetDC(LPDIRECTDRAWSURFACE4 this,HDC* lphdc) {
-	FIXME(ddraw,"(%p)->GetDC(%p)\n",this,lphdc);
-	*lphdc = BeginPaint(this->s.ddraw->d.window,&this->s.ddraw->d.ps);
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetDC(LPDIRECTDRAWSURFACE4 iface,HDC* lphdc) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	FIXME(ddraw,"(%p)->GetDC(%p)\n",This,lphdc);
+	*lphdc = BeginPaint(This->s.ddraw->d.window,&This->s.ddraw->d.ps);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_ReleaseDC(LPDIRECTDRAWSURFACE4 this,HDC hdc) {
+static HRESULT WINAPI IDirectDrawSurface4Impl_ReleaseDC(LPDIRECTDRAWSURFACE4 iface,HDC hdc) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
   	DDSURFACEDESC	desc;
 	DWORD x, y;
 	
-	FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",this,(long)hdc);
-	EndPaint(this->s.ddraw->d.window,&this->s.ddraw->d.ps);
+	FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",This,(long)hdc);
+	EndPaint(This->s.ddraw->d.window,&This->s.ddraw->d.ps);
 
 	/* Well, as what the application did paint in this DC is NOT saved in the surface,
 	   I fill it with 'dummy' values to have something on the screen */
-	this->lpvtbl->fnLock(this,NULL,&desc,0,0);
+	IDirectDrawSurface4_Lock(iface,NULL,&desc,0,0);
 	for (y = 0; y < desc.dwHeight; y++) {
 	  for (x = 0; x < desc.dwWidth; x++) {
-	    ((unsigned char *) desc.y.lpSurface)[x + y * desc.dwWidth] = (unsigned int) this + x + y;
+	    ((unsigned char *) desc.y.lpSurface)[x + y * desc.dwWidth] = (unsigned int) This + x + y;
 	  }
 	}
-	this->lpvtbl->fnUnlock(this,NULL);
+	IDirectDrawSurface4_Unlock(iface,NULL);
 	
 	return DD_OK;
 }
 
 
-static HRESULT WINAPI IDirectDrawSurface4_QueryInterface(LPDIRECTDRAWSURFACE4 this,REFIID refiid,LPVOID *obj) {
+static HRESULT WINAPI IDirectDrawSurface4Impl_QueryInterface(LPDIRECTDRAWSURFACE4 iface,REFIID refiid,LPVOID *obj) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
         char    xrefiid[50];
 
         WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-        TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+        TRACE(ddraw,"(%p)->(%s,%p)\n",This,xrefiid,obj);
 	
 	/* All DirectDrawSurface versions (1, 2, 3 and 4) use
 	 * the same interface. And IUnknown does that too of course.
@@ -1279,8 +1310,8 @@
 		!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID))	||
 		!memcmp(&IID_IUnknown,refiid,sizeof(IID))
 	) {
-		*obj = this;
-		this->lpvtbl->fnAddRef(this);
+		*obj = This;
+		IDirectDrawSurface4_AddRef(iface);
 
 		TRACE(ddraw, "  Creating IDirectDrawSurface interface (%p)\n", *obj);
 		
@@ -1289,8 +1320,8 @@
 	else if (!memcmp(&IID_IDirect3DTexture2,refiid,sizeof(IID)))
 	  {
 	    /* Texture interface */
-	    *obj = d3dtexture2_create(this);
-	    this->lpvtbl->fnAddRef(this);
+	    *obj = d3dtexture2_create(This);
+	    IDirectDrawSurface4_AddRef(iface);
 	    
 	    TRACE(ddraw, "  Creating IDirect3DTexture2 interface (%p)\n", *obj);
 	    
@@ -1299,73 +1330,77 @@
 	else if (!memcmp(&IID_IDirect3DTexture,refiid,sizeof(IID)))
 	  {
 	    /* Texture interface */
-	    *obj = d3dtexture_create(this);
-	    this->lpvtbl->fnAddRef(this);
+	    *obj = d3dtexture_create(This);
+	    IDirectDrawSurface4_AddRef(iface);
 	    
 	    TRACE(ddraw, "  Creating IDirect3DTexture interface (%p)\n", *obj);
 	    
 	    return S_OK;
 	  }
-	else if (is_OpenGL_dx3(refiid, (LPDIRECTDRAWSURFACE) this, (LPDIRECT3DDEVICE *) obj))
+	else if (is_OpenGL_dx3(refiid, (IDirectDrawSurfaceImpl*)This, (IDirect3DDeviceImpl**) obj))
 	  {
 	    /* It is the OpenGL Direct3D Device */
-	    this->lpvtbl->fnAddRef(this);
+	    IDirectDrawSurface4_AddRef(iface);
 
 	    TRACE(ddraw, "  Creating IDirect3DDevice interface (%p)\n", *obj);
 			
 		return S_OK;
 	}
 	
-	FIXME(ddraw,"(%p):interface for IID %s NOT found!\n",this,xrefiid);
+	FIXME(ddraw,"(%p):interface for IID %s NOT found!\n",This,xrefiid);
 	return OLE_E_ENUM_NOMORE;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_IsLost(LPDIRECTDRAWSURFACE4 this) {
-	TRACE(ddraw,"(%p)->(), stub!\n",this);
+static HRESULT WINAPI IDirectDrawSurface4Impl_IsLost(LPDIRECTDRAWSURFACE4 iface) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	TRACE(ddraw,"(%p)->(), stub!\n",This);
 	return DD_OK; /* hmm */
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE4 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
-	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,context,esfcb);
+static HRESULT WINAPI IDirectDrawSurface4Impl_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE4 iface,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",This,context,esfcb);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_Restore(LPDIRECTDRAWSURFACE4 this) {
-	FIXME(ddraw,"(%p)->(),stub!\n",this);
+static HRESULT WINAPI IDirectDrawSurface4Impl_Restore(LPDIRECTDRAWSURFACE4 iface) {
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+	FIXME(ddraw,"(%p)->(),stub!\n",This);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_SetColorKey(
-	LPDIRECTDRAWSURFACE4 this, DWORD dwFlags, LPDDCOLORKEY ckey ) 
+static HRESULT WINAPI IDirectDrawSurface4Impl_SetColorKey(
+	LPDIRECTDRAWSURFACE4 iface, DWORD dwFlags, LPDDCOLORKEY ckey ) 
 {
-        TRACE(ddraw,"(%p)->(0x%08lx,%p)\n",this,dwFlags,ckey);
+        ICOM_THIS(IDirectDrawSurface4Impl,iface);
+        TRACE(ddraw,"(%p)->(0x%08lx,%p)\n",This,dwFlags,ckey);
 
         if( dwFlags & DDCKEY_SRCBLT )
         {
            dwFlags &= ~DDCKEY_SRCBLT;
-	   this->s.surface_desc.dwFlags |= DDSD_CKSRCBLT;
-           memcpy( &(this->s.surface_desc.ddckCKSrcBlt), ckey, sizeof( *ckey ) );
+	   This->s.surface_desc.dwFlags |= DDSD_CKSRCBLT;
+           memcpy( &(This->s.surface_desc.ddckCKSrcBlt), ckey, sizeof( *ckey ) );
         }
 
         if( dwFlags & DDCKEY_DESTBLT )
         {
            dwFlags &= ~DDCKEY_DESTBLT;
-	   this->s.surface_desc.dwFlags |= DDSD_CKDESTBLT;
-           memcpy( &(this->s.surface_desc.ddckCKDestBlt), ckey, sizeof( *ckey ) );
+	   This->s.surface_desc.dwFlags |= DDSD_CKDESTBLT;
+           memcpy( &(This->s.surface_desc.ddckCKDestBlt), ckey, sizeof( *ckey ) );
         }
 
         if( dwFlags & DDCKEY_SRCOVERLAY )
         {
            dwFlags &= ~DDCKEY_SRCOVERLAY;
-	   this->s.surface_desc.dwFlags |= DDSD_CKSRCOVERLAY;
-           memcpy( &(this->s.surface_desc.ddckCKSrcOverlay), ckey, sizeof( *ckey ) );	   
+	   This->s.surface_desc.dwFlags |= DDSD_CKSRCOVERLAY;
+           memcpy( &(This->s.surface_desc.ddckCKSrcOverlay), ckey, sizeof( *ckey ) );	   
         }
 	
         if( dwFlags & DDCKEY_DESTOVERLAY )
         {
            dwFlags &= ~DDCKEY_DESTOVERLAY;
-	   this->s.surface_desc.dwFlags |= DDSD_CKDESTOVERLAY;
-           memcpy( &(this->s.surface_desc.ddckCKDestOverlay), ckey, sizeof( *ckey ) );	   
+	   This->s.surface_desc.dwFlags |= DDSD_CKDESTOVERLAY;
+           memcpy( &(This->s.surface_desc.ddckCKDestOverlay), ckey, sizeof( *ckey ) );	   
         }
 
         if( dwFlags )
@@ -1377,74 +1412,79 @@
 
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_AddOverlayDirtyRect(
-        LPDIRECTDRAWSURFACE4 this, 
+static HRESULT WINAPI IDirectDrawSurface4Impl_AddOverlayDirtyRect(
+        LPDIRECTDRAWSURFACE4 iface, 
         LPRECT lpRect )
 {
-  FIXME(ddraw,"(%p)->(%p),stub!\n",this,lpRect); 
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(%p),stub!\n",This,lpRect); 
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_DeleteAttachedSurface(
-        LPDIRECTDRAWSURFACE4 this, 
+static HRESULT WINAPI IDirectDrawSurface4Impl_DeleteAttachedSurface(
+        LPDIRECTDRAWSURFACE4 iface, 
         DWORD dwFlags,
         LPDIRECTDRAWSURFACE4 lpDDSAttachedSurface )
 {
-  FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n",this,dwFlags,lpDDSAttachedSurface);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n",This,dwFlags,lpDDSAttachedSurface);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_EnumOverlayZOrders(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_EnumOverlayZOrders(
+        LPDIRECTDRAWSURFACE4 iface,
         DWORD dwFlags,
         LPVOID lpContext,
         LPDDENUMSURFACESCALLBACK lpfnCallback )
 {
-  FIXME(ddraw,"(%p)->(0x%08lx,%p,%p),stub!\n", this,dwFlags,
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(0x%08lx,%p,%p),stub!\n", This,dwFlags,
           lpContext, lpfnCallback );
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetClipper(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetClipper(
+        LPDIRECTDRAWSURFACE4 iface,
         LPDIRECTDRAWCLIPPER* lplpDDClipper )
 {
-  FIXME(ddraw,"(%p)->(%p),stub!\n", this, lplpDDClipper);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(%p),stub!\n", This, lplpDDClipper);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetColorKey(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetColorKey(
+        LPDIRECTDRAWSURFACE4 iface,
         DWORD dwFlags,
         LPDDCOLORKEY lpDDColorKey )
 {
-  TRACE(ddraw,"(%p)->(0x%08lx,%p)\n", this, dwFlags, lpDDColorKey);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  TRACE(ddraw,"(%p)->(0x%08lx,%p)\n", This, dwFlags, lpDDColorKey);
 
   if( dwFlags & DDCKEY_SRCBLT )  {
      dwFlags &= ~DDCKEY_SRCBLT;
-     memcpy( lpDDColorKey, &(this->s.surface_desc.ddckCKSrcBlt), sizeof( *lpDDColorKey ) );
+     memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKSrcBlt), sizeof( *lpDDColorKey ) );
   }
 
   if( dwFlags & DDCKEY_DESTBLT )
   {
     dwFlags &= ~DDCKEY_DESTBLT;
-    memcpy( lpDDColorKey, &(this->s.surface_desc.ddckCKDestBlt), sizeof( *lpDDColorKey ) );
+    memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKDestBlt), sizeof( *lpDDColorKey ) );
   }
 
   if( dwFlags & DDCKEY_SRCOVERLAY )
   {
     dwFlags &= ~DDCKEY_SRCOVERLAY;
-    memcpy( lpDDColorKey, &(this->s.surface_desc.ddckCKSrcOverlay), sizeof( *lpDDColorKey ) );
+    memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKSrcOverlay), sizeof( *lpDDColorKey ) );
   }
 
   if( dwFlags & DDCKEY_DESTOVERLAY )
   {
     dwFlags &= ~DDCKEY_DESTOVERLAY;
-    memcpy( lpDDColorKey, &(this->s.surface_desc.ddckCKDestOverlay), sizeof( *lpDDColorKey ) );
+    memcpy( lpDDColorKey, &(This->s.surface_desc.ddckCKDestOverlay), sizeof( *lpDDColorKey ) );
   }
 
   if( dwFlags )
@@ -1455,240 +1495,255 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetFlipStatus(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetFlipStatus(
+        LPDIRECTDRAWSURFACE4 iface,
         DWORD dwFlags ) 
 {
-  FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", this, dwFlags);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", This, dwFlags);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetPalette(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetPalette(
+        LPDIRECTDRAWSURFACE4 iface,
         LPDIRECTDRAWPALETTE* lplpDDPalette )
 {
-  FIXME(ddraw,"(%p)->(%p),stub!\n", this, lplpDDPalette);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(%p),stub!\n", This, lplpDDPalette);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_SetOverlayPosition(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_SetOverlayPosition(
+        LPDIRECTDRAWSURFACE4 iface,
         LONG lX,
         LONG lY)
 {
-  FIXME(ddraw,"(%p)->(%ld,%ld),stub!\n", this, lX, lY);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(%ld,%ld),stub!\n", This, lX, lY);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_UpdateOverlay(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlay(
+        LPDIRECTDRAWSURFACE4 iface,
         LPRECT lpSrcRect,
         LPDIRECTDRAWSURFACE4 lpDDDestSurface,
         LPRECT lpDestRect,
         DWORD dwFlags,
         LPDDOVERLAYFX lpDDOverlayFx )
 {
-  FIXME(ddraw,"(%p)->(%p,%p,%p,0x%08lx,%p),stub!\n", this,
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(%p,%p,%p,0x%08lx,%p),stub!\n", This,
          lpSrcRect, lpDDDestSurface, lpDestRect, dwFlags, lpDDOverlayFx );  
 
   return DD_OK;
 }
  
-static HRESULT WINAPI IDirectDrawSurface4_UpdateOverlayDisplay(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlayDisplay(
+        LPDIRECTDRAWSURFACE4 iface,
         DWORD dwFlags )
 {
-  FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", this, dwFlags); 
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", This, dwFlags); 
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_UpdateOverlayZOrder(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_UpdateOverlayZOrder(
+        LPDIRECTDRAWSURFACE4 iface,
         DWORD dwFlags,
         LPDIRECTDRAWSURFACE4 lpDDSReference )
 {
-  FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n", this, dwFlags, lpDDSReference);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n", This, dwFlags, lpDDSReference);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetDDInterface(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetDDInterface(
+        LPDIRECTDRAWSURFACE4 iface,
         LPVOID* lplpDD )
 {
-  FIXME(ddraw,"(%p)->(%p),stub!\n", this, lplpDD);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(%p),stub!\n", This, lplpDD);
 
   /* Not sure about that... */
-  *lplpDD = (void *) this->s.ddraw;
+  *lplpDD = (void *) This->s.ddraw;
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_PageLock(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_PageLock(
+        LPDIRECTDRAWSURFACE4 iface,
         DWORD dwFlags )
 {
-  FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", this, dwFlags);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", This, dwFlags);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_PageUnlock(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_PageUnlock(
+        LPDIRECTDRAWSURFACE4 iface,
         DWORD dwFlags )
 {
-  FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", this, dwFlags);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", This, dwFlags);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_SetSurfaceDesc(
-        LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_SetSurfaceDesc(
+        LPDIRECTDRAWSURFACE4 iface,
         LPDDSURFACEDESC lpDDSD,
         DWORD dwFlags )
 {
-  FIXME(ddraw,"(%p)->(%p,0x%08lx),stub!\n", this, lpDDSD, dwFlags);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw,"(%p)->(%p,0x%08lx),stub!\n", This, lpDDSD, dwFlags);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_SetPrivateData(LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_SetPrivateData(LPDIRECTDRAWSURFACE4 iface,
 							 REFGUID guidTag,
 							 LPVOID lpData,
 							 DWORD cbSize,
 							 DWORD dwFlags) {
-  FIXME(ddraw, "(%p)->(%p,%p,%ld,%08lx\n", this, guidTag, lpData, cbSize, dwFlags);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p,%ld,%08lx\n", This, guidTag, lpData, cbSize, dwFlags);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetPrivateData(LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetPrivateData(LPDIRECTDRAWSURFACE4 iface,
 							 REFGUID guidTag,
 							 LPVOID lpBuffer,
 							 LPDWORD lpcbBufferSize) {
-  FIXME(ddraw, "(%p)->(%p,%p,%p)\n", this, guidTag, lpBuffer, lpcbBufferSize);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%p,%p)\n", This, guidTag, lpBuffer, lpcbBufferSize);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_FreePrivateData(LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_FreePrivateData(LPDIRECTDRAWSURFACE4 iface,
 							  REFGUID guidTag)  {
-  FIXME(ddraw, "(%p)->(%p)\n", this, guidTag);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw, "(%p)->(%p)\n", This, guidTag);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_GetUniquenessValue(LPDIRECTDRAWSURFACE4 this,
+static HRESULT WINAPI IDirectDrawSurface4Impl_GetUniquenessValue(LPDIRECTDRAWSURFACE4 iface,
 							     LPDWORD lpValue)  {
-  FIXME(ddraw, "(%p)->(%p)\n", this, lpValue);
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw, "(%p)->(%p)\n", This, lpValue);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface4_ChangeUniquenessValue(LPDIRECTDRAWSURFACE4 this) {
-  FIXME(ddraw, "(%p)\n", this);
+static HRESULT WINAPI IDirectDrawSurface4Impl_ChangeUniquenessValue(LPDIRECTDRAWSURFACE4 iface) {
+  ICOM_THIS(IDirectDrawSurface4Impl,iface);
+  FIXME(ddraw, "(%p)\n", This);
   
   return DD_OK;
 }
 
-static struct IDirectDrawSurface4_VTable dga_dds4vt = {
-	IDirectDrawSurface4_QueryInterface,
-	IDirectDrawSurface4_AddRef,
-	DGA_IDirectDrawSurface4_Release,
-	IDirectDrawSurface4_AddAttachedSurface,
-	IDirectDrawSurface4_AddOverlayDirtyRect,
-	IDirectDrawSurface4_Blt,
-	IDirectDrawSurface4_BltBatch,
-	IDirectDrawSurface4_BltFast,
-	IDirectDrawSurface4_DeleteAttachedSurface,
-	IDirectDrawSurface4_EnumAttachedSurfaces,
-	IDirectDrawSurface4_EnumOverlayZOrders,
-	DGA_IDirectDrawSurface4_Flip,
-	IDirectDrawSurface4_GetAttachedSurface,
-	IDirectDrawSurface4_GetBltStatus,
-	IDirectDrawSurface4_GetCaps,
-	IDirectDrawSurface4_GetClipper,
-	IDirectDrawSurface4_GetColorKey,
-	IDirectDrawSurface4_GetDC,
-	IDirectDrawSurface4_GetFlipStatus,
-	IDirectDrawSurface4_GetOverlayPosition,
-	IDirectDrawSurface4_GetPalette,
-	IDirectDrawSurface4_GetPixelFormat,
-	IDirectDrawSurface4_GetSurfaceDesc,
-	IDirectDrawSurface4_Initialize,
-	IDirectDrawSurface4_IsLost,
-	IDirectDrawSurface4_Lock,
-	IDirectDrawSurface4_ReleaseDC,
-	IDirectDrawSurface4_Restore,
-	IDirectDrawSurface4_SetClipper,
-	IDirectDrawSurface4_SetColorKey,
-	IDirectDrawSurface4_SetOverlayPosition,
-	DGA_IDirectDrawSurface4_SetPalette,
-	DGA_IDirectDrawSurface4_Unlock,
-	IDirectDrawSurface4_UpdateOverlay,
-	IDirectDrawSurface4_UpdateOverlayDisplay,
-	IDirectDrawSurface4_UpdateOverlayZOrder,
-	IDirectDrawSurface4_GetDDInterface,
-	IDirectDrawSurface4_PageLock,
-	IDirectDrawSurface4_PageUnlock,
-	IDirectDrawSurface4_SetSurfaceDesc,
-	IDirectDrawSurface4_SetPrivateData,
-	IDirectDrawSurface4_GetPrivateData,
-	IDirectDrawSurface4_FreePrivateData,
-	IDirectDrawSurface4_GetUniquenessValue,
-	IDirectDrawSurface4_ChangeUniquenessValue
+static ICOM_VTABLE(IDirectDrawSurface4) dga_dds4vt = {
+	IDirectDrawSurface4Impl_QueryInterface,
+	IDirectDrawSurface4Impl_AddRef,
+	DGA_IDirectDrawSurface4Impl_Release,
+	IDirectDrawSurface4Impl_AddAttachedSurface,
+	IDirectDrawSurface4Impl_AddOverlayDirtyRect,
+	IDirectDrawSurface4Impl_Blt,
+	IDirectDrawSurface4Impl_BltBatch,
+	IDirectDrawSurface4Impl_BltFast,
+	IDirectDrawSurface4Impl_DeleteAttachedSurface,
+	IDirectDrawSurface4Impl_EnumAttachedSurfaces,
+	IDirectDrawSurface4Impl_EnumOverlayZOrders,
+	DGA_IDirectDrawSurface4Impl_Flip,
+	IDirectDrawSurface4Impl_GetAttachedSurface,
+	IDirectDrawSurface4Impl_GetBltStatus,
+	IDirectDrawSurface4Impl_GetCaps,
+	IDirectDrawSurface4Impl_GetClipper,
+	IDirectDrawSurface4Impl_GetColorKey,
+	IDirectDrawSurface4Impl_GetDC,
+	IDirectDrawSurface4Impl_GetFlipStatus,
+	IDirectDrawSurface4Impl_GetOverlayPosition,
+	IDirectDrawSurface4Impl_GetPalette,
+	IDirectDrawSurface4Impl_GetPixelFormat,
+	IDirectDrawSurface4Impl_GetSurfaceDesc,
+	IDirectDrawSurface4Impl_Initialize,
+	IDirectDrawSurface4Impl_IsLost,
+	IDirectDrawSurface4Impl_Lock,
+	IDirectDrawSurface4Impl_ReleaseDC,
+	IDirectDrawSurface4Impl_Restore,
+	IDirectDrawSurface4Impl_SetClipper,
+	IDirectDrawSurface4Impl_SetColorKey,
+	IDirectDrawSurface4Impl_SetOverlayPosition,
+	DGA_IDirectDrawSurface4Impl_SetPalette,
+	DGA_IDirectDrawSurface4Impl_Unlock,
+	IDirectDrawSurface4Impl_UpdateOverlay,
+	IDirectDrawSurface4Impl_UpdateOverlayDisplay,
+	IDirectDrawSurface4Impl_UpdateOverlayZOrder,
+	IDirectDrawSurface4Impl_GetDDInterface,
+	IDirectDrawSurface4Impl_PageLock,
+	IDirectDrawSurface4Impl_PageUnlock,
+	IDirectDrawSurface4Impl_SetSurfaceDesc,
+	IDirectDrawSurface4Impl_SetPrivateData,
+	IDirectDrawSurface4Impl_GetPrivateData,
+	IDirectDrawSurface4Impl_FreePrivateData,
+	IDirectDrawSurface4Impl_GetUniquenessValue,
+	IDirectDrawSurface4Impl_ChangeUniquenessValue
 };
 
-static struct IDirectDrawSurface4_VTable xlib_dds4vt = {
-	IDirectDrawSurface4_QueryInterface,
-	IDirectDrawSurface4_AddRef,
-	Xlib_IDirectDrawSurface4_Release,
-	IDirectDrawSurface4_AddAttachedSurface,
-	IDirectDrawSurface4_AddOverlayDirtyRect,
-	IDirectDrawSurface4_Blt,
-	IDirectDrawSurface4_BltBatch,
-	IDirectDrawSurface4_BltFast,
-	IDirectDrawSurface4_DeleteAttachedSurface,
-	IDirectDrawSurface4_EnumAttachedSurfaces,
-	IDirectDrawSurface4_EnumOverlayZOrders,
-	Xlib_IDirectDrawSurface4_Flip,
-	IDirectDrawSurface4_GetAttachedSurface,
-	IDirectDrawSurface4_GetBltStatus,
-	IDirectDrawSurface4_GetCaps,
-	IDirectDrawSurface4_GetClipper,
-	IDirectDrawSurface4_GetColorKey,
-	IDirectDrawSurface4_GetDC,
-	IDirectDrawSurface4_GetFlipStatus,
-	IDirectDrawSurface4_GetOverlayPosition,
-	IDirectDrawSurface4_GetPalette,
-	IDirectDrawSurface4_GetPixelFormat,
-	IDirectDrawSurface4_GetSurfaceDesc,
-	IDirectDrawSurface4_Initialize,
-	IDirectDrawSurface4_IsLost,
-	IDirectDrawSurface4_Lock,
-	IDirectDrawSurface4_ReleaseDC,
-	IDirectDrawSurface4_Restore,
-	IDirectDrawSurface4_SetClipper,
-	IDirectDrawSurface4_SetColorKey,
-	IDirectDrawSurface4_SetOverlayPosition,
-	Xlib_IDirectDrawSurface4_SetPalette,
-	Xlib_IDirectDrawSurface4_Unlock,
-	IDirectDrawSurface4_UpdateOverlay,
-	IDirectDrawSurface4_UpdateOverlayDisplay,
-	IDirectDrawSurface4_UpdateOverlayZOrder,
-	IDirectDrawSurface4_GetDDInterface,
-	IDirectDrawSurface4_PageLock,
-	IDirectDrawSurface4_PageUnlock,
-	IDirectDrawSurface4_SetSurfaceDesc,
-	IDirectDrawSurface4_SetPrivateData,
-	IDirectDrawSurface4_GetPrivateData,
-	IDirectDrawSurface4_FreePrivateData,
-	IDirectDrawSurface4_GetUniquenessValue,
-	IDirectDrawSurface4_ChangeUniquenessValue
+static ICOM_VTABLE(IDirectDrawSurface4) xlib_dds4vt = {
+	IDirectDrawSurface4Impl_QueryInterface,
+	IDirectDrawSurface4Impl_AddRef,
+	Xlib_IDirectDrawSurface4Impl_Release,
+	IDirectDrawSurface4Impl_AddAttachedSurface,
+	IDirectDrawSurface4Impl_AddOverlayDirtyRect,
+	IDirectDrawSurface4Impl_Blt,
+	IDirectDrawSurface4Impl_BltBatch,
+	IDirectDrawSurface4Impl_BltFast,
+	IDirectDrawSurface4Impl_DeleteAttachedSurface,
+	IDirectDrawSurface4Impl_EnumAttachedSurfaces,
+	IDirectDrawSurface4Impl_EnumOverlayZOrders,
+	Xlib_IDirectDrawSurface4Impl_Flip,
+	IDirectDrawSurface4Impl_GetAttachedSurface,
+	IDirectDrawSurface4Impl_GetBltStatus,
+	IDirectDrawSurface4Impl_GetCaps,
+	IDirectDrawSurface4Impl_GetClipper,
+	IDirectDrawSurface4Impl_GetColorKey,
+	IDirectDrawSurface4Impl_GetDC,
+	IDirectDrawSurface4Impl_GetFlipStatus,
+	IDirectDrawSurface4Impl_GetOverlayPosition,
+	IDirectDrawSurface4Impl_GetPalette,
+	IDirectDrawSurface4Impl_GetPixelFormat,
+	IDirectDrawSurface4Impl_GetSurfaceDesc,
+	IDirectDrawSurface4Impl_Initialize,
+	IDirectDrawSurface4Impl_IsLost,
+	IDirectDrawSurface4Impl_Lock,
+	IDirectDrawSurface4Impl_ReleaseDC,
+	IDirectDrawSurface4Impl_Restore,
+	IDirectDrawSurface4Impl_SetClipper,
+	IDirectDrawSurface4Impl_SetColorKey,
+	IDirectDrawSurface4Impl_SetOverlayPosition,
+	Xlib_IDirectDrawSurface4Impl_SetPalette,
+	Xlib_IDirectDrawSurface4Impl_Unlock,
+	IDirectDrawSurface4Impl_UpdateOverlay,
+	IDirectDrawSurface4Impl_UpdateOverlayDisplay,
+	IDirectDrawSurface4Impl_UpdateOverlayZOrder,
+	IDirectDrawSurface4Impl_GetDDInterface,
+	IDirectDrawSurface4Impl_PageLock,
+	IDirectDrawSurface4Impl_PageUnlock,
+	IDirectDrawSurface4Impl_SetSurfaceDesc,
+	IDirectDrawSurface4Impl_SetPrivateData,
+	IDirectDrawSurface4Impl_GetPrivateData,
+	IDirectDrawSurface4Impl_FreePrivateData,
+	IDirectDrawSurface4Impl_GetUniquenessValue,
+	IDirectDrawSurface4Impl_ChangeUniquenessValue
 };
 
 /******************************************************************************
@@ -1698,11 +1753,12 @@
 				        LPDIRECTDRAWCLIPPER *lplpDDClipper,
 				        LPUNKNOWN pUnkOuter)
 {
-  TRACE(ddraw, "(%08lx,%p,%p)\n", dwFlags, lplpDDClipper, pUnkOuter);
+  IDirectDrawClipperImpl** ilplpDDClipper=(IDirectDrawClipperImpl**)lplpDDClipper;
+  TRACE(ddraw, "(%08lx,%p,%p)\n", dwFlags, ilplpDDClipper, pUnkOuter);
 
-  *lplpDDClipper = (LPDIRECTDRAWCLIPPER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipper));
-  (*lplpDDClipper)->lpvtbl = &ddclipvt;
-  (*lplpDDClipper)->ref = 1;
+  *ilplpDDClipper = (IDirectDrawClipperImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipperImpl));
+  (*ilplpDDClipper)->lpvtbl = &ddclipvt;
+  (*ilplpDDClipper)->ref = 1;
 
   return DD_OK;
 }
@@ -1710,124 +1766,135 @@
 /******************************************************************************
  *			IDirectDrawClipper
  */
-static HRESULT WINAPI IDirectDrawClipper_SetHwnd(
-	LPDIRECTDRAWCLIPPER this,DWORD x,HWND hwnd
+static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd(
+	LPDIRECTDRAWCLIPPER iface,DWORD x,HWND hwnd
 ) {
-	FIXME(ddraw,"(%p)->SetHwnd(0x%08lx,0x%08lx),stub!\n",this,x,(DWORD)hwnd);
+        ICOM_THIS(IDirectDrawClipperImpl,iface);
+	FIXME(ddraw,"(%p)->SetHwnd(0x%08lx,0x%08lx),stub!\n",This,x,(DWORD)hwnd);
 	return DD_OK;
 }
 
-static ULONG WINAPI IDirectDrawClipper_Release(LPDIRECTDRAWCLIPPER this) {
-        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI IDirectDrawClipperImpl_Release(LPDIRECTDRAWCLIPPER iface) {
+        ICOM_THIS(IDirectDrawClipperImpl,iface);
+        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
 
-	this->ref--;
-	if (this->ref)
-		return this->ref;
-	HeapFree(GetProcessHeap(),0,this);
+	This->ref--;
+	if (This->ref)
+		return This->ref;
+	HeapFree(GetProcessHeap(),0,This);
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawClipper_GetClipList(
-	LPDIRECTDRAWCLIPPER this,LPRECT rects,LPRGNDATA lprgn,LPDWORD hmm
+static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList(
+	LPDIRECTDRAWCLIPPER iface,LPRECT rects,LPRGNDATA lprgn,LPDWORD hmm
 ) {
-	FIXME(ddraw,"(%p,%p,%p,%p),stub!\n",this,rects,lprgn,hmm);
+        ICOM_THIS(IDirectDrawClipperImpl,iface);
+	FIXME(ddraw,"(%p,%p,%p,%p),stub!\n",This,rects,lprgn,hmm);
 	if (hmm) *hmm=0;
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawClipper_SetClipList(
-	LPDIRECTDRAWCLIPPER this,LPRGNDATA lprgn,DWORD hmm
+static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList(
+	LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,DWORD hmm
 ) {
-	FIXME(ddraw,"(%p,%p,%ld),stub!\n",this,lprgn,hmm);
+        ICOM_THIS(IDirectDrawClipperImpl,iface);
+	FIXME(ddraw,"(%p,%p,%ld),stub!\n",This,lprgn,hmm);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawClipper_QueryInterface(
-         LPDIRECTDRAWCLIPPER this,
+static HRESULT WINAPI IDirectDrawClipperImpl_QueryInterface(
+         LPDIRECTDRAWCLIPPER iface,
          REFIID riid,
          LPVOID* ppvObj )
 {
-   FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,riid,ppvObj);
+   ICOM_THIS(IDirectDrawClipperImpl,iface);
+   FIXME(ddraw,"(%p)->(%p,%p),stub!\n",This,riid,ppvObj);
    return OLE_E_ENUM_NOMORE;
 }
 
-static ULONG WINAPI IDirectDrawClipper_AddRef( LPDIRECTDRAWCLIPPER this )
+static ULONG WINAPI IDirectDrawClipperImpl_AddRef( LPDIRECTDRAWCLIPPER iface )
 {
-  TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
-  return ++(this->ref);
+  ICOM_THIS(IDirectDrawClipperImpl,iface);
+  TRACE( ddraw, "(%p)->() incrementing from %lu.\n", This, This->ref );
+  return ++(This->ref);
 }
 
-static HRESULT WINAPI IDirectDrawClipper_GetHWnd(
-         LPDIRECTDRAWCLIPPER this,
+static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd(
+         LPDIRECTDRAWCLIPPER iface,
          HWND* HWndPtr )
 {
-   FIXME(ddraw,"(%p)->(%p),stub!\n",this,HWndPtr);
+   ICOM_THIS(IDirectDrawClipperImpl,iface);
+   FIXME(ddraw,"(%p)->(%p),stub!\n",This,HWndPtr);
    return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawClipper_Initialize(
-         LPDIRECTDRAWCLIPPER this,
+static HRESULT WINAPI IDirectDrawClipperImpl_Initialize(
+         LPDIRECTDRAWCLIPPER iface,
          LPDIRECTDRAW lpDD,
          DWORD dwFlags )
 {
-   FIXME(ddraw,"(%p)->(%p,0x%08lx),stub!\n",this,lpDD,dwFlags);
+   ICOM_THIS(IDirectDrawClipperImpl,iface);
+   FIXME(ddraw,"(%p)->(%p,0x%08lx),stub!\n",This,lpDD,dwFlags);
    return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawClipper_IsClipListChanged(
-         LPDIRECTDRAWCLIPPER this,
+static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged(
+         LPDIRECTDRAWCLIPPER iface,
          BOOL* lpbChanged )
 {
-   FIXME(ddraw,"(%p)->(%p),stub!\n",this,lpbChanged);
+   ICOM_THIS(IDirectDrawClipperImpl,iface);
+   FIXME(ddraw,"(%p)->(%p),stub!\n",This,lpbChanged);
    return DD_OK;
 }
 
-static struct IDirectDrawClipper_VTable ddclipvt = {
-        IDirectDrawClipper_QueryInterface,
-        IDirectDrawClipper_AddRef,
-        IDirectDrawClipper_Release,
-        IDirectDrawClipper_GetClipList,
-        IDirectDrawClipper_GetHWnd,
-        IDirectDrawClipper_Initialize,
-        IDirectDrawClipper_IsClipListChanged,
-        IDirectDrawClipper_SetClipList,
-        IDirectDrawClipper_SetHwnd
+static ICOM_VTABLE(IDirectDrawClipper) ddclipvt = {
+        IDirectDrawClipperImpl_QueryInterface,
+        IDirectDrawClipperImpl_AddRef,
+        IDirectDrawClipperImpl_Release,
+        IDirectDrawClipperImpl_GetClipList,
+        IDirectDrawClipperImpl_GetHWnd,
+        IDirectDrawClipperImpl_Initialize,
+        IDirectDrawClipperImpl_IsClipListChanged,
+        IDirectDrawClipperImpl_SetClipList,
+        IDirectDrawClipperImpl_SetHwnd
 };
 
 
 /******************************************************************************
  *			IDirectDrawPalette
  */
-static HRESULT WINAPI IDirectDrawPalette_GetEntries(
-	LPDIRECTDRAWPALETTE this,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent
+static HRESULT WINAPI IDirectDrawPaletteImpl_GetEntries(
+	LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent
 ) {
+        ICOM_THIS(IDirectDrawPaletteImpl,iface);
 	int	i;
 
 	TRACE(ddraw,"(%p)->GetEntries(%08lx,%ld,%ld,%p)\n",
-	      this,x,start,count,palent);
+	      This,x,start,count,palent);
 
-	if (!this->cm) /* should not happen */ {
+	if (!This->cm) /* should not happen */ {
 		FIXME(ddraw,"app tried to read colormap for non-palettized mode\n");
 		return DDERR_GENERIC;
 	}
 	for (i=0;i<count;i++) {
-                palent[i].peRed   = this->palents[start+i].peRed;
-                palent[i].peBlue  = this->palents[start+i].peBlue;
-                palent[i].peGreen = this->palents[start+i].peGreen;
-                palent[i].peFlags = this->palents[start+i].peFlags;
+                palent[i].peRed   = This->palents[start+i].peRed;
+                palent[i].peBlue  = This->palents[start+i].peBlue;
+                palent[i].peGreen = This->palents[start+i].peGreen;
+                palent[i].peFlags = This->palents[start+i].peFlags;
 
 	}
 	return DD_OK;
 }
 
-static HRESULT WINAPI Xlib_IDirectDrawPalette_SetEntries(
-	LPDIRECTDRAWPALETTE this,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent
+static HRESULT WINAPI Xlib_IDirectDrawPaletteImpl_SetEntries(
+	LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent
 ) {
+        ICOM_THIS(IDirectDrawPaletteImpl,iface);
 	XColor		xc;
 	int		i;
 
 	TRACE(ddraw,"(%p)->SetEntries(%08lx,%ld,%ld,%p)\n",
-		this,x,start,count,palent
+		This,x,start,count,palent
 	);
 	for (i=0;i<count;i++) {
 		xc.red = palent[i].peRed<<8;
@@ -1836,40 +1903,41 @@
 		xc.flags = DoRed|DoBlue|DoGreen;
 		xc.pixel = start+i;
 
-		if (this->cm)
-		    TSXStoreColor(display,this->cm,&xc);
+		if (This->cm)
+		    TSXStoreColor(display,This->cm,&xc);
 
-		this->palents[start+i].peRed = palent[i].peRed;
-		this->palents[start+i].peBlue = palent[i].peBlue;
-		this->palents[start+i].peGreen = palent[i].peGreen;
-                this->palents[start+i].peFlags = palent[i].peFlags;
+		This->palents[start+i].peRed = palent[i].peRed;
+		This->palents[start+i].peBlue = palent[i].peBlue;
+		This->palents[start+i].peGreen = palent[i].peGreen;
+                This->palents[start+i].peFlags = palent[i].peFlags;
 	}
 
 	/* Now, if we are in 'depth conversion mode', update the screen palette */
-	if (this->ddraw->d.palette_convert != NULL)
-	  this->ddraw->d.palette_convert(palent, this->screen_palents, start, count);
+	if (This->ddraw->d.palette_convert != NULL)
+	  This->ddraw->d.palette_convert(palent, This->screen_palents, start, count);
 	  
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawPalette_SetEntries(
-	LPDIRECTDRAWPALETTE this,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent
+static HRESULT WINAPI DGA_IDirectDrawPaletteImpl_SetEntries(
+	LPDIRECTDRAWPALETTE iface,DWORD x,DWORD start,DWORD count,LPPALETTEENTRY palent
 ) {
 #ifdef HAVE_LIBXXF86DGA
+        ICOM_THIS(IDirectDrawPaletteImpl,iface);
 	XColor		xc;
 	Colormap	cm;
 	int		i;
 
 	TRACE(ddraw,"(%p)->SetEntries(%08lx,%ld,%ld,%p)\n",
-		this,x,start,count,palent
+		This,x,start,count,palent
 	);
-	if (!this->cm) /* should not happen */ {
+	if (!This->cm) /* should not happen */ {
 		FIXME(ddraw,"app tried to set colormap in non-palettized mode\n");
 		return DDERR_GENERIC;
 	}
 	/* FIXME: free colorcells instead of freeing whole map */
-	cm = this->cm;
-	this->cm = TSXCopyColormapAndFree(display,this->cm);
+	cm = This->cm;
+	This->cm = TSXCopyColormapAndFree(display,This->cm);
 	TSXFreeColormap(display,cm);
 
 	for (i=0;i<count;i++) {
@@ -1879,111 +1947,118 @@
 		xc.flags = DoRed|DoBlue|DoGreen;
 		xc.pixel = i+start;
 
-		TSXStoreColor(display,this->cm,&xc);
+		TSXStoreColor(display,This->cm,&xc);
 
-		this->palents[start+i].peRed = palent[i].peRed;
-		this->palents[start+i].peBlue = palent[i].peBlue;
-		this->palents[start+i].peGreen = palent[i].peGreen;
-                this->palents[start+i].peFlags = palent[i].peFlags;
+		This->palents[start+i].peRed = palent[i].peRed;
+		This->palents[start+i].peBlue = palent[i].peBlue;
+		This->palents[start+i].peGreen = palent[i].peGreen;
+                This->palents[start+i].peFlags = palent[i].peFlags;
 	}
-	TSXF86DGAInstallColormap(display,DefaultScreen(display),this->cm);
+	TSXF86DGAInstallColormap(display,DefaultScreen(display),This->cm);
 	return DD_OK;
 #else /* defined(HAVE_LIBXXF86DGA) */
 	return E_UNEXPECTED;
 #endif /* defined(HAVE_LIBXXF86DGA) */
 }
 
-static ULONG WINAPI IDirectDrawPalette_Release(LPDIRECTDRAWPALETTE this) {
-        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
-	if (!--(this->ref)) {
-		if (this->cm) {
-			TSXFreeColormap(display,this->cm);
-			this->cm = 0;
+static ULONG WINAPI IDirectDrawPaletteImpl_Release(LPDIRECTDRAWPALETTE iface) {
+        ICOM_THIS(IDirectDrawPaletteImpl,iface);
+        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
+	if (!--(This->ref)) {
+		if (This->cm) {
+			TSXFreeColormap(display,This->cm);
+			This->cm = 0;
 		}
-		HeapFree(GetProcessHeap(),0,this);
+		HeapFree(GetProcessHeap(),0,This);
 		return 0;
 	}
-	return this->ref;
+	return This->ref;
 }
 
-static ULONG WINAPI IDirectDrawPalette_AddRef(LPDIRECTDRAWPALETTE this) {
+static ULONG WINAPI IDirectDrawPaletteImpl_AddRef(LPDIRECTDRAWPALETTE iface) {
+        ICOM_THIS(IDirectDrawPaletteImpl,iface);
 
-        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
-	return ++(this->ref);
+        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", This, This->ref );
+	return ++(This->ref);
 }
 
-static HRESULT WINAPI IDirectDrawPalette_Initialize(
-	LPDIRECTDRAWPALETTE this,LPDIRECTDRAW ddraw,DWORD x,LPPALETTEENTRY palent
+static HRESULT WINAPI IDirectDrawPaletteImpl_Initialize(
+	LPDIRECTDRAWPALETTE iface,LPDIRECTDRAW ddraw,DWORD x,LPPALETTEENTRY palent
 ) {
-        TRACE(ddraw,"(%p)->(%p,%ld,%p)\n", this, ddraw, x, palent);
+        ICOM_THIS(IDirectDrawPaletteImpl,iface);
+        TRACE(ddraw,"(%p)->(%p,%ld,%p)\n", This, ddraw, x, palent);
 
 	return DDERR_ALREADYINITIALIZED;
 }
 
-static HRESULT WINAPI IDirectDrawPalette_GetCaps(
-         LPDIRECTDRAWPALETTE this, LPDWORD lpdwCaps )
+static HRESULT WINAPI IDirectDrawPaletteImpl_GetCaps(
+         LPDIRECTDRAWPALETTE iface, LPDWORD lpdwCaps )
 {
-   FIXME( ddraw, "(%p)->(%p) stub.\n", this, lpdwCaps );
+   ICOM_THIS(IDirectDrawPaletteImpl,iface);
+   FIXME( ddraw, "(%p)->(%p) stub.\n", This, lpdwCaps );
    return DD_OK;
 } 
 
-static HRESULT WINAPI IDirectDrawPalette_QueryInterface(
-        LPDIRECTDRAWPALETTE this,REFIID refiid,LPVOID *obj ) 
+static HRESULT WINAPI IDirectDrawPaletteImpl_QueryInterface(
+        LPDIRECTDRAWPALETTE iface,REFIID refiid,LPVOID *obj ) 
 {
+  ICOM_THIS(IDirectDrawPaletteImpl,iface);
   char    xrefiid[50];
 
   WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-  FIXME(ddraw,"(%p)->(%s,%p) stub.\n",this,xrefiid,obj);
+  FIXME(ddraw,"(%p)->(%s,%p) stub.\n",This,xrefiid,obj);
 
   return S_OK;
 }
 
-static struct IDirectDrawPalette_VTable dga_ddpalvt = {
-	IDirectDrawPalette_QueryInterface,
-	IDirectDrawPalette_AddRef,
-	IDirectDrawPalette_Release,
-	IDirectDrawPalette_GetCaps,
-	IDirectDrawPalette_GetEntries,
-	IDirectDrawPalette_Initialize,
-	DGA_IDirectDrawPalette_SetEntries
+static ICOM_VTABLE(IDirectDrawPalette) dga_ddpalvt = {
+	IDirectDrawPaletteImpl_QueryInterface,
+	IDirectDrawPaletteImpl_AddRef,
+	IDirectDrawPaletteImpl_Release,
+	IDirectDrawPaletteImpl_GetCaps,
+	IDirectDrawPaletteImpl_GetEntries,
+	IDirectDrawPaletteImpl_Initialize,
+	DGA_IDirectDrawPaletteImpl_SetEntries
 };
 
-static struct IDirectDrawPalette_VTable xlib_ddpalvt = {
-	IDirectDrawPalette_QueryInterface,
-	IDirectDrawPalette_AddRef,
-	IDirectDrawPalette_Release,
-	IDirectDrawPalette_GetCaps,
-	IDirectDrawPalette_GetEntries,
-	IDirectDrawPalette_Initialize,
-	Xlib_IDirectDrawPalette_SetEntries
+static ICOM_VTABLE(IDirectDrawPalette) xlib_ddpalvt = {
+	IDirectDrawPaletteImpl_QueryInterface,
+	IDirectDrawPaletteImpl_AddRef,
+	IDirectDrawPaletteImpl_Release,
+	IDirectDrawPaletteImpl_GetCaps,
+	IDirectDrawPaletteImpl_GetEntries,
+	IDirectDrawPaletteImpl_Initialize,
+	Xlib_IDirectDrawPaletteImpl_SetEntries
 };
 
 /*******************************************************************************
  *				IDirect3D
  */
-static HRESULT WINAPI IDirect3D_QueryInterface(
-        LPDIRECT3D this,REFIID refiid,LPVOID *obj
+static HRESULT WINAPI IDirect3DImpl_QueryInterface(
+        LPDIRECT3D iface,REFIID refiid,LPVOID *obj
 ) {
+        ICOM_THIS(IDirect3DImpl,iface);
 	/* FIXME: Not sure if this is correct */
         char    xrefiid[50];
 
         WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-        TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+        TRACE(ddraw,"(%p)->(%s,%p)\n",This,xrefiid,obj);
         if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
-                *obj = this;
-                this->lpvtbl->fnAddRef(this);
+                *obj = This;
+                IDirect3D_AddRef(iface);
 
 		TRACE(ddraw, "  Creating IUnknown interface (%p)\n", *obj);
 		
                 return S_OK;
         }
         if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
-                LPDIRECT3D      d3d;
+                IDirect3DImpl*   d3d;
 
                 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
                 d3d->ref = 1;
-                d3d->ddraw = (LPDIRECTDRAW)this;
-                this->lpvtbl->fnAddRef(this);
+		/* FIXME: isn't this a bit weird ??? */
+                d3d->ddraw = (IDirectDrawImpl*)This;
+                IDirect3D_AddRef(iface);
                 d3d->lpvtbl = &d3dvt;
                 *obj = d3d;
 
@@ -1992,12 +2067,13 @@
                 return S_OK;
         }
         if (!memcmp(&IID_IDirect3D2,refiid,sizeof(IID_IDirect3D2))) {
-                LPDIRECT3D2     d3d;
+                IDirect3D2Impl*  d3d;
 
                 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
                 d3d->ref = 1;
-                d3d->ddraw = (LPDIRECTDRAW)this;
-                this->lpvtbl->fnAddRef(this);
+		/* FIXME: isn't this a bit weird ??? */
+                d3d->ddraw = (IDirectDrawImpl*)This;
+                IDirect3D_AddRef(iface);
                 d3d->lpvtbl = &d3d2vt;
                 *obj = d3d;
 
@@ -2005,44 +2081,48 @@
 
                 return S_OK;
         }
-        FIXME(ddraw,"(%p):interface for IID %s NOT found!\n",this,xrefiid);
+        FIXME(ddraw,"(%p):interface for IID %s NOT found!\n",This,xrefiid);
         return OLE_E_ENUM_NOMORE;
 }
 
-static ULONG WINAPI IDirect3D_AddRef(LPDIRECT3D this) {
-        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI IDirect3DImpl_AddRef(LPDIRECT3D iface) {
+        ICOM_THIS(IDirect3DImpl,iface);
+        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", This, This->ref );
 
-        return ++(this->ref);
+        return ++(This->ref);
 }
 
-static ULONG WINAPI IDirect3D_Release(LPDIRECT3D this)
+static ULONG WINAPI IDirect3DImpl_Release(LPDIRECT3D iface)
 {
-        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+        ICOM_THIS(IDirect3DImpl,iface);
+        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
 
-        if (!--(this->ref)) {
-                this->ddraw->lpvtbl->fnRelease(this->ddraw);
-                HeapFree(GetProcessHeap(),0,this);
+        if (!--(This->ref)) {
+                IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
+                HeapFree(GetProcessHeap(),0,This);
                 return 0;
         }
-        return this->ref;
+        return This->ref;
 }
 
-static HRESULT WINAPI IDirect3D_Initialize(
-         LPDIRECT3D this, REFIID refiid )
+static HRESULT WINAPI IDirect3DImpl_Initialize(
+         LPDIRECT3D iface, REFIID refiid )
 {
+  ICOM_THIS(IDirect3DImpl,iface);
   /* FIXME: Not sure if this is correct */
   char    xrefiid[50];
 
   WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-  FIXME(ddraw,"(%p)->(%s):stub.\n",this,xrefiid);
+  FIXME(ddraw,"(%p)->(%s):stub.\n",This,xrefiid);
   
   return DDERR_ALREADYINITIALIZED;
 }
 
-static HRESULT WINAPI IDirect3D_EnumDevices(LPDIRECT3D this,
+static HRESULT WINAPI IDirect3DImpl_EnumDevices(LPDIRECT3D iface,
 					    LPD3DENUMDEVICESCALLBACK cb,
 					    LPVOID context) {
-  FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,cb,context);
+  ICOM_THIS(IDirect3DImpl,iface);
+  FIXME(ddraw,"(%p)->(%p,%p),stub!\n",This,cb,context);
 
   /* Call functions defined in d3ddevices.c */
   if (!d3d_OpenGL_dx3(cb, context))
@@ -2051,95 +2131,103 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3D_CreateLight(LPDIRECT3D this,
+static HRESULT WINAPI IDirect3DImpl_CreateLight(LPDIRECT3D iface,
 					    LPDIRECT3DLIGHT *lplight,
 					    IUnknown *lpunk)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lplight, lpunk);
+  ICOM_THIS(IDirect3DImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lplight, lpunk);
   
   /* Call the creation function that is located in d3dlight.c */
-  *lplight = d3dlight_create_dx3(this);
+  *lplight = d3dlight_create_dx3(This);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3D_CreateMaterial(LPDIRECT3D this,
+static HRESULT WINAPI IDirect3DImpl_CreateMaterial(LPDIRECT3D iface,
 					       LPDIRECT3DMATERIAL *lpmaterial,
 					       IUnknown *lpunk)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpmaterial, lpunk);
+  ICOM_THIS(IDirect3DImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
 
   /* Call the creation function that is located in d3dviewport.c */
-  *lpmaterial = d3dmaterial_create(this);
+  *lpmaterial = d3dmaterial_create(This);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3D_CreateViewport(LPDIRECT3D this,
+static HRESULT WINAPI IDirect3DImpl_CreateViewport(LPDIRECT3D iface,
 					       LPDIRECT3DVIEWPORT *lpviewport,
 					       IUnknown *lpunk)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpviewport, lpunk);
+  ICOM_THIS(IDirect3DImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
   
   /* Call the creation function that is located in d3dviewport.c */
-  *lpviewport = d3dviewport_create(this);
+  *lpviewport = d3dviewport_create(This);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3D_FindDevice(LPDIRECT3D this,
+static HRESULT WINAPI IDirect3DImpl_FindDevice(LPDIRECT3D iface,
 					   LPD3DFINDDEVICESEARCH lpfinddevsrc,
 					   LPD3DFINDDEVICERESULT lpfinddevrst)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpfinddevsrc, lpfinddevrst);
+  ICOM_THIS(IDirect3DImpl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
   
   return DD_OK;
 }
 
-static struct IDirect3D_VTable d3dvt = {
-        IDirect3D_QueryInterface,
-        IDirect3D_AddRef,
-        IDirect3D_Release,
-        IDirect3D_Initialize,
-        IDirect3D_EnumDevices,
-        IDirect3D_CreateLight,
-        IDirect3D_CreateMaterial,
-        IDirect3D_CreateViewport,
-	IDirect3D_FindDevice
+static ICOM_VTABLE(IDirect3D) d3dvt = {
+        IDirect3DImpl_QueryInterface,
+        IDirect3DImpl_AddRef,
+        IDirect3DImpl_Release,
+        IDirect3DImpl_Initialize,
+        IDirect3DImpl_EnumDevices,
+        IDirect3DImpl_CreateLight,
+        IDirect3DImpl_CreateMaterial,
+        IDirect3DImpl_CreateViewport,
+	IDirect3DImpl_FindDevice
 };
 
 /*******************************************************************************
  *				IDirect3D2
  */
-static HRESULT WINAPI IDirect3D2_QueryInterface(
-        LPDIRECT3D2 this,REFIID refiid,LPVOID *obj) {
+static HRESULT WINAPI IDirect3D2Impl_QueryInterface(
+        LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {
+  ICOM_THIS(IDirect3D2Impl,iface);
   /* For the moment, we use the same function as in IDirect3D */
   TRACE(ddraw, "Calling IDirect3D enumerating function.\n");
   
-  return IDirect3D_QueryInterface((LPDIRECT3D) this, refiid, obj);
+  return IDirect3DImpl_QueryInterface((LPDIRECT3D) This, refiid, obj);
 }
 
-static ULONG WINAPI IDirect3D2_AddRef(LPDIRECT3D2 this) {
-        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI IDirect3D2Impl_AddRef(LPDIRECT3D2 iface) {
+        ICOM_THIS(IDirect3D2Impl,iface);
+        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", This, This->ref );
 
-        return ++(this->ref);
+        return ++(This->ref);
 }
 
-static ULONG WINAPI IDirect3D2_Release(LPDIRECT3D2 this) {
-        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
+        ICOM_THIS(IDirect3D2Impl,iface);
+        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
 
-	if (!--(this->ref)) {
-		this->ddraw->lpvtbl->fnRelease(this->ddraw);
-		HeapFree(GetProcessHeap(),0,this);
+	if (!--(This->ref)) {
+		IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
+		HeapFree(GetProcessHeap(),0,This);
 		return 0;
 	}
-	return this->ref;
+	return This->ref;
 }
 
-static HRESULT WINAPI IDirect3D2_EnumDevices(
-	LPDIRECT3D2 this,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
+static HRESULT WINAPI IDirect3D2Impl_EnumDevices(
+	LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
 ) {
-	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,cb,context);
+        ICOM_THIS(IDirect3D2Impl,iface);
+	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",This,cb,context);
 
 	/* Call functions defined in d3ddevices.c */
 	if (!d3d_OpenGL(cb, context))
@@ -2148,79 +2236,84 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3D2_CreateLight(LPDIRECT3D2 this,
+static HRESULT WINAPI IDirect3D2Impl_CreateLight(LPDIRECT3D2 iface,
 					     LPDIRECT3DLIGHT *lplight,
 					     IUnknown *lpunk)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lplight, lpunk);
+  ICOM_THIS(IDirect3D2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lplight, lpunk);
 
   /* Call the creation function that is located in d3dlight.c */
-  *lplight = d3dlight_create(this);
+  *lplight = d3dlight_create(This);
   
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3D2_CreateMaterial(LPDIRECT3D2 this,
+static HRESULT WINAPI IDirect3D2Impl_CreateMaterial(LPDIRECT3D2 iface,
 						LPDIRECT3DMATERIAL2 *lpmaterial,
 						IUnknown *lpunk)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpmaterial, lpunk);
+  ICOM_THIS(IDirect3D2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
 
   /* Call the creation function that is located in d3dviewport.c */
-  *lpmaterial = d3dmaterial2_create(this);
+  *lpmaterial = d3dmaterial2_create(This);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3D2_CreateViewport(LPDIRECT3D2 this,
+static HRESULT WINAPI IDirect3D2Impl_CreateViewport(LPDIRECT3D2 iface,
 						LPDIRECT3DVIEWPORT2 *lpviewport,
 						IUnknown *lpunk)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpviewport, lpunk);
+  ICOM_THIS(IDirect3D2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
   
   /* Call the creation function that is located in d3dviewport.c */
-  *lpviewport = d3dviewport2_create(this);
+  *lpviewport = d3dviewport2_create(This);
   
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3D2_FindDevice(LPDIRECT3D2 this,
+static HRESULT WINAPI IDirect3D2Impl_FindDevice(LPDIRECT3D2 iface,
 					    LPD3DFINDDEVICESEARCH lpfinddevsrc,
 					    LPD3DFINDDEVICERESULT lpfinddevrst)
 {
-  TRACE(ddraw, "(%p)->(%p,%p): stub\n", this, lpfinddevsrc, lpfinddevrst);
+  ICOM_THIS(IDirect3D2Impl,iface);
+  TRACE(ddraw, "(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirect3D2_CreateDevice(LPDIRECT3D2 this,
+static HRESULT WINAPI IDirect3D2Impl_CreateDevice(LPDIRECT3D2 iface,
 					      REFCLSID rguid,
 					      LPDIRECTDRAWSURFACE surface,
 					      LPDIRECT3DDEVICE2 *device)
 {
+  ICOM_THIS(IDirect3D2Impl,iface);
   char	xbuf[50];
   
   WINE_StringFromCLSID(rguid,xbuf);
-  FIXME(ddraw,"(%p)->(%s,%p,%p): stub\n",this,xbuf,surface,device);
+  FIXME(ddraw,"(%p)->(%s,%p,%p): stub\n",This,xbuf,surface,device);
 
-  if (is_OpenGL(rguid, surface, device, this)) {
-    this->lpvtbl->fnAddRef(this);
+  if (is_OpenGL(rguid, (IDirectDrawSurfaceImpl*)surface, (IDirect3DDevice2Impl**)device, This)) {
+    IDirect3D2_AddRef(iface);
     return DD_OK;
 }
 
   return DDERR_INVALIDPARAMS;
 }
 
-static struct IDirect3D2_VTable d3d2vt = {
-	IDirect3D2_QueryInterface,
-	IDirect3D2_AddRef,
-        IDirect3D2_Release,
-        IDirect3D2_EnumDevices,
-	IDirect3D2_CreateLight,
-	IDirect3D2_CreateMaterial,
-	IDirect3D2_CreateViewport,
-	IDirect3D2_FindDevice,
-	IDirect3D2_CreateDevice
+static ICOM_VTABLE(IDirect3D2) d3d2vt = {
+	IDirect3D2Impl_QueryInterface,
+	IDirect3D2Impl_AddRef,
+        IDirect3D2Impl_Release,
+        IDirect3D2Impl_EnumDevices,
+	IDirect3D2Impl_CreateLight,
+	IDirect3D2Impl_CreateMaterial,
+	IDirect3D2Impl_CreateViewport,
+	IDirect3D2Impl_FindDevice,
+	IDirect3D2Impl_CreateDevice
 };
 
 /*******************************************************************************
@@ -2232,9 +2325,9 @@
  */
 static INT ddrawXlibThisOffset = 0;
 
-static HRESULT common_off_screen_CreateSurface(LPDIRECTDRAW2 this,
+static HRESULT common_off_screen_CreateSurface(IDirectDraw2Impl* This,
 					       LPDDSURFACEDESC lpddsd,
-					       LPDIRECTDRAWSURFACE lpdsf)
+					       IDirectDrawSurfaceImpl* lpdsf)
 {
   int bpp;
   
@@ -2249,7 +2342,7 @@
     /* This is a standard image */
   if (!(lpddsd->dwFlags & DDSD_PIXELFORMAT)) {
     /* No pixel format => use DirectDraw's format */
-    lpddsd->ddpfPixelFormat = this->d.directdraw_pixelformat;
+    lpddsd->ddpfPixelFormat = This->d.directdraw_pixelformat;
     lpddsd->dwFlags |= DDSD_PIXELFORMAT;
   }  else {
     /* To check what the program wants */
@@ -2275,13 +2368,15 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDraw2_CreateSurface(
-	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
+static HRESULT WINAPI DGA_IDirectDraw2Impl_CreateSurface(
+	LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
 ) {
 #ifdef HAVE_LIBXXF86DGA
+        ICOM_THIS(IDirectDraw2Impl,iface);
+        IDirectDrawSurfaceImpl** ilpdsf=(IDirectDrawSurfaceImpl**)lpdsf;
 	int	i;
 
-	TRACE(ddraw, "(%p)->(%p,%p,%p)\n",this,lpddsd,lpdsf,lpunk);
+	TRACE(ddraw, "(%p)->(%p,%p,%p)\n",This,lpddsd,ilpdsf,lpunk);
 	if (TRACE_ON(ddraw)) {
 		DUMP("   w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
 		_dump_DDSD(lpddsd->dwFlags);
@@ -2289,19 +2384,19 @@
 		_dump_DDSCAPS(lpddsd->ddsCaps.dwCaps);
 	}
 
-	*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
-	this->lpvtbl->fnAddRef(this);
+	*ilpdsf = (IDirectDrawSurfaceImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurfaceImpl));
+	IDirectDraw2_AddRef(iface);
         
-	(*lpdsf)->ref = 1;
-	(*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds4vt;
-	(*lpdsf)->s.ddraw = this;
-	(*lpdsf)->s.palette = NULL;
-	(*lpdsf)->t.dga.fb_height = -1; /* This is to have non-on screen surfaces freed */
+	(*ilpdsf)->ref = 1;
+	(*ilpdsf)->lpvtbl = (ICOM_VTABLE(IDirectDrawSurface)*)&dga_dds4vt;
+	(*ilpdsf)->s.ddraw = This;
+	(*ilpdsf)->s.palette = NULL;
+	(*ilpdsf)->t.dga.fb_height = -1; /* This is to have non-on screen surfaces freed */
 
 	if (!(lpddsd->dwFlags & DDSD_WIDTH))
-	  lpddsd->dwWidth  = this->d.width;
+	  lpddsd->dwWidth  = This->d.width;
 	if (!(lpddsd->dwFlags & DDSD_HEIGHT))
-	  lpddsd->dwHeight = this->d.height;
+	  lpddsd->dwHeight = This->d.height;
 	
 	/* Check if this a 'primary surface' or not */
 	if ((lpddsd->dwFlags & DDSD_CAPS) &&
@@ -2309,61 +2404,61 @@
 
 	  /* This is THE primary surface => there is DGA-specific code */
 	  /* First, store the surface description */
-	  (*lpdsf)->s.surface_desc = *lpddsd;
+	  (*ilpdsf)->s.surface_desc = *lpddsd;
 	  
 	  /* Find a viewport */
 		for (i=0;i<32;i++)
-			if (!(this->e.dga.vpmask & (1<<i)))
+			if (!(This->e.dga.vpmask & (1<<i)))
 				break;
 		TRACE(ddraw,"using viewport %d for a primary surface\n",i);
 		/* if i == 32 or maximum ... return error */
-		this->e.dga.vpmask|=(1<<i);
-	  (*lpdsf)->s.surface_desc.y.lpSurface =
-	    this->e.dga.fb_addr+((i*this->e.dga.fb_height)*this->e.dga.fb_width*this->d.directdraw_pixelformat.x.dwRGBBitCount/8);
-		(*lpdsf)->t.dga.fb_height = i*this->e.dga.fb_height;
-	  (*lpdsf)->s.surface_desc.lPitch = this->e.dga.fb_width*this->d.directdraw_pixelformat.x.dwRGBBitCount/8;
-	  lpddsd->lPitch = (*lpdsf)->s.surface_desc.lPitch;
+		This->e.dga.vpmask|=(1<<i);
+	  (*ilpdsf)->s.surface_desc.y.lpSurface =
+	    This->e.dga.fb_addr+((i*This->e.dga.fb_height)*This->e.dga.fb_width*This->d.directdraw_pixelformat.x.dwRGBBitCount/8);
+		(*ilpdsf)->t.dga.fb_height = i*This->e.dga.fb_height;
+	  (*ilpdsf)->s.surface_desc.lPitch = This->e.dga.fb_width*This->d.directdraw_pixelformat.x.dwRGBBitCount/8;
+	  lpddsd->lPitch = (*ilpdsf)->s.surface_desc.lPitch;
 
 	  /* Add flags if there were not present */
-	  (*lpdsf)->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT;
-	  (*lpdsf)->s.surface_desc.dwWidth = this->d.width;
-	  (*lpdsf)->s.surface_desc.dwHeight = this->d.height;
-	  TRACE(ddraw,"primary surface: dwWidth=%ld, dwHeight=%ld, lPitch=%ld\n",this->d.width,this->d.height,lpddsd->lPitch);
+	  (*ilpdsf)->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT;
+	  (*ilpdsf)->s.surface_desc.dwWidth = This->d.width;
+	  (*ilpdsf)->s.surface_desc.dwHeight = This->d.height;
+	  TRACE(ddraw,"primary surface: dwWidth=%ld, dwHeight=%ld, lPitch=%ld\n",This->d.width,This->d.height,lpddsd->lPitch);
 	  /* We put our surface always in video memory */
-	  (*lpdsf)->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY;
-	  (*lpdsf)->s.surface_desc.ddpfPixelFormat = this->d.directdraw_pixelformat;
-	(*lpdsf)->s.backbuffer = NULL;
+	  (*ilpdsf)->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY;
+	  (*ilpdsf)->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat;
+	(*ilpdsf)->s.backbuffer = NULL;
 	  
 	if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
-		LPDIRECTDRAWSURFACE4	back;
+		IDirectDrawSurface4Impl*	back;
 
 		if (lpddsd->dwBackBufferCount>1)
 			FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
 
-	    (*lpdsf)->s.backbuffer = back =
-	      (LPDIRECTDRAWSURFACE4)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface4));
-		this->lpvtbl->fnAddRef(this);
+	    (*ilpdsf)->s.backbuffer = back =
+	      (IDirectDrawSurface4Impl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface4Impl));
+		IDirectDraw2_AddRef(iface);
 		back->ref = 1;
-		back->lpvtbl = (LPDIRECTDRAWSURFACE4_VTABLE)&dga_dds4vt;
+		back->lpvtbl = (ICOM_VTABLE(IDirectDrawSurface4)*)&dga_dds4vt;
 		for (i=0;i<32;i++)
-			if (!(this->e.dga.vpmask & (1<<i)))
+			if (!(This->e.dga.vpmask & (1<<i)))
 				break;
 		TRACE(ddraw,"using viewport %d for backbuffer\n",i);
 		/* if i == 32 or maximum ... return error */
-		this->e.dga.vpmask|=(1<<i);
-		back->t.dga.fb_height = i*this->e.dga.fb_height;
+		This->e.dga.vpmask|=(1<<i);
+		back->t.dga.fb_height = i*This->e.dga.fb_height;
 
 	    /* Copy the surface description from the front buffer */
-	    back->s.surface_desc = (*lpdsf)->s.surface_desc;
+	    back->s.surface_desc = (*ilpdsf)->s.surface_desc;
 	    /* Change the parameters that are not the same */
-	    back->s.surface_desc.y.lpSurface = this->e.dga.fb_addr+
-	      ((i*this->e.dga.fb_height)*this->e.dga.fb_width*this->d.directdraw_pixelformat.x.dwRGBBitCount/8);
-		back->s.ddraw = this;
+	    back->s.surface_desc.y.lpSurface = This->e.dga.fb_addr+
+	      ((i*This->e.dga.fb_height)*This->e.dga.fb_width*This->d.directdraw_pixelformat.x.dwRGBBitCount/8);
+		back->s.ddraw = This;
 		back->s.backbuffer = NULL; /* does not have a backbuffer, it is
 					    * one! */
 
 	    /* Add relevant info to front and back buffers */
-	    (*lpdsf)->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_FRONTBUFFER;
+	    (*ilpdsf)->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_FRONTBUFFER;
 	    back->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER;
 	    back->s.surface_desc.dwFlags &= ~DDSD_BACKBUFFERCOUNT;
 	    back->s.surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_VISIBLE;
@@ -2372,7 +2467,7 @@
 	} else {
 	  /* There is no DGA-specific code here...
 	     Go to the common surface creation function */
-	  return common_off_screen_CreateSurface(this, lpddsd, *lpdsf);
+	  return common_off_screen_CreateSurface(This, lpddsd, *ilpdsf);
 	}
 	
 	return DD_OK;
@@ -2388,13 +2483,13 @@
   return 0;
 }
 
-static XImage *create_xshmimage(LPDIRECTDRAW2 this, LPDIRECTDRAWSURFACE4 lpdsf) {
+static XImage *create_xshmimage(IDirectDraw2Impl* This, IDirectDrawSurface4Impl* lpdsf) {
   XImage *img;
   int (*WineXHandler)(Display *, XErrorEvent *);
 
     img = TSXShmCreateImage(display,
 			    DefaultVisualOfScreen(X11DRV_GetXScreen()),
-			    this->d.pixmap_depth,
+			    This->d.pixmap_depth,
 			    ZPixmap,
 			    NULL,
 			    &(lpdsf->t.xlib.shminfo),
@@ -2403,14 +2498,14 @@
     
   if (img == NULL) {
     MSG("Couldn't create XShm image (due to X11 remote display or failure).\nReverting to standard X images !\n");
-    this->e.xlib.xshm_active = 0;
+    This->e.xlib.xshm_active = 0;
       return NULL;
   }
 
     lpdsf->t.xlib.shminfo.shmid = shmget( IPC_PRIVATE, img->bytes_per_line * img->height, IPC_CREAT|0777 );
     if (lpdsf->t.xlib.shminfo.shmid < 0) {
     MSG("Couldn't create shared memory segment (due to X11 remote display or failure).\nReverting to standard X images !\n");
-    this->e.xlib.xshm_active = 0;
+    This->e.xlib.xshm_active = 0;
       TSXDestroyImage(img);
       return NULL;
     }
@@ -2419,7 +2514,7 @@
       
     if (img->data == (char *) -1) {
     MSG("Couldn't attach shared memory segment (due to X11 remote display or failure).\nReverting to standard X images !\n");
-    this->e.xlib.xshm_active = 0;
+    This->e.xlib.xshm_active = 0;
       TSXDestroyImage(img);
       shmctl(lpdsf->t.xlib.shminfo.shmid, IPC_RMID, 0);
       return NULL;
@@ -2450,7 +2545,7 @@
     XSetErrorHandler(WineXHandler);
 
     MSG("Couldn't attach shared memory segment to X server (due to X11 remote display or failure).\nReverting to standard X images !\n");
-    this->e.xlib.xshm_active = 0;
+    This->e.xlib.xshm_active = 0;
     
     /* Leave the critical section */
     LeaveCriticalSection( &X11DRV_CritSection );
@@ -2465,11 +2560,11 @@
   
     shmctl(lpdsf->t.xlib.shminfo.shmid, IPC_RMID, 0);
 
-    if (this->d.pixel_convert != NULL) {
+    if (This->d.pixel_convert != NULL) {
       lpdsf->s.surface_desc.y.lpSurface = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
 						    lpdsf->s.surface_desc.dwWidth *
 						    lpdsf->s.surface_desc.dwHeight *
-						    (this->d.directdraw_pixelformat.x.dwRGBBitCount));
+						    (This->d.directdraw_pixelformat.x.dwRGBBitCount));
     } else {
     lpdsf->s.surface_desc.y.lpSurface = img->data;
     }
@@ -2478,13 +2573,13 @@
 }
 #endif /* HAVE_LIBXXSHM */
 
-static XImage *create_ximage(LPDIRECTDRAW2 this, LPDIRECTDRAWSURFACE4 lpdsf) {
+static XImage *create_ximage(IDirectDraw2Impl* This, IDirectDrawSurface4Impl* lpdsf) {
   XImage *img = NULL;
   void *img_data;
 
 #ifdef HAVE_LIBXXSHM
-  if (this->e.xlib.xshm_active) {
-    img = create_xshmimage(this, lpdsf);
+  if (This->e.xlib.xshm_active) {
+    img = create_xshmimage(This, lpdsf);
   }
     
   if (img == NULL) {
@@ -2493,13 +2588,13 @@
     lpdsf->s.surface_desc.y.lpSurface = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
 						  lpdsf->s.surface_desc.dwWidth *
 						  lpdsf->s.surface_desc.dwHeight *
-						  (this->d.directdraw_pixelformat.x.dwRGBBitCount / 8));
+						  (This->d.directdraw_pixelformat.x.dwRGBBitCount / 8));
     
-    if (this->d.pixel_convert != NULL) {
+    if (This->d.pixel_convert != NULL) {
       img_data = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
 			   lpdsf->s.surface_desc.dwWidth *
 			   lpdsf->s.surface_desc.dwHeight *
-			   (this->d.screen_pixelformat.x.dwRGBBitCount / 8));
+			   (This->d.screen_pixelformat.x.dwRGBBitCount / 8));
     } else {
       img_data = lpdsf->s.surface_desc.y.lpSurface;
     }
@@ -2508,21 +2603,21 @@
     img =
       TSXCreateImage(display,
 		     DefaultVisualOfScreen(X11DRV_GetXScreen()),
-		     this->d.pixmap_depth,
+		     This->d.pixmap_depth,
 		     ZPixmap,
 		     0,
 		     img_data,
 		     lpdsf->s.surface_desc.dwWidth,
 		     lpdsf->s.surface_desc.dwHeight,
 		     32,
-		     lpdsf->s.surface_desc.dwWidth * (this->d.screen_pixelformat.x.dwRGBBitCount / 8)
+		     lpdsf->s.surface_desc.dwWidth * (This->d.screen_pixelformat.x.dwRGBBitCount / 8)
 		     );
     
 #ifdef HAVE_LIBXXSHM
   }
 #endif
-  if (this->d.pixel_convert != NULL) {
-    lpdsf->s.surface_desc.lPitch = (this->d.directdraw_pixelformat.x.dwRGBBitCount / 8) * lpdsf->s.surface_desc.dwWidth;
+  if (This->d.pixel_convert != NULL) {
+    lpdsf->s.surface_desc.lPitch = (This->d.directdraw_pixelformat.x.dwRGBBitCount / 8) * lpdsf->s.surface_desc.dwWidth;
   } else {
   lpdsf->s.surface_desc.lPitch = img->bytes_per_line;
   }
@@ -2530,11 +2625,13 @@
   return img;
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2_CreateSurface(
-	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
+static HRESULT WINAPI Xlib_IDirectDraw2Impl_CreateSurface(
+	LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
+        IDirectDrawSurfaceImpl** ilpdsf=(IDirectDrawSurfaceImpl**)lpdsf;
 	TRACE(ddraw, "(%p)->CreateSurface(%p,%p,%p)\n",
-		     this,lpddsd,lpdsf,lpunk);
+		     This,lpddsd,ilpdsf,lpunk);
 
 	if (TRACE_ON(ddraw)) {
 		DUMP("   w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
@@ -2543,67 +2640,67 @@
 		_dump_DDSCAPS(lpddsd->ddsCaps.dwCaps);
 	}
 
-	*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
+	*ilpdsf = (IDirectDrawSurfaceImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurfaceImpl));
 
-	this->lpvtbl->fnAddRef(this);
-	(*lpdsf)->s.ddraw             = this;
-	(*lpdsf)->ref                 = 1;
-	(*lpdsf)->lpvtbl              = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds4vt;
-	(*lpdsf)->s.palette = NULL;
-	(*lpdsf)->t.xlib.image = NULL; /* This is for off-screen buffers */
+	IDirectDraw2_AddRef(iface);
+	(*ilpdsf)->s.ddraw             = This;
+	(*ilpdsf)->ref                 = 1;
+	(*ilpdsf)->lpvtbl              = (ICOM_VTABLE(IDirectDrawSurface)*)&xlib_dds4vt;
+	(*ilpdsf)->s.palette = NULL;
+	(*ilpdsf)->t.xlib.image = NULL; /* This is for off-screen buffers */
 
 	if (!(lpddsd->dwFlags & DDSD_WIDTH))
-		lpddsd->dwWidth	 = this->d.width;
+		lpddsd->dwWidth	 = This->d.width;
 	if (!(lpddsd->dwFlags & DDSD_HEIGHT))
-		lpddsd->dwHeight = this->d.height;
+		lpddsd->dwHeight = This->d.height;
 
 	/* Check if this a 'primary surface' or not */
   if ((lpddsd->dwFlags & DDSD_CAPS) && 
 	    (lpddsd->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)) {
     XImage *img;
       
-    TRACE(ddraw,"using standard XImage for a primary surface (%p)\n", *lpdsf);
+    TRACE(ddraw,"using standard XImage for a primary surface (%p)\n", *ilpdsf);
 
 	  /* First, store the surface description */
-	  (*lpdsf)->s.surface_desc = *lpddsd;
+	  (*ilpdsf)->s.surface_desc = *lpddsd;
 	  
     /* Create the XImage */
-    img = create_ximage(this, (LPDIRECTDRAWSURFACE4) *lpdsf);
+    img = create_ximage(This, (IDirectDrawSurface4Impl*) *ilpdsf);
     if (img == NULL)
       return DDERR_OUTOFMEMORY;
-    (*lpdsf)->t.xlib.image = img;
+    (*ilpdsf)->t.xlib.image = img;
 
 	  /* Add flags if there were not present */
-	  (*lpdsf)->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT;
-	  (*lpdsf)->s.surface_desc.dwWidth = this->d.width;
-	  (*lpdsf)->s.surface_desc.dwHeight = this->d.height;
-	  (*lpdsf)->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY;
-	  (*lpdsf)->s.surface_desc.ddpfPixelFormat = this->d.directdraw_pixelformat;
-	  (*lpdsf)->s.backbuffer = NULL;
+	  (*ilpdsf)->s.surface_desc.dwFlags |= DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_LPSURFACE|DDSD_PIXELFORMAT;
+	  (*ilpdsf)->s.surface_desc.dwWidth = This->d.width;
+	  (*ilpdsf)->s.surface_desc.dwHeight = This->d.height;
+	  (*ilpdsf)->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_VISIBLE|DDSCAPS_VIDEOMEMORY;
+	  (*ilpdsf)->s.surface_desc.ddpfPixelFormat = This->d.directdraw_pixelformat;
+	  (*ilpdsf)->s.backbuffer = NULL;
     
     /* Check for backbuffers */
 	if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
-		LPDIRECTDRAWSURFACE4	back;
+		IDirectDrawSurface4Impl*	back;
       XImage *img;
 
 		if (lpddsd->dwBackBufferCount>1)
 			FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
 
-      (*lpdsf)->s.backbuffer = back =
-	(LPDIRECTDRAWSURFACE4)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface4));
+      (*ilpdsf)->s.backbuffer = back =
+	(IDirectDrawSurface4Impl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface4Impl));
 
       TRACE(ddraw,"allocated back-buffer (%p)\n", back);
       
-		this->lpvtbl->fnAddRef(this);
-		back->s.ddraw = this;
+		IDirectDraw2_AddRef(iface);
+		back->s.ddraw = This;
 
 		back->ref = 1;
-		back->lpvtbl = (LPDIRECTDRAWSURFACE4_VTABLE)&xlib_dds4vt;
+		back->lpvtbl = (ICOM_VTABLE(IDirectDrawSurface4)*)&xlib_dds4vt;
 	    /* Copy the surface description from the front buffer */
-	    back->s.surface_desc = (*lpdsf)->s.surface_desc;
+	    back->s.surface_desc = (*ilpdsf)->s.surface_desc;
 
       /* Create the XImage */
-      img = create_ximage(this, back);
+      img = create_ximage(This, back);
       if (img == NULL)
 	return DDERR_OUTOFMEMORY;
       back->t.xlib.image = img;
@@ -2612,7 +2709,7 @@
 					    * one! */
 
 	    /* Add relevant info to front and back buffers */
-	    (*lpdsf)->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_FRONTBUFFER;
+	    (*ilpdsf)->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_FRONTBUFFER;
 	    back->s.surface_desc.ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER;
 	    back->s.surface_desc.dwFlags &= ~DDSD_BACKBUFFERCOUNT;
 	    back->s.surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_VISIBLE;
@@ -2621,16 +2718,17 @@
 	} else {
 	  /* There is no Xlib-specific code here...
 	     Go to the common surface creation function */
-	  return common_off_screen_CreateSurface(this, lpddsd, *lpdsf);
+	  return common_off_screen_CreateSurface(This, lpddsd, *ilpdsf);
   }
   
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_DuplicateSurface(
-	LPDIRECTDRAW2 this,LPDIRECTDRAWSURFACE src,LPDIRECTDRAWSURFACE *dst
+static HRESULT WINAPI IDirectDraw2Impl_DuplicateSurface(
+	LPDIRECTDRAW2 iface,LPDIRECTDRAWSURFACE src,LPDIRECTDRAWSURFACE *dst
 ) {
-	FIXME(ddraw,"(%p)->(%p,%p) simply copies\n",this,src,dst);
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	FIXME(ddraw,"(%p)->(%p,%p) simply copies\n",This,src,dst);
 	*dst = src; /* FIXME */
 	return DD_OK;
 }
@@ -2639,9 +2737,10 @@
  * The Xlib Implementation tries to use the passed hwnd as drawing window,
  * even when the approbiate bitmasks are not specified.
  */
-static HRESULT WINAPI IDirectDraw2_SetCooperativeLevel(
-	LPDIRECTDRAW2 this,HWND hwnd,DWORD cooplevel
+static HRESULT WINAPI IDirectDraw2Impl_SetCooperativeLevel(
+	LPDIRECTDRAW2 iface,HWND hwnd,DWORD cooplevel
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
 	int	i;
 	const struct {
 		int	mask;
@@ -2658,7 +2757,7 @@
 		FE(DDSCL_CREATEDEVICEWINDOW)
 	};
 
-	FIXME(ddraw,"(%p)->(%08lx,%08lx)\n",this,(DWORD)hwnd,cooplevel);
+	FIXME(ddraw,"(%p)->(%08lx,%08lx)\n",This,(DWORD)hwnd,cooplevel);
 	if(TRACE_ON(ddraw)){
 	  dbg_decl_str(ddraw, 512);
 	  for (i=0;i<sizeof(flagmap)/sizeof(flagmap[0]);i++)
@@ -2666,14 +2765,14 @@
 	      dsprintf(ddraw, "%s ", flagmap[i].name);
 	  TRACE(ddraw,"	cooperative level %s\n", dbg_str(ddraw));
 	}
-        this->d.mainWindow = hwnd;
+        This->d.mainWindow = hwnd;
 
 	/* This will be overwritten in the case of Full Screen mode.
 	   Windowed games could work with that :-) */
 	if (hwnd)
         {
             WND *tmpWnd = WIN_FindWndPtr(hwnd);
-            this->d.drawable  = X11DRV_WND_GetXWindow(tmpWnd);
+            This->d.drawable  = X11DRV_WND_GetXWindow(tmpWnd);
             WIN_ReleaseWndPtr(tmpWnd);
         }
 
@@ -2683,45 +2782,45 @@
 /* Small helper to either use the cooperative window or create a new 
  * one (for mouse and keyboard input) and drawing in the Xlib implementation.
  */
-static void _common_IDirectDraw_SetDisplayMode(LPDIRECTDRAW this) {
+static void _common_IDirectDrawImpl_SetDisplayMode(IDirectDrawImpl* This) {
 	RECT	rect;
 
 	/* Do not destroy the application supplied cooperative window */
-	if (this->d.window && this->d.window != this->d.mainWindow) {
-		DestroyWindow(this->d.window);
-		this->d.window = 0;
+	if (This->d.window && This->d.window != This->d.mainWindow) {
+		DestroyWindow(This->d.window);
+		This->d.window = 0;
 	}
 	/* Sanity check cooperative window before assigning it to drawing. */
-	if (	IsWindow(this->d.mainWindow) &&
-		IsWindowVisible(this->d.mainWindow)
+	if (	IsWindow(This->d.mainWindow) &&
+		IsWindowVisible(This->d.mainWindow)
 	) {
-		GetWindowRect(this->d.mainWindow,&rect);
-		if (((rect.right-rect.left) >= this->d.width)	&&
-		    ((rect.bottom-rect.top) >= this->d.height)
+		GetWindowRect(This->d.mainWindow,&rect);
+		if (((rect.right-rect.left) >= This->d.width)	&&
+		    ((rect.bottom-rect.top) >= This->d.height)
 		)
-			this->d.window = this->d.mainWindow;
+			This->d.window = This->d.mainWindow;
 	}
 	/* ... failed, create new one. */
-	if (!this->d.window) {
-	    this->d.window = CreateWindowExA(
+	if (!This->d.window) {
+	    This->d.window = CreateWindowExA(
 		    0,
 		    "WINE_DirectDraw",
 		    "WINE_DirectDraw",
 		    WS_VISIBLE|WS_SYSMENU|WS_THICKFRAME,
 		    0,0,
-		    this->d.width,
-		    this->d.height,
+		    This->d.width,
+		    This->d.height,
 		    0,
 		    0,
 		    0,
 		    NULL
 	    );
 	    /*Store THIS with the window. We'll use it in the window procedure*/
-	    SetWindowLongA(this->d.window,ddrawXlibThisOffset,(LONG)this);
-	    ShowWindow(this->d.window,TRUE);
-	    UpdateWindow(this->d.window);
+	    SetWindowLongA(This->d.window,ddrawXlibThisOffset,(LONG)This);
+	    ShowWindow(This->d.window,TRUE);
+	    UpdateWindow(This->d.window);
 	}
-	SetFocus(this->d.window);
+	SetFocus(This->d.window);
 }
 
 static int _common_depth_to_pixelformat(DWORD depth, DDPIXELFORMAT *pixelformat, DDPIXELFORMAT *screen_pixelformat, int *pix_depth) {
@@ -2819,32 +2918,33 @@
   return match;
 }
 
-static HRESULT WINAPI DGA_IDirectDraw_SetDisplayMode(
-	LPDIRECTDRAW this,DWORD width,DWORD height,DWORD depth
+static HRESULT WINAPI DGA_IDirectDrawImpl_SetDisplayMode(
+	LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth
 ) {
 #ifdef HAVE_LIBXXF86DGA
+        ICOM_THIS(IDirectDrawImpl,iface);
         int	i,mode_count;
 
-	TRACE(ddraw, "(%p)->(%ld,%ld,%ld)\n", this, width, height, depth);
+	TRACE(ddraw, "(%p)->(%ld,%ld,%ld)\n", This, width, height, depth);
 
 	/* We hope getting the asked for depth */
-	if (_common_depth_to_pixelformat(depth, &(this->d.directdraw_pixelformat), &(this->d.screen_pixelformat), NULL) != 1) {
+	if (_common_depth_to_pixelformat(depth, &(This->d.directdraw_pixelformat), &(This->d.screen_pixelformat), NULL) != 1) {
 	  /* I.e. no visual found or emulated */
 		ERR(ddraw,"(w=%ld,h=%ld,d=%ld), unsupported depth!\n",width,height,depth);
 		return DDERR_UNSUPPORTEDMODE;
 	}
 	
-	if (this->d.width < width) {
-		ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,this->d.width);
+	if (This->d.width < width) {
+		ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,This->d.width);
 		return DDERR_UNSUPPORTEDMODE;
 	}
-	this->d.width	= width;
-	this->d.height	= height;
+	This->d.width	= width;
+	This->d.height	= height;
 
 	/* adjust fb_height, so we don't overlap */
-	if (this->e.dga.fb_height < height)
-		this->e.dga.fb_height = height;
-	_common_IDirectDraw_SetDisplayMode(this);
+	if (This->e.dga.fb_height < height)
+		This->e.dga.fb_height = height;
+	_common_IDirectDrawImpl_SetDisplayMode(This);
 
 #ifdef HAVE_LIBXXF86VM
         {
@@ -2900,7 +3000,7 @@
 	 */
 	TSXF86DGADirectVideo(display,DefaultScreen(display),XF86DGADirectGraphics);
 #ifdef DIABLO_HACK
-	TSXF86DGASetViewPort(display,DefaultScreen(display),0,this->e.dga.fb_height);
+	TSXF86DGASetViewPort(display,DefaultScreen(display),0,This->e.dga.fb_height);
 #else
 	TSXF86DGASetViewPort(display,DefaultScreen(display),0,0);
 #endif
@@ -2917,7 +3017,7 @@
 /* *************************************
       16 / 15 bpp to palettized 8 bpp
    ************************************* */
-static void pixel_convert_16_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, LPDIRECTDRAWPALETTE palette) {
+static void pixel_convert_16_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) {
   unsigned char  *c_src = (unsigned char  *) src;
   unsigned short *c_dst = (unsigned short *) dst;
   int x, y;
@@ -2957,7 +3057,7 @@
 /* *************************************
       24 / 32 bpp to palettized 8 bpp
    ************************************* */
-static void pixel_convert_32_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, LPDIRECTDRAWPALETTE palette) {
+static void pixel_convert_32_to_8(void *src, void *dst, DWORD width, DWORD height, LONG pitch, IDirectDrawPaletteImpl* palette) {
   unsigned char  *c_src = (unsigned char  *) src;
   unsigned int *c_dst = (unsigned int *) dst;
   int x, y;
@@ -2985,19 +3085,20 @@
 		      ((unsigned int) palent[i].peBlue));
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw_SetDisplayMode(
-	LPDIRECTDRAW this,DWORD width,DWORD height,DWORD depth
+static HRESULT WINAPI Xlib_IDirectDrawImpl_SetDisplayMode(
+	LPDIRECTDRAW iface,DWORD width,DWORD height,DWORD depth
 ) {
+        ICOM_THIS(IDirectDrawImpl,iface);
 	char	buf[200];
         WND *tmpWnd;
 
 	TRACE(ddraw, "(%p)->SetDisplayMode(%ld,%ld,%ld)\n",
-		      this, width, height, depth);
+		      This, width, height, depth);
 
 	switch (_common_depth_to_pixelformat(depth,
-					     &(this->d.directdraw_pixelformat),
-					     &(this->d.screen_pixelformat),
-					     &(this->d.pixmap_depth))) {
+					     &(This->d.directdraw_pixelformat),
+					     &(This->d.screen_pixelformat),
+					     &(This->d.pixmap_depth))) {
 	case 0:
 	  sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), unsupported depth!",width,height,depth);
 	  MessageBoxA(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
@@ -3005,8 +3106,8 @@
 
 	case 1:
 	  /* No convertion */
-	  this->d.pixel_convert = NULL;
-	  this->d.palette_convert = NULL;
+	  This->d.pixel_convert = NULL;
+	  This->d.palette_convert = NULL;
 	  break;
 
 	case 2: {
@@ -3015,24 +3116,24 @@
 	  WARN(ddraw, "Warning : running in depth-convertion mode. Should run using a %ld depth for optimal performances.\n", depth);
 	  
 	  /* Set the depth convertion routines */
-	  switch (this->d.screen_pixelformat.x.dwRGBBitCount) {
+	  switch (This->d.screen_pixelformat.x.dwRGBBitCount) {
 	  case 16:
-	    if ((this->d.screen_pixelformat.y.dwRBitMask == 0xF800) &&
-		(this->d.screen_pixelformat.z.dwGBitMask == 0x07E0) &&
-		(this->d.screen_pixelformat.xx.dwBBitMask == 0x001F)) {
+	    if ((This->d.screen_pixelformat.y.dwRBitMask == 0xF800) &&
+		(This->d.screen_pixelformat.z.dwGBitMask == 0x07E0) &&
+		(This->d.screen_pixelformat.xx.dwBBitMask == 0x001F)) {
 	      /* 16 bpp */
 	      found = 1;
 	      
-	      this->d.pixel_convert = pixel_convert_16_to_8;
-	      this->d.palette_convert = palette_convert_16_to_8;
-	    } else if ((this->d.screen_pixelformat.y.dwRBitMask == 0x7C00) &&
-		       (this->d.screen_pixelformat.z.dwGBitMask == 0x03E0) &&
-		       (this->d.screen_pixelformat.xx.dwBBitMask == 0x001F)) {
+	      This->d.pixel_convert = pixel_convert_16_to_8;
+	      This->d.palette_convert = palette_convert_16_to_8;
+	    } else if ((This->d.screen_pixelformat.y.dwRBitMask == 0x7C00) &&
+		       (This->d.screen_pixelformat.z.dwGBitMask == 0x03E0) &&
+		       (This->d.screen_pixelformat.xx.dwBBitMask == 0x001F)) {
 	      /* 15 bpp */
 	      found = 1;
 
-	      this->d.pixel_convert = pixel_convert_16_to_8;
-	      this->d.palette_convert = palette_convert_15_to_8;
+	      This->d.pixel_convert = pixel_convert_16_to_8;
+	      This->d.palette_convert = palette_convert_15_to_8;
 	    }
 	    break;
 	    
@@ -3042,14 +3143,14 @@
 			break;
 	    
 	  case 32:
-	    if ((this->d.screen_pixelformat.y.dwRBitMask ==  0xFF0000) &&
-		(this->d.screen_pixelformat.z.dwGBitMask ==  0x00FF00) &&
-		(this->d.screen_pixelformat.xx.dwBBitMask == 0x0000FF)) {
+	    if ((This->d.screen_pixelformat.y.dwRBitMask ==  0xFF0000) &&
+		(This->d.screen_pixelformat.z.dwGBitMask ==  0x00FF00) &&
+		(This->d.screen_pixelformat.xx.dwBBitMask == 0x0000FF)) {
 	      /* 24 bpp */
 	      found = 1;
 
-	      this->d.pixel_convert = pixel_convert_32_to_8;
-	      this->d.palette_convert = palette_convert_24_to_8;
+	      This->d.pixel_convert = pixel_convert_32_to_8;
+	      This->d.palette_convert = palette_convert_24_to_8;
 	    }
 	      break;
 	  }
@@ -3062,35 +3163,36 @@
 	} break;
 	}
 
-	this->d.width	= width;
-	this->d.height	= height;
+	This->d.width	= width;
+	This->d.height	= height;
 
-	_common_IDirectDraw_SetDisplayMode(this);
+	_common_IDirectDrawImpl_SetDisplayMode(This);
 
-        tmpWnd = WIN_FindWndPtr(this->d.window);
-	this->d.paintable = 1;
-        this->d.drawable  = ((X11DRV_WND_DATA *) tmpWnd->pDriverData)->window;
+        tmpWnd = WIN_FindWndPtr(This->d.window);
+	This->d.paintable = 1;
+        This->d.drawable  = ((X11DRV_WND_DATA *) tmpWnd->pDriverData)->window;
         /* We don't have a context for this window. Host off the desktop */
 
-        if( !this->d.drawable )
+        if( !This->d.drawable )
         {
-           this->d.drawable = ((X11DRV_WND_DATA *) WIN_GetDesktop()->pDriverData)->window;
+           This->d.drawable = ((X11DRV_WND_DATA *) WIN_GetDesktop()->pDriverData)->window;
             WIN_ReleaseDesktop();
         }
         WIN_ReleaseWndPtr(tmpWnd);
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDraw2_GetCaps(
-	LPDIRECTDRAW2 this,LPDDCAPS caps1,LPDDCAPS caps2
+static HRESULT WINAPI DGA_IDirectDraw2Impl_GetCaps(
+	LPDIRECTDRAW2 iface,LPDDCAPS caps1,LPDDCAPS caps2
 ) {
 #ifdef HAVE_LIBXXF86DGA
-	TRACE(ddraw,"(%p)->GetCaps(%p,%p)\n",this,caps1,caps2);
-	caps1->dwVidMemTotal = this->e.dga.fb_memsize;
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	TRACE(ddraw,"(%p)->GetCaps(%p,%p)\n",This,caps1,caps2);
+	caps1->dwVidMemTotal = This->e.dga.fb_memsize;
 	caps1->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED);		/* we can do anything */
 	caps1->ddsCaps.dwCaps = 0xffffffff;	/* we can do anything */
 	if (caps2) {
-		caps2->dwVidMemTotal = this->e.dga.fb_memsize;
+		caps2->dwVidMemTotal = This->e.dga.fb_memsize;
 		caps2->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED);		/* we can do anything */
 		caps2->ddsCaps.dwCaps = 0xffffffff;	/* we can do anything */
 	}
@@ -3134,10 +3236,11 @@
 #endif
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2_GetCaps(
-	LPDIRECTDRAW2 this,LPDDCAPS caps1,LPDDCAPS caps2
+static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetCaps(
+	LPDIRECTDRAW2 iface,LPDDCAPS caps1,LPDDCAPS caps2
 )  {
-	TRACE(ddraw,"(%p)->GetCaps(%p,%p)\n",this,caps1,caps2);
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	TRACE(ddraw,"(%p)->GetCaps(%p,%p)\n",This,caps1,caps2);
 
 	/* Put the same caps for the two capabilities */
 	fill_caps(caps1);
@@ -3146,30 +3249,32 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_CreateClipper(
-	LPDIRECTDRAW2 this,DWORD x,LPDIRECTDRAWCLIPPER *lpddclip,LPUNKNOWN lpunk
+static HRESULT WINAPI IDirectDraw2Impl_CreateClipper(
+	LPDIRECTDRAW2 iface,DWORD x,LPDIRECTDRAWCLIPPER *lpddclip,LPUNKNOWN lpunk
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
+        IDirectDrawClipperImpl** ilpddclip=(IDirectDrawClipperImpl**)lpddclip;
 	FIXME(ddraw,"(%p)->(%08lx,%p,%p),stub!\n",
-		this,x,lpddclip,lpunk
+		This,x,ilpddclip,lpunk
 	);
-	*lpddclip = (LPDIRECTDRAWCLIPPER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipper));
-	(*lpddclip)->ref = 1;
-	(*lpddclip)->lpvtbl = &ddclipvt;
+	*ilpddclip = (IDirectDrawClipperImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipperImpl));
+	(*ilpddclip)->ref = 1;
+	(*ilpddclip)->lpvtbl = &ddclipvt;
 	return DD_OK;
 }
 
-static HRESULT WINAPI common_IDirectDraw2_CreatePalette(
-	LPDIRECTDRAW2 this,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk,int *psize
+static HRESULT WINAPI common_IDirectDraw2Impl_CreatePalette(
+	IDirectDraw2Impl* This,DWORD dwFlags,LPPALETTEENTRY palent,IDirectDrawPaletteImpl **lpddpal,LPUNKNOWN lpunk,int *psize
 ) {
 	int size = 0;
 	  
 	if (TRACE_ON(ddraw))
 	  _dump_paletteformat(dwFlags);
 	
-	*lpddpal = (LPDIRECTDRAWPALETTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPalette));
+	*lpddpal = (IDirectDrawPaletteImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPaletteImpl));
 	if (*lpddpal == NULL) return E_OUTOFMEMORY;
 	(*lpddpal)->ref = 1;
-	(*lpddpal)->ddraw = (LPDIRECTDRAW)this;
+	(*lpddpal)->ddraw = (IDirectDrawImpl*)This;
 	(*lpddpal)->installed = 0;
 
 	  if (dwFlags & DDPCAPS_1BIT)
@@ -3187,11 +3292,11 @@
         if (palent)
         {
 	  /* Now, if we are in 'depth conversion mode', create the screen palette */
-	  if (this->d.palette_convert != NULL)	    
-	    this->d.palette_convert(palent, (*lpddpal)->screen_palents, 0, size);
+	  if (This->d.palette_convert != NULL)	    
+	    This->d.palette_convert(palent, (*lpddpal)->screen_palents, 0, size);
 
 	  memcpy((*lpddpal)->palents, palent, size * sizeof(PALETTEENTRY));
-        } else if (this->d.palette_convert != NULL) {
+        } else if (This->d.palette_convert != NULL) {
 	  /* In that case, put all 0xFF */
 	  memset((*lpddpal)->screen_palents, 0xFF, 256 * sizeof(int));
 	}
@@ -3199,53 +3304,58 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDraw2_CreatePalette(
-	LPDIRECTDRAW2 this,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
+static HRESULT WINAPI DGA_IDirectDraw2Impl_CreatePalette(
+	LPDIRECTDRAW2 iface,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
+        IDirectDrawPaletteImpl** ilpddpal=(IDirectDrawPaletteImpl**)lpddpal;
 	HRESULT res;
 	int xsize = 0,i;
 
-	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",this,dwFlags,palent,lpddpal,lpunk);
-	res = common_IDirectDraw2_CreatePalette(this,dwFlags,palent,lpddpal,lpunk,&xsize);
+	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",This,dwFlags,palent,ilpddpal,lpunk);
+	res = common_IDirectDraw2Impl_CreatePalette(This,dwFlags,palent,ilpddpal,lpunk,&xsize);
 	if (res != 0) return res;
-	(*lpddpal)->lpvtbl = &dga_ddpalvt;
-	if (this->d.directdraw_pixelformat.x.dwRGBBitCount<=8) {
-		(*lpddpal)->cm = TSXCreateColormap(display,DefaultRootWindow(display),DefaultVisualOfScreen(X11DRV_GetXScreen()),AllocAll);
+	(*ilpddpal)->lpvtbl = &dga_ddpalvt;
+	if (This->d.directdraw_pixelformat.x.dwRGBBitCount<=8) {
+		(*ilpddpal)->cm = TSXCreateColormap(display,DefaultRootWindow(display),DefaultVisualOfScreen(X11DRV_GetXScreen()),AllocAll);
 	} else {
 		FIXME(ddraw,"why are we doing CreatePalette in hi/truecolor?\n");
-		(*lpddpal)->cm = 0;
+		(*ilpddpal)->cm = 0;
 	}
-	if (((*lpddpal)->cm)&&xsize) {
+	if (((*ilpddpal)->cm)&&xsize) {
 	  for (i=0;i<xsize;i++) {
 		  XColor xc;
 
-		  xc.red = (*lpddpal)->palents[i].peRed<<8;
-		  xc.blue = (*lpddpal)->palents[i].peBlue<<8;
-		  xc.green = (*lpddpal)->palents[i].peGreen<<8;
+		  xc.red = (*ilpddpal)->palents[i].peRed<<8;
+		  xc.blue = (*ilpddpal)->palents[i].peBlue<<8;
+		  xc.green = (*ilpddpal)->palents[i].peGreen<<8;
 		  xc.flags = DoRed|DoBlue|DoGreen;
 		  xc.pixel = i;
-		  TSXStoreColor(display,(*lpddpal)->cm,&xc);
+		  TSXStoreColor(display,(*ilpddpal)->cm,&xc);
 	  }
 	}
 	return DD_OK;
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2_CreatePalette(
-	LPDIRECTDRAW2 this,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
+static HRESULT WINAPI Xlib_IDirectDraw2Impl_CreatePalette(
+	LPDIRECTDRAW2 iface,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
+        IDirectDrawPaletteImpl** ilpddpal=(IDirectDrawPaletteImpl**)lpddpal;
 	int xsize;
 	HRESULT res;
 
-	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",this,dwFlags,palent,lpddpal,lpunk);
-	res = common_IDirectDraw2_CreatePalette(this,dwFlags,palent,lpddpal,lpunk,&xsize);
+	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",This,dwFlags,palent,ilpddpal,lpunk);
+	res = common_IDirectDraw2Impl_CreatePalette(This,dwFlags,palent,ilpddpal,lpunk,&xsize);
 	if (res != 0) return res;
-	(*lpddpal)->lpvtbl = &xlib_ddpalvt;
+	(*ilpddpal)->lpvtbl = &xlib_ddpalvt;
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDraw2_RestoreDisplayMode(LPDIRECTDRAW2 this) {
+static HRESULT WINAPI DGA_IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 iface) {
 #ifdef HAVE_LIBXXF86DGA
-	TRACE(ddraw, "(%p)->()\n",this);
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	TRACE(ddraw, "(%p)->()\n",This);
 	Sleep(1000);
 	TSXF86DGADirectVideo(display,DefaultScreen(display),0);
 #ifdef RESTORE_SIGNALS
@@ -3257,33 +3367,37 @@
 #endif
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2_RestoreDisplayMode(LPDIRECTDRAW2 this) {
-	TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", this);
+static HRESULT WINAPI Xlib_IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 iface) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", This);
 	Sleep(1000);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_WaitForVerticalBlank(
-	LPDIRECTDRAW2 this,DWORD x,HANDLE h
+static HRESULT WINAPI IDirectDraw2Impl_WaitForVerticalBlank(
+	LPDIRECTDRAW2 iface,DWORD x,HANDLE h
 ) {
-	TRACE(ddraw,"(%p)->(0x%08lx,0x%08x)\n",this,x,h);
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	TRACE(ddraw,"(%p)->(0x%08lx,0x%08x)\n",This,x,h);
 	return DD_OK;
 }
 
-static ULONG WINAPI IDirectDraw2_AddRef(LPDIRECTDRAW2 this) {
-        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
+        TRACE( ddraw, "(%p)->() incrementing from %lu.\n", This, This->ref );
 
-	return ++(this->ref);
+	return ++(This->ref);
 }
 
-static ULONG WINAPI DGA_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
-        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI DGA_IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
+        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
 
 #ifdef HAVE_LIBXXF86DGA
-	if (!--(this->ref)) {
+	if (!--(This->ref)) {
 		TSXF86DGADirectVideo(display,DefaultScreen(display),0);
-		if (this->d.window && (this->d.mainWindow != this->d.window))
-			DestroyWindow(this->d.window);
+		if (This->d.window && (This->d.mainWindow != This->d.window))
+			DestroyWindow(This->d.window);
 #ifdef HAVE_LIBXXF86VM
 		if (orig_mode) {
 			TSXF86VidModeSwitchToMode(
@@ -3300,75 +3414,77 @@
 #ifdef RESTORE_SIGNALS
 		SIGNAL_InitHandlers();
 #endif
-		HeapFree(GetProcessHeap(),0,this);
+		HeapFree(GetProcessHeap(),0,This);
 		return 0;
 	}
 #endif /* defined(HAVE_LIBXXF86DGA) */
-	return this->ref;
+	return This->ref;
 }
 
-static ULONG WINAPI Xlib_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
-        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
+static ULONG WINAPI Xlib_IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
+        TRACE( ddraw, "(%p)->() decrementing from %lu.\n", This, This->ref );
 
-	if (!--(this->ref)) {
-		if (this->d.window && (this->d.mainWindow != this->d.window))
-			DestroyWindow(this->d.window);
-		HeapFree(GetProcessHeap(),0,this);
+	if (!--(This->ref)) {
+		if (This->d.window && (This->d.mainWindow != This->d.window))
+			DestroyWindow(This->d.window);
+		HeapFree(GetProcessHeap(),0,This);
 		return 0;
 	}
 	/* FIXME: destroy window ... */
-	return this->ref;
+	return This->ref;
 }
 
-static HRESULT WINAPI DGA_IDirectDraw2_QueryInterface(
-	LPDIRECTDRAW2 this,REFIID refiid,LPVOID *obj
+static HRESULT WINAPI DGA_IDirectDraw2Impl_QueryInterface(
+	LPDIRECTDRAW2 iface,REFIID refiid,LPVOID *obj
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
 	char    xrefiid[50];
 
 	WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-	TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+	TRACE(ddraw,"(%p)->(%s,%p)\n",This,xrefiid,obj);
 	if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
-		*obj = this;
-		this->lpvtbl->fnAddRef(this);
+		*obj = This;
+		IDirectDraw2_AddRef(iface);
 
 		TRACE(ddraw, "  Creating IUnknown interface (%p)\n", *obj);
 		
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirectDraw,refiid,sizeof(IID_IDirectDraw))) {
-		this->lpvtbl = (LPDIRECTDRAW2_VTABLE)&dga_ddvt;
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
+		This->lpvtbl = (ICOM_VTABLE(IDirectDraw2)*)&dga_ddvt;
+		IDirectDraw2_AddRef(iface);
+		*obj = This;
 
 		TRACE(ddraw, "  Creating IDirectDraw interface (%p)\n", *obj);
 		
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirectDraw2,refiid,sizeof(IID_IDirectDraw2))) {
-		this->lpvtbl = (LPDIRECTDRAW2_VTABLE)&dga_dd2vt;
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
+		This->lpvtbl = (ICOM_VTABLE(IDirectDraw2)*)&dga_dd2vt;
+		IDirectDraw2_AddRef(iface);
+		*obj = This;
 
 		TRACE(ddraw, "  Creating IDirectDraw2 interface (%p)\n", *obj);
 
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirectDraw4,refiid,sizeof(IID_IDirectDraw4))) {
-		this->lpvtbl = (LPDIRECTDRAW2_VTABLE)&dga_dd4vt;
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
+		This->lpvtbl = (ICOM_VTABLE(IDirectDraw2)*)&dga_dd4vt;
+		IDirectDraw2_AddRef(iface);
+		*obj = This;
 
 		TRACE(ddraw, "  Creating IDirectDraw4 interface (%p)\n", *obj);
 
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
-		LPDIRECT3D	d3d;
+		IDirect3DImpl* d3d;
 
 		d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
 		d3d->ref = 1;
-		d3d->ddraw = (LPDIRECTDRAW)this;
-		this->lpvtbl->fnAddRef(this);
+		d3d->ddraw = (IDirectDrawImpl*)This;
+		IDirectDraw2_AddRef(iface);
 		d3d->lpvtbl = &d3dvt;
 		*obj = d3d;
 
@@ -3377,12 +3493,12 @@
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirect3D2,refiid,sizeof(IID_IDirect3D2))) {
-		LPDIRECT3D2	d3d;
+		IDirect3D2Impl*	d3d;
 
 		d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
 		d3d->ref = 1;
-		d3d->ddraw = (LPDIRECTDRAW)this;
-		this->lpvtbl->fnAddRef(this);
+		d3d->ddraw = (IDirectDrawImpl*)This;
+		IDirectDraw2_AddRef(iface);
 		d3d->lpvtbl = &d3d2vt;
 		*obj = d3d;
 
@@ -3390,59 +3506,60 @@
 		
 		return S_OK;
 	}
-	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
+	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",This,xrefiid);
         return OLE_E_ENUM_NOMORE;
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2_QueryInterface(
-	LPDIRECTDRAW2 this,REFIID refiid,LPVOID *obj
+static HRESULT WINAPI Xlib_IDirectDraw2Impl_QueryInterface(
+	LPDIRECTDRAW2 iface,REFIID refiid,LPVOID *obj
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
 	char    xrefiid[50];
 
 	WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-	TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+	TRACE(ddraw,"(%p)->(%s,%p)\n",This,xrefiid,obj);
 	if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
-		*obj = this;
-		this->lpvtbl->fnAddRef(this);
+		*obj = This;
+		IDirectDraw2_AddRef(iface);
 
 		TRACE(ddraw, "  Creating IUnknown interface (%p)\n", *obj);
 		
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirectDraw,refiid,sizeof(IID_IDirectDraw))) {
-		this->lpvtbl = (LPDIRECTDRAW2_VTABLE)&xlib_ddvt;
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
+		This->lpvtbl = (ICOM_VTABLE(IDirectDraw2)*)&xlib_ddvt;
+		IDirectDraw2_AddRef(iface);
+		*obj = This;
 
 		TRACE(ddraw, "  Creating IDirectDraw interface (%p)\n", *obj);
 		
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirectDraw2,refiid,sizeof(IID_IDirectDraw2))) {
-		this->lpvtbl = (LPDIRECTDRAW2_VTABLE)&xlib_dd2vt;
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
+		This->lpvtbl = (ICOM_VTABLE(IDirectDraw2)*)&xlib_dd2vt;
+		IDirectDraw2_AddRef(iface);
+		*obj = This;
 
 		TRACE(ddraw, "  Creating IDirectDraw2 interface (%p)\n", *obj);
 		
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirectDraw4,refiid,sizeof(IID_IDirectDraw4))) {
-		this->lpvtbl = (LPDIRECTDRAW2_VTABLE)&xlib_dd4vt;
-		this->lpvtbl->fnAddRef(this);
-		*obj = this;
+		This->lpvtbl = (ICOM_VTABLE(IDirectDraw2)*)&xlib_dd4vt;
+		IDirectDraw2_AddRef(iface);
+		*obj = This;
 
 		TRACE(ddraw, "  Creating IDirectDraw4 interface (%p)\n", *obj);
 
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
-		LPDIRECT3D	d3d;
+		IDirect3DImpl* d3d;
 
 		d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
 		d3d->ref = 1;
-		d3d->ddraw = (LPDIRECTDRAW)this;
-		this->lpvtbl->fnAddRef(this);
+		d3d->ddraw = (IDirectDrawImpl*)This;
+		IDirectDraw2_AddRef(iface);
 		d3d->lpvtbl = &d3dvt;
 		*obj = d3d;
 
@@ -3451,12 +3568,12 @@
 		return S_OK;
 	}
 	if (!memcmp(&IID_IDirect3D2,refiid,sizeof(IID_IDirect3D))) {
-		LPDIRECT3D2	d3d;
+		IDirect3D2Impl* d3d;
 
 		d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
 		d3d->ref = 1;
-		d3d->ddraw = (LPDIRECTDRAW)this;
-		this->lpvtbl->fnAddRef(this);
+		d3d->ddraw = (IDirectDrawImpl*)This;
+		IDirectDraw2_AddRef(iface);
 		d3d->lpvtbl = &d3d2vt;
 		*obj = d3d;
 
@@ -3464,21 +3581,23 @@
 
 		return S_OK;
 	}
-	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
+	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",This,xrefiid);
         return OLE_E_ENUM_NOMORE;
 }
 
-static HRESULT WINAPI IDirectDraw2_GetVerticalBlankStatus(
-	LPDIRECTDRAW2 this,BOOL *status
+static HRESULT WINAPI IDirectDraw2Impl_GetVerticalBlankStatus(
+	LPDIRECTDRAW2 iface,BOOL *status
 ) {
-        TRACE(ddraw,"(%p)->(%p)\n",this,status);
+        ICOM_THIS(IDirectDraw2Impl,iface);
+        TRACE(ddraw,"(%p)->(%p)\n",This,status);
 	*status = TRUE;
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDraw2_EnumDisplayModes(
-	LPDIRECTDRAW2 this,DWORD dwFlags,LPDDSURFACEDESC lpddsfd,LPVOID context,LPDDENUMMODESCALLBACK modescb
+static HRESULT WINAPI DGA_IDirectDraw2Impl_EnumDisplayModes(
+	LPDIRECTDRAW2 iface,DWORD dwFlags,LPDDSURFACEDESC lpddsfd,LPVOID context,LPDDENUMMODESCALLBACK modescb
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
 	DDSURFACEDESC	ddsfd;
 	static struct {
 		int w,h;
@@ -3492,7 +3611,7 @@
 	static int depths[4] = {8,16,24,32};
 	int	i,j;
 
-	TRACE(ddraw,"(%p)->(0x%08lx,%p,%p,%p)\n",this,dwFlags,lpddsfd,context,modescb);
+	TRACE(ddraw,"(%p)->(0x%08lx,%p,%p,%p)\n",This,dwFlags,lpddsfd,context,modescb);
 	ddsfd.dwSize = sizeof(ddsfd);
 	ddsfd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
 	if (dwFlags & DDEDM_REFRESHRATES) {
@@ -3560,9 +3679,10 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2_EnumDisplayModes(
-	LPDIRECTDRAW2 this,DWORD dwFlags,LPDDSURFACEDESC lpddsfd,LPVOID context,LPDDENUMMODESCALLBACK modescb
+static HRESULT WINAPI Xlib_IDirectDraw2Impl_EnumDisplayModes(
+	LPDIRECTDRAW2 iface,DWORD dwFlags,LPDDSURFACEDESC lpddsfd,LPVOID context,LPDDENUMMODESCALLBACK modescb
 ) {
+  ICOM_THIS(IDirectDraw2Impl,iface);
   XVisualInfo *vi;
   XPixmapFormatValues *pf;
   XVisualInfo vt;
@@ -3582,7 +3702,7 @@
   };
   DWORD maxWidth, maxHeight;
 
-  TRACE(ddraw,"(%p)->(0x%08lx,%p,%p,%p)\n",this,dwFlags,lpddsfd,context,modescb);
+  TRACE(ddraw,"(%p)->(0x%08lx,%p,%p,%p)\n",This,dwFlags,lpddsfd,context,modescb);
   ddsfd.dwSize = sizeof(ddsfd);
   ddsfd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_CAPS;
   if (dwFlags & DDEDM_REFRESHRATES) {
@@ -3686,93 +3806,103 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDraw2_GetDisplayMode(
-	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsfd
+static HRESULT WINAPI DGA_IDirectDraw2Impl_GetDisplayMode(
+	LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsfd
 ) {
 #ifdef HAVE_LIBXXF86DGA
-	TRACE(ddraw,"(%p)->(%p)\n",this,lpddsfd);
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	TRACE(ddraw,"(%p)->(%p)\n",This,lpddsfd);
 	lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
 	lpddsfd->dwHeight = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
 	lpddsfd->dwWidth = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
-	lpddsfd->lPitch = this->e.dga.fb_width*this->d.directdraw_pixelformat.x.dwRGBBitCount/8;
+	lpddsfd->lPitch = This->e.dga.fb_width*This->d.directdraw_pixelformat.x.dwRGBBitCount/8;
 	lpddsfd->dwBackBufferCount = 1;
 	lpddsfd->x.dwRefreshRate = 60;
 	lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE;
-	lpddsfd->ddpfPixelFormat = this->d.directdraw_pixelformat;
+	lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat;
 	return DD_OK;
 #else /* defined(HAVE_LIBXXF86DGA) */
 	return E_UNEXPECTED;
 #endif /* defined(HAVE_LIBXXF86DGA) */
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2_GetDisplayMode(
-	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsfd
+static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetDisplayMode(
+	LPDIRECTDRAW2 iface,LPDDSURFACEDESC lpddsfd
 ) {
-	TRACE(ddraw,"(%p)->GetDisplayMode(%p)\n",this,lpddsfd);
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	TRACE(ddraw,"(%p)->GetDisplayMode(%p)\n",This,lpddsfd);
 	lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
 	lpddsfd->dwHeight = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
 	lpddsfd->dwWidth = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
-	lpddsfd->lPitch = lpddsfd->dwWidth * this->d.directdraw_pixelformat.x.dwRGBBitCount/8;
+	lpddsfd->lPitch = lpddsfd->dwWidth * This->d.directdraw_pixelformat.x.dwRGBBitCount/8;
 	lpddsfd->dwBackBufferCount = 1;
 	lpddsfd->x.dwRefreshRate = 60;
 	lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE;
-	lpddsfd->ddpfPixelFormat = this->d.directdraw_pixelformat;
+	lpddsfd->ddpfPixelFormat = This->d.directdraw_pixelformat;
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_FlipToGDISurface(LPDIRECTDRAW2 this) {
-	TRACE(ddraw,"(%p)->()\n",this);
+static HRESULT WINAPI IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 iface) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	TRACE(ddraw,"(%p)->()\n",This);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_GetMonitorFrequency(
-	LPDIRECTDRAW2 this,LPDWORD freq
+static HRESULT WINAPI IDirectDraw2Impl_GetMonitorFrequency(
+	LPDIRECTDRAW2 iface,LPDWORD freq
 ) {
-	FIXME(ddraw,"(%p)->(%p) returns 60 Hz always\n",this,freq);
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	FIXME(ddraw,"(%p)->(%p) returns 60 Hz always\n",This,freq);
 	*freq = 60*100; /* 60 Hz */
 	return DD_OK;
 }
 
 /* what can we directly decompress? */
-static HRESULT WINAPI IDirectDraw2_GetFourCCCodes(
-	LPDIRECTDRAW2 this,LPDWORD x,LPDWORD y
+static HRESULT WINAPI IDirectDraw2Impl_GetFourCCCodes(
+	LPDIRECTDRAW2 iface,LPDWORD x,LPDWORD y
 ) {
-	FIXME(ddraw,"(%p,%p,%p), stub\n",this,x,y);
+        ICOM_THIS(IDirectDraw2Impl,iface);
+	FIXME(ddraw,"(%p,%p,%p), stub\n",This,x,y);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_EnumSurfaces(
-	LPDIRECTDRAW2 this,DWORD x,LPDDSURFACEDESC ddsfd,LPVOID context,LPDDENUMSURFACESCALLBACK ddsfcb
+static HRESULT WINAPI IDirectDraw2Impl_EnumSurfaces(
+	LPDIRECTDRAW2 iface,DWORD x,LPDDSURFACEDESC ddsfd,LPVOID context,LPDDENUMSURFACESCALLBACK ddsfcb
 ) {
-  FIXME(ddraw,"(%p)->(0x%08lx,%p,%p,%p),stub!\n",this,x,ddsfd,context,ddsfcb);
+  ICOM_THIS(IDirectDraw2Impl,iface);
+  FIXME(ddraw,"(%p)->(0x%08lx,%p,%p,%p),stub!\n",This,x,ddsfd,context,ddsfcb);
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_Compact(
-          LPDIRECTDRAW2 this )
+static HRESULT WINAPI IDirectDraw2Impl_Compact(
+          LPDIRECTDRAW2 iface )
 {
-  FIXME(ddraw,"(%p)->()\n", this );
+  ICOM_THIS(IDirectDraw2Impl,iface);
+  FIXME(ddraw,"(%p)->()\n", This );
  
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_GetGDISurface(LPDIRECTDRAW2 this,
+static HRESULT WINAPI IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 iface,
 						 LPDIRECTDRAWSURFACE *lplpGDIDDSSurface) {
-  FIXME(ddraw,"(%p)->(%p)\n", this, lplpGDIDDSSurface);
+  ICOM_THIS(IDirectDraw2Impl,iface);
+  FIXME(ddraw,"(%p)->(%p)\n", This, lplpGDIDDSSurface);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_GetScanLine(LPDIRECTDRAW2 this,
+static HRESULT WINAPI IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 iface,
 					       LPDWORD lpdwScanLine) {
-  FIXME(ddraw,"(%p)->(%p)\n", this, lpdwScanLine);
+  ICOM_THIS(IDirectDraw2Impl,iface);
+  FIXME(ddraw,"(%p)->(%p)\n", This, lpdwScanLine);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw2_Initialize(LPDIRECTDRAW2 this,
+static HRESULT WINAPI IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface,
 					      GUID *lpGUID) {
-  FIXME(ddraw,"(%p)->(%p)\n", this, lpGUID);
+  ICOM_THIS(IDirectDraw2Impl,iface);
+  FIXME(ddraw,"(%p)->(%p)\n", This, lpGUID);
   
   return DD_OK;
 }
@@ -3784,56 +3914,56 @@
 # define XCAST(fun)	(void*)
 #endif
 
-static struct IDirectDraw_VTable dga_ddvt = {
-	XCAST(QueryInterface)DGA_IDirectDraw2_QueryInterface,
-	XCAST(AddRef)IDirectDraw2_AddRef,
-	XCAST(Release)DGA_IDirectDraw2_Release,
-	XCAST(Compact)IDirectDraw2_Compact,
-	XCAST(CreateClipper)IDirectDraw2_CreateClipper,
-	XCAST(CreatePalette)DGA_IDirectDraw2_CreatePalette,
-	XCAST(CreateSurface)DGA_IDirectDraw2_CreateSurface,
-	XCAST(DuplicateSurface)IDirectDraw2_DuplicateSurface,
-	XCAST(EnumDisplayModes)DGA_IDirectDraw2_EnumDisplayModes,
-	XCAST(EnumSurfaces)IDirectDraw2_EnumSurfaces,
-	XCAST(FlipToGDISurface)IDirectDraw2_FlipToGDISurface,
-	XCAST(GetCaps)DGA_IDirectDraw2_GetCaps,
-	XCAST(GetDisplayMode)DGA_IDirectDraw2_GetDisplayMode,
-	XCAST(GetFourCCCodes)IDirectDraw2_GetFourCCCodes,
-	XCAST(GetGDISurface)IDirectDraw2_GetGDISurface,
-	XCAST(GetMonitorFrequency)IDirectDraw2_GetMonitorFrequency,
-	XCAST(GetScanLine)IDirectDraw2_GetScanLine,
-	XCAST(GetVerticalBlankStatus)IDirectDraw2_GetVerticalBlankStatus,
-	XCAST(Initialize)IDirectDraw2_Initialize,
-	XCAST(RestoreDisplayMode)DGA_IDirectDraw2_RestoreDisplayMode,
-	XCAST(SetCooperativeLevel)IDirectDraw2_SetCooperativeLevel,
-	DGA_IDirectDraw_SetDisplayMode,
-	XCAST(WaitForVerticalBlank)IDirectDraw2_WaitForVerticalBlank,
+static ICOM_VTABLE(IDirectDraw) dga_ddvt = {
+	XCAST(QueryInterface)DGA_IDirectDraw2Impl_QueryInterface,
+	XCAST(AddRef)IDirectDraw2Impl_AddRef,
+	XCAST(Release)DGA_IDirectDraw2Impl_Release,
+	XCAST(Compact)IDirectDraw2Impl_Compact,
+	XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper,
+	XCAST(CreatePalette)DGA_IDirectDraw2Impl_CreatePalette,
+	XCAST(CreateSurface)DGA_IDirectDraw2Impl_CreateSurface,
+	XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface,
+	XCAST(EnumDisplayModes)DGA_IDirectDraw2Impl_EnumDisplayModes,
+	XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces,
+	XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface,
+	XCAST(GetCaps)DGA_IDirectDraw2Impl_GetCaps,
+	XCAST(GetDisplayMode)DGA_IDirectDraw2Impl_GetDisplayMode,
+	XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes,
+	XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface,
+	XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency,
+	XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine,
+	XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus,
+	XCAST(Initialize)IDirectDraw2Impl_Initialize,
+	XCAST(RestoreDisplayMode)DGA_IDirectDraw2Impl_RestoreDisplayMode,
+	XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel,
+	DGA_IDirectDrawImpl_SetDisplayMode,
+	XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank,
 };
 
-static struct IDirectDraw_VTable xlib_ddvt = {
-	XCAST(QueryInterface)Xlib_IDirectDraw2_QueryInterface,
-	XCAST(AddRef)IDirectDraw2_AddRef,
-	XCAST(Release)Xlib_IDirectDraw2_Release,
-	XCAST(Compact)IDirectDraw2_Compact,
-	XCAST(CreateClipper)IDirectDraw2_CreateClipper,
-	XCAST(CreatePalette)Xlib_IDirectDraw2_CreatePalette,
-	XCAST(CreateSurface)Xlib_IDirectDraw2_CreateSurface,
-	XCAST(DuplicateSurface)IDirectDraw2_DuplicateSurface,
-	XCAST(EnumDisplayModes)Xlib_IDirectDraw2_EnumDisplayModes,
-	XCAST(EnumSurfaces)IDirectDraw2_EnumSurfaces,
-	XCAST(FlipToGDISurface)IDirectDraw2_FlipToGDISurface,
-	XCAST(GetCaps)Xlib_IDirectDraw2_GetCaps,
-	XCAST(GetDisplayMode)Xlib_IDirectDraw2_GetDisplayMode,
-	XCAST(GetFourCCCodes)IDirectDraw2_GetFourCCCodes,
-	XCAST(GetGDISurface)IDirectDraw2_GetGDISurface,
-	XCAST(GetMonitorFrequency)IDirectDraw2_GetMonitorFrequency,
-	XCAST(GetScanLine)IDirectDraw2_GetScanLine,
-	XCAST(GetVerticalBlankStatus)IDirectDraw2_GetVerticalBlankStatus,
-	XCAST(Initialize)IDirectDraw2_Initialize,
-	XCAST(RestoreDisplayMode)Xlib_IDirectDraw2_RestoreDisplayMode,
-	XCAST(SetCooperativeLevel)IDirectDraw2_SetCooperativeLevel,
-	Xlib_IDirectDraw_SetDisplayMode,
-	XCAST(WaitForVerticalBlank)IDirectDraw2_WaitForVerticalBlank,
+static ICOM_VTABLE(IDirectDraw) xlib_ddvt = {
+	XCAST(QueryInterface)Xlib_IDirectDraw2Impl_QueryInterface,
+	XCAST(AddRef)IDirectDraw2Impl_AddRef,
+	XCAST(Release)Xlib_IDirectDraw2Impl_Release,
+	XCAST(Compact)IDirectDraw2Impl_Compact,
+	XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper,
+	XCAST(CreatePalette)Xlib_IDirectDraw2Impl_CreatePalette,
+	XCAST(CreateSurface)Xlib_IDirectDraw2Impl_CreateSurface,
+	XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface,
+	XCAST(EnumDisplayModes)Xlib_IDirectDraw2Impl_EnumDisplayModes,
+	XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces,
+	XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface,
+	XCAST(GetCaps)Xlib_IDirectDraw2Impl_GetCaps,
+	XCAST(GetDisplayMode)Xlib_IDirectDraw2Impl_GetDisplayMode,
+	XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes,
+	XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface,
+	XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency,
+	XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine,
+	XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus,
+	XCAST(Initialize)IDirectDraw2Impl_Initialize,
+	XCAST(RestoreDisplayMode)Xlib_IDirectDraw2Impl_RestoreDisplayMode,
+	XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel,
+	Xlib_IDirectDrawImpl_SetDisplayMode,
+	XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank,
 };
 
 #undef XCAST
@@ -3844,92 +3974,94 @@
  */
 
 
-static HRESULT WINAPI DGA_IDirectDraw2_SetDisplayMode(
-	LPDIRECTDRAW2 this,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy
+static HRESULT WINAPI DGA_IDirectDraw2Impl_SetDisplayMode(
+	LPDIRECTDRAW2 iface,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy
 ) {
-	return DGA_IDirectDraw_SetDisplayMode((LPDIRECTDRAW)this,width,height,depth);
+	return DGA_IDirectDrawImpl_SetDisplayMode((LPDIRECTDRAW)iface,width,height,depth);
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2_SetDisplayMode(
-	LPDIRECTDRAW2 this,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy
+static HRESULT WINAPI Xlib_IDirectDraw2Impl_SetDisplayMode(
+	LPDIRECTDRAW2 iface,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy
 ) {
-	return Xlib_IDirectDraw_SetDisplayMode((LPDIRECTDRAW)this,width,height,depth);
+	return Xlib_IDirectDrawImpl_SetDisplayMode((LPDIRECTDRAW)iface,width,height,depth);
 }
 
-static HRESULT WINAPI DGA_IDirectDraw2_GetAvailableVidMem(
-	LPDIRECTDRAW2 this,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free
+static HRESULT WINAPI DGA_IDirectDraw2Impl_GetAvailableVidMem(
+	LPDIRECTDRAW2 iface,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
 	TRACE(ddraw,"(%p)->(%p,%p,%p)\n",
-		this,ddscaps,total,free
+		This,ddscaps,total,free
 	);
-	if (total) *total = this->e.dga.fb_memsize * 1024;
-	if (free) *free = this->e.dga.fb_memsize * 1024;
+	if (total) *total = This->e.dga.fb_memsize * 1024;
+	if (free) *free = This->e.dga.fb_memsize * 1024;
 	return DD_OK;
 }
 
-static HRESULT WINAPI Xlib_IDirectDraw2_GetAvailableVidMem(
-	LPDIRECTDRAW2 this,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free
+static HRESULT WINAPI Xlib_IDirectDraw2Impl_GetAvailableVidMem(
+	LPDIRECTDRAW2 iface,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free
 ) {
+        ICOM_THIS(IDirectDraw2Impl,iface);
 	TRACE(ddraw,"(%p)->(%p,%p,%p)\n",
-		this,ddscaps,total,free
+		This,ddscaps,total,free
 	);
 	if (total) *total = 2048 * 1024;
 	if (free) *free = 2048 * 1024;
 	return DD_OK;
 }
 
-static IDirectDraw2_VTable dga_dd2vt = {
-	DGA_IDirectDraw2_QueryInterface,
-	IDirectDraw2_AddRef,
-	DGA_IDirectDraw2_Release,
-	IDirectDraw2_Compact,
-	IDirectDraw2_CreateClipper,
-	DGA_IDirectDraw2_CreatePalette,
-	DGA_IDirectDraw2_CreateSurface,
-	IDirectDraw2_DuplicateSurface,
-	DGA_IDirectDraw2_EnumDisplayModes,
-	IDirectDraw2_EnumSurfaces,
-	IDirectDraw2_FlipToGDISurface,
-	DGA_IDirectDraw2_GetCaps,
-	DGA_IDirectDraw2_GetDisplayMode,
-	IDirectDraw2_GetFourCCCodes,
-	IDirectDraw2_GetGDISurface,
-	IDirectDraw2_GetMonitorFrequency,
-	IDirectDraw2_GetScanLine,
-	IDirectDraw2_GetVerticalBlankStatus,
-	IDirectDraw2_Initialize,
-	DGA_IDirectDraw2_RestoreDisplayMode,
-	IDirectDraw2_SetCooperativeLevel,
-	DGA_IDirectDraw2_SetDisplayMode,
-	IDirectDraw2_WaitForVerticalBlank,
-	DGA_IDirectDraw2_GetAvailableVidMem
+static ICOM_VTABLE(IDirectDraw2) dga_dd2vt = {
+	DGA_IDirectDraw2Impl_QueryInterface,
+	IDirectDraw2Impl_AddRef,
+	DGA_IDirectDraw2Impl_Release,
+	IDirectDraw2Impl_Compact,
+	IDirectDraw2Impl_CreateClipper,
+	DGA_IDirectDraw2Impl_CreatePalette,
+	DGA_IDirectDraw2Impl_CreateSurface,
+	IDirectDraw2Impl_DuplicateSurface,
+	DGA_IDirectDraw2Impl_EnumDisplayModes,
+	IDirectDraw2Impl_EnumSurfaces,
+	IDirectDraw2Impl_FlipToGDISurface,
+	DGA_IDirectDraw2Impl_GetCaps,
+	DGA_IDirectDraw2Impl_GetDisplayMode,
+	IDirectDraw2Impl_GetFourCCCodes,
+	IDirectDraw2Impl_GetGDISurface,
+	IDirectDraw2Impl_GetMonitorFrequency,
+	IDirectDraw2Impl_GetScanLine,
+	IDirectDraw2Impl_GetVerticalBlankStatus,
+	IDirectDraw2Impl_Initialize,
+	DGA_IDirectDraw2Impl_RestoreDisplayMode,
+	IDirectDraw2Impl_SetCooperativeLevel,
+	DGA_IDirectDraw2Impl_SetDisplayMode,
+	IDirectDraw2Impl_WaitForVerticalBlank,
+	DGA_IDirectDraw2Impl_GetAvailableVidMem
 };
 
-static struct IDirectDraw2_VTable xlib_dd2vt = {
-	Xlib_IDirectDraw2_QueryInterface,
-	IDirectDraw2_AddRef,
-	Xlib_IDirectDraw2_Release,
-	IDirectDraw2_Compact,
-	IDirectDraw2_CreateClipper,
-	Xlib_IDirectDraw2_CreatePalette,
-	Xlib_IDirectDraw2_CreateSurface,
-	IDirectDraw2_DuplicateSurface,
-	Xlib_IDirectDraw2_EnumDisplayModes,
-	IDirectDraw2_EnumSurfaces,
-	IDirectDraw2_FlipToGDISurface,
-	Xlib_IDirectDraw2_GetCaps,
-	Xlib_IDirectDraw2_GetDisplayMode,
-	IDirectDraw2_GetFourCCCodes,
-	IDirectDraw2_GetGDISurface,
-	IDirectDraw2_GetMonitorFrequency,
-	IDirectDraw2_GetScanLine,
-	IDirectDraw2_GetVerticalBlankStatus,
-	IDirectDraw2_Initialize,
-	Xlib_IDirectDraw2_RestoreDisplayMode,
-	IDirectDraw2_SetCooperativeLevel,
-	Xlib_IDirectDraw2_SetDisplayMode,
-	IDirectDraw2_WaitForVerticalBlank,
-	Xlib_IDirectDraw2_GetAvailableVidMem	
+static ICOM_VTABLE(IDirectDraw2) xlib_dd2vt = {
+	Xlib_IDirectDraw2Impl_QueryInterface,
+	IDirectDraw2Impl_AddRef,
+	Xlib_IDirectDraw2Impl_Release,
+	IDirectDraw2Impl_Compact,
+	IDirectDraw2Impl_CreateClipper,
+	Xlib_IDirectDraw2Impl_CreatePalette,
+	Xlib_IDirectDraw2Impl_CreateSurface,
+	IDirectDraw2Impl_DuplicateSurface,
+	Xlib_IDirectDraw2Impl_EnumDisplayModes,
+	IDirectDraw2Impl_EnumSurfaces,
+	IDirectDraw2Impl_FlipToGDISurface,
+	Xlib_IDirectDraw2Impl_GetCaps,
+	Xlib_IDirectDraw2Impl_GetDisplayMode,
+	IDirectDraw2Impl_GetFourCCCodes,
+	IDirectDraw2Impl_GetGDISurface,
+	IDirectDraw2Impl_GetMonitorFrequency,
+	IDirectDraw2Impl_GetScanLine,
+	IDirectDraw2Impl_GetVerticalBlankStatus,
+	IDirectDraw2Impl_Initialize,
+	Xlib_IDirectDraw2Impl_RestoreDisplayMode,
+	IDirectDraw2Impl_SetCooperativeLevel,
+	Xlib_IDirectDraw2Impl_SetDisplayMode,
+	IDirectDraw2Impl_WaitForVerticalBlank,
+	Xlib_IDirectDraw2Impl_GetAvailableVidMem	
 };
 
 /*****************************************************************************
@@ -3937,30 +4069,34 @@
  *
  */
 
-static HRESULT WINAPI IDirectDraw4_GetSurfaceFromDC(LPDIRECTDRAW4 this,
+static HRESULT WINAPI IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 iface,
 						    HDC hdc,
 						    LPDIRECTDRAWSURFACE *lpDDS) {
-  FIXME(ddraw, "(%p)->(%08ld,%p)\n", this, (DWORD) hdc, lpDDS);
+  ICOM_THIS(IDirectDraw4Impl,iface);
+  FIXME(ddraw, "(%p)->(%08ld,%p)\n", This, (DWORD) hdc, lpDDS);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw4_RestoreAllSurfaces(LPDIRECTDRAW4 this) {
-  FIXME(ddraw, "(%p)->()\n", this);
+static HRESULT WINAPI IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 iface) {
+  ICOM_THIS(IDirectDraw4Impl,iface);
+  FIXME(ddraw, "(%p)->()\n", This);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw4_TestCooperativeLevel(LPDIRECTDRAW4 this) {
-  FIXME(ddraw, "(%p)->()\n", this);
+static HRESULT WINAPI IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 iface) {
+  ICOM_THIS(IDirectDraw4Impl,iface);
+  FIXME(ddraw, "(%p)->()\n", This);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw4_GetDeviceIdentifier(LPDIRECTDRAW4 this,
+static HRESULT WINAPI IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 iface,
 						       LPDDDEVICEIDENTIFIER lpdddi,
 						       DWORD dwFlags) {
-  FIXME(ddraw, "(%p)->(%p,%08lx)\n", this, lpdddi, dwFlags);
+  ICOM_THIS(IDirectDraw4Impl,iface);
+  FIXME(ddraw, "(%p)->(%p,%08lx)\n", This, lpdddi, dwFlags);
   
   return DD_OK;
 }
@@ -3972,66 +4108,66 @@
 #endif
 
 
-static struct IDirectDraw4_VTable dga_dd4vt = {
-	XCAST(QueryInterface)DGA_IDirectDraw2_QueryInterface,
-	XCAST(AddRef)IDirectDraw2_AddRef,
-	XCAST(Release)DGA_IDirectDraw2_Release,
-	XCAST(Compact)IDirectDraw2_Compact,
-	XCAST(CreateClipper)IDirectDraw2_CreateClipper,
-	XCAST(CreatePalette)DGA_IDirectDraw2_CreatePalette,
-	XCAST(CreateSurface)DGA_IDirectDraw2_CreateSurface,
-	XCAST(DuplicateSurface)IDirectDraw2_DuplicateSurface,
-	XCAST(EnumDisplayModes)DGA_IDirectDraw2_EnumDisplayModes,
-	XCAST(EnumSurfaces)IDirectDraw2_EnumSurfaces,
-	XCAST(FlipToGDISurface)IDirectDraw2_FlipToGDISurface,
-	XCAST(GetCaps)DGA_IDirectDraw2_GetCaps,
-	XCAST(GetDisplayMode)DGA_IDirectDraw2_GetDisplayMode,
-	XCAST(GetFourCCCodes)IDirectDraw2_GetFourCCCodes,
-	XCAST(GetGDISurface)IDirectDraw2_GetGDISurface,
-	XCAST(GetMonitorFrequency)IDirectDraw2_GetMonitorFrequency,
-	XCAST(GetScanLine)IDirectDraw2_GetScanLine,
-	XCAST(GetVerticalBlankStatus)IDirectDraw2_GetVerticalBlankStatus,
-	XCAST(Initialize)IDirectDraw2_Initialize,
-	XCAST(RestoreDisplayMode)DGA_IDirectDraw2_RestoreDisplayMode,
-	XCAST(SetCooperativeLevel)IDirectDraw2_SetCooperativeLevel,
-	XCAST(SetDisplayMode)DGA_IDirectDraw_SetDisplayMode,
-	XCAST(WaitForVerticalBlank)IDirectDraw2_WaitForVerticalBlank,
-	XCAST(GetAvailableVidMem)DGA_IDirectDraw2_GetAvailableVidMem,
-	IDirectDraw4_GetSurfaceFromDC,
-	IDirectDraw4_RestoreAllSurfaces,
-	IDirectDraw4_TestCooperativeLevel,
-	IDirectDraw4_GetDeviceIdentifier
+static ICOM_VTABLE(IDirectDraw4) dga_dd4vt = {
+	XCAST(QueryInterface)DGA_IDirectDraw2Impl_QueryInterface,
+	XCAST(AddRef)IDirectDraw2Impl_AddRef,
+	XCAST(Release)DGA_IDirectDraw2Impl_Release,
+	XCAST(Compact)IDirectDraw2Impl_Compact,
+	XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper,
+	XCAST(CreatePalette)DGA_IDirectDraw2Impl_CreatePalette,
+	XCAST(CreateSurface)DGA_IDirectDraw2Impl_CreateSurface,
+	XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface,
+	XCAST(EnumDisplayModes)DGA_IDirectDraw2Impl_EnumDisplayModes,
+	XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces,
+	XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface,
+	XCAST(GetCaps)DGA_IDirectDraw2Impl_GetCaps,
+	XCAST(GetDisplayMode)DGA_IDirectDraw2Impl_GetDisplayMode,
+	XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes,
+	XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface,
+	XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency,
+	XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine,
+	XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus,
+	XCAST(Initialize)IDirectDraw2Impl_Initialize,
+	XCAST(RestoreDisplayMode)DGA_IDirectDraw2Impl_RestoreDisplayMode,
+	XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel,
+	XCAST(SetDisplayMode)DGA_IDirectDrawImpl_SetDisplayMode,
+	XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank,
+	XCAST(GetAvailableVidMem)DGA_IDirectDraw2Impl_GetAvailableVidMem,
+	IDirectDraw4Impl_GetSurfaceFromDC,
+	IDirectDraw4Impl_RestoreAllSurfaces,
+	IDirectDraw4Impl_TestCooperativeLevel,
+	IDirectDraw4Impl_GetDeviceIdentifier
 };
 
-static struct IDirectDraw4_VTable xlib_dd4vt = {
-	XCAST(QueryInterface)Xlib_IDirectDraw2_QueryInterface,
-	XCAST(AddRef)IDirectDraw2_AddRef,
-	XCAST(Release)Xlib_IDirectDraw2_Release,
-	XCAST(Compact)IDirectDraw2_Compact,
-	XCAST(CreateClipper)IDirectDraw2_CreateClipper,
-	XCAST(CreatePalette)Xlib_IDirectDraw2_CreatePalette,
-	XCAST(CreateSurface)Xlib_IDirectDraw2_CreateSurface,
-	XCAST(DuplicateSurface)IDirectDraw2_DuplicateSurface,
-	XCAST(EnumDisplayModes)Xlib_IDirectDraw2_EnumDisplayModes,
-	XCAST(EnumSurfaces)IDirectDraw2_EnumSurfaces,
-	XCAST(FlipToGDISurface)IDirectDraw2_FlipToGDISurface,
-	XCAST(GetCaps)Xlib_IDirectDraw2_GetCaps,
-	XCAST(GetDisplayMode)Xlib_IDirectDraw2_GetDisplayMode,
-	XCAST(GetFourCCCodes)IDirectDraw2_GetFourCCCodes,
-	XCAST(GetGDISurface)IDirectDraw2_GetGDISurface,
-	XCAST(GetMonitorFrequency)IDirectDraw2_GetMonitorFrequency,
-	XCAST(GetScanLine)IDirectDraw2_GetScanLine,
-	XCAST(GetVerticalBlankStatus)IDirectDraw2_GetVerticalBlankStatus,
-	XCAST(Initialize)IDirectDraw2_Initialize,
-	XCAST(RestoreDisplayMode)Xlib_IDirectDraw2_RestoreDisplayMode,
-	XCAST(SetCooperativeLevel)IDirectDraw2_SetCooperativeLevel,
-	XCAST(SetDisplayMode)Xlib_IDirectDraw_SetDisplayMode,
-	XCAST(WaitForVerticalBlank)IDirectDraw2_WaitForVerticalBlank,
-	XCAST(GetAvailableVidMem)Xlib_IDirectDraw2_GetAvailableVidMem,
-	IDirectDraw4_GetSurfaceFromDC,
-	IDirectDraw4_RestoreAllSurfaces,
-	IDirectDraw4_TestCooperativeLevel,
-	IDirectDraw4_GetDeviceIdentifier
+static ICOM_VTABLE(IDirectDraw4) xlib_dd4vt = {
+	XCAST(QueryInterface)Xlib_IDirectDraw2Impl_QueryInterface,
+	XCAST(AddRef)IDirectDraw2Impl_AddRef,
+	XCAST(Release)Xlib_IDirectDraw2Impl_Release,
+	XCAST(Compact)IDirectDraw2Impl_Compact,
+	XCAST(CreateClipper)IDirectDraw2Impl_CreateClipper,
+	XCAST(CreatePalette)Xlib_IDirectDraw2Impl_CreatePalette,
+	XCAST(CreateSurface)Xlib_IDirectDraw2Impl_CreateSurface,
+	XCAST(DuplicateSurface)IDirectDraw2Impl_DuplicateSurface,
+	XCAST(EnumDisplayModes)Xlib_IDirectDraw2Impl_EnumDisplayModes,
+	XCAST(EnumSurfaces)IDirectDraw2Impl_EnumSurfaces,
+	XCAST(FlipToGDISurface)IDirectDraw2Impl_FlipToGDISurface,
+	XCAST(GetCaps)Xlib_IDirectDraw2Impl_GetCaps,
+	XCAST(GetDisplayMode)Xlib_IDirectDraw2Impl_GetDisplayMode,
+	XCAST(GetFourCCCodes)IDirectDraw2Impl_GetFourCCCodes,
+	XCAST(GetGDISurface)IDirectDraw2Impl_GetGDISurface,
+	XCAST(GetMonitorFrequency)IDirectDraw2Impl_GetMonitorFrequency,
+	XCAST(GetScanLine)IDirectDraw2Impl_GetScanLine,
+	XCAST(GetVerticalBlankStatus)IDirectDraw2Impl_GetVerticalBlankStatus,
+	XCAST(Initialize)IDirectDraw2Impl_Initialize,
+	XCAST(RestoreDisplayMode)Xlib_IDirectDraw2Impl_RestoreDisplayMode,
+	XCAST(SetCooperativeLevel)IDirectDraw2Impl_SetCooperativeLevel,
+	XCAST(SetDisplayMode)Xlib_IDirectDrawImpl_SetDisplayMode,
+	XCAST(WaitForVerticalBlank)IDirectDraw2Impl_WaitForVerticalBlank,
+	XCAST(GetAvailableVidMem)Xlib_IDirectDraw2Impl_GetAvailableVidMem,
+	IDirectDraw4Impl_GetSurfaceFromDC,
+	IDirectDraw4Impl_RestoreAllSurfaces,
+	IDirectDraw4Impl_TestCooperativeLevel,
+	IDirectDraw4Impl_GetDeviceIdentifier
 };
 
 #undef XCAST
@@ -4043,13 +4179,13 @@
 LRESULT WINAPI Xlib_DDWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
 {
    LRESULT ret;
-   LPDIRECTDRAW ddraw = NULL;
+   IDirectDrawImpl* ddraw = NULL;
    DWORD lastError;
 
    /* FIXME(ddraw,"(0x%04x,%s,0x%08lx,0x%08lx),stub!\n",(int)hwnd,SPY_GetMsgName(msg),(long)wParam,(long)lParam); */
 
    SetLastError( ERROR_SUCCESS );
-   ddraw  = (LPDIRECTDRAW)GetWindowLongA( hwnd, ddrawXlibThisOffset );
+   ddraw  = (IDirectDrawImpl*)GetWindowLongA( hwnd, ddrawXlibThisOffset );
    if( (!ddraw)  &&
        ( ( lastError = GetLastError() ) != ERROR_SUCCESS )
      ) 
@@ -4105,6 +4241,7 @@
 
 HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) {
 #ifdef HAVE_LIBXXF86DGA
+        IDirectDrawImpl** ilplpDD=(IDirectDrawImpl**)lplpDD;
 	int	memsize,banksize,width,major,minor,flags,height;
 	char	*addr;
 	int     fd;             	
@@ -4123,9 +4260,9 @@
 	        TRACE(ddraw,"No XF86DGA detected.\n");
 	        return DDERR_GENERIC;
 	}
-	*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
-	(*lplpDD)->lpvtbl = &dga_ddvt;
-	(*lplpDD)->ref = 1;
+	*ilplpDD = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawImpl));
+	(*ilplpDD)->lpvtbl = &dga_ddvt;
+	(*ilplpDD)->ref = 1;
 	TSXF86DGAQueryVersion(display,&major,&minor);
 	TRACE(ddraw,"XF86DGA is version %d.%d\n",major,minor);
 	TSXF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags);
@@ -4135,24 +4272,24 @@
 	TRACE(ddraw,"video framebuffer: begin %p, width %d,banksize %d,memsize %d\n",
 		addr,width,banksize,memsize
 	);
-	(*lplpDD)->e.dga.fb_width = width;
-	(*lplpDD)->d.width = width;
-	(*lplpDD)->e.dga.fb_addr = addr;
-	(*lplpDD)->e.dga.fb_memsize = memsize;
-	(*lplpDD)->e.dga.fb_banksize = banksize;
+	(*ilplpDD)->e.dga.fb_width = width;
+	(*ilplpDD)->d.width = width;
+	(*ilplpDD)->e.dga.fb_addr = addr;
+	(*ilplpDD)->e.dga.fb_memsize = memsize;
+	(*ilplpDD)->e.dga.fb_banksize = banksize;
 
 	TSXF86DGAGetViewPortSize(display,DefaultScreen(display),&width,&height);
 	TSXF86DGASetViewPort(display,DefaultScreen(display),0,0);
-	(*lplpDD)->e.dga.fb_height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
+	(*ilplpDD)->e.dga.fb_height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
 #ifdef DIABLO_HACK
-	(*lplpDD)->e.dga.vpmask = 1;
+	(*ilplpDD)->e.dga.vpmask = 1;
 #else
-	(*lplpDD)->e.dga.vpmask = 0;
+	(*ilplpDD)->e.dga.vpmask = 0;
 #endif
 
 	/* just assume the default depth is the DGA depth too */
 	depth = DefaultDepthOfScreen(X11DRV_GetXScreen());
-	_common_depth_to_pixelformat(depth, &((*lplpDD)->d.directdraw_pixelformat), &((*lplpDD)->d.screen_pixelformat), NULL);
+	_common_depth_to_pixelformat(depth, &((*ilplpDD)->d.directdraw_pixelformat), &((*ilplpDD)->d.screen_pixelformat), NULL);
 #ifdef RESTORE_SIGNALS
 	SIGNAL_InitHandlers();
 #endif
@@ -4185,22 +4322,23 @@
 }
 
 HRESULT WINAPI Xlib_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) {
+        IDirectDrawImpl** ilplpDD=(IDirectDrawImpl**)lplpDD;
 	int depth;
 
-	*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
-	(*lplpDD)->lpvtbl = &xlib_ddvt;
-	(*lplpDD)->ref = 1;
-	(*lplpDD)->d.drawable = 0; /* in SetDisplayMode */
+	*ilplpDD = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawImpl));
+	(*ilplpDD)->lpvtbl = &xlib_ddvt;
+	(*ilplpDD)->ref = 1;
+	(*ilplpDD)->d.drawable = 0; /* in SetDisplayMode */
 
 	/* At DirectDraw creation, the depth is the default depth */
 	depth = DefaultDepthOfScreen(X11DRV_GetXScreen());
-	_common_depth_to_pixelformat(depth, &((*lplpDD)->d.directdraw_pixelformat), &((*lplpDD)->d.screen_pixelformat), NULL);
-	(*lplpDD)->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
-	(*lplpDD)->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
+	_common_depth_to_pixelformat(depth, &((*ilplpDD)->d.directdraw_pixelformat), &((*ilplpDD)->d.screen_pixelformat), NULL);
+	(*ilplpDD)->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
+	(*ilplpDD)->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
 
 #ifdef HAVE_LIBXXSHM
 	/* Test if XShm is available. */
-	if (((*lplpDD)->e.xlib.xshm_active = DDRAW_XSHM_Available()))
+	if (((*ilplpDD)->e.xlib.xshm_active = DDRAW_XSHM_Available()))
 	  TRACE(ddraw, "Using XShm extension.\n");
 #endif
 	
@@ -4208,6 +4346,7 @@
 }
 
 HRESULT WINAPI DirectDrawCreate( LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter ) {
+        IDirectDrawImpl** ilplpDD=(IDirectDrawImpl**)lplpDD;
 	char	xclsid[50];
 	WNDCLASSA	wc;
         /* WND*            pParentWindow; */
@@ -4220,7 +4359,7 @@
 		lpGUID = NULL;
 	}
 
-	TRACE(ddraw,"(%s,%p,%p)\n",xclsid,lplpDD,pUnkOuter);
+	TRACE(ddraw,"(%s,%p,%p)\n",xclsid,ilplpDD,pUnkOuter);
 
 	if (!lpGUID) {
 		/* if they didn't request a particular interface, use the best
@@ -4261,7 +4400,7 @@
 	  goto err;
 
 
-	(*lplpDD)->d.winclass = RegisterClassA(&wc);
+	(*ilplpDD)->d.winclass = RegisterClassA(&wc);
 	return ret;
 
       err: