Index: uspace/lib/libdrv/generic/driver.c
===================================================================
--- uspace/lib/libdrv/generic/driver.c	(revision 7f8b5815070a70217f19184d31a4e8837c21346f)
+++ uspace/lib/libdrv/generic/driver.c	(revision 2300b9d16356af1c2c6e7ca022000eaa4cff16d8)
@@ -81,8 +81,10 @@
 
 static void driver_irq_handler(ipc_callid_t iid, ipc_call_t *icall)
-{
+{	
 	int id = (int)IPC_GET_METHOD(*icall);
 	interrupt_context_t *ctx = find_interrupt_context_by_id(&interrupt_contexts, id);
-	(*ctx->handler)(ctx->dev, iid, icall);	
+	if (NULL != ctx && NULL != ctx->handler) {
+		(*ctx->handler)(ctx->dev, iid, icall);		
+	}
 }
 
Index: uspace/srv/drivers/serial/serial.c
===================================================================
--- uspace/srv/drivers/serial/serial.c	(revision 7f8b5815070a70217f19184d31a4e8837c21346f)
+++ uspace/srv/drivers/serial/serial.c	(revision 2300b9d16356af1c2c6e7ca022000eaa4cff16d8)
@@ -242,10 +242,14 @@
 	serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;
 	
+	int res;
 	// enable interrupt globally	
-	enable_interrupt(data->irq);
+	printf(NAME ": call  enable_interrupt\n");
+	if (EOK != (res = interrupt_enable(data->irq))) {
+		return res;
+	}
 	
 	// enable interrupt on the serial port
 	pio_write_8(data->port + 1 , 0x01);   // Interrupt when data received
-	pio_write_8(data->port + 4, 0x0B);
+	pio_write_8(data->port + 4, 0x0B);	
 	
 	return EOK;
@@ -267,7 +271,13 @@
 }
 
-static void serial_interrupt_handler(device_t *dev, ipc_callid_t iid, ipc_call_t *icall)
-{
-	// TODO 
+static void serial_read_from_device(device_t *dev)
+{
+	// TODO
+}
+
+static inline void serial_interrupt_handler(device_t *dev, ipc_callid_t iid, ipc_call_t *icall)
+{
+	printf(NAME ": interrupt received.\n");
+	serial_read_from_device(dev);
 }
 
@@ -276,6 +286,12 @@
 	serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;
 	
-	return register_interrupt_handler(dev, data->irq, serial_interrupt_handler, NULL);
-	
+	return register_interrupt_handler(dev, data->irq, serial_interrupt_handler, NULL);	
+}
+
+static inline int serial_unregister_interrupt_handler(device_t *dev)
+{
+	serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;
+	
+	return unregister_interrupt_handler(dev, data->irq);	
 }
 
@@ -304,13 +320,19 @@
 	
 	// register interrupt handler
-	if (0 != serial_register_interrupt_handler(dev)) {
-		
-	}
-	
-	// enable interrupt
-	if (0 != (res = serial_interrupt_enable(dev))) {
+	if (EOK != serial_register_interrupt_handler(dev)) {
+		printf(NAME ": failed to register interrupt handler.\n");
 		serial_dev_cleanup(dev);
 		return res;
+	}
+	
+	// enable interrupt
+	if (EOK != (res = serial_interrupt_enable(dev))) {
+		printf(NAME ": failed to enable the interrupt. Error code = %d.\n", res);
+		serial_dev_cleanup(dev);
+		serial_unregister_interrupt_handler(dev);
+		return res;
 	}		
+	
+	printf(NAME ": the %s device has been successfully initialized.\n", dev->name);
 	
 	return EOK;
