--- vte-0.13.7/src/vte.c	2006-08-24 21:18:06.000000000 +0100
+++ vte-0.13.7.patched/src/vte.c	2007-05-25 21:23:50.599698000 +0100
@@ -1453,20 +1453,20 @@
 	}
 }
 
-/* Scroll up or down in the current screen. */
+/* Scroll a fixed number of lines up or down in the current screen. */
 static void
-vte_terminal_scroll_pages(VteTerminal *terminal, gint pages)
+vte_terminal_scroll_lines(VteTerminal *terminal, gint lines)
 {
 	glong destination;
 	g_assert(VTE_IS_TERMINAL(terminal));
 #ifdef VTE_DEBUG
 	if (_vte_debug_on(VTE_DEBUG_IO)) {
-		fprintf(stderr, "Scrolling %d pages.\n", pages);
+		fprintf(stderr, "Scrolling %d lines.\n", lines);
 	}
 #endif
 	/* Calculate the ideal position where we want to be before clamping. */
 	destination = floor(gtk_adjustment_get_value(terminal->adjustment));
-	destination += (pages * terminal->row_count);
+	destination += lines;
 	/* Can't scroll past data we have. */
 	destination = CLAMP(destination,
 			    terminal->adjustment->lower,
@@ -3964,10 +3964,28 @@
 			}
 			break;
 		/* Keypad/motion keys. */
+		case GDK_KP_Up:
+		case GDK_Up:
+			if (terminal->pvt->modifiers & GDK_SHIFT_MASK) {
+				vte_terminal_scroll_lines(terminal, -1);
+				scrolled = TRUE;
+				handled = TRUE;
+				suppress_meta_esc = TRUE;
+			}
+			break;
+		case GDK_KP_Down:
+		case GDK_Down:
+			if (terminal->pvt->modifiers & GDK_SHIFT_MASK) {
+				vte_terminal_scroll_lines(terminal, 1);
+				scrolled = TRUE;
+				handled = TRUE;
+				suppress_meta_esc = TRUE;
+			}
+			break;
 		case GDK_KP_Page_Up:
 		case GDK_Page_Up:
 			if (terminal->pvt->modifiers & GDK_SHIFT_MASK) {
-				vte_terminal_scroll_pages(terminal, -1);
+				vte_terminal_scroll_lines(terminal, -terminal->row_count/2);
 				scrolled = TRUE;
 				handled = TRUE;
 				suppress_meta_esc = TRUE;
@@ -3976,7 +3994,7 @@
 		case GDK_KP_Page_Down:
 		case GDK_Page_Down:
 			if (terminal->pvt->modifiers & GDK_SHIFT_MASK) {
-				vte_terminal_scroll_pages(terminal, 1);
+				vte_terminal_scroll_lines(terminal, terminal->row_count/2);
 				scrolled = TRUE;
 				handled = TRUE;
 				suppress_meta_esc = TRUE;
