diff --git a/Xext/xace.c b/Xext/xace.c
index c346b74e7340913472a3f80bba133da97d0610f8..82cc6d2b536bffda77a8cdacd7234cfe5d003d50 100644
--- a/Xext/xace.c
+++ b/Xext/xace.c
@@ -94,13 +94,19 @@ int XaceHookReceiveAccess(ClientPtr client, WindowPtr win,
     return rec.status;
 }
 
+int XaceHookClientAccess(ClientPtr client, ClientPtr target, Mask access_mode)
+{
+    XaceClientAccessRec rec = { client, target, access_mode, Success };
+    CallCallbacks(&XaceHooks[XACE_CLIENT_ACCESS], &rec);
+    return rec.status;
+}
+
 /* Entry point for hook functions.  Called by Xserver.
  */
 int
 XaceHook(int hook, ...)
 {
     union {
-        XaceClientAccessRec client;
         XaceExtAccessRec ext;
         XaceServerAccessRec server;
         XaceScreenAccessRec screen;
@@ -121,14 +127,6 @@ XaceHook(int hook, ...)
      * sets calldata directly to a single argument (with no return result)
      */
     switch (hook) {
-    case XACE_CLIENT_ACCESS:
-        u.client.client = va_arg(ap, ClientPtr);
-        u.client.target = va_arg(ap, ClientPtr);
-        u.client.access_mode = va_arg(ap, Mask);
-
-        u.client.status = Success;      /* default allow */
-        prv = &u.client.status;
-        break;
     case XACE_EXT_ACCESS:
         u.ext.client = va_arg(ap, ClientPtr);
 
diff --git a/Xext/xace.h b/Xext/xace.h
index b55bc8d1ea4eb486651f6354f6fcc400b8999036..9227794a01d031e3a285eafd3bba1c1df19fb057 100644
--- a/Xext/xace.h
+++ b/Xext/xace.h
@@ -87,6 +87,8 @@ int XaceHookDeviceAccess(ClientPtr client, DeviceIntPtr dev, Mask access_mode);
 int XaceHookSendAccess(ClientPtr client, DeviceIntPtr dev, WindowPtr win,
                        xEventPtr ev, int count);
 int XaceHookReceiveAccess(ClientPtr client, WindowPtr win, xEventPtr ev, int count);
+int XaceHookClientAccess(ClientPtr client, ClientPtr target, Mask access_mode);
+
 
 /* Register a callback for a given hook.
  */
diff --git a/dix/dispatch.c b/dix/dispatch.c
index b3a759ee45d0ae2e1d6fcf6087ed0f15660ac557..4b339fc56dea0571423b1ee70b0093318da69999 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -3436,7 +3436,7 @@ ProcChangeCloseDownMode(ClientPtr client)
     REQUEST(xSetCloseDownModeReq);
     REQUEST_SIZE_MATCH(xSetCloseDownModeReq);
 
-    rc = XaceHook(XACE_CLIENT_ACCESS, client, client, DixManageAccess);
+    rc = XaceHookClientAccess(client, client, DixManageAccess);
     if (rc != Success)
         return rc;
 
diff --git a/dix/dixutils.c b/dix/dixutils.c
index 440b4d08cd89d1e7d1c2d44a5243970f85c7eb23..ac5c0f9628742d7b4842c0b6451809f9b412feb4 100644
--- a/dix/dixutils.c
+++ b/dix/dixutils.c
@@ -232,7 +232,7 @@ dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client, Mask access)
     if (rc != Success)
         goto bad;
 
-    rc = XaceHook(XACE_CLIENT_ACCESS, client, clients[clientIndex], access);
+    rc = XaceHookClientAccess(client, clients[clientIndex], access);
     if (rc != Success)
         goto bad;