diff --git a/dlls/urlmon/tests/Makefile.in b/dlls/urlmon/tests/Makefile.in
index 3db88cf..c9045a2 100644
--- a/dlls/urlmon/tests/Makefile.in
+++ b/dlls/urlmon/tests/Makefile.in
@@ -3,7 +3,7 @@
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 TESTDLL   = urlmon.dll
-IMPORTS   = urlmon user32 kernel32
+IMPORTS   = urlmon user32 kernel32 ole32
 EXTRALIBS = -luuid
 
 CTESTS = \
diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c
index b8c3614..40b7bd5 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -218,13 +218,14 @@
         return;
     }
 
-    bindopts.cbStruct = 16;
+    bindopts.cbStruct = sizeof(bindopts);
     hres = IBindCtx_GetBindOptions(bctx, &bindopts);
     ok(SUCCEEDED(hres), "IBindCtx_GetBindOptions failed: %08lx\n", hres);
     ok(bindopts.grfFlags == BIND_MAYBOTHERUSER,
                 "bindopts.grfFlags = %08lx, expected: BIND_MAYBOTHERUSER\n", bindopts.grfFlags);
-    ok(bindopts.grfMode = STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
-                "bindopts.grfMode = %08lx, expected: STGM_READWRITE | STGM_SHARE_EXCLUSIVE\n", bindopts.grfMode);
+    ok(bindopts.grfMode == (STGM_READWRITE | STGM_SHARE_EXCLUSIVE),
+                "bindopts.grfMode = %08lx, expected: STGM_READWRITE | STGM_SHARE_EXCLUSIVE\n",
+                bindopts.grfMode);
     ok(bindopts.dwTickCountDeadline == 0,
                 "bindopts.dwTickCountDeadline = %08lx, expected: 0\n", bindopts.dwTickCountDeadline);
 
@@ -234,6 +235,64 @@
     ok(ref == 0, "bsc should be destroyed here\n");
 }
 
+static void test_CreateAsyncBindCtxEx(void)
+{
+    IBindCtx *bctx = NULL, *bctx_arg = NULL;
+    IBindStatusCallback *bsc = statusclb_create();
+    BIND_OPTS bindopts;
+    HRESULT hres;
+
+    hres = CreateAsyncBindCtxEx(NULL, 0, NULL, NULL, NULL, 0);
+    ok(hres == E_INVALIDARG, "CreateAsyncBindCtx failed: %08lx, expected E_INVALIDARG\n", hres);
+
+    hres = CreateAsyncBindCtxEx(NULL, 0, NULL, NULL, &bctx, 0);
+    ok(hres == S_OK, "CreateAsyncBindCtxEx failed: %08lx\n", hres);
+
+    if(SUCCEEDED(hres)) {
+        bindopts.cbStruct = sizeof(bindopts);
+        hres = IBindCtx_GetBindOptions(bctx, &bindopts);
+        ok(SUCCEEDED(hres), "IBindCtx_GetBindOptions failed: %08lx\n", hres);
+        ok(bindopts.grfFlags == BIND_MAYBOTHERUSER,
+                "bindopts.grfFlags = %08lx, expected: BIND_MAYBOTHERUSER\n", bindopts.grfFlags);
+        ok(bindopts.grfMode == (STGM_READWRITE | STGM_SHARE_EXCLUSIVE),
+                "bindopts.grfMode = %08lx, expected: STGM_READWRITE | STGM_SHARE_EXCLUSIVE\n",
+                bindopts.grfMode);
+        ok(bindopts.dwTickCountDeadline == 0,
+                "bindopts.dwTickCountDeadline = %08lx, expected: 0\n", bindopts.dwTickCountDeadline);
+
+        IBindCtx_Release(bctx);
+    }
+
+    CreateBindCtx(0, &bctx_arg);
+    hres = CreateAsyncBindCtxEx(NULL, 0, NULL, NULL, &bctx, 0);
+    ok(hres == S_OK, "CreateAsyncBindCtxEx failed: %08lx\n", hres);
+
+    if(SUCCEEDED(hres)) {
+        bindopts.cbStruct = sizeof(bindopts);
+        hres = IBindCtx_GetBindOptions(bctx, &bindopts);
+        ok(SUCCEEDED(hres), "IBindCtx_GetBindOptions failed: %08lx\n", hres);
+        ok(bindopts.grfFlags == BIND_MAYBOTHERUSER,
+                "bindopts.grfFlags = %08lx, expected: BIND_MAYBOTHERUSER\n", bindopts.grfFlags);
+        ok(bindopts.grfMode == (STGM_READWRITE | STGM_SHARE_EXCLUSIVE),
+                "bindopts.grfMode = %08lx, expected: STGM_READWRITE | STGM_SHARE_EXCLUSIVE\n",
+                bindopts.grfMode);
+        ok(bindopts.dwTickCountDeadline == 0,
+                "bindopts.dwTickCountDeadline = %08lx, expected: 0\n", bindopts.dwTickCountDeadline);
+
+        IBindCtx_Release(bctx);
+    }
+
+    IBindCtx_Release(bctx_arg);
+
+    hres = CreateAsyncBindCtxEx(NULL, 0, bsc, NULL, &bctx, 0);
+    ok(hres == S_OK, "CreateAsyncBindCtxEx failed: %08lx\n", hres);
+
+    if(SUCCEEDED(hres))
+        IBindCtx_Release(bctx);
+
+    IBindStatusCallback_Release(bsc);
+}
+
 static void test_BindToStorage(void)
 {
     IMoniker *mon;
@@ -302,5 +361,6 @@
 {
     test_create();
     test_CreateAsyncBindCtx();
+    test_CreateAsyncBindCtxEx();
     test_BindToStorage();
 }
diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c
index b4d7904..615fab9 100644
--- a/dlls/urlmon/umon.c
+++ b/dlls/urlmon/umon.c
@@ -1179,16 +1179,38 @@
 HRESULT WINAPI CreateAsyncBindCtx(DWORD reserved, IBindStatusCallback *callback,
     IEnumFORMATETC *format, IBindCtx **pbind)
 {
-    HRESULT hres;
-    BIND_OPTS bindopts;
-    IBindCtx *bctx;
-
     TRACE("(%08lx %p %p %p)\n", reserved, callback, format, pbind);
 
     if(!callback)
         return E_INVALIDARG;
+
+    return CreateAsyncBindCtxEx(NULL, 0, callback, format, pbind, 0);
+}
+/***********************************************************************
+ *           CreateAsyncBindCtxEx (URLMON.@)
+ *
+ * Create an asynchronous bind context.
+ */ 
+HRESULT WINAPI CreateAsyncBindCtxEx(IBindCtx *ibind, DWORD options,
+    IBindStatusCallback *callback, IEnumFORMATETC *format, IBindCtx** pbind,
+    DWORD reserved)
+{
+    HRESULT hres;
+    BIND_OPTS bindopts;
+    IBindCtx *bctx;
+
+    TRACE("(%p %08lx %p %p %p %ld)\n", ibind, options, callback, format, pbind, reserved);
+
+    if(!pbind)
+        return E_INVALIDARG;
+
+    if(options)
+        FIXME("not supported options %08lx", options);
     if(format)
-        FIXME("format is not supported yet\n");
+        FIXME("format is not supported\n");
+
+    if(reserved)
+        WARN("reserved=%ld\n", reserved);
 
     hres = CreateBindCtx(0, &bctx);
     if(FAILED(hres))
@@ -1200,31 +1222,13 @@
     bindopts.dwTickCountDeadline = 0;
     IBindCtx_SetBindOptions(bctx, &bindopts);
 
-    hres = IBindCtx_RegisterObjectParam(bctx, (LPOLESTR)BSCBHolder, (IUnknown*)callback);
-    if(FAILED(hres)) {
-        IBindCtx_Release(bctx);
-        return hres;
-    }
+    if(callback)
+        RegisterBindStatusCallback(bctx, callback, NULL, 0);
 
     *pbind = bctx;
 
     return S_OK;
 }
-/***********************************************************************
- *           CreateAsyncBindCtxEx (URLMON.@)
- *
- * Create an asynchronous bind context.
- *
- * FIXME
- *   Not implemented.
- */ 
-HRESULT WINAPI CreateAsyncBindCtxEx(IBindCtx *ibind, DWORD options,
-    IBindStatusCallback *callback, IEnumFORMATETC *format, IBindCtx** pbind,
-    DWORD reserved)
-{
-     FIXME("stub, returns failure\n");
-     return E_INVALIDARG;
-}
 
 
 /***********************************************************************
@@ -1445,7 +1449,7 @@
             IBindStatusCallback_Release(prev);
     }
 
-	return IBindCtx_RegisterObjectParam(pbc, (LPOLESTR)BSCBHolder, (IUnknown *)pbsc);
+    return IBindCtx_RegisterObjectParam(pbc, (LPOLESTR)BSCBHolder, (IUnknown *)pbsc);
 }
 
 /***********************************************************************
