diff -Nur linux-2.6.17-gentoo-r7/drivers/input/mouse/Kconfig linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/Kconfig
--- linux-2.6.17-gentoo-r7/drivers/input/mouse/Kconfig	2006-09-07 13:18:44.000000000 +0200
+++ linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/Kconfig	2006-09-05 00:45:33.000000000 +0200
@@ -37,6 +37,13 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called psmouse.
 
+config MOUSE_TPWHEEL
+	bool "TrackPoint wheel emulation"
+	depends on MOUSE_PS2
+	help
+	  Say Y to enable the tp-scroll feature. Press middle button to scroll up and down.
+
+
 config MOUSE_SERIAL
 	tristate "Serial mouse"
 	select SERIO
diff -Nur linux-2.6.17-gentoo-r7/drivers/input/mouse/psmouse-base.c linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/psmouse-base.c
--- linux-2.6.17-gentoo-r7/drivers/input/mouse/psmouse-base.c	2006-09-07 13:18:44.000000000 +0200
+++ linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/psmouse-base.c	2006-09-05 00:48:46.000000000 +0200
@@ -128,6 +128,7 @@
 {
 	struct input_dev *dev = psmouse->dev;
 	unsigned char *packet = psmouse->packet;
+	int rel_y = packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0;
 
 	if (psmouse->pktcnt < psmouse->pktsize)
 		return PSMOUSE_GOOD_DATA;
@@ -174,15 +175,72 @@
 	}
 
 /*
+ * IBM Trackpoint wheel emulation
+ * 	Joerg Hundertmarck <joerg@hundertmarck.de>
+ * 	2006-09-05 00:35 GMT+1
+ */
+#ifdef CONFIG_MOUSE_TPWHEEL
+	if ( psmouse->type == PSMOUSE_TRACKPOINT ) {
+		/* Middle button pressed? */
+		if ( psmouse->scroll_state == 0 && (packet[0] >> 2) & 1 )
+			/* Okay, lets keep state */
+			psmouse->scroll_state = 1;
+
+		/* If the middle button was pressed */
+		if ( psmouse->scroll_state == 1 ) {
+			/* Button pressed */
+			if ( (packet[0] >> 2) & 1 ) {
+				/* Moved? */
+				if ( rel_y )
+					/* Yes, initiate wheel mode */
+					psmouse->scroll_state = 2;
+				else
+					return PSMOUSE_FULL_PACKET;
+			}
+
+			/* Button released */
+			else {
+				/* Reset scroll state */
+				psmouse->scroll_state = 0;
+
+				/* Important! Report middle button pressed
+				 * Note: scroll_state equal 0 that means Normal operation is
+				 * executed to reset the middle button state. */
+				input_report_key(dev, BTN_MIDDLE, 1);
+
+				/* Flush reported data. That's important for middle button action */
+				input_sync(dev);
+			}
+		}
+
+		/* Wheel mode? */
+		if ( psmouse->scroll_state == 2 ) {
+			/* Button already pressed */
+			if ( ((packet[0] >> 2) & 1) ) {
+				/* Rotate wheel */
+				input_report_rel(dev, REL_WHEEL, rel_y * -1);
+
+				/* Flush ... */
+				input_sync(dev);
+
+				return PSMOUSE_FULL_PACKET;
+			}
+
+			/* Button released, reset to normal mode */
+			psmouse->scroll_state = 0;
+		}
+	}
+#endif
+
+/*
  * Generic PS/2 Mouse
  */
 
 	input_report_key(dev, BTN_LEFT,    packet[0]       & 1);
 	input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1);
 	input_report_key(dev, BTN_RIGHT,  (packet[0] >> 1) & 1);
-
 	input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0);
-	input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0);
+	input_report_rel(dev, REL_Y, rel_y);
 
 	input_sync(dev);
 
@@ -597,8 +655,12 @@
 	if (max_proto > PSMOUSE_IMEX && ps2pp_init(psmouse, set_properties) == 0)
 		return PSMOUSE_PS2PP;
 
-	if (max_proto > PSMOUSE_IMEX && trackpoint_detect(psmouse, set_properties) == 0)
+	if (max_proto > PSMOUSE_IMEX && trackpoint_detect(psmouse, set_properties) == 0) {
+		/* hack preq 1 */
+		set_bit(REL_WHEEL, psmouse->dev->relbit);
+		printk(KERN_WARNING "IBM TrackPoint scrolling feature activated.\n");
 		return PSMOUSE_TRACKPOINT;
+	}
 
 /*
  * Reset to defaults in case the device got confused by extended
diff -Nur linux-2.6.17-gentoo-r7/drivers/input/mouse/psmouse.h linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/psmouse.h
--- linux-2.6.17-gentoo-r7/drivers/input/mouse/psmouse.h	2006-09-07 13:18:44.000000000 +0200
+++ linux-2.6.17-gentoo-r7-hacked/drivers/input/mouse/psmouse.h	2006-09-05 00:49:00.000000000 +0200
@@ -56,6 +56,10 @@
 	char devname[64];
 	char phys[32];
 
+#ifdef CONFIG_MOUSE_TPWHEEL
+	unsigned char scroll_state;
+#endif
+
 	unsigned int rate;
 	unsigned int resolution;
 	unsigned int resetafter;
