diff --git a/src/multitouch.c b/src/multitouch.c
index c55d742..4a8192d 100644
--- a/src/multitouch.c
+++ b/src/multitouch.c
@@ -114,7 +114,7 @@ static int init_properties(DeviceIntPtr dev)
 	return Success;
 }
 
-static int device_init(DeviceIntPtr dev, LocalDevicePtr local)
+static int device_init(DeviceIntPtr dev, InputInfoPtr local)
 {
 	struct mtev_mtouch *mt = local->private;
 	Atom atom;
@@ -222,7 +222,7 @@ static int device_init(DeviceIntPtr dev, LocalDevicePtr local)
 			xf86InitValuatorAxisStruct(dev, val, axes_labels[val],
 						   min,
 						   max,
-						   1, 0, 1);
+						   1, 0, 1,Absolute);
 			xf86InitValuatorDefaults(dev, val);
 		}
 	}
@@ -232,7 +232,7 @@ static int device_init(DeviceIntPtr dev, LocalDevicePtr local)
 	return Success;
 }
 
-static int device_on(LocalDevicePtr local)
+static int device_on(InputInfoPtr local)
 {
 	struct mtev_mtouch *mt = local->private;
 	local->fd = xf86OpenSerial(local->options);
@@ -248,7 +248,7 @@ static int device_on(LocalDevicePtr local)
 	return Success;
 }
 
-static int device_off(LocalDevicePtr local)
+static int device_off(InputInfoPtr local)
 {
 	struct mtev_mtouch *mt = local->private;
 	xf86RemoveEnabledDevice(local);
@@ -259,12 +259,12 @@ static int device_off(LocalDevicePtr local)
 	return Success;
 }
 
-static int device_close(LocalDevicePtr local)
+static int device_close(InputInfoPtr local)
 {
 	return Success;
 }
 
-static void process_state(LocalDevicePtr local,
+static void process_state(InputInfoPtr local,
 			  const struct mtev_mtouch *mt)
 {
 
@@ -321,22 +321,22 @@ static void process_state(LocalDevicePtr local,
 	}
 
 	/* Some x-clients assume they get motion events before button down */
+	xf86Msg(X_INFO,"down %d|pdown %d\n", down, pdown);
 	if (down)
 		xf86PostMotionEventP(local->dev, TRUE,
 				     0, down * MT_AXIS_PER_FINGER, valuators);
-
 	if(down && pdown == 0)
 		xf86PostButtonEventP(local->dev, TRUE,
 				     1, 1,
 				     0, down * MT_AXIS_PER_FINGER, valuators);
-	else if (down == 0 && pdown)
-		xf86PostButtonEvent(local->dev, TRUE, 1, 0, 0, 0);
-
+	else if (down == 0 && pdown){
+		xf86PostButtonEvent(local->dev, TRUE, 1, 1, 0, 0);
+	}
 	pdown = !!down;
 }
 
 /* called for each full received packet from the touchpad */
-static void read_input(LocalDevicePtr local)
+static void read_input(InputInfoPtr local)
 {
 	struct mtev_mtouch *mt = local->private;
 	while (mtouch_read_synchronized_event(mt, local->fd)) {
@@ -346,7 +346,7 @@ static void read_input(LocalDevicePtr local)
 
 static Bool device_control(DeviceIntPtr dev, int mode)
 {
-	LocalDevicePtr local = dev->public.devicePrivate;
+	InputInfoPtr local = dev->public.devicePrivate;
 	switch (mode) {
 	case DEVICE_INIT:
 		xf86Msg(X_INFO, "device control: init\n");
@@ -366,39 +366,29 @@ static Bool device_control(DeviceIntPtr dev, int mode)
 	}
 }
 
-static InputInfoPtr preinit(InputDriverPtr drv, IDevPtr dev, int flags)
+static InputInfoPtr preinit(InputDriverPtr drv, InputInfoPtr pInfo, int flags)
 {
 	struct mtev_mtouch *mt;
-	InputInfoPtr local = xf86AllocateInput(drv, 0);
-	if (!local)
-		goto error;
+	int rc;
+
 	mt = calloc(1, sizeof(struct mtev_mtouch));
+
 	if (!mt)
 		goto error;
 
-	local->name = dev->identifier;
-	local->type_name = XI_TOUCHSCREEN;
-	local->device_control = device_control;
-	local->read_input = read_input;
-	local->private = mt;
-	local->flags = XI86_POINTER_CAPABLE |
-		XI86_SEND_DRAG_EVENTS;
-
-	local->conf_idev = dev;
-
-	xf86CollectInputOptions(local, NULL, NULL);
-	//xf86OptionListReport(local->options);
-	xf86ProcessCommonOptions(local, local->options);
+	pInfo->private = mt;
+	pInfo->type_name = "UNKNOWN";
+	pInfo->device_control = device_control;
+	pInfo->read_input = read_input;
 
+	mt->swap_xy = xf86SetBoolOption(pInfo->options, "SwapAxes", FALSE);
+	mt->invert_x = xf86SetBoolOption(pInfo->options, "InvertX", FALSE);
+	mt->invert_y = xf86SetBoolOption(pInfo->options, "InvertY", FALSE);
 
-	mt->swap_xy = xf86SetBoolOption(local->options, "SwapAxes", FALSE);
-	mt->invert_x = xf86SetBoolOption(local->options, "InvertX", FALSE);
-	mt->invert_y = xf86SetBoolOption(local->options, "InvertY", FALSE);
-
-	local->flags |= XI86_CONFIGURED;
+	return Success;
 
 error:
-	return local;
+	return !Success;
 }
 
 static void uninit(InputDriverPtr drv, InputInfoPtr local, int flags)
@@ -415,7 +405,6 @@ static InputDriverRec MTEV = {
 	.PreInit = preinit,
 	.UnInit = uninit,
 	.module = NULL,
-	.refCount = 0
 };
 
 static XF86ModuleVersionInfo VERSION = {
