diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 520a4b3..a689e9b 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -780,6 +780,7 @@ static HRESULT  WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U
     }
 
     list_init(&object->renderbuffers);
+    list_init(&object->stencil_renderbuffers);
 
     /* Call the private setup routine */
     return IWineD3DSurface_PrivateSetup( (IWineD3DSurface *) object );
@@ -5575,6 +5576,8 @@ static void set_depth_stencil_fbo(IWineD3DDevice *iface, IWineD3DSurface *depth_
         if (depth_stencil_impl->current_renderbuffer) {
             GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_stencil_impl->current_renderbuffer->id));
             checkGLcall("glFramebufferRenderbufferEXT()");
+            GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_stencil_impl->current_stencil_renderbuffer ? depth_stencil_impl->current_stencil_renderbuffer->id : 0));
+            checkGLcall("glFramebufferRenderbufferEXT()");
         } else {
             IWineD3DBaseTextureImpl *texture_impl;
             GLenum texttarget, target;
@@ -5604,10 +5607,18 @@ static void set_depth_stencil_fbo(IWineD3DDevice *iface, IWineD3DSurface *depth_
 
             GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, texttarget, depth_stencil_impl->glDescription.textureName, 0));
             checkGLcall("glFramebufferTexture2DEXT()");
+            GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0));
+            checkGLcall("glFramebufferTexture2DEXT()");
+            GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0));
+            checkGLcall("glFramebufferRenderbufferEXT()");
         }
     } else {
         GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0));
         checkGLcall("glFramebufferTexture2DEXT()");
+        GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0));
+        checkGLcall("glFramebufferTexture2DEXT()");
+        GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0));
+        checkGLcall("glFramebufferRenderbufferEXT()");
     }
 }
 
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 07467be..003e5f9 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -244,14 +244,47 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal,
     This->Flags |= SFLAG_ALLOCATED;
 }
 
+static renderbuffer_entry_t *createRenderBuffer(IWineD3DSurfaceImpl *This, GLenum fmt, BOOL stencil,
+                                                unsigned int width, unsigned int height) {
+    GLuint renderbuffer;
+    renderbuffer_entry_t *entry;
+    GL_EXTCALL(glGenRenderbuffersEXT(1, &renderbuffer));
+    checkGLcall("gen rb name\n");
+    GL_EXTCALL(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderbuffer));
+    checkGLcall("bind rb\n");
+    GL_EXTCALL(glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, fmt, width, height));
+    checkGLcall("gen rb storage\n");
+
+    entry = HeapAlloc(GetProcessHeap(), 0, sizeof(renderbuffer_entry_t));
+    entry->width = width;
+    entry->height = height;
+    entry->id = renderbuffer;
+    if(!stencil) {
+        list_add_head(&This->renderbuffers, &entry->entry);
+    } else {
+        list_add_head(&This->stencil_renderbuffers, &entry->entry);
+    }
+    return entry;
+}
+
 /* In D3D the depth stencil dimensions have to be greater than or equal to the
  * render target dimensions. With FBOs, the dimensions have to be an exact match. */
 /* TODO: We should synchronize the renderbuffer's content with the texture's content. */
 void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height) {
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
     renderbuffer_entry_t *entry;
-    GLuint renderbuffer = 0;
+    GLuint renderbuffer = 0, stencil_renderbuffer = 0;
     unsigned int src_width, src_height;
+    BOOL has_stencil;
+
+    if(This->resource.format == WINED3DFMT_D24S8   ||
+       This->resource.format == WINED3DFMT_D24X4S4 ||
+       This->resource.format == WINED3DFMT_D15S1) {
+        has_stencil = TRUE;
+    } else {
+        This->current_stencil_renderbuffer = NULL;
+        has_stencil = FALSE;
+    }
 
     src_width = This->pow2Width;
     src_height = This->pow2Height;
@@ -260,8 +293,9 @@ void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int wi
     if (width > src_width || height > src_height) return;
 
     /* Remove any renderbuffer set if the sizes match */
-    if (width == src_width && height == src_height) {
+    if (width == src_width && height == src_height && !has_stencil) {
         This->current_renderbuffer = NULL;
+        This->current_stencil_renderbuffer = NULL;
         return;
     }
 
@@ -273,21 +307,25 @@ void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int wi
             break;
         }
     }
+    if(has_stencil) {
+        LIST_FOR_EACH_ENTRY(entry, &This->stencil_renderbuffers, renderbuffer_entry_t, entry) {
+            if (entry->width == width && entry->height == height) {
+                stencil_renderbuffer = entry->id;
+                This->current_stencil_renderbuffer = entry;
+                break;
+            }
+        }
+    }
 
     if (!renderbuffer) {
         const PixelFormatDesc *format_entry = getFormatDescEntry(This->resource.format);
+        GLuint glFmt = has_stencil ? GL_DEPTH_COMPONENT24_ARB : format_entry->glFormat;
 
-        GL_EXTCALL(glGenRenderbuffersEXT(1, &renderbuffer));
-        GL_EXTCALL(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderbuffer));
-        GL_EXTCALL(glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, format_entry->glFormat, width, height));
-
-        entry = HeapAlloc(GetProcessHeap(), 0, sizeof(renderbuffer_entry_t));
-        entry->width = width;
-        entry->height = height;
-        entry->id = renderbuffer;
-        list_add_head(&This->renderbuffers, &entry->entry);
-
-        This->current_renderbuffer = entry;
+        This->current_renderbuffer = createRenderBuffer(This, glFmt, FALSE, width, height);
+    }
+    if (!stencil_renderbuffer && has_stencil) {
+        This->current_stencil_renderbuffer = createRenderBuffer(This, GL_STENCIL_INDEX16_EXT, TRUE,
+                                                                width, height);
     }
 
     checkGLcall("set_compatible_renderbuffer");
@@ -418,6 +456,10 @@ ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) {
             GL_EXTCALL(glDeleteRenderbuffersEXT(1, &entry->id));
             HeapFree(GetProcessHeap(), 0, entry);
         }
+        LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->stencil_renderbuffers, renderbuffer_entry_t, entry) {
+            GL_EXTCALL(glDeleteRenderbuffersEXT(1, &entry->id));
+            HeapFree(GetProcessHeap(), 0, entry);
+        }
 
         TRACE("(%p) Released\n", This);
         HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 07a9db3..af34d8b 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1114,6 +1114,8 @@ struct IWineD3DSurfaceImpl
 
     struct list               renderbuffers;
     renderbuffer_entry_t      *current_renderbuffer;
+    struct list               stencil_renderbuffers;
+    renderbuffer_entry_t      *current_stencil_renderbuffer;
 
     /* DirectDraw clippers */
     IWineD3DClipper           *clipper;
diff --git a/tools/winewrapper b/tools/winewrapper
