diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 77afbf4..036b09c 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -1080,11 +1080,22 @@ int __glXDisp_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
     return DoGetFBConfigs(cl, req->screen);
 }
 
+static int glxWindowPrivateKeyIndex;
+static DevPrivateKey glxWindowPrivateKey = &glxWindowPrivateKeyIndex;
+
 GLboolean
 __glXDrawableInit(__GLXdrawable *drawable,
 		  __GLXscreen *screen, DrawablePtr pDraw, int type,
 		  XID drawId, __GLXconfig *config)
 {
+    if (pDraw->type == DRAWABLE_WINDOW)
+    {
+	WindowPtr pWin;
+
+	pWin = (WindowPtr) pDraw;
+	dixSetPrivate(&pWin->devPrivates, glxWindowPrivateKey, drawable);
+    }
+
     drawable->pDraw = pDraw;
     drawable->type = type;
     drawable->drawId = drawId;
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 58d8ee0..8d9ebea 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -353,8 +353,11 @@ glxDestroyWindow(WindowPtr pWin)
     ScreenPtr pScreen = pWin->drawable.pScreen;
     __GLXscreen *pGlxScreen = glxGetScreen(pScreen);
     Bool retval = TRUE;
+    __GLXdrawable *drawable;
 
-    FreeResource(pWin->drawable.id, FALSE);
+    drawable = dixLookupPrivate(&pWin->devPrivates, glxWindowPrivateKey);
+    if (drawable)
+        FreeResource(drawable->drawId, FALSE);
 
     /* call lower wrapped functions */
     if (pGlxScreen->DestroyWindow) {
