diff --git a/nx-X11/programs/Xserver/dix/devices.c b/nx-X11/programs/Xserver/dix/devices.c
index 8ad1cc37137280fe601a0e1a7ceaf3adad20aa64..3dee81a25d183b5ae72ed649218d73613db47988 100644
--- a/nx-X11/programs/Xserver/dix/devices.c
+++ b/nx-X11/programs/Xserver/dix/devices.c
@@ -73,6 +73,8 @@ SOFTWARE.
 #include "swaprep.h"
 #include "dixevents.h"
 
+extern void XkbFreePrivates(DeviceIntPtr device);
+
 DeviceIntPtr
 AddInputDevice(DeviceProc deviceProc, Bool autoStart)
 {
@@ -275,6 +277,13 @@ CloseDevice(register DeviceIntPtr dev)
 #endif
 	free(l);
     }
+
+#ifdef XKB
+    XkbFreePrivates(dev);
+#endif
+
+    free(dev->devPrivates);
+
     free(dev->sync.event);
     free(dev);
 }
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
index 4952c019746b6aab2ea3cac51e811366ad780259..6fbc66481ba8f74a08a7a6de4a0b9d4a46f2eb88 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
@@ -1034,14 +1034,6 @@ Reply   Total	Cached	Bits In			Bits Out		Bits/Reply	  Ratio
       fprintf(stderr, "nxagentKeyboardProc: Called for [DEVICE_CLOSE].\n");
       #endif
 
-      for (int i = 0; i < pDev->nPrivates; i++)
-      {
-        free(pDev->devPrivates[i].ptr);
-        pDev->devPrivates[i].ptr = NULL;
-      }
-      free(pDev->devPrivates);
-      pDev->devPrivates = NULL;
-
       break;
   }
 
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Pointer.c b/nx-X11/programs/Xserver/hw/nxagent/Pointer.c
index 85d286b967df80c4cb81f25d309eb558da86ba66..d344f34b079c31b892de8e5f919e3f9282b36a71 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Pointer.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Pointer.c
@@ -166,14 +166,6 @@ int nxagentPointerProc(DeviceIntPtr pDev, int onoff)
       fprintf(stderr, "nxagentPointerProc: Called for [DEVICE_CLOSE].\n");
       #endif
 
-      for (int i = 0; i < pDev->nPrivates; i++)
-      {
-        free(pDev->devPrivates[i].ptr);
-        pDev->devPrivates[i].ptr = NULL;
-      }
-      free(pDev->devPrivates);
-      pDev->devPrivates = NULL;
-
       break;
     }
 
diff --git a/nx-X11/programs/Xserver/xkb/xkbActions.c b/nx-X11/programs/Xserver/xkb/xkbActions.c
index 90bad93e0d2fd5a7cc182d0ae22654a0c7418a19..a39e5c8f25a628d2516b53ffbee6462054c85df3 100644
--- a/nx-X11/programs/Xserver/xkb/xkbActions.c
+++ b/nx-X11/programs/Xserver/xkb/xkbActions.c
@@ -81,6 +81,20 @@ XkbSetExtension(DeviceIntPtr device, ProcessInputProc proc)
 			    proc,xkbUnwrapProc);
 }
 
+void
+XkbFreePrivates(DeviceIntPtr device)
+{
+  if (device &&
+      device->devPrivates &&
+      device->nPrivates > 0 &&
+      xkbDevicePrivateIndex != -1 &&
+      xkbDevicePrivateIndex < device->nPrivates)
+    {
+      free(device->devPrivates[xkbDevicePrivateIndex].ptr);
+      device->devPrivates[xkbDevicePrivateIndex].ptr = NULL;
+    }
+}
+
 #ifdef XINPUT
 extern	void	ProcessOtherEvent(
     xEvent *		/* xE */,