diff --git a/dlls/urlmon/tests/Makefile.in b/dlls/urlmon/tests/Makefile.in
index 3db88cf336e0e7a4329796fa1ed73d4cd66ce974..c9045a2338ad76c6d107377b4344744e97387e4a 100644
--- a/dlls/urlmon/tests/Makefile.in
+++ b/dlls/urlmon/tests/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
 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 b8c3614297e1e50b90b8c2ca91d078c65c6d03a7..40b7bd5b38d4b16a3cc78422d3705ed413425903 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -218,13 +218,14 @@ static void test_CreateAsyncBindCtx(void)
         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 @@ static void test_CreateAsyncBindCtx(void)
     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 @@ START_TEST(url)
 {
     test_create();
     test_CreateAsyncBindCtx();
+    test_CreateAsyncBindCtxEx();
     test_BindToStorage();
 }
diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c
index b4d7904f1008f342bf7c158bc49cfc14b2ba9a66..615fab9ba5bb82ba3a6d8edbb32ab51180a7ce2f 100644
--- a/dlls/urlmon/umon.c
+++ b/dlls/urlmon/umon.c
@@ -1178,17 +1178,39 @@ static HRESULT URLMonikerImpl_Construct(URLMonikerImpl* This, LPCOLESTR lpszLeft
  */
 HRESULT WINAPI CreateAsyncBindCtx(DWORD reserved, IBindStatusCallback *callback,
     IEnumFORMATETC *format, IBindCtx **pbind)
+{
+    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("(%08lx %p %p %p)\n", reserved, callback, format, pbind);
+    TRACE("(%p %08lx %p %p %p %ld)\n", ibind, options, callback, format, pbind, reserved);
 
-    if(!callback)
+    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 @@ HRESULT WINAPI CreateAsyncBindCtx(DWORD reserved, IBindStatusCallback *callback,
     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 @@ HRESULT WINAPI RegisterBindStatusCallback(
             IBindStatusCallback_Release(prev);
     }
 
-	return IBindCtx_RegisterObjectParam(pbc, (LPOLESTR)BSCBHolder, (IUnknown *)pbsc);
+    return IBindCtx_RegisterObjectParam(pbc, (LPOLESTR)BSCBHolder, (IUnknown *)pbsc);
 }
 
 /***********************************************************************