Index: generic/include/console/chardev.h
===================================================================
--- generic/include/console/chardev.h	(revision 26777587cc06315d26b419e506af97ae2163613a)
+++ generic/include/console/chardev.h	(revision 607c5f9ed835a2f0301c7d609f3e38c0d5e4dc77)
@@ -35,7 +35,13 @@
 #include <synch/spinlock.h>
 
-#define CHARDEV_BUFLEN 10
+#define CHARDEV_BUFLEN 512
 
-typedef void (* ready_func_t)(void);
+/* Character device operations interface. */
+struct chardev_operations {
+	void (* suspend)(void);		/**< Suspend pushing characters. */
+	void (* resume)(void);		/**< Resume pushing characters. */
+};
+
+typedef struct chardev_operations chardev_operations_t;
 
 /** Character input device. */
@@ -46,8 +52,9 @@
 	count_t counter;
 	index_t index;
-	ready_func_t ready_func;	/**< Function to re-enable input from the device. */
+	chardev_operations_t *op;	/**< Implementation of chardev operations. */
 };
 
-extern void chardev_initialize(chardev_t *chardev, ready_func_t r);
+extern void chardev_initialize(chardev_t *chardev, chardev_operations_t *op);
+void chardev_push_character(chardev_t *chardev, __u8 ch);
 
 #endif /* __CHARDEV_H__ */
Index: generic/src/console/chardev.c
===================================================================
--- generic/src/console/chardev.c	(revision 26777587cc06315d26b419e506af97ae2163613a)
+++ generic/src/console/chardev.c	(revision 607c5f9ed835a2f0301c7d609f3e38c0d5e4dc77)
@@ -28,9 +28,14 @@
 
 #include <console/chardev.h>
+#include <putchar.h>
 #include <synch/waitq.h>
 #include <synch/spinlock.h>
 
-/** Initialize character device. */
-void chardev_initialize(chardev_t *chardev, ready_func_t r)
+/** Initialize character device.
+ *
+ * @param chardev Character device.
+ * @param op Implementation of character device operations.
+ */
+void chardev_initialize(chardev_t *chardev, chardev_operations_t *op)
 {
 	waitq_initialize(&chardev->wq);
@@ -38,4 +43,25 @@
 	chardev->counter = 0;
 	chardev->index = 0;
-	chardev->ready_func = r;
+	chardev->op = op;
 }
+
+/** Push character read from input character device.
+ *
+ * @param chardev Character device.
+ * @param ch Character being pushed.
+ */
+void chardev_push_character(chardev_t *chardev, __u8 ch)
+{
+        spinlock_lock(&chardev->lock);
+	chardev->counter++;
+	if (chardev->counter == CHARDEV_BUFLEN - 1) {
+		/* buffer full => disable device interrupt */
+		chardev->op->suspend();
+	}
+
+	putchar(ch);
+        chardev->buffer[chardev->index++] = ch;
+        chardev->index = chardev->index % CHARDEV_BUFLEN; /* index modulo size of buffer */
+        waitq_wakeup(&chardev->wq, WAKEUP_FIRST);
+        spinlock_unlock(&chardev->lock);
+}
Index: generic/src/console/console.c
===================================================================
--- generic/src/console/console.c	(revision 26777587cc06315d26b419e506af97ae2163613a)
+++ generic/src/console/console.c	(revision 607c5f9ed835a2f0301c7d609f3e38c0d5e4dc77)
@@ -83,5 +83,5 @@
 	interrupts_restore(ipl);
 
-	chardev->ready_func();
+	chardev->op->resume();
 
 	return ch;
