Index: uspace/app/tmon/commands.h
===================================================================
--- uspace/app/tmon/commands.h	(revision cec130b59435e0b961988adaf7952d4f54d3c38d)
+++ uspace/app/tmon/commands.h	(revision e9d600c20d03e61842f0bffa983b376a8da9fff0)
@@ -38,4 +38,6 @@
 
 int tmon_list(int, char **);
+int tmon_stress_intr_in(int, char **);
+int tmon_stress_intr_out(int, char **);
 int tmon_stress_bulk_in(int, char **);
 int tmon_stress_bulk_out(int, char **);
Index: uspace/app/tmon/main.c
===================================================================
--- uspace/app/tmon/main.c	(revision cec130b59435e0b961988adaf7952d4f54d3c38d)
+++ uspace/app/tmon/main.c	(revision e9d600c20d03e61842f0bffa983b376a8da9fff0)
@@ -53,4 +53,14 @@
 	},
 	{
+		.name = "stress-intr-in",
+		.description = "Stress benchmark interrupt in endpoints of a diagnostic device.",
+		.action = tmon_stress_intr_in,
+	},
+	{
+		.name = "stress-intr-out",
+		.description = "Stress benchmark interrupt out endpoints of a diagnostic device.",
+		.action = tmon_stress_intr_out,
+	},
+	{
 		.name = "stress-bulk-in",
 		.description = "Stress benchmark bulk in endpoints of a diagnostic device.",
@@ -59,5 +69,5 @@
 	{
 		.name = "stress-bulk-out",
-		.description = "Benchmark bulk out endpoints of a diagnostic device.",
+		.description = "Stress benchmark bulk out endpoints of a diagnostic device.",
 		.action = tmon_stress_bulk_out,
 	},
Index: uspace/app/tmon/test.c
===================================================================
--- uspace/app/tmon/test.c	(revision cec130b59435e0b961988adaf7952d4f54d3c38d)
+++ uspace/app/tmon/test.c	(revision e9d600c20d03e61842f0bffa983b376a8da9fff0)
@@ -44,4 +44,8 @@
 
 #define NAME "tmon"
+#define MAX_PATH_LENGTH 1024
+
+#define DEFAULT_CYCLES  1024
+#define DEFAULT_SIZE    65432
 
 static int resolve_default_fun(devman_handle_t *fun)
@@ -97,5 +101,5 @@
 }
 
-static int resolve_and_test(int argc, char *argv[], int (*test)(devman_handle_t)) {
+static int resolve_and_test(int argc, char *argv[], int (*test)(devman_handle_t, int, size_t)) {
 	devman_handle_t fun = -1;
 
@@ -111,39 +115,94 @@
 	}
 
-	return test(fun);
-}
-
-static int stress_bulk_in(devman_handle_t fun) {
-	async_sess_t *sess = usbdiag_connect(fun);
-	async_exch_t *exch = async_exchange_begin(sess);
-
-	const int cycles = 1024;
-	const size_t size = 65432;
+	int rc;
+	char path[MAX_PATH_LENGTH];
+	if ((rc = devman_fun_get_path(fun, path, sizeof(path)))) {
+		printf(NAME ": Error resolving path of device with handle %ld. %s\n", fun, str_error(rc));
+		return 1;
+	}
+
+	printf("Using device: %s\n", path);
+
+	// TODO: Read options here.
+
+	return test(fun, DEFAULT_CYCLES, DEFAULT_SIZE);
+}
+
+static int stress_intr_in(devman_handle_t fun, int cycles, size_t size) {
+	async_sess_t *sess = usbdiag_connect(fun);
+	async_exch_t *exch = async_exchange_begin(sess);
+
+	int rc = usbdiag_stress_intr_in(exch, cycles, size);
+	int ec = 0;
+
+	if (rc) {
+		printf(NAME ": %s\n", str_error(rc));
+		ec = 1;
+	}
+
+	async_exchange_end(exch);
+	usbdiag_disconnect(sess);
+	return ec;
+}
+
+static int stress_intr_out(devman_handle_t fun, int cycles, size_t size) {
+	async_sess_t *sess = usbdiag_connect(fun);
+	async_exch_t *exch = async_exchange_begin(sess);
+
+	int rc = usbdiag_stress_intr_out(exch, cycles, size);
+	int ec = 0;
+
+	if (rc) {
+		printf(NAME ": %s\n", str_error(rc));
+		ec = 1;
+	}
+
+	async_exchange_end(exch);
+	usbdiag_disconnect(sess);
+	return ec;
+}
+
+static int stress_bulk_in(devman_handle_t fun, int cycles, size_t size) {
+	async_sess_t *sess = usbdiag_connect(fun);
+	async_exch_t *exch = async_exchange_begin(sess);
+
 	int rc = usbdiag_stress_bulk_in(exch, cycles, size);
-
-	if (rc) {
-		printf(NAME ": %s\n", str_error(rc));
-	}
-
-	async_exchange_end(exch);
-	usbdiag_disconnect(sess);
-	return 0;
-}
-
-static int stress_bulk_out(devman_handle_t fun) {
-	async_sess_t *sess = usbdiag_connect(fun);
-	async_exch_t *exch = async_exchange_begin(sess);
-
-	const int cycles = 1024;
-	const size_t size = 65432;
+	int ec = 0;
+
+	if (rc) {
+		printf(NAME ": %s\n", str_error(rc));
+		ec = 1;
+	}
+
+	async_exchange_end(exch);
+	usbdiag_disconnect(sess);
+	return ec;
+}
+
+static int stress_bulk_out(devman_handle_t fun, int cycles, size_t size) {
+	async_sess_t *sess = usbdiag_connect(fun);
+	async_exch_t *exch = async_exchange_begin(sess);
+
 	int rc = usbdiag_stress_bulk_out(exch, cycles, size);
-
-	if (rc) {
-		printf(NAME ": %s\n", str_error(rc));
-	}
-
-	async_exchange_end(exch);
-	usbdiag_disconnect(sess);
-	return 0;
+	int ec = 0;
+
+	if (rc) {
+		printf(NAME ": %s\n", str_error(rc));
+		ec = 1;
+	}
+
+	async_exchange_end(exch);
+	usbdiag_disconnect(sess);
+	return ec;
+}
+
+int tmon_stress_intr_in(int argc, char *argv[])
+{
+	return resolve_and_test(argc, argv, stress_intr_in);
+}
+
+int tmon_stress_intr_out(int argc, char *argv[])
+{
+	return resolve_and_test(argc, argv, stress_intr_out);
 }
 
Index: uspace/drv/bus/usb/usbdiag/tests.c
===================================================================
--- uspace/drv/bus/usb/usbdiag/tests.c	(revision cec130b59435e0b961988adaf7952d4f54d3c38d)
+++ uspace/drv/bus/usb/usbdiag/tests.c	(revision e9d600c20d03e61842f0bffa983b376a8da9fff0)
@@ -41,4 +41,72 @@
 #define NAME "usbdiag"
 
+
+int usb_diag_stress_intr_out(usb_diag_dev_t *dev, int cycles, size_t size)
+{
+	if (!dev)
+		return EBADMEM;
+
+	char *buffer = (char *) malloc(size);
+	if (!buffer)
+		return ENOMEM;
+
+	memset(buffer, 42, size);
+
+	// TODO: Are we sure that no other test is running on this endpoint?
+
+	usb_log_info("Performing interrupt out stress test on device %s.", ddf_fun_get_name(dev->fun));
+	int rc = EOK;
+	for (int i = 0; i < cycles; ++i) {
+		// Write buffer to device.
+		if ((rc = usb_pipe_write(dev->intr_out, buffer, size))) {
+			usb_log_error("Interrupt OUT write failed. %s\n", str_error(rc));
+			break;
+		}
+	}
+
+	free(buffer);
+	return rc;
+}
+
+int usb_diag_stress_intr_in(usb_diag_dev_t *dev, int cycles, size_t size)
+{
+	if (!dev)
+		return EBADMEM;
+
+	char *buffer = (char *) malloc(size);
+	if (!buffer)
+		return ENOMEM;
+
+	// TODO: Are we sure that no other test is running on this endpoint?
+
+	usb_log_info("Performing interrupt in stress test on device %s.", ddf_fun_get_name(dev->fun));
+	int rc = EOK;
+	for (int i = 0; i < cycles; ++i) {
+		// Read device's response.
+		size_t remaining = size;
+		size_t transferred;
+
+		while (remaining > 0) {
+			if ((rc = usb_pipe_read(dev->intr_in, buffer + size - remaining, remaining, &transferred))) {
+				usb_log_error("Interrupt IN read failed. %s\n", str_error(rc));
+				break;
+			}
+
+			if (transferred > remaining) {
+				usb_log_error("Interrupt IN read more than expected.\n");
+				rc = EINVAL;
+				break;
+			}
+
+			remaining -= transferred;
+		}
+
+		if (rc)
+			break;
+	}
+
+	free(buffer);
+	return rc;
+}
 
 int usb_diag_stress_bulk_out(usb_diag_dev_t *dev, int cycles, size_t size)
Index: uspace/drv/bus/usb/usbdiag/tests.h
===================================================================
--- uspace/drv/bus/usb/usbdiag/tests.h	(revision cec130b59435e0b961988adaf7952d4f54d3c38d)
+++ uspace/drv/bus/usb/usbdiag/tests.h	(revision e9d600c20d03e61842f0bffa983b376a8da9fff0)
@@ -39,4 +39,6 @@
 #include "device.h"
 
+int usb_diag_stress_intr_out(usb_diag_dev_t *, int, size_t);
+int usb_diag_stress_intr_in(usb_diag_dev_t *, int, size_t);
 int usb_diag_stress_bulk_out(usb_diag_dev_t *, int, size_t);
 int usb_diag_stress_bulk_in(usb_diag_dev_t *, int, size_t);
Index: uspace/lib/drv/generic/remote_usbdiag.c
===================================================================
--- uspace/lib/drv/generic/remote_usbdiag.c	(revision cec130b59435e0b961988adaf7952d4f54d3c38d)
+++ uspace/lib/drv/generic/remote_usbdiag.c	(revision e9d600c20d03e61842f0bffa983b376a8da9fff0)
@@ -43,6 +43,8 @@
 
 typedef enum {
-	IPC_M_USBDIAG_STRESS_BULK_OUT,
-	IPC_M_USBDIAG_STRESS_BULK_IN
+	IPC_M_USBDIAG_STRESS_INTR_IN,
+	IPC_M_USBDIAG_STRESS_INTR_OUT,
+	IPC_M_USBDIAG_STRESS_BULK_IN,
+	IPC_M_USBDIAG_STRESS_BULK_OUT
 } usb_iface_funcs_t;
 
@@ -58,10 +60,18 @@
 }
 
-int usbdiag_stress_bulk_out(async_exch_t *exch, int cycles, size_t size)
+int usbdiag_stress_intr_in(async_exch_t *exch, int cycles, size_t size)
 {
 	if (!exch)
 		return EBADMEM;
 
-	return async_req_3_0(exch, DEV_IFACE_ID(USBDIAG_DEV_IFACE), IPC_M_USBDIAG_STRESS_BULK_OUT, cycles, size);
+	return async_req_3_0(exch, DEV_IFACE_ID(USBDIAG_DEV_IFACE), IPC_M_USBDIAG_STRESS_INTR_IN, cycles, size);
+}
+
+int usbdiag_stress_intr_out(async_exch_t *exch, int cycles, size_t size)
+{
+	if (!exch)
+		return EBADMEM;
+
+	return async_req_3_0(exch, DEV_IFACE_ID(USBDIAG_DEV_IFACE), IPC_M_USBDIAG_STRESS_INTR_OUT, cycles, size);
 }
 
@@ -74,11 +84,23 @@
 }
 
+int usbdiag_stress_bulk_out(async_exch_t *exch, int cycles, size_t size)
+{
+	if (!exch)
+		return EBADMEM;
+
+	return async_req_3_0(exch, DEV_IFACE_ID(USBDIAG_DEV_IFACE), IPC_M_USBDIAG_STRESS_BULK_OUT, cycles, size);
+}
+
+static void remote_usbdiag_stress_intr_in(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
+static void remote_usbdiag_stress_intr_out(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
+static void remote_usbdiag_stress_bulk_in(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_usbdiag_stress_bulk_out(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
-static void remote_usbdiag_stress_bulk_in(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
 
 /** Remote USB diagnostic interface operations. */
 static const remote_iface_func_ptr_t remote_usbdiag_iface_ops [] = {
-	[IPC_M_USBDIAG_STRESS_BULK_OUT] = remote_usbdiag_stress_bulk_out,
-	[IPC_M_USBDIAG_STRESS_BULK_IN] = remote_usbdiag_stress_bulk_in,
+[	IPC_M_USBDIAG_STRESS_INTR_IN] = remote_usbdiag_stress_intr_in,
+	[IPC_M_USBDIAG_STRESS_INTR_OUT] = remote_usbdiag_stress_intr_out,
+[	IPC_M_USBDIAG_STRESS_BULK_IN] = remote_usbdiag_stress_bulk_in,
+	[IPC_M_USBDIAG_STRESS_BULK_OUT] = remote_usbdiag_stress_bulk_out
 };
 
@@ -89,5 +111,20 @@
 };
 
-void remote_usbdiag_stress_bulk_out(ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
+void remote_usbdiag_stress_intr_in(ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
+{
+	const usbdiag_iface_t *diag_iface = (usbdiag_iface_t *) iface;
+
+	if (diag_iface->stress_bulk_in == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	int cycles = DEV_IPC_GET_ARG1(*call);
+	size_t size = DEV_IPC_GET_ARG2(*call);
+	const int ret = diag_iface->stress_intr_in(fun, cycles, size);
+	async_answer_0(callid, ret);
+}
+
+void remote_usbdiag_stress_intr_out(ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
 {
 	const usbdiag_iface_t *diag_iface = (usbdiag_iface_t *) iface;
@@ -100,5 +137,5 @@
 	int cycles = DEV_IPC_GET_ARG1(*call);
 	size_t size = DEV_IPC_GET_ARG2(*call);
-	const int ret = diag_iface->stress_bulk_out(fun, cycles, size);
+	const int ret = diag_iface->stress_intr_out(fun, cycles, size);
 	async_answer_0(callid, ret);
 }
@@ -119,4 +156,19 @@
 }
 
+void remote_usbdiag_stress_bulk_out(ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
+{
+	const usbdiag_iface_t *diag_iface = (usbdiag_iface_t *) iface;
+
+	if (diag_iface->stress_bulk_out == NULL) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	int cycles = DEV_IPC_GET_ARG1(*call);
+	size_t size = DEV_IPC_GET_ARG2(*call);
+	const int ret = diag_iface->stress_bulk_out(fun, cycles, size);
+	async_answer_0(callid, ret);
+}
+
 /**
  * @}
Index: uspace/lib/drv/include/usbdiag_iface.h
===================================================================
--- uspace/lib/drv/include/usbdiag_iface.h	(revision cec130b59435e0b961988adaf7952d4f54d3c38d)
+++ uspace/lib/drv/include/usbdiag_iface.h	(revision e9d600c20d03e61842f0bffa983b376a8da9fff0)
@@ -45,4 +45,6 @@
 async_sess_t *usbdiag_connect(devman_handle_t);
 void usbdiag_disconnect(async_sess_t*);
+int usbdiag_stress_intr_in(async_exch_t*, int, size_t);
+int usbdiag_stress_intr_out(async_exch_t*, int, size_t);
 int usbdiag_stress_bulk_in(async_exch_t*, int, size_t);
 int usbdiag_stress_bulk_out(async_exch_t*, int, size_t);
@@ -50,4 +52,6 @@
 /** USB diagnostic device communication interface. */
 typedef struct {
+	int (*stress_intr_in)(ddf_fun_t*, int, size_t);
+	int (*stress_intr_out)(ddf_fun_t*, int, size_t);
 	int (*stress_bulk_in)(ddf_fun_t*, int, size_t);
 	int (*stress_bulk_out)(ddf_fun_t*, int, size_t);
