Index: uspace/drv/nic/virtio-net/virtio-net.c
===================================================================
--- uspace/drv/nic/virtio-net/virtio-net.c	(revision 848e880fda73cd0edc7152878b52d08a679cd828)
+++ uspace/drv/nic/virtio-net/virtio-net.c	(revision fe96085bcf6c380399cf9a2766b34890d9f087a3)
@@ -34,4 +34,5 @@
 #include <as.h>
 #include <ddf/driver.h>
+#include <ddf/interrupt.h>
 #include <ddf/log.h>
 #include <ops/nic.h>
@@ -68,4 +69,9 @@
 };
 
+static void virtio_net_irq_handler(ipc_call_t *icall, ddf_dev_t *dev)
+{
+	ddf_msg(LVL_NOTE, "Got interrupt");
+}
+
 static errno_t virtio_net_setup_bufs(unsigned int buffers, size_t size,
     bool write, void *buf[], uintptr_t buf_p[])
@@ -112,8 +118,64 @@
 }
 
+static errno_t virtio_net_register_interrupt(ddf_dev_t *dev)
+{
+	nic_t *nic = ddf_dev_data_get(dev);
+	virtio_net_t *virtio_net = nic_get_specific(nic);
+	virtio_dev_t *vdev = &virtio_net->virtio_dev;
+
+	hw_res_list_parsed_t res;
+	hw_res_list_parsed_init(&res);
+
+	errno_t rc = nic_get_resources(nic, &res);
+	if (rc != EOK)
+		return rc;
+
+	if (res.irqs.count < 1) {
+		hw_res_list_parsed_clean(&res);
+		rc = EINVAL;
+		return rc;
+	}
+
+	virtio_net->irq = res.irqs.irqs[0];
+	hw_res_list_parsed_clean(&res);
+
+	irq_pio_range_t pio_ranges[] = {
+		{
+			.base = vdev->isr_phys,
+			.size = sizeof(vdev->isr_phys),
+		}
+	};
+
+	irq_cmd_t irq_commands[] = {
+		{
+			.cmd = CMD_PIO_READ_8,
+			.addr = (void *) vdev->isr_phys,
+			.dstarg = 2
+		},
+		{
+			.cmd = CMD_PREDICATE,
+			.value = 1,
+			.srcarg = 2
+		},
+		{
+			.cmd = CMD_ACCEPT
+		}
+	};
+
+	irq_code_t irq_code = {
+		.rangecount = sizeof(pio_ranges) / sizeof(irq_pio_range_t),
+		.ranges = pio_ranges,
+		.cmdcount = sizeof(irq_commands) / sizeof(irq_cmd_t),
+		.cmds = irq_commands
+	};
+
+	return register_interrupt_handler(dev, virtio_net->irq,
+	    virtio_net_irq_handler, &irq_code, &virtio_net->irq_handle);
+}
+
 static errno_t virtio_net_initialize(ddf_dev_t *dev)
 {
-	nic_t *nic_data = nic_create_and_bind(dev);
-	if (!nic_data)
+	nic_t *nic = nic_create_and_bind(dev);
+	if (!nic)
 		return ENOMEM;
 
@@ -124,5 +186,5 @@
 	}
 
-	nic_set_specific(nic_data, virtio_net);
+	nic_set_specific(nic, virtio_net);
 
 	errno_t rc = virtio_pci_dev_initialize(dev, &virtio_net->virtio_dev);
@@ -133,4 +195,11 @@
 	virtio_pci_common_cfg_t *cfg = virtio_net->virtio_dev.common_cfg;
 	virtio_net_cfg_t *netcfg = virtio_net->virtio_dev.device_cfg;
+
+	/*
+	 * Register IRQ
+	 */
+	rc = virtio_net_register_interrupt(dev);
+	if (rc != EOK)
+		goto fail;
 
 	/* Reset the device and negotiate the feature bits */
@@ -216,5 +285,5 @@
 	for (unsigned i = 0; i < 6; i++)
 		nic_addr.address[i] = pio_read_8(&netcfg->mac[i]);
-	rc = nic_report_address(nic_data, &nic_addr);
+	rc = nic_report_address(nic, &nic_addr);
 	if (rc != EOK)
 		goto fail;
@@ -223,4 +292,16 @@
 	    nic_addr.address[0], nic_addr.address[1], nic_addr.address[2],
 	    nic_addr.address[3], nic_addr.address[4], nic_addr.address[5]);
+
+	/*
+	 * Enable IRQ
+	 */
+	rc = hw_res_enable_interrupt(ddf_dev_parent_sess_get(dev),
+	    virtio_net->irq);
+	if (rc != EOK) {
+		ddf_msg(LVL_NOTE, "Failed to enable interrupt");
+		goto fail;
+	}
+
+	ddf_msg(LVL_NOTE, "Registered IRQ %d", virtio_net->irq);
 
 	/* Go live */
@@ -320,6 +401,6 @@
     nic_device_info_t *info)
 {
-	nic_t *nic_data = nic_get_from_ddf_fun(fun);
-	if (!nic_data)
+	nic_t *nic = nic_get_from_ddf_fun(fun);
+	if (!nic)
 		return ENOENT;
 
Index: uspace/drv/nic/virtio-net/virtio-net.h
===================================================================
--- uspace/drv/nic/virtio-net/virtio-net.h	(revision 848e880fda73cd0edc7152878b52d08a679cd828)
+++ uspace/drv/nic/virtio-net/virtio-net.h	(revision fe96085bcf6c380399cf9a2766b34890d9f087a3)
@@ -31,4 +31,5 @@
 
 #include <virtio-pci.h>
+#include <abi/cap.h>
 
 #define RX_BUFFERS	8
@@ -60,4 +61,7 @@
 	uint16_t tx_free_head;
 	uint16_t ct_free_head;
+
+	int irq;
+	cap_irq_handle_t irq_handle;
 } virtio_net_t;
 
Index: uspace/lib/virtio/virtio-pci.c
===================================================================
--- uspace/lib/virtio/virtio-pci.c	(revision 848e880fda73cd0edc7152878b52d08a679cd828)
+++ uspace/lib/virtio/virtio-pci.c	(revision fe96085bcf6c380399cf9a2766b34890d9f087a3)
@@ -100,6 +100,8 @@
 
 	vdev->isr = vdev->bar[bar].mapped_base + offset;
-
-	ddf_msg(LVL_NOTE, "isr=%p", vdev->isr);
+	vdev->isr_phys = vdev->bar[bar].phys_base + offset;
+
+	ddf_msg(LVL_NOTE, "isr=%p (phys=%#" PRIxn ")", vdev->isr,
+	    vdev->isr_phys);
 }
 
Index: uspace/lib/virtio/virtio-pci.h
===================================================================
--- uspace/lib/virtio/virtio-pci.h	(revision 848e880fda73cd0edc7152878b52d08a679cd828)
+++ uspace/lib/virtio/virtio-pci.h	(revision fe96085bcf6c380399cf9a2766b34890d9f087a3)
@@ -167,4 +167,5 @@
 	/** INT#x interrupt ISR register */
 	ioport8_t *isr;
+	uintptr_t isr_phys;
 
 	/** Device-specific configuration */
