diff --git a/dlls/ddraw/d3ddevice/mesa.c b/dlls/ddraw/d3ddevice/mesa.c
index 0395cd35f3d0f4a5ebf2f1ff8cc3b1e354b82e23..13a01ec96b5df1e413200b7c22c1152ab89f5cbf 100644
--- a/dlls/ddraw/d3ddevice/mesa.c
+++ b/dlls/ddraw/d3ddevice/mesa.c
@@ -132,20 +132,17 @@ static BOOL opengl_flip( LPVOID display, LPVOID drawable)
 /*******************************************************************************
  *				OpenGL static functions
  */
-static void set_context(IDirect3DDeviceImpl* This) {
-#if 0
-    D3DDPRIVATE(This);
-
+static void set_context(IDirect3DDeviceImpl* This)
+{
+    IDirect3DDeviceGLImpl* glThis = (IDirect3DDeviceGLImpl*) This;
+   
     ENTER_GL();
-    TRACE("glxMakeCurrent %p, %ld, %p\n",odev->gdi_display,odev->drawable, odev->ctx);
-    if (glXMakeCurrent(odev->gdi_display,odev->drawable, odev->ctx) == False) {
+    TRACE("glxMakeCurrent %p, %ld, %p\n",glThis->display,glThis->drawable, glThis->gl_context);
+    if (glXMakeCurrent(glThis->display, glThis->drawable, glThis->gl_context) == False) {
 	ERR("Error in setting current context (context %p drawable %ld)!\n",
-	    odev->ctx, odev->drawable);
+	    glThis->gl_context, glThis->drawable);
     }
     LEAVE_GL();
-#else
-    ERR("This function should not be called in the current state of the code...\n");
-#endif
 }
 
 static void fill_opengl_primcaps(D3DPRIMCAPS *pc)
@@ -1083,7 +1080,7 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfa
     glColor3f(1.0, 1.0, 1.0);
     LEAVE_GL();
 
-    fill_device_capabilities(d3d->ddraw);    
+    /* fill_device_capabilities(d3d->ddraw); */    
     
     ICOM_INIT_INTERFACE(object, IDirect3DDevice,  VTABLE_IDirect3DDevice);
     ICOM_INIT_INTERFACE(object, IDirect3DDevice2, VTABLE_IDirect3DDevice2);
diff --git a/dlls/ddraw/d3dexecutebuffer.c b/dlls/ddraw/d3dexecutebuffer.c
index 8fc17154562c2e13ff1f7252f8b37deaed7d4dac..70ab5f0537290cc6a24c1a016569c35cf16ac76d 100644
--- a/dlls/ddraw/d3dexecutebuffer.c
+++ b/dlls/ddraw/d3dexecutebuffer.c
@@ -183,28 +183,26 @@ static void _dump_D3DEXECUTEBUFFERDESC(LPD3DEXECUTEBUFFERDESC lpDesc) {
 
 static void execute(IDirect3DExecuteBufferImpl *This,
 		    IDirect3DDeviceImpl *lpDevice,
-		    IDirect3DViewportImpl *lpViewport) {
-#if 0
-    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; */
+		    IDirect3DViewportImpl *lpViewport)
+{
+    IDirect3DDeviceGLImpl* lpDeviceGL = (IDirect3DDeviceGLImpl*) lpDevice;
+    /* DWORD bs = This->desc.dwBufferSize; */
+    DWORD vs = This->data.dwVertexOffset;
+    /* DWORD vc = This->data.dwVertexCount; */
+    DWORD is = This->data.dwInstructionOffset;
+    /* DWORD il = This->data.dwInstructionLength; */
     
-    void *instr = ilpBuff->desc.lpData + is;
-    D3DDPRIVATE((IDirect3DDeviceImpl*)dev);
+    void *instr = This->desc.lpData + is;
 
     /* Should check if the viewport was added or not to the device */
 
     /* Activate the viewport */
-    ivp->device.active_device1 = (IDirect3DDeviceImpl*)dev;
-    ivp->activate(ivp);
+    lpViewport->active_device = lpDevice;
+    lpViewport->activate(lpViewport);
 
     TRACE("ExecuteData : \n");
     if (TRACE_ON(ddraw))
-      _dump_executedata(&(ilpBuff->data));
+      _dump_executedata(&(This->data));
 
     ENTER_GL();
 
@@ -230,12 +228,12 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 
 	    case D3DOP_TRIANGLE: {
 	        int i;
-		OGL_Vertex  *vx    = (OGL_Vertex  *) ilpBuff->vertex_data;
-		OGL_LVertex *l_vx  = (OGL_LVertex *) ilpBuff->vertex_data;
-		D3DTLVERTEX *tl_vx = (D3DTLVERTEX *) ilpBuff->vertex_data;
+		OGL_Vertex  *vx    = (OGL_Vertex  *) This->vertex_data;
+		OGL_LVertex *l_vx  = (OGL_LVertex *) This->vertex_data;
+		D3DTLVERTEX *tl_vx = (D3DTLVERTEX *) This->vertex_data;
 		TRACE("TRIANGLE         (%d)\n", count);
 		
-		switch (ilpBuff->vertex_type) {
+		switch (This->vertex_type) {
 		    case D3DVT_VERTEX:
 		        /* This time, there is lighting */
 		        glEnable(GL_LIGHTING);
@@ -245,16 +243,16 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 			glLoadIdentity(); /* The model transformation was done during the
 					     transformation phase */
 			glMatrixMode(GL_PROJECTION);
-			TRACE("  Projection Matrix : (%p)\n", odev->proj_mat);
-			dump_mat(odev->proj_mat);
-			TRACE("  View       Matrix : (%p)\n", odev->view_mat);
-			dump_mat(odev->view_mat);
+			TRACE("  Projection Matrix : (%p)\n", lpDeviceGL->proj_mat);
+			dump_mat(lpDeviceGL->proj_mat);
+			TRACE("  View       Matrix : (%p)\n", lpDeviceGL->view_mat);
+			dump_mat(lpDeviceGL->view_mat);
 
 			/* Although z axis is inverted between OpenGL and Direct3D, the z projected coordinates
 			   are always 0.0 at the front viewing volume and 1.0 at the back with Direct 3D and with
 			   the default behaviour of OpenGL. So, no additional transformation is required. */
-			glLoadMatrixf((float *) odev->proj_mat);
-			glMultMatrixf((float *) odev->view_mat);
+			glLoadMatrixf((float *) lpDeviceGL->proj_mat);
+			glMultMatrixf((float *) lpDeviceGL->view_mat);
 			break;
 
 		    case D3DVT_LVERTEX:
@@ -267,16 +265,16 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 					     transformation phase */
 			glMatrixMode(GL_PROJECTION);
 			
-			TRACE("  Projection Matrix : (%p)\n", odev->proj_mat);
-			dump_mat(odev->proj_mat);
-			TRACE("  View       Matrix : (%p)\n", odev->view_mat);
-			dump_mat(odev->view_mat);
+			TRACE("  Projection Matrix : (%p)\n", lpDeviceGL->proj_mat);
+			dump_mat(lpDeviceGL->proj_mat);
+			TRACE("  View       Matrix : (%p)\n", lpDeviceGL->view_mat);
+			dump_mat(lpDeviceGL->view_mat);
 			
 			/* Although z axis is inverted between OpenGL and Direct3D, the z projected coordinates
 			   are always 0 at the front viewing volume and 1 at the back with Direct 3D and with
 			   the default behaviour of OpenGL. So, no additional transformation is required. */
-			glLoadMatrixf((float *) odev->proj_mat);
-			glMultMatrixf((float *) odev->view_mat);
+			glLoadMatrixf((float *) lpDeviceGL->proj_mat);
+			glMultMatrixf((float *) lpDeviceGL->view_mat);
 			break;
 
 		    case D3DVT_TLVERTEX: {
@@ -291,7 +289,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 			glMatrixMode(GL_PROJECTION);
 			glLoadIdentity();
 			
-			if (ivp == NULL) {
+			if (lpViewport == NULL) {
 			    ERR("No current viewport !\n");
 			    /* Using standard values */
 			    height = 640.0;
@@ -299,10 +297,10 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 			    minZ = -10.0;
 			    maxZ = 10.0;
 			} else {
-			    height = (GLdouble) ivp->viewport.vp1.dwHeight;
-			    width  = (GLdouble) ivp->viewport.vp1.dwWidth;
-			    minZ   = (GLdouble) ivp->viewport.vp1.dvMinZ;
-			    maxZ   = (GLdouble) ivp->viewport.vp1.dvMaxZ;
+			    height = (GLdouble) lpViewport->viewports.vp1.dwHeight;
+			    width  = (GLdouble) lpViewport->viewports.vp1.dwWidth;
+			    minZ   = (GLdouble) lpViewport->viewports.vp1.dvMinZ;
+			    maxZ   = (GLdouble) lpViewport->viewports.vp1.dvMaxZ;
 			    
 			    if (minZ == maxZ) {
 			        /* I do not know why, but many Dx 3.0 games have minZ = maxZ = 0.0 */
@@ -318,7 +316,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 			break;
 		}
 
-		switch (ilpBuff->vertex_type) {
+		switch (This->vertex_type) {
 		    case D3DVT_VERTEX:
 		        TRIANGLE_LOOP(DO_VERTEX);
 			break;
@@ -381,17 +379,17 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 		    switch (ci->u1.dtstTransformStateType) {
 		        case D3DTRANSFORMSTATE_WORLD: {
 			    TRACE("  WORLD (%p)\n", (D3DMATRIX*) ci->u2.dwArg[0]);
-			    odev->world_mat = (D3DMATRIX*) ci->u2.dwArg[0];
+			    lpDeviceGL->world_mat = (D3DMATRIX*) ci->u2.dwArg[0];
 			} break;
 
 			case D3DTRANSFORMSTATE_VIEW: {
 			    TRACE("  VIEW (%p)\n", (D3DMATRIX*) ci->u2.dwArg[0]);
-			    odev->view_mat = (D3DMATRIX*) ci->u2.dwArg[0];
+			    lpDeviceGL->view_mat = (D3DMATRIX*) ci->u2.dwArg[0];
 			} break;
 
 			case D3DTRANSFORMSTATE_PROJECTION: {
 			    TRACE("  PROJECTION (%p)\n", (D3DMATRIX*) ci->u2.dwArg[0]);
-			    odev->proj_mat = (D3DMATRIX*) ci->u2.dwArg[0];
+			    lpDeviceGL->proj_mat = (D3DMATRIX*) ci->u2.dwArg[0];
 			} break;
 			  
 			default:
@@ -413,7 +411,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 		    /* Handle the state transform */
 		    switch (ci->u1.dlstLightStateType) {
 		        case D3DLIGHTSTATE_MATERIAL: {
-			    IDirect3DMaterial2Impl* mat = (IDirect3DMaterial2Impl*) ci->u2.dwArg[0];
+			    IDirect3DMaterialImpl* mat = (IDirect3DMaterialImpl*) ci->u2.dwArg[0];
 			    TRACE("  MATERIAL\n");
 			    
 			    if (mat != NULL) {
@@ -477,7 +475,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 		    LPD3DSTATE ci = (LPD3DSTATE) instr;
 		    
 		    /* Handle the state transform */
-		    set_render_state(ci->u1.drstRenderStateType, ci->u2.dwArg[0], &(odev->rs));
+		    set_render_state(ci->u1.drstRenderStateType, ci->u2.dwArg[0], &(lpDeviceGL->render_state));
 
 		    instr += size;
 		}
@@ -538,14 +536,14 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 		    /* Enough for the moment */
 		    if (ci->dwFlags == D3DPROCESSVERTICES_TRANSFORMLIGHT) {
 		        int nb;
-			D3DVERTEX  *src = ((LPD3DVERTEX)  (ilpBuff->desc.lpData + vs)) + ci->wStart;
-			OGL_Vertex *dst = ((OGL_Vertex *) (ilpBuff->vertex_data)) + ci->wDest;
-			D3DMATRIX *mat = odev->world_mat;
+			D3DVERTEX  *src = ((LPD3DVERTEX)  (This->desc.lpData + vs)) + ci->wStart;
+			OGL_Vertex *dst = ((OGL_Vertex *) (This->vertex_data)) + ci->wDest;
+			D3DMATRIX *mat = lpDeviceGL->world_mat;
 			
 			TRACE("  World Matrix : (%p)\n", mat);
 			dump_mat(mat);
 
-			ilpBuff->vertex_type = D3DVT_VERTEX;
+			This->vertex_type = D3DVT_VERTEX;
 			
 			for (nb = 0; nb < ci->dwCount; nb++) {
 			    /* For the moment, no normal transformation... */
@@ -567,14 +565,14 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 			}
 		    } else if (ci->dwFlags == D3DPROCESSVERTICES_TRANSFORM) {
 		        int nb;
-			D3DLVERTEX *src  = ((LPD3DLVERTEX) (ilpBuff->desc.lpData + vs)) + ci->wStart;
-			OGL_LVertex *dst = ((OGL_LVertex *) (ilpBuff->vertex_data)) + ci->wDest;
-			D3DMATRIX *mat = odev->world_mat;
+			D3DLVERTEX *src  = ((LPD3DLVERTEX) (This->desc.lpData + vs)) + ci->wStart;
+			OGL_LVertex *dst = ((OGL_LVertex *) (This->vertex_data)) + ci->wDest;
+			D3DMATRIX *mat = lpDeviceGL->world_mat;
 			
 			TRACE("  World Matrix : (%p)\n", mat);
 			dump_mat(mat);
 			
-			ilpBuff->vertex_type = D3DVT_LVERTEX;
+			This->vertex_type = D3DVT_LVERTEX;
 			
 			for (nb = 0; nb < ci->dwCount; nb++) {
 			    dst->c  = src->u4.color;
@@ -592,10 +590,10 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 			    dst++;
 			}
 		    } else if (ci->dwFlags == D3DPROCESSVERTICES_COPY) {
-		        D3DTLVERTEX *src = ((LPD3DTLVERTEX) (ilpBuff->desc.lpData + vs)) + ci->wStart;
-			D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (ilpBuff->vertex_data)) + ci->wDest;
+		        D3DTLVERTEX *src = ((LPD3DTLVERTEX) (This->desc.lpData + vs)) + ci->wStart;
+			D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (This->vertex_data)) + ci->wDest;
 			
-			ilpBuff->vertex_type = D3DVT_TLVERTEX;
+			This->vertex_type = D3DVT_TLVERTEX;
 			
 			memcpy(dst, src, ci->dwCount * sizeof(D3DTLVERTEX));
 		    } else {
@@ -627,7 +625,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 		for (i = 0; i < count; i++) {
 		    LPD3DBRANCH ci = (LPD3DBRANCH) instr;
 
-		    if ((ilpBuff->data.dsStatus.dwStatus & ci->dwMask) == ci->dwValue) {
+		    if ((This->data.dsStatus.dwStatus & ci->dwMask) == ci->dwValue) {
 		        if (!ci->bNegate) {
 			    TRACE(" Should branch to %ld\n", ci->dwOffset);
 			}
@@ -654,7 +652,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 		for (i = 0; i < count; i++) {
 		    LPD3DSTATUS ci = (LPD3DSTATUS) instr;
 		    
-		    ilpBuff->data.dsStatus = *ci;
+		    This->data.dsStatus = *ci;
 
 		    instr += size;
 		}
@@ -668,11 +666,8 @@ static void execute(IDirect3DExecuteBufferImpl *This,
 	}
     }
 
-  end_of_buffer:
+end_of_buffer:
     LEAVE_GL();
-#else
-    FIXME("Need to make this function compile again !!!\n");
-#endif
 }
 
 HRESULT WINAPI
@@ -868,7 +863,7 @@ HRESULT d3dexecutebuffer_create(IDirect3DExecuteBufferImpl **obj, IDirect3DImpl
     object->d3ddev = d3ddev;
 
     /* Initializes memory */
-    memcpy(&object->desc, &lpDesc, lpDesc->dwSize);
+    memcpy(&object->desc, lpDesc, lpDesc->dwSize);
 
     /* No buffer given */
     if ((object->desc.dwFlags & D3DDEB_LPDATA) == 0)
diff --git a/dlls/ddraw/direct3d/main.c b/dlls/ddraw/direct3d/main.c
index 3f1f09675129fca3336010213c1e544e0e499b4d..a68b578fd4f664bf3c8eaf0055c7166deeca8c90 100644
--- a/dlls/ddraw/direct3d/main.c
+++ b/dlls/ddraw/direct3d/main.c
@@ -426,7 +426,7 @@ Thunk_IDirect3DImpl_1_CreateMaterial(LPDIRECT3D iface,
 				    &ret_val,
 				    pUnkOuter);
 
-    *lplpDirect3DMaterial = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial, &ret_val);
+    *lplpDirect3DMaterial = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial, ret_val);
 
     TRACE(" returning interface %p.\n", *lplpDirect3DMaterial);
     
@@ -457,7 +457,7 @@ Thunk_IDirect3DImpl_2_CreateMaterial(LPDIRECT3D2 iface,
 				    &ret_val,
 				    pUnkOuter);
 
-    *lplpDirect3DMaterial2 = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial2, &ret_val);
+    *lplpDirect3DMaterial2 = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial2, ret_val);
 
     TRACE(" returning interface %p.\n", *lplpDirect3DMaterial2);
     
diff --git a/dlls/ddraw/direct3d/mesa.c b/dlls/ddraw/direct3d/mesa.c
index 4d7cc3dd811f6cb974639108e6416b8cb5778800..f2d080670febabe354d8999875483fd2237a50fa 100644
--- a/dlls/ddraw/direct3d/mesa.c
+++ b/dlls/ddraw/direct3d/mesa.c
@@ -281,7 +281,7 @@ ICOM_VTABLE(IDirect3D3) VTABLE_IDirect3D3 =
     XCAST(AddRef) Thunk_IDirect3DImpl_3_AddRef,
     XCAST(Release) Thunk_IDirect3DImpl_3_Release,
     XCAST(EnumDevices) GL_IDirect3DImpl_3_EnumDevices,
-    XCAST(CreateLight) Main_IDirect3DImpl_3_2T_1T_CreateLight,
+    XCAST(CreateLight) GL_IDirect3DImpl_3_2T_1T_CreateLight,
     XCAST(CreateMaterial) GL_IDirect3DImpl_3_2T_1T_CreateMaterial,
     XCAST(CreateViewport) GL_IDirect3DImpl_3_2T_1T_CreateViewport,
     XCAST(FindDevice) Main_IDirect3DImpl_3_2T_FindDevice,
@@ -308,7 +308,7 @@ ICOM_VTABLE(IDirect3D2) VTABLE_IDirect3D2 =
     XCAST(QueryInterface) Thunk_IDirect3DImpl_2_QueryInterface,
     XCAST(AddRef) Thunk_IDirect3DImpl_2_AddRef,
     XCAST(Release) Thunk_IDirect3DImpl_2_Release,
-    XCAST(EnumDevices) Thunk_IDirect3DImpl_2_EnumDevices,
+    XCAST(EnumDevices) GL_IDirect3DImpl_2_EnumDevices,
     XCAST(CreateLight) Thunk_IDirect3DImpl_2_CreateLight,
     XCAST(CreateMaterial) Thunk_IDirect3DImpl_2_CreateMaterial,
     XCAST(CreateViewport) Thunk_IDirect3DImpl_2_CreateViewport,
@@ -334,7 +334,7 @@ ICOM_VTABLE(IDirect3D) VTABLE_IDirect3D =
     XCAST(AddRef) Thunk_IDirect3DImpl_1_AddRef,
     XCAST(Release) Thunk_IDirect3DImpl_1_Release,
     XCAST(Initialize) Main_IDirect3DImpl_1_Initialize,
-    XCAST(EnumDevices) Thunk_IDirect3DImpl_1_EnumDevices,
+    XCAST(EnumDevices) GL_IDirect3DImpl_1_EnumDevices,
     XCAST(CreateLight) Thunk_IDirect3DImpl_1_CreateLight,
     XCAST(CreateMaterial) Thunk_IDirect3DImpl_1_CreateMaterial,
     XCAST(CreateViewport) Thunk_IDirect3DImpl_1_CreateViewport,