Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision 888c06e05177b71e23a0f4f5636be16622ad9463)
+++ kernel/genarch/src/fb/fb.c	(revision eb2187c4b32d71314ef8e18b14cf7c74dd74473d)
@@ -267,4 +267,57 @@
 }
 
+/** Scroll screen down by one row
+ *
+ */
+static void screen_scroll(fb_instance_t *instance)
+{
+	if ((!instance->parea.mapped) || (console_override)) {
+		for (unsigned int rel_row = 0; rel_row < instance->screen_rows; rel_row++) {
+			unsigned int y = ROW2Y(rel_row);
+			unsigned int row = rel_row + instance->offset_row;
+
+			for (unsigned int yd = 0; yd < FONT_SCANLINES; yd++) {
+				unsigned int x;
+				unsigned int col;
+				size_t bb_pos = BB_POS(instance, 0, row);
+				size_t bb_pos1 = BB_POS(instance, 0, row + 1);
+
+				for (col = 0, x = 0; col < instance->cols;
+				    col++, x += FONT_WIDTH) {
+					uint16_t glyph;
+
+					if (row < instance->rows - 1) {
+						if (instance->backbuf[bb_pos] ==
+						    instance->backbuf[bb_pos1])
+							goto skip;
+
+						glyph = instance->backbuf[bb_pos1];
+					} else
+						glyph = 0;
+
+					memcpy(&instance->addr[FB_POS(instance, x, y + yd)],
+					    &instance->glyphs[GLYPH_POS(instance, glyph, yd)],
+					    instance->glyphscanline);
+				skip:
+					BB_NEXT_COL(bb_pos);
+					BB_NEXT_COL(bb_pos1);
+				}
+			}
+		}
+	}
+
+	/*
+	 * Implement backbuffer scrolling by wrapping around
+	 * the cyclic buffer.
+	 */
+
+	instance->start_row++;
+	if (instance->start_row == instance->rows)
+		instance->start_row = 0;
+
+	memsetw(&instance->backbuf[BB_POS(instance, 0, instance->rows - 1)],
+	    instance->cols, 0);
+}
+
 static void cursor_put(fb_instance_t *instance)
 {
@@ -365,23 +418,4 @@
 			memcpy(&instance->addr[FB_POS(instance, 0, y)],
 			    instance->bgscan, instance->bgscanbytes);
-	}
-}
-
-/** Scroll screen down by one row
- *
- */
-static void screen_scroll(fb_instance_t *instance)
-{
-	/*
-	 * Implement backbuffer scrolling by wrapping around
-	 * the cyclic buffer.
-	 */
-
-	instance->start_row++;
-	if (instance->start_row == instance->rows)
-		instance->start_row = 0;
-
-	if ((!instance->parea.mapped) || (console_override)) {
-		fb_redraw_internal(instance);
 	}
 }
