diff --git a/dlls/ole32/oleproxy.c b/dlls/ole32/oleproxy.c
index d366ad8c1c4c9a43b58ad184739266edc811b1e5..f8111f2083132d392cc6b4b867113161a49a2c14 100644
--- a/dlls/ole32/oleproxy.c
+++ b/dlls/ole32/oleproxy.c
@@ -452,7 +452,9 @@ PSFacBuf_CreateProxy(
     LPPSFACTORYBUFFER iface, IUnknown* pUnkOuter, REFIID riid,
     IRpcProxyBuffer **ppProxy, LPVOID *ppv
 ) {
-    if (IsEqualIID(&IID_IClassFactory,riid))
+    if (IsEqualIID(&IID_IClassFactory,riid) ||
+	IsEqualIID(&IID_IUnknown,riid)
+    )
 	return CFProxy_Construct(ppv,(LPVOID*)ppProxy);
     FIXME("proxying not implemented for (%s) yet!\n",debugstr_guid(riid));
     return E_FAIL;
@@ -467,7 +469,9 @@ PSFacBuf_CreateStub(
 
     TRACE("(%s,%p,%p)\n",debugstr_guid(riid),pUnkServer,ppStub);
 
-    if (IsEqualIID(&IID_IClassFactory,riid)) {
+    if (IsEqualIID(&IID_IClassFactory,riid) ||
+        IsEqualIID(&IID_IUnknown,riid)
+    ) {
 	hres = CFStub_Construct(ppStub);
 	if (!hres)
 	    IRpcStubBuffer_Connect((*ppStub),pUnkServer);
@@ -503,7 +507,11 @@ HRESULT WINAPI OLE32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv)
 	STUBMGR_Start();
 	return S_OK;
     }
-    if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&IsEqualIID(iid,&IID_IClassFactory))
+    if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&(
+		IsEqualIID(iid,&IID_IClassFactory) ||
+		IsEqualIID(iid,&IID_IUnknown)
+	)
+    )
 	return MARSHAL_GetStandardMarshalCF(ppv);
     FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid));
     return CLASS_E_CLASSNOTAVAILABLE;
diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c
index f206998c623c559739b33da62b8562c6f6aa99a1..2644dc4ef38f76937ba7bc413670e1859b4ed903 100644
--- a/dlls/oleaut32/tmarshal.c
+++ b/dlls/oleaut32/tmarshal.c
@@ -436,6 +436,8 @@ marshall_param(
 	ITypeInfo_Release(tinfo2);
 	return hres;
     }
+    case VT_UNKNOWN:
+        return _marshal_interface(buf,&IID_IUnknown,(LPUNKNOWN)*arg);
     default:
 	ERR("Cannot marshal type %d\n",tdesc->vt);
 	/*dump_ELEMDESC(elem);*/
@@ -887,7 +889,10 @@ stuballoc_param(
 	case VT_UNKNOWN:
 	    /* FIXME: UNKNOWN is unknown ..., but allocate 4 byte for it */
 	    *arg=(DWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DWORD));
-	    return S_OK;
+	    hres = S_OK;
+	    if (elem->u.paramdesc.wParamFlags & PARAMFLAG_FIN)
+		hres = _unmarshal_interface(buf,&IID_IUnknown,(LPUNKNOWN*)arg);
+	    return hres;
 	case VT_VOID:
 	    *arg = (DWORD)HeapAlloc(GetProcessHeap(),0,sizeof(LPVOID));
 	    hres = S_OK;
@@ -993,7 +998,7 @@ stubunalloc_param(
     case VT_UNKNOWN:
 	if (elem->u.paramdesc.wParamFlags & PARAMFLAG_FOUT) {
 	    FIXME("Marshaling back VT_UNKNOWN %lx\n",*arg);
-	    hres = xbuf_add(buf,(LPBYTE)*arg,sizeof(DWORD));
+	    hres = _marshal_interface(buf,&IID_IUnknown,(LPUNKNOWN)*arg);
 	}
 	HeapFree(GetProcessHeap(),0,(LPVOID)*arg);
 	return hres;
diff --git a/winedefault.reg b/winedefault.reg
index dd5572fb402b57c6d6097f02c0c0bd6283b2f039..30b62db63acc69b048af26cb7ed82b3e535bbaf6 100644
--- a/winedefault.reg
+++ b/winedefault.reg
@@ -129,6 +129,9 @@
 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000000-0000-0000-C000-000000000046}\NumMethods]
 @="3"
 
+[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000000-0000-0000-C000-000000000046}\ProxyStubClsid32]
+@="{00000320-0000-0000-C000-000000000046}"
+
 # IClassFactory, standard interface for creating instances of classes.
 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{00000001-0000-0000-C000-000000000046}]
 @="IClassFactory"