--- /dev/null
+--- a/src/tslib.c
++++ b/src/tslib.c
+@@ -49,6 +49,7 @@
+ #include <X11/keysym.h>
+ #include <mipointer.h>
+ #include <randrstr.h>
++#include <xserver-properties.h>
+
+ #include <tslib.h>
+
+@@ -211,6 +212,15 @@ xf86TslibControlProc(DeviceIntPtr device, int what)
+ unsigned char map[MAXBUTTONS + 1];
+ int i;
+ struct ts_priv *priv;
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
++ Atom buttons[MAXBUTTONS];
++ Atom axes[2];
++
++ axes[0] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_X);
++ axes[1] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_Y);
++
++ buttons[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
++#endif
+
+ #ifdef DEBUG
+ ErrorF("%s\n", __FUNCTION__);
+@@ -226,33 +236,45 @@ xf86TslibControlProc(DeviceIntPtr device, int what)
+ map[i + 1] = i + 1;
+ }
+
+- if (InitButtonClassDeviceStruct(device,
+- MAXBUTTONS, map) == FALSE) {
++ if (InitButtonClassDeviceStruct(device, MAXBUTTONS,
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
++ buttons,
++#endif
++ map) == FALSE) {
+ ErrorF("unable to allocate Button class device\n");
+ return !Success;
+ }
+
+- if (InitValuatorClassDeviceStruct(device,
+- 2,
+-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 3
+- xf86GetMotionEvents,
++ if (InitValuatorClassDeviceStruct(device, 2,
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
++ axes,
++#elif GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 3
++ xf86GetMotionEvents,
+ #endif
+- 0, Absolute) == FALSE) {
++ 0, Absolute) == FALSE) {
+ ErrorF("unable to allocate Valuator class device\n");
+ return !Success;
+ }
+
+- InitValuatorAxisStruct(device, 0, 0, /* min val */
+- priv->width - 1, /* max val */
+- priv->width, /* resolution */
+- 0, /* min_res */
+- priv->width); /* max_res */
+-
+- InitValuatorAxisStruct(device, 1, 0, /* min val */
+- priv->height - 1,/* max val */
+- priv->height, /* resolution */
+- 0, /* min_res */
+- priv->height); /* max_res */
++ InitValuatorAxisStruct(device, 0,
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
++ axes[0],
++#endif
++ 0, /* min val */
++ priv->width - 1, /* max val */
++ priv->width, /* resolution */
++ 0, /* min_res */
++ priv->width); /* max_res */
++
++ InitValuatorAxisStruct(device, 1,
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
++ axes[1],
++#endif
++ 0, /* min val */
++ priv->height - 1, /* max val */
++ priv->height, /* resolution */
++ 0, /* min_res */
++ priv->height); /* max_res */
+
+ if (InitProximityClassDeviceStruct (device) == FALSE) {
+ ErrorF ("Unable to allocate EVTouch touchscreen ProximityClassDeviceStruct\n");
+