Index: uspace/drv/ohci/hc.c
===================================================================
--- uspace/drv/ohci/hc.c	(revision c92c13f6c4447ba4a35cc8863976d36af27f26a2)
+++ uspace/drv/ohci/hc.c	(revision 7102aa59b743600ad06edfdc84edb29ae4045e4f)
@@ -45,11 +45,6 @@
 #include "hc.h"
 
-static int dummy_reset(int foo, void *arg)
-{
-	hc_t *hc = (hc_t*)arg;
-	assert(hc);
-	hc->rh.address = 0;
-	return EOK;
-}
+static int dummy_reset(int foo, void *arg);
+static int interrupt_emulator(hc_t *instance);
 /*----------------------------------------------------------------------------*/
 int hc_init(hc_t *instance, ddf_fun_t *fun, ddf_dev_t *dev,
@@ -66,4 +61,10 @@
 	instance->ddf_instance = fun;
 	usb_device_keeper_init(&instance->manager);
+
+	if (!interrupts) {
+		instance->interrupt_emulator =
+		    fibril_create((int(*)(void*))interrupt_emulator, instance);
+		fibril_add_ready(instance->interrupt_emulator);
+	}
 
 
@@ -99,5 +100,9 @@
 	ret = usb_hc_new_device_wrapper(dev, &conn, USB_SPEED_FULL, dummy_reset,
 	    0, instance, &address, &handle, NULL, NULL, NULL);
-	CHECK_RET_RETURN(ret, "Failed to add rh device.\n");
+	if (ret != EOK) {
+		usb_log_error("Failed to add rh device.\n");
+		instance->rh.address = -1;
+		return ret;
+	}
 
 	ret = usb_hc_connection_close(&conn);
@@ -117,10 +122,35 @@
 }
 /*----------------------------------------------------------------------------*/
-void hc_interrupt(hc_t *instance, uint16_t status)
+void hc_interrupt(hc_t *instance, uint32_t status)
 {
 	assert(instance);
-	/* TODO: Check for interrupt cause */
-	rh_interrupt(&instance->rh);
+	if (status == 0)
+		return;
+	if (status & IS_RHSC)
+		rh_interrupt(&instance->rh);
+
+	/* TODO: Check for further interrupt causes */
 	/* TODO: implement */
+}
+/*----------------------------------------------------------------------------*/
+static int dummy_reset(int foo, void *arg)
+{
+	hc_t *hc = (hc_t*)arg;
+	assert(hc);
+	hc->rh.address = 0;
+	return EOK;
+}
+/*----------------------------------------------------------------------------*/
+static int interrupt_emulator(hc_t *instance)
+{
+	assert(instance);
+	usb_log_info("Started interrupt emulator.\n");
+	while (1) {
+		uint32_t status = instance->registers->interrupt_status;
+		instance->registers->interrupt_status = status;
+		hc_interrupt(instance, status);
+		async_usleep(1000);
+	}
+	return EOK;
 }
 /**
Index: uspace/drv/ohci/hc.h
===================================================================
--- uspace/drv/ohci/hc.h	(revision c92c13f6c4447ba4a35cc8863976d36af27f26a2)
+++ uspace/drv/ohci/hc.h	(revision 7102aa59b743600ad06edfdc84edb29ae4045e4f)
@@ -54,4 +54,5 @@
 	ddf_fun_t *ddf_instance;
 	usb_device_keeper_t manager;
+	fid_t interrupt_emulator;
 } hc_t;
 
@@ -63,5 +64,5 @@
 int hc_schedule(hc_t *instance, usb_transfer_batch_t *batch);
 
-void hc_interrupt(hc_t *instance, uint16_t status);
+void hc_interrupt(hc_t *instance, uint32_t status);
 
 /** Safely dispose host controller internal structures
Index: uspace/drv/ohci/ohci_regs.h
===================================================================
--- uspace/drv/ohci/ohci_regs.h	(revision c92c13f6c4447ba4a35cc8863976d36af27f26a2)
+++ uspace/drv/ohci/ohci_regs.h	(revision 7102aa59b743600ad06edfdc84edb29ae4045e4f)
@@ -43,4 +43,12 @@
 	volatile uint32_t command_status;
 	volatile uint32_t interrupt_status;
+#define IS_SO (1 << 0)
+#define IS_WDH (1 << 1)
+#define IS_SF (1 << 2)
+#define IS_RD (1 << 3)
+#define IS_UE (1 << 4)
+#define IS_FNO (1 << 5)
+#define IS_RHSC (1 << 6)
+#define IS_OC (1 << 30)
 	volatile uint32_t interupt_enable;
 #define IE_SO   (1 << 0)
Index: uspace/drv/uhci-hcd/uhci_hc.c
===================================================================
--- uspace/drv/uhci-hcd/uhci_hc.c	(revision c92c13f6c4447ba4a35cc8863976d36af27f26a2)
+++ uspace/drv/uhci-hcd/uhci_hc.c	(revision 7102aa59b743600ad06edfdc84edb29ae4045e4f)
@@ -121,4 +121,6 @@
 		    fibril_create(uhci_hc_interrupt_emulator, instance);
 		fibril_add_ready(instance->cleaner);
+	} else {
+		/* TODO: enable interrupts here */
 	}
 
