Index: arch/ia32/src/drivers/ega.c
===================================================================
--- arch/ia32/src/drivers/ega.c	(revision f7f6f258f11ea7fa2e036886d7e08ce0072288a6)
+++ arch/ia32/src/drivers/ega.c	(revision e8a9dc377795653528971e5e91a41ab7edea3ae2)
@@ -100,11 +100,15 @@
 
 	switch (ch) {
-	    case '\n':
+	case '\n':
 		ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW;
 		break;
-	    case '\t':
+	case '\t':
 		ega_cursor = (ega_cursor + 8) - ega_cursor % 8;
 		break; 
-	    default:
+	case '\b':
+		if (ega_cursor % ROW)
+			ega_cursor--;
+		break;
+	default:
 		ega_display_char(ch);
 		ega_cursor++;
Index: arch/ia32/src/drivers/i8042.c
===================================================================
--- arch/ia32/src/drivers/i8042.c	(revision f7f6f258f11ea7fa2e036886d7e08ce0072288a6)
+++ arch/ia32/src/drivers/i8042.c	(revision e8a9dc377795653528971e5e91a41ab7edea3ae2)
@@ -82,5 +82,5 @@
 	SPECIAL, /* 0x01 - Esc */
 	'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=',
-	SPECIAL, /* 0x0e - Backspace */
+	'\b', /* 0x0e - Backspace */
 	'\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n',
 	SPECIAL, /* 0x1d - LCtrl */
Index: arch/mips32/src/drivers/arc.c
===================================================================
--- arch/mips32/src/drivers/arc.c	(revision f7f6f258f11ea7fa2e036886d7e08ce0072288a6)
+++ arch/mips32/src/drivers/arc.c	(revision e8a9dc377795653528971e5e91a41ab7edea3ae2)
@@ -210,5 +210,7 @@
 	if (ch == '\r')
 		ch = '\n';
-
+	if (ch == 0x7f)
+		ch = '\b';
+	
 	chardev_push_character(&console, ch);
 }
Index: arch/mips32/src/drivers/msim.c
===================================================================
--- arch/mips32/src/drivers/msim.c	(revision f7f6f258f11ea7fa2e036886d7e08ce0072288a6)
+++ arch/mips32/src/drivers/msim.c	(revision e8a9dc377795653528971e5e91a41ab7edea3ae2)
@@ -62,4 +62,5 @@
 }
 
+#include <print.h>
 /** Process keyboard interrupt. */
 static void msim_interrupt(int n, void *stack)
@@ -70,4 +71,6 @@
 	if (ch =='\r')
 		ch = '\n';
+	if (ch == 0x7f)
+		ch = '\b';
 	chardev_push_character(&console, ch);
 }
Index: generic/src/console/chardev.c
===================================================================
--- generic/src/console/chardev.c	(revision f7f6f258f11ea7fa2e036886d7e08ce0072288a6)
+++ generic/src/console/chardev.c	(revision e8a9dc377795653528971e5e91a41ab7edea3ae2)
@@ -63,5 +63,4 @@
 	}
 
-	putchar(ch);
         chardev->buffer[chardev->index++] = ch;
         chardev->index = chardev->index % CHARDEV_BUFLEN; /* index modulo size of buffer */
Index: generic/src/console/console.c
===================================================================
--- generic/src/console/console.c	(revision f7f6f258f11ea7fa2e036886d7e08ce0072288a6)
+++ generic/src/console/console.c	(revision e8a9dc377795653528971e5e91a41ab7edea3ae2)
@@ -40,4 +40,28 @@
 chardev_t *stdout = NULL;
 
+/** Get character from character device.
+ *
+ * @param chardev Character device.
+ *
+ * @return Character read.
+ */
+static __u8 _getc(chardev_t *chardev)
+{
+	__u8 ch;
+	ipl_t ipl;
+
+	waitq_sleep(&chardev->wq);
+	ipl = interrupts_disable();
+	spinlock_lock(&chardev->lock);
+	ch = chardev->buffer[(chardev->index - chardev->counter) % CHARDEV_BUFLEN];
+	chardev->counter--;
+	spinlock_unlock(&chardev->lock);
+	interrupts_restore(ipl);
+
+	chardev->op->resume(chardev);
+
+	return ch;
+}
+
 /** Get string from character device.
  *
@@ -57,5 +81,17 @@
 
 	while (index < buflen) {
-		ch = getc(chardev);
+		ch = _getc(chardev);
+		if (ch == '\b') {
+			if (index > 0) {
+				index--;
+				/* Space backspace, space */
+				putchar('\b');
+				putchar(' ');
+				putchar('\b');
+			}
+			continue;
+		} 
+		putchar(ch);
+
 		if (ch == '\n') { /* end of string => write 0, return */
 			buf[index] = '\0';
@@ -67,25 +103,11 @@
 }
 
-/** Get character from character device.
- *
- * @param chardev Character device.
- *
- * @return Character read.
- */
+/** Get character from device & echo it to screen */
 __u8 getc(chardev_t *chardev)
 {
 	__u8 ch;
-	ipl_t ipl;
 
-	waitq_sleep(&chardev->wq);
-	ipl = interrupts_disable();
-	spinlock_lock(&chardev->lock);
-	ch = chardev->buffer[(chardev->index - chardev->counter) % CHARDEV_BUFLEN];
-	chardev->counter--;
-	spinlock_unlock(&chardev->lock);
-	interrupts_restore(ipl);
-
-	chardev->op->resume(chardev);
-
+	ch = _getc(chardev);
+	putchar(ch);
 	return ch;
 }
