Index: uspace/lib/drv/generic/driver.c
===================================================================
--- uspace/lib/drv/generic/driver.c	(revision 3afcf68458411c50a4d1233505058c6e2a12f946)
+++ uspace/lib/drv/generic/driver.c	(revision 2896ff65b4eed4511ef35ea3d5cc318dff981aa2)
@@ -599,29 +599,16 @@
 }
 
-/** Create session with the parent function.
- *
- * The session will be automatically closed when @a dev is destroyed.
- *
- * @param dev Device
- *
- * @return New session or NULL if session could not be created
- *
- */
-async_sess_t *ddf_dev_parent_sess_create(ddf_dev_t *dev)
-{
-	assert(dev->parent_sess == NULL);
-	dev->parent_sess = devman_parent_device_connect(dev->handle,
-	    IPC_FLAG_BLOCKING);
-
-	return dev->parent_sess;
-}
-
 /** Return existing session with the parent function.
  *
  * @param dev	Device
- * @return	Existing session or NULL if there is no session
+ * @return	Session with parent function or NULL upon failure
  */
 async_sess_t *ddf_dev_parent_sess_get(ddf_dev_t *dev)
 {
+	if (dev->parent_sess == NULL) {
+		dev->parent_sess = devman_parent_device_connect(dev->handle,
+		    IPC_FLAG_BLOCKING);
+	}
+
 	return dev->parent_sess;
 }
@@ -943,11 +930,15 @@
 	int rc = async_create_port(INTERFACE_DDF_DRIVER, driver_connection_driver,
 	    NULL, &port);
-	if (rc != EOK)
+	if (rc != EOK) {
+		printf("Error: Failed to create driver port.\n");
 		return rc;
+	}
 	
 	rc = async_create_port(INTERFACE_DDF_DEVMAN, driver_connection_devman,
 	    NULL, &port);
-	if (rc != EOK)
+	if (rc != EOK) {
+		printf("Error: Failed to create devman port.\n");
 		return rc;
+	}
 	
 	async_set_fallback_port_handler(driver_connection_client, NULL);
@@ -964,6 +955,8 @@
 	/* Return success from the task since server has started. */
 	rc = task_retval(0);
-	if (rc != EOK)
+	if (rc != EOK) {
+		printf("Error: Failed returning task value.\n");
 		return rc;
+	}
 	
 	async_manager();
Index: uspace/lib/drv/generic/interrupt.c
===================================================================
--- uspace/lib/drv/generic/interrupt.c	(revision 3afcf68458411c50a4d1233505058c6e2a12f946)
+++ uspace/lib/drv/generic/interrupt.c	(revision 2896ff65b4eed4511ef35ea3d5cc318dff981aa2)
@@ -44,13 +44,13 @@
 
 int register_interrupt_handler(ddf_dev_t *dev, int irq,
-    interrupt_handler_t *handler, const irq_code_t *pseudocode)
+    interrupt_handler_t *handler, const irq_code_t *irq_code)
 {
-	return async_irq_subscribe(irq, dev->handle,
-	    (async_notification_handler_t) handler, dev, pseudocode);
+	return async_irq_subscribe(irq, (async_notification_handler_t) handler,
+	    dev, irq_code);
 }
 
-int unregister_interrupt_handler(ddf_dev_t *dev, int irq)
+int unregister_interrupt_handler(ddf_dev_t *dev, int cap)
 {
-	return async_irq_unsubscribe(irq, dev->handle);
+	return async_irq_unsubscribe(cap);
 }
 
Index: uspace/lib/drv/generic/remote_hw_res.c
===================================================================
--- uspace/lib/drv/generic/remote_hw_res.c	(revision 3afcf68458411c50a4d1233505058c6e2a12f946)
+++ uspace/lib/drv/generic/remote_hw_res.c	(revision 2896ff65b4eed4511ef35ea3d5cc318dff981aa2)
@@ -45,4 +45,8 @@
 static void remote_hw_res_enable_interrupt(ddf_fun_t *, void *, ipc_callid_t,
     ipc_call_t *);
+static void remote_hw_res_disable_interrupt(ddf_fun_t *, void *, ipc_callid_t,
+    ipc_call_t *);
+static void remote_hw_res_clear_interrupt(ddf_fun_t *, void *, ipc_callid_t,
+    ipc_call_t *);
 static void remote_hw_res_dma_channel_setup(ddf_fun_t *, void *, ipc_callid_t,
     ipc_call_t *);
@@ -53,4 +57,6 @@
 	[HW_RES_GET_RESOURCE_LIST] = &remote_hw_res_get_resource_list,
 	[HW_RES_ENABLE_INTERRUPT] = &remote_hw_res_enable_interrupt,
+	[HW_RES_DISABLE_INTERRUPT] = &remote_hw_res_disable_interrupt,
+	[HW_RES_CLEAR_INTERRUPT] = &remote_hw_res_clear_interrupt,
 	[HW_RES_DMA_CHANNEL_SETUP] = &remote_hw_res_dma_channel_setup,
 	[HW_RES_DMA_CHANNEL_REMAIN] = &remote_hw_res_dma_channel_remain,
@@ -67,10 +73,42 @@
 	hw_res_ops_t *hw_res_ops = (hw_res_ops_t *) ops;
 	
-	if (hw_res_ops->enable_interrupt == NULL)
+	if (hw_res_ops->enable_interrupt == NULL) {
 		async_answer_0(callid, ENOTSUP);
-	else if (hw_res_ops->enable_interrupt(fun))
-		async_answer_0(callid, EOK);
-	else
-		async_answer_0(callid, EREFUSED);
+		return;
+	}
+	
+	const int irq = DEV_IPC_GET_ARG1(*call);
+	const int ret = hw_res_ops->enable_interrupt(fun, irq);
+	async_answer_0(callid, ret);
+}
+
+static void remote_hw_res_disable_interrupt(ddf_fun_t *fun, void *ops,
+    ipc_callid_t callid, ipc_call_t *call)
+{
+	hw_res_ops_t *hw_res_ops = (hw_res_ops_t *) ops;
+	
+	if (hw_res_ops->disable_interrupt == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+	
+	const int irq = DEV_IPC_GET_ARG1(*call);
+	const int ret = hw_res_ops->disable_interrupt(fun, irq);
+	async_answer_0(callid, ret);
+}
+
+static void remote_hw_res_clear_interrupt(ddf_fun_t *fun, void *ops,
+    ipc_callid_t callid, ipc_call_t *call)
+{
+	hw_res_ops_t *hw_res_ops = (hw_res_ops_t *) ops;
+	
+	if (hw_res_ops->clear_interrupt == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+	
+	const int irq = DEV_IPC_GET_ARG1(*call);
+	const int ret = hw_res_ops->enable_interrupt(fun, irq);
+	async_answer_0(callid, ret);
 }
 
Index: uspace/lib/drv/include/ddf/driver.h
===================================================================
--- uspace/lib/drv/include/ddf/driver.h	(revision 3afcf68458411c50a4d1233505058c6e2a12f946)
+++ uspace/lib/drv/include/ddf/driver.h	(revision 2896ff65b4eed4511ef35ea3d5cc318dff981aa2)
@@ -117,5 +117,4 @@
 extern devman_handle_t ddf_dev_get_handle(ddf_dev_t *);
 extern const char *ddf_dev_get_name(ddf_dev_t *);
-extern async_sess_t *ddf_dev_parent_sess_create(ddf_dev_t *);
 extern async_sess_t *ddf_dev_parent_sess_get(ddf_dev_t *);
 extern ddf_fun_t *ddf_fun_create(ddf_dev_t *, fun_type_t, const char *);
Index: uspace/lib/drv/include/ddf/interrupt.h
===================================================================
--- uspace/lib/drv/include/ddf/interrupt.h	(revision 3afcf68458411c50a4d1233505058c6e2a12f946)
+++ uspace/lib/drv/include/ddf/interrupt.h	(revision 2896ff65b4eed4511ef35ea3d5cc318dff981aa2)
@@ -37,5 +37,5 @@
 
 #include <libarch/common.h>
-#include <libarch/types.h>
+#include <types/common.h>
 #include <abi/ddi/irq.h>
 #include <adt/list.h>
Index: uspace/lib/drv/include/ops/hw_res.h
===================================================================
--- uspace/lib/drv/include/ops/hw_res.h	(revision 3afcf68458411c50a4d1233505058c6e2a12f946)
+++ uspace/lib/drv/include/ops/hw_res.h	(revision 2896ff65b4eed4511ef35ea3d5cc318dff981aa2)
@@ -44,5 +44,7 @@
 typedef struct {
 	hw_resource_list_t *(*get_resource_list)(ddf_fun_t *);
-	bool (*enable_interrupt)(ddf_fun_t *);
+	int (*enable_interrupt)(ddf_fun_t *, int);
+	int (*disable_interrupt)(ddf_fun_t *, int);
+	int (*clear_interrupt)(ddf_fun_t *, int);
 	int (*dma_channel_setup)(ddf_fun_t *, unsigned, uint32_t, uint32_t, uint8_t);
 	int (*dma_channel_remain)(ddf_fun_t *, unsigned, size_t *);
