diff -uprN linuxwacom-0.8.1-3.orig/src/xdrv/wcmUSB.c linuxwacom-0.8.1-3/src/xdrv/wcmUSB.c
--- linuxwacom-0.8.1-3.orig/src/xdrv/wcmUSB.c	2008-08-12 15:31:08.000000000 -0400
+++ linuxwacom-0.8.1-3/src/xdrv/wcmUSB.c	2008-08-25 05:29:53.000000000 -0400
@@ -500,7 +500,7 @@ Bool usbWcmInit(LocalDevicePtr local, ch
 	ioctl(local->fd, EVIOCGNAME(sizeof(id)), id);
 
 	/* vendor is wacom */
-	if (sID[1] == 0x056A)
+	if (sID[1] == 0x056A || sID[1]==0x1b96)
 	{
 		common->tablet_id = sID[2];
 
@@ -555,7 +555,8 @@ Bool usbWcmInit(LocalDevicePtr local, ch
 	else if (ISBITSET (keys, BTN_SIDE))
 		common->nbuttons = 6;
 	else
-		common->nbuttons = 5;
+		common->nbuttons = 11;
+      //common->nbuttons = 5;
 
 	return Success;
 }
@@ -892,6 +893,7 @@ static void usbParseChannel(LocalDeviceP
 	struct input_event* event;
 	WacomDevicePtr priv = (WacomDevicePtr)local->private;
 	WacomCommonPtr common = priv->common;
+   int local_device_type=-1;
 
 	#define MOD_BUTTONS(bit, value) do { \
 		shift = 1<<bit; \
@@ -921,6 +923,9 @@ static void usbParseChannel(LocalDeviceP
 		/* absolute events */
 		if (event->type == EV_ABS)
 		{
+         if( ds->device_type == TOUCH_ID &&
+               (event->code == 2 || event->code==3))
+            event->code-=2;
 			if (event->code == ABS_X)
 				ds->x = event->value;
 			else if (event->code == ABS_Y)
@@ -962,9 +967,9 @@ static void usbParseChannel(LocalDeviceP
 		{
 			if ((event->code == BTN_TOOL_PEN) ||
 				(event->code == BTN_TOOL_PENCIL) ||
-				(event->code == BTN_TOOL_BRUSH) ||
 				(event->code == BTN_TOOL_AIRBRUSH))
 			{
+				local_device_type = STYLUS_ID;
 				ds->device_type = STYLUS_ID;
 				ds->device_id = STYLUS_DEVICE_ID;
 				ds->proximity = (event->value != 0);
@@ -974,6 +979,7 @@ static void usbParseChannel(LocalDeviceP
 			}
 			else if (event->code == BTN_TOOL_RUBBER)
 			{
+				local_device_type = ERASER_ID;
 				ds->device_type = ERASER_ID;
 				ds->device_id = ERASER_DEVICE_ID;
 				ds->proximity = (event->value != 0);
@@ -989,6 +995,7 @@ static void usbParseChannel(LocalDeviceP
 				DBG(6, common->debugLevel, ErrorF(
 					"USB mouse detected %x (value=%d)\n",
 					event->code, event->value));
+				local_device_type = CURSOR_ID;
 				ds->device_type = CURSOR_ID;
 				ds->device_id = CURSOR_DEVICE_ID;
 				ds->proximity = (event->value != 0);
@@ -998,15 +1005,23 @@ static void usbParseChannel(LocalDeviceP
 				DBG(6, common->debugLevel, ErrorF(
 					"USB Pad detected %x (value=%d)\n",
 					event->code, event->value));
+				local_device_type = PAD_ID;
 				ds->device_type = PAD_ID;
 				ds->device_id = PAD_DEVICE_ID;
 				ds->proximity = (event->value != 0);
 			}
-			else if (event->code == BTN_TOUCH)
+			else if (
+               (event->code == BTN_TOOL_BRUSH) ||
+               (event->code == BTN_TOUCH)
+               )
 			{
 				DBG(6, common->debugLevel, ErrorF(
 					"USB Touch detected %x (value=%d)\n",
 					event->code, event->value));
+            //if(local_device_type==-1)
+            if(event->value && ! (ds->device_type == STYLUS_ID && ds->proximity))
+            {
+				local_device_type = TOUCH_ID;
 				ds->device_type = TOUCH_ID;
 				ds->device_id = TOUCH_DEVICE_ID;
 				ds->proximity = event->value;
@@ -1016,6 +1031,7 @@ static void usbParseChannel(LocalDeviceP
 				 */
 				if (common->wcmCapacityDefault < 0)
 					MOD_BUTTONS (0, event->value);
+            }
 			}
 			else if ((event->code == BTN_STYLUS) ||
 				(event->code == BTN_MIDDLE))
