Index: kernel/arch/ia32/src/drivers/ega.c
===================================================================
--- kernel/arch/ia32/src/drivers/ega.c	(revision b755225b228b383f0b91e692e42e4789bac12916)
+++ kernel/arch/ia32/src/drivers/ega.c	(revision 24a44ec161e8b3293d6f2f9ef1360e003d87831e)
@@ -39,4 +39,5 @@
 #include <mm/page.h>
 #include <mm/as.h>
+#include <mm/slab.h>
 #include <arch/mm/page.h>
 #include <synch/spinlock.h>
@@ -59,4 +60,5 @@
 static uint32_t ega_cursor;
 static uint8_t *videoram;
+static uint8_t *backbuf;
 
 static void ega_putchar(chardev_t *d, const char ch);
@@ -72,4 +74,8 @@
 {
 	uint8_t hi, lo;
+
+	backbuf = (uint8_t *) malloc(SCREEN * 2, 0);
+	if (!backbuf)
+		panic("Unable to allocate backbuffer.\n");
 	
 	videoram = (uint8_t *) hw_map(VIDEORAM, SCREEN * 2);
@@ -99,4 +105,5 @@
 {
 	videoram[ega_cursor * 2] = ch;
+	backbuf[ega_cursor * 2] = ch;
 }
 
@@ -109,6 +116,8 @@
 		return;
 
-	memcpy((void *) videoram, (void *) (videoram + ROW * 2), (SCREEN - ROW) * 2);
+	memmove((void *) videoram, (void *) (videoram + ROW * 2), (SCREEN - ROW) * 2);
+	memmove((void *) backbuf, (void *) (backbuf + ROW * 2), (SCREEN - ROW) * 2);
 	memsetw(videoram + (SCREEN - ROW) * 2, ROW, 0x0720);
+	memsetw(backbuf + (SCREEN - ROW) * 2, ROW, 0x0720);
 	ega_cursor = ega_cursor - ROW;
 }
@@ -152,4 +161,10 @@
 }
 
+void ega_redraw(void)
+{
+	memcpy(videoram, backbuf, SCREEN * 2);
+	ega_move_cursor();
+}
+
 /** @}
  */
