bool                    valid;          /* are the samples valid? */
        bool                    size_detect_done;
        bool                    overflow_warned;
+       int                     fingers_old;    /* last reported finger count */
        int                     x_old;          /* last reported x/y, */
        int                     y_old;          /* used for smoothing */
        signed char             xy_cur[ATP_XSENSORS + ATP_YSENSORS];
 {
        int x, y, x_z, y_z, x_f, y_f;
        int retval, i, j;
-       int key;
+       int key, fingers;
        struct atp *dev = urb->context;
        int status = atp_status_check(urb);
 
                              dev->info->yfact, &y_z, &y_f);
        key = dev->data[dev->info->datalen - 1] & ATP_STATUS_BUTTON;
 
-       if (x && y) {
+       fingers = max(x_f, y_f);
+
+       if (x && y && fingers == dev->fingers_old) {
                if (dev->x_old != -1) {
                        x = (dev->x_old * 7 + x) >> 3;
                        y = (dev->y_old * 7 + y) >> 3;
                        input_report_abs(dev->input, ABS_Y, y);
                        input_report_abs(dev->input, ABS_PRESSURE,
                                         min(ATP_PRESSURE, x_z + y_z));
-                       atp_report_fingers(dev->input, max(x_f, y_f));
+                       atp_report_fingers(dev->input, fingers);
                }
                dev->x_old = x;
                dev->y_old = y;
        } else if (!x && !y) {
 
                dev->x_old = dev->y_old = -1;
+               dev->fingers_old = 0;
                input_report_key(dev->input, BTN_TOUCH, 0);
                input_report_abs(dev->input, ABS_PRESSURE, 0);
                atp_report_fingers(dev->input, 0);
                memset(dev->xy_acc, 0, sizeof(dev->xy_acc));
        }
 
+       if (fingers != dev->fingers_old)
+               dev->x_old = dev->y_old = -1;
+       dev->fingers_old = fingers;
+
        input_report_key(dev->input, BTN_LEFT, key);
        input_sync(dev->input);
 
 {
        int x, y, x_z, y_z, x_f, y_f;
        int retval, i, j;
-       int key;
+       int key, fingers;
        struct atp *dev = urb->context;
        int status = atp_status_check(urb);
 
 
        key = dev->data[dev->info->datalen - 1] & ATP_STATUS_BUTTON;
 
-       if (x && y) {
+       fingers = max(x_f, y_f);
+
+       if (x && y && fingers == dev->fingers_old) {
                if (dev->x_old != -1) {
                        x = (dev->x_old * 7 + x) >> 3;
                        y = (dev->y_old * 7 + y) >> 3;
                        input_report_abs(dev->input, ABS_Y, y);
                        input_report_abs(dev->input, ABS_PRESSURE,
                                         min(ATP_PRESSURE, x_z + y_z));
-                       atp_report_fingers(dev->input, max(x_f, y_f));
+                       atp_report_fingers(dev->input, fingers);
                }
                dev->x_old = x;
                dev->y_old = y;
        } else if (!x && !y) {
 
                dev->x_old = dev->y_old = -1;
+               dev->fingers_old = 0;
                input_report_key(dev->input, BTN_TOUCH, 0);
                input_report_abs(dev->input, ABS_PRESSURE, 0);
                atp_report_fingers(dev->input, 0);
                memset(dev->xy_acc, 0, sizeof(dev->xy_acc));
        }
 
+       if (fingers != dev->fingers_old)
+               dev->x_old = dev->y_old = -1;
+       dev->fingers_old = fingers;
+
        input_report_key(dev->input, BTN_LEFT, key);
        input_sync(dev->input);