Index: arch/ia64/include/arch.h
===================================================================
--- arch/ia64/include/arch.h	(revision 116d1ef443ca3edd56636818c5c30d58ad5bf213)
+++ arch/ia64/include/arch.h	(revision d0c59014273d37ae8d8218bc43b145fd27e12bb6)
@@ -32,3 +32,5 @@
 #define LOADED_PROG_STACK_PAGES_NO 2
 
+#include <arch/ski/ski.h>
+
 #endif
Index: arch/ia64/include/interrupt.h
===================================================================
--- arch/ia64/include/interrupt.h	(revision 116d1ef443ca3edd56636818c5c30d58ad5bf213)
+++ arch/ia64/include/interrupt.h	(revision d0c59014273d37ae8d8218bc43b145fd27e12bb6)
@@ -34,5 +34,6 @@
 #include <arch/register.h>
 
-#define IRQ_COUNT		1	/* TODO */
+#define IRQ_COUNT               257 /* 256 NOT suppotred IRQS*//* TODO */
+#define IRQ_KBD                 256 /* One simulated interrupt for ski simulator keyboard*/
 
 /** External Interrupt vectors. */
@@ -120,4 +121,5 @@
 extern void nop_handler(__u64 vector, istate_t *istate);
 extern void external_interrupt(__u64 vector, istate_t *istate);
+extern void virtual_interrupt(__u64 irq, void *param);
 extern void disabled_fp_register(__u64 vector, istate_t *istate);
 
Index: arch/ia64/include/ski/ski.h
===================================================================
--- arch/ia64/include/ski/ski.h	(revision 116d1ef443ca3edd56636818c5c30d58ad5bf213)
+++ arch/ia64/include/ski/ski.h	(revision d0c59014273d37ae8d8218bc43b145fd27e12bb6)
@@ -31,4 +31,5 @@
 
 #include <arch/types.h>
+#include <console/console.h>
 
 #define SKI_INIT_CONSOLE	20
@@ -37,5 +38,9 @@
 
 extern void ski_init_console(void);
+extern void ski_set_console_sysinfo(void);
 extern void poll_keyboard(void);
 
+extern chardev_t ski_uconsole;
+extern int kbd_uspace;
+
 #endif
Index: arch/ia64/src/ia64.c
===================================================================
--- arch/ia64/src/ia64.c	(revision 116d1ef443ca3edd56636818c5c30d58ad5bf213)
+++ arch/ia64/src/ia64.c	(revision d0c59014273d37ae8d8218bc43b145fd27e12bb6)
@@ -73,4 +73,5 @@
 void arch_post_mm_init(void)
 {
+	ski_set_console_sysinfo();
 }
 
Index: arch/ia64/src/interrupt.c
===================================================================
--- arch/ia64/src/interrupt.c	(revision 116d1ef443ca3edd56636818c5c30d58ad5bf213)
+++ arch/ia64/src/interrupt.c	(revision d0c59014273d37ae8d8218bc43b145fd27e12bb6)
@@ -45,4 +45,6 @@
 #include <proc/scheduler.h>
 #include <ipc/sysipc.h>
+#include <ipc/irq.h>
+#include <ipc/ipc.h>
 
 
@@ -53,4 +55,5 @@
 
 #define BUNDLE_SIZE		16
+
 
 char *vector_names_64_bundle[VECTORS_64_BUNDLE] = {
@@ -135,11 +138,11 @@
 	printf("Interrupted context dump:\n");
 	printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp, istate->ar_bspstore);
-	printf("ar.rnat=%#llx\tar.rsc=%$llx\n", istate->ar_rnat, istate->ar_rsc);
-	printf("ar.ifs=%#llx\tar.pfs=%#llx\n", istate->ar_ifs, istate->ar_pfs);
-	printf("cr.isr=%#llx\tcr.ipsr=%#llx\t\n", istate->cr_isr.value, istate->cr_ipsr);
+	printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat, istate->ar_rsc);
+	printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs, istate->ar_pfs);
+	printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value, istate->cr_ipsr);
 	
-	printf("cr.iip=%#llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, iip ? iip : "?");
-	printf("cr.iipa=%#llx\t(%s)\n", istate->cr_iipa, iipa ? iipa : "?");
-	printf("cr.ifa=%#llx\t(%s)\n", istate->cr_ifa, ifa ? ifa : "?");
+	printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, iip);
+	printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa);
+	printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa);
 }
 
@@ -243,8 +246,27 @@
 }
 
+void virtual_interrupt(__u64 irq,void *param)
+{
+	switch(irq) {
+		case IRQ_KBD:
+			if(kbd_uspace) ipc_irq_send_notif(irq);
+			break;
+		default:
+			panic("\nUnhandled Virtual Interrupt request %d\n", irq);
+		break;
+	}
+}
+
 /* Reregister irq to be IPC-ready */
 void irq_ipc_bind_arch(__native irq)
 {
+	if(irq==IRQ_KBD) {
+		kbd_uspace=1;
+		return;
+	}
 	panic("not implemented\n");
 	/* TODO */
 }
+
+
+
Index: arch/ia64/src/ski/ski.c
===================================================================
--- arch/ia64/src/ski/ski.c	(revision 116d1ef443ca3edd56636818c5c30d58ad5bf213)
+++ arch/ia64/src/ski/ski.c	(revision d0c59014273d37ae8d8218bc43b145fd27e12bb6)
@@ -30,7 +30,11 @@
 #include <console/console.h>
 #include <console/chardev.h>
+#include <arch/interrupt.h>
+#include <sysinfo/sysinfo.h>
 
-static chardev_t ski_console;
+chardev_t ski_console;
+chardev_t ski_uconsole;
 static bool kb_disable;
+int kbd_uspace=0;
 
 static void ski_putchar(chardev_t *d, const char ch);
@@ -112,6 +116,15 @@
 	if(ch == '\r')
 		ch = '\n'; 
-	if (ch)
-		chardev_push_character(&ski_console, ch);
+	if (ch){
+		if(kbd_uspace){
+			chardev_push_character(&ski_uconsole, ch);
+			virtual_interrupt(IRQ_KBD,NULL);
+		}
+		else {
+			chardev_push_character(&ski_console, ch);
+
+		}	
+		
+	}	
 }
 
@@ -153,5 +166,18 @@
 
 	chardev_initialize("ski_console", &ski_console, &ski_ops);
+	chardev_initialize("ski_uconsole", &ski_uconsole, &ski_ops);
 	stdin = &ski_console;
 	stdout = &ski_console;
+
 }
+/** Setup console sysinfo (i.e. Keyboard IRQ)
+ *
+ * Because sysinfo neads memory allocation/dealocation
+ * this functions should be called separetely from init.
+ *
+ */
+void ski_set_console_sysinfo(void)
+{
+	sysinfo_set_item_val("kbd",NULL,true);
+	sysinfo_set_item_val("kbd.irq",NULL,IRQ_KBD);
+}
Index: generic/include/ipc/irq.h
===================================================================
--- generic/include/ipc/irq.h	(revision 116d1ef443ca3edd56636818c5c30d58ad5bf213)
+++ generic/include/ipc/irq.h	(revision d0c59014273d37ae8d8218bc43b145fd27e12bb6)
@@ -43,4 +43,5 @@
 	CMD_PORT_READ_1,
 	CMD_PORT_WRITE_1,
+	CMD_IA64_GETCHAR,
 	CMD_LAST
 } irq_cmd_type;
Index: generic/src/ipc/irq.c
===================================================================
--- generic/src/ipc/irq.c	(revision 116d1ef443ca3edd56636818c5c30d58ad5bf213)
+++ generic/src/ipc/irq.c	(revision d0c59014273d37ae8d8218bc43b145fd27e12bb6)
@@ -49,4 +49,5 @@
 #include <atomic.h>
 #include <syscall/copy.h>
+#include <console/console.h>
 
 typedef struct {
@@ -102,4 +103,9 @@
 		case CMD_PORT_WRITE_1:
 			outb((long)code->cmds[i].addr, code->cmds[i].value);
+			break;
+#endif
+#if defined(ia64) 
+		case CMD_IA64_GETCHAR:
+			IPC_SET_ARG2(call->data, _getc(&ski_uconsole));
 			break;
 #endif
