diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index afa73db3ae68bb118422a3dca1f59b441a7c8442..60a2485d00b3c8c823f1333a7888fbe360e5e451 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -44,11 +44,6 @@
  *   - Implement RPC thread affinity (should fix InstallShield painting
  *     problems)
  *
- *   - Implement IRemUnknown and marshalling for it, then use that for
- *     reffing/unreffing the stub manager from a proxy instead of our
- *     current hack of simply reaching into local process memory to do it,
- *     which obviously doesn't work inter-process.
- *
  *   - Make our custom marshalling use NDR to be wire compatible with
  *     native DCOM
  *     
@@ -2564,3 +2559,118 @@ ULONG WINAPI CoReleaseServerProcess(void)
     FIXME("\n");
     return 1;
 }
+
+/***********************************************************************
+ *           CoQueryProxyBlanket [OLE32.@]
+ *
+ * Retrieves the security settings being used by a proxy.
+ *
+ * PARAMS
+ *  pProxy        [I] Pointer to the proxy object.
+ *  pAuthnSvc     [O] The type of authentication service.
+ *  pAuthzSvc     [O] The type of authorization service.
+ *  ppServerPrincName [O] Optional. The server prinicple name.
+ *  pAuthnLevel   [O] The authentication level.
+ *  pImpLevel     [O] The impersonation level.
+ *  ppAuthInfo    [O] Information specific to the authorization/authentication service.
+ *  pCapabilities [O] Flags affecting the security behaviour.
+ *
+ * RETURNS
+ *  Success: S_OK.
+ *  Failure: HRESULT code.
+ *
+ * SEE ALSO
+ *  CoCopyProxy, CoSetProxyBlanket.
+ */
+HRESULT WINAPI CoQueryProxyBlanket(IUnknown *pProxy, DWORD *pAuthnSvc,
+    DWORD *pAuthzSvc, OLECHAR **ppServerPrincName, DWORD *pAuthnLevel,
+    DWORD *pImpLevel, void **ppAuthInfo, DWORD *pCapabilities)
+{
+    IClientSecurity *pCliSec;
+    HRESULT hr;
+
+    TRACE("%p\n", pProxy);
+
+    hr = IUnknown_QueryInterface(pProxy, &IID_IClientSecurity, (void **)&pCliSec);
+    if (SUCCEEDED(hr))
+        hr = IClientSecurity_QueryBlanket(pCliSec, pProxy, pAuthnSvc,
+                                          pAuthzSvc, ppServerPrincName,
+                                          pAuthnLevel, pImpLevel, ppAuthInfo,
+                                          pCapabilities);
+
+    if (FAILED(hr)) ERR("-- failed with 0x%08lx\n", hr);
+    return hr;
+}
+
+/***********************************************************************
+ *           CoSetProxyBlanket [OLE32.@]
+ *
+ * Sets the security settings for a proxy.
+ *
+ * PARAMS
+ *  pProxy       [I] Pointer to the proxy object.
+ *  AuthnSvc     [I] The type of authentication service.
+ *  AuthzSvc     [I] The type of authorization service.
+ *  pServerPrincName [I] The server prinicple name.
+ *  AuthnLevel   [I] The authentication level.
+ *  ImpLevel     [I] The impersonation level.
+ *  pAuthInfo    [I] Information specific to the authorization/authentication service.
+ *  Capabilities [I] Flags affecting the security behaviour.
+ *
+ * RETURNS
+ *  Success: S_OK.
+ *  Failure: HRESULT code.
+ *
+ * SEE ALSO
+ *  CoQueryProxyBlanket, CoCopyProxy.
+ */
+HRESULT WINAPI CoSetProxyBlanket(IUnknown *pProxy, DWORD AuthnSvc,
+    DWORD AuthzSvc, OLECHAR *pServerPrincName, DWORD AuthnLevel,
+    DWORD ImpLevel, void *pAuthInfo, DWORD Capabilities)
+{
+    IClientSecurity *pCliSec;
+    HRESULT hr;
+
+    TRACE("%p\n", pProxy);
+
+    hr = IUnknown_QueryInterface(pProxy, &IID_IClientSecurity, (void **)&pCliSec);
+    if (SUCCEEDED(hr))
+        hr = IClientSecurity_SetBlanket(pCliSec, pProxy, AuthnSvc,
+                                        AuthzSvc, pServerPrincName,
+                                        AuthnLevel, ImpLevel, pAuthInfo,
+                                        Capabilities);
+
+    if (FAILED(hr)) ERR("-- failed with 0x%08lx\n", hr);
+    return hr;
+}
+
+/***********************************************************************
+ *           CoCopyProxy [OLE32.@]
+ *
+ * Copies a proxy.
+ *
+ * PARAMS
+ *  pProxy [I] Pointer to the proxy object.
+ *  ppCopy [O] Copy of the proxy.
+ *
+ * RETURNS
+ *  Success: S_OK.
+ *  Failure: HRESULT code.
+ *
+ * SEE ALSO
+ *  CoQueryProxyBlanket, CoSetProxyBlanket.
+ */
+HRESULT WINAPI CoCopyProxy(IUnknown *pProxy, IUnknown **ppCopy)
+{
+    IClientSecurity *pCliSec;
+    HRESULT hr;
+
+    TRACE("%p\n", pProxy);
+
+    hr = IUnknown_QueryInterface(pProxy, &IID_IClientSecurity, (void **)&pCliSec);
+    if (SUCCEEDED(hr))
+        hr = IClientSecurity_CopyProxy(pCliSec, pProxy, ppCopy);
+
+    if (FAILED(hr)) ERR("-- failed with 0x%08lx\n", hr);
+    return hr;
+}
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index 2dcb5cb2f4daed84f2431049251ab29c55cd92d1..c9b4c986b618f77244051ace4e2389c7fd5efcb5 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -7,7 +7,7 @@
 @ stdcall CLSIDFromString(wstr ptr)
 @ stdcall CoAddRefServerProcess()
 @ stdcall CoBuildVersion()
-@ stub CoCopyProxy                #@ stdcall (ptr ptr) return 0,ERR_NOTIMPLEMENTED
+@ stdcall CoCopyProxy(ptr ptr)
 @ stdcall CoCreateFreeThreadedMarshaler(ptr ptr)
 @ stdcall CoCreateGuid(ptr)
 @ stdcall CoCreateInstance(ptr ptr long ptr ptr)
@@ -49,7 +49,7 @@
 @ stdcall CoMarshalInterface(ptr ptr ptr long ptr long)
 @ stub CoQueryAuthenticationServices
 @ stub CoQueryClientBlanket
-@ stub CoQueryProxyBlanket
+@ stdcall CoQueryProxyBlanket(ptr ptr ptr ptr ptr ptr ptr ptr)
 @ stub CoQueryReleaseObject
 @ stub CoRegisterChannelHook
 @ stdcall CoRegisterClassObject(ptr ptr long long ptr)
@@ -63,7 +63,7 @@
 @ stub CoRevertToSelf             #@ stdcall () return 0,ERR_NOTIMPLEMENTED
 @ stdcall CoRevokeClassObject(long)
 @ stdcall CoRevokeMallocSpy()
-@ stub CoSetProxyBlanket          #@ stdcall (ptr long long wstr long long ptr long) return 0,ERR_NOTIMPLEMENTED
+@ stdcall CoSetProxyBlanket(ptr long long wstr long long ptr long)
 @ stdcall CoSetState(ptr)
 @ stub CoSwitchCallContext
 @ stdcall CoSuspendClassObjects()