diff --git a/plugins/xrandr/gsd-xrandr-manager.c b/plugins/xrandr/gsd-xrandr-manager.c
index 2fb6204..5f994b3 100644
--- a/plugins/xrandr/gsd-xrandr-manager.c
+++ b/plugins/xrandr/gsd-xrandr-manager.c
@@ -1502,15 +1502,13 @@ get_next_rotation (GnomeRRRotation allowed_rotations, GnomeRRRotation current_ro
 
 struct {
         GnomeRRRotation rotation;
-        /* evdev */
-        gboolean x_axis_inversion;
-        gboolean y_axis_inversion;
-        gboolean axes_swap;
+	//Coordinate Transformation Matrix
+        gfloat matrix[9];
 } evdev_rotations[] = {
-        { GNOME_RR_ROTATION_0, 0, 0, 0 },
-        { GNOME_RR_ROTATION_90, 1, 0, 1 },
-        { GNOME_RR_ROTATION_180, 1, 1, 0 },
-        { GNOME_RR_ROTATION_270, 0, 1, 1 }
+        { GNOME_RR_ROTATION_0, {1, 0, 0, 0, 1, 0, 0, 0, 1}},
+        { GNOME_RR_ROTATION_90, {0, -1, 1, 1, 0, 0, 0, 0, 1}},
+        { GNOME_RR_ROTATION_180, {-1, 0, 1, 0, -1, 1, 0, 0, 1}},
+        { GNOME_RR_ROTATION_270, {0, 1, 0, -1, 0, 1, 0,  0, 1}}
 };
 
 static guint
@@ -1566,6 +1564,7 @@ rotate_touchscreens (GsdXrandrManager *mgr,
         XDeviceInfo *device_info;
         gint n_devices;
         guint i, rot_idx;
+        Atom float_atom = XInternAtom(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), "FLOAT", True);
 
         if (!supports_xinput_devices ())
                 return;
@@ -1587,13 +1586,13 @@ rotate_touchscreens (GsdXrandrManager *mgr,
                 if (device_info_is_touchscreen (&device_info[i]) ||
                             device_info_is_tablet (&device_info[i])) {
                         XDevice *device;
-                        char c = evdev_rotations[rot_idx].axes_swap;
-                        PropertyHelper axes_swap = {
-                                .name = "Evdev Axes Swap",
-                                .nitems = 1,
-                                .format = 8,
-                                .type   = XA_INTEGER,
-                                .data.c = &c,
+                        gfloat *m = evdev_rotations[rot_idx].matrix;
+                        PropertyHelper matrix = {
+                                .name = "Coordinate Transformation Matrix",
+                                .nitems = 9,
+                                .format = 32,
+                                .type = float_atom,
+                                .data.i = (int *)m,
                         };
 
                         g_debug ("About to rotate '%s'", device_info[i].name);
@@ -1603,26 +1602,18 @@ rotate_touchscreens (GsdXrandrManager *mgr,
                         if (gdk_error_trap_pop () || (device == NULL))
                                 continue;
 
-                        if (device_set_property (device, device_info[i].name, &axes_swap) != FALSE) {
-                                char axis[] = {
-                                        evdev_rotations[rot_idx].x_axis_inversion,
-                                        evdev_rotations[rot_idx].y_axis_inversion
-                                };
-                                PropertyHelper axis_invert = {
-                                        .name = "Evdev Axis Inversion",
-                                        .nitems = 2,
-                                        .format = 8,
-                                        .type   = XA_INTEGER,
-                                        .data.c = axis,
-                                };
-
-                                device_set_property (device, device_info[i].name, &axis_invert);
-
-                                g_debug ("Rotated '%s' to configuration '%d, %d, %d'",
+                        if (device_set_property (device, device_info[i].name, &matrix) != FALSE) {
+                                g_debug ("Rotated '%s' to configuration '%f, %f, %f, %f, %f, %f, %f, %f, %f'\n",
                                          device_info[i].name,
-                                         evdev_rotations[rot_idx].x_axis_inversion,
-                                         evdev_rotations[rot_idx].y_axis_inversion,
-                                         evdev_rotations[rot_idx].axes_swap);
+                                         evdev_rotations[rot_idx].matrix[0],
+                                         evdev_rotations[rot_idx].matrix[1],
+                                         evdev_rotations[rot_idx].matrix[2],
+                                         evdev_rotations[rot_idx].matrix[3],
+                                         evdev_rotations[rot_idx].matrix[4],
+                                         evdev_rotations[rot_idx].matrix[5],
+                                         evdev_rotations[rot_idx].matrix[6],
+                                         evdev_rotations[rot_idx].matrix[7],
+                                         evdev_rotations[rot_idx].matrix[8]);
                         }
 
                         XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
