Index: uspace/drv/char/i8042/i8042.c
===================================================================
--- uspace/drv/char/i8042/i8042.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/char/i8042/i8042.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -67,5 +67,6 @@
 
 static void i8042_char_conn(ipc_call_t *, void *);
-static errno_t i8042_read(chardev_srv_t *, void *, size_t, size_t *);
+static errno_t i8042_read(chardev_srv_t *, void *, size_t, size_t *,
+    chardev_flags_t);
 static errno_t i8042_write(chardev_srv_t *, const void *, size_t, size_t *);
 
@@ -385,5 +386,5 @@
  */
 static errno_t i8042_read(chardev_srv_t *srv, void *dest, size_t size,
-    size_t *nread)
+    size_t *nread, chardev_flags_t flags)
 {
 	i8042_port_t *port = (i8042_port_t *)srv->srvs->sarg;
@@ -394,5 +395,6 @@
 	fibril_mutex_lock(&port->buf_lock);
 
-	while (circ_buf_nused(&port->cbuf) == 0)
+	while ((flags & chardev_f_nonblock) == 0 &&
+	    circ_buf_nused(&port->cbuf) == 0)
 		fibril_condvar_wait(&port->buf_cv, &port->buf_lock);
 
Index: uspace/drv/char/msim-con/msim-con.c
===================================================================
--- uspace/drv/char/msim-con/msim-con.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/char/msim-con/msim-con.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -43,5 +43,6 @@
 static void msim_con_connection(ipc_call_t *, void *);
 
-static errno_t msim_con_read(chardev_srv_t *, void *, size_t, size_t *);
+static errno_t msim_con_read(chardev_srv_t *, void *, size_t, size_t *,
+    chardev_flags_t);
 static errno_t msim_con_write(chardev_srv_t *, const void *, size_t, size_t *);
 
@@ -185,5 +186,5 @@
 /** Read from msim console device */
 static errno_t msim_con_read(chardev_srv_t *srv, void *buf, size_t size,
-    size_t *nread)
+    size_t *nread, chardev_flags_t flags)
 {
 	msim_con_t *con = (msim_con_t *) srv->srvs->sarg;
@@ -194,5 +195,6 @@
 	fibril_mutex_lock(&con->buf_lock);
 
-	while (circ_buf_nused(&con->cbuf) == 0)
+	while ((flags & chardev_f_nonblock) == 0 &&
+	    circ_buf_nused(&con->cbuf) == 0)
 		fibril_condvar_wait(&con->buf_cv, &con->buf_lock);
 
Index: uspace/drv/char/ns8250/ns8250.c
===================================================================
--- uspace/drv/char/ns8250/ns8250.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/char/ns8250/ns8250.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -246,8 +246,11 @@
  * @param count		The number of bytes to be read.
  * @param nread		Place to store number of bytes actually read
+ * @param flags		@c chardev_f_nonblock not to block waiting for data
+ *			even if no data is available
  *
  * @return		EOK on success or non-zero error code
  */
-static errno_t ns8250_read(chardev_srv_t *srv, void *buf, size_t count, size_t *nread)
+static errno_t ns8250_read(chardev_srv_t *srv, void *buf, size_t count, size_t *nread,
+    chardev_flags_t flags)
 {
 	ns8250_t *ns = srv_ns8250(srv);
@@ -261,5 +264,6 @@
 
 	fibril_mutex_lock(&ns->mutex);
-	while (buf_is_empty(&ns->input_buffer))
+	while ((flags & chardev_f_none) == 0 &&
+	    buf_is_empty(&ns->input_buffer))
 		fibril_condvar_wait(&ns->input_buffer_available, &ns->mutex);
 	while (!buf_is_empty(&ns->input_buffer) && pos < count) {
Index: uspace/drv/char/pc-lpt/pc-lpt.c
===================================================================
--- uspace/drv/char/pc-lpt/pc-lpt.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/char/pc-lpt/pc-lpt.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -45,5 +45,6 @@
 static void pc_lpt_connection(ipc_call_t *, void *);
 
-static errno_t pc_lpt_read(chardev_srv_t *, void *, size_t, size_t *);
+static errno_t pc_lpt_read(chardev_srv_t *, void *, size_t, size_t *,
+    chardev_flags_t);
 static errno_t pc_lpt_write(chardev_srv_t *, const void *, size_t, size_t *);
 
@@ -224,5 +225,5 @@
 /** Read from pc-lpt device */
 static errno_t pc_lpt_read(chardev_srv_t *srv, void *buf, size_t size,
-    size_t *nread)
+    size_t *nread, chardev_flags_t flags)
 {
 	pc_lpt_t *lpt = (pc_lpt_t *) srv->srvs->sarg;
Index: uspace/drv/char/pl050/pl050.c
===================================================================
--- uspace/drv/char/pl050/pl050.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/char/pl050/pl050.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -59,5 +59,6 @@
 static errno_t pl050_fun_offline(ddf_fun_t *);
 static void pl050_char_conn(ipc_call_t *, void *);
-static errno_t pl050_read(chardev_srv_t *, void *, size_t, size_t *);
+static errno_t pl050_read(chardev_srv_t *, void *, size_t, size_t *,
+    chardev_flags_t);
 static errno_t pl050_write(chardev_srv_t *, const void *, size_t, size_t *);
 
@@ -242,5 +243,5 @@
 
 static errno_t pl050_read(chardev_srv_t *srv, void *buffer, size_t size,
-    size_t *nread)
+    size_t *nread, chardev_flags_t flags)
 {
 	pl050_t *pl050 = (pl050_t *)srv->srvs->sarg;
@@ -252,5 +253,6 @@
 	left = size;
 	while (left > 0) {
-		while (left == size && pl050->buf_rp == pl050->buf_wp)
+		while ((flags & chardev_f_nonblock) == 0 &&
+		    left == size && pl050->buf_rp == pl050->buf_wp)
 			fibril_condvar_wait(&pl050->buf_cv, &pl050->buf_lock);
 		if (pl050->buf_rp == pl050->buf_wp)
Index: uspace/drv/char/ski-con/ski-con.c
===================================================================
--- uspace/drv/char/ski-con/ski-con.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/char/ski-con/ski-con.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -55,5 +55,6 @@
 static void ski_con_connection(ipc_call_t *, void *);
 
-static errno_t ski_con_read(chardev_srv_t *, void *, size_t, size_t *);
+static errno_t ski_con_read(chardev_srv_t *, void *, size_t, size_t *,
+    chardev_flags_t);
 static errno_t ski_con_write(chardev_srv_t *, const void *, size_t, size_t *);
 
@@ -260,5 +261,5 @@
 /** Read from Ski console device */
 static errno_t ski_con_read(chardev_srv_t *srv, void *buf, size_t size,
-    size_t *nread)
+    size_t *nread, chardev_flags_t flags)
 {
 	ski_con_t *con = (ski_con_t *) srv->srvs->sarg;
@@ -269,5 +270,6 @@
 	fibril_mutex_lock(&con->buf_lock);
 
-	while (circ_buf_nused(&con->cbuf) == 0)
+	while ((flags & chardev_f_nonblock) == 0 &&
+	    circ_buf_nused(&con->cbuf) == 0)
 		fibril_condvar_wait(&con->buf_cv, &con->buf_lock);
 
Index: uspace/drv/char/sun4v-con/sun4v-con.c
===================================================================
--- uspace/drv/char/sun4v-con/sun4v-con.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/char/sun4v-con/sun4v-con.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -46,5 +46,6 @@
 #define POLL_INTERVAL  10000
 
-static errno_t sun4v_con_read(chardev_srv_t *, void *, size_t, size_t *);
+static errno_t sun4v_con_read(chardev_srv_t *, void *, size_t, size_t *,
+    chardev_flags_t);
 static errno_t sun4v_con_write(chardev_srv_t *, const void *, size_t, size_t *);
 
@@ -154,5 +155,5 @@
 /** Read from Sun4v console device */
 static errno_t sun4v_con_read(chardev_srv_t *srv, void *buf, size_t size,
-    size_t *nread)
+    size_t *nread, chardev_flags_t flags)
 {
 	sun4v_con_t *con = (sun4v_con_t *) srv->srvs->sarg;
@@ -161,5 +162,6 @@
 	char c;
 
-	while (con->input_buffer->read_ptr == con->input_buffer->write_ptr)
+	while ((flags & chardev_f_nonblock) == 0 &&
+	    con->input_buffer->read_ptr == con->input_buffer->write_ptr)
 		fibril_usleep(POLL_INTERVAL);
 
Index: uspace/drv/hid/atkbd/atkbd.c
===================================================================
--- uspace/drv/hid/atkbd/atkbd.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/hid/atkbd/atkbd.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -211,5 +211,5 @@
 	while (true) {
 		uint8_t code = 0;
-		rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+		rc = chardev_read(kbd->chardev, &code, 1, &nwr, chardev_f_none);
 		if (rc != EOK)
 			return EIO;
@@ -222,9 +222,11 @@
 			map_size = sizeof(scanmap_e0) / sizeof(unsigned int);
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+			rc = chardev_read(kbd->chardev, &code, 1, &nwr,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
 		} else if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) {
-			rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+			rc = chardev_read(kbd->chardev, &code, 1, &nwr,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -232,5 +234,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+			rc = chardev_read(kbd->chardev, &code, 1, &nwr,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -238,5 +241,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+			rc = chardev_read(kbd->chardev, &code, 1, &nwr,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -244,5 +248,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+			rc = chardev_read(kbd->chardev, &code, 1, &nwr,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -250,5 +255,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+			rc = chardev_read(kbd->chardev, &code, 1, &nwr,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -256,5 +262,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+			rc = chardev_read(kbd->chardev, &code, 1, &nwr,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -262,5 +269,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+			rc = chardev_read(kbd->chardev, &code, 1, &nwr,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -277,5 +285,6 @@
 		if (code == KBD_SCANCODE_KEY_RELEASE) {
 			type = KEY_RELEASE;
-			rc = chardev_read(kbd->chardev, &code, 1, &nwr);
+			rc = chardev_read(kbd->chardev, &code, 1, &nwr,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -418,5 +427,6 @@
 		return EIO;
 	}
-	rc = chardev_read(kbd->chardev, &code, 1, &bytes);
+	rc = chardev_read(kbd->chardev, &code, 1, &bytes,
+	    chardev_f_none);
 	if (rc != EOK || code != AT_KBD_ACK) {
 		ddf_msg(LVL_ERROR, "Failed to confirm keyboard enable: %hhx.",
Index: uspace/drv/hid/ps2mouse/ps2mouse.c
===================================================================
--- uspace/drv/hid/ps2mouse/ps2mouse.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/hid/ps2mouse/ps2mouse.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -77,5 +77,6 @@
 	uint8_t data = 0; \
 	size_t nread; \
-	const errno_t rc = chardev_read((mouse)->chardev, &data, 1, &nread); \
+	const errno_t rc = chardev_read((mouse)->chardev, &data, 1, &nread, \
+	    chardev_f_none); \
 	if (rc != EOK) { \
 		ddf_msg(LVL_ERROR, "Failed reading byte: %s", str_error_name(rc));\
@@ -184,5 +185,5 @@
 
 	size_t nread;
-	rc = chardev_read(mouse->chardev, &report, 1, &nread);
+	rc = chardev_read(mouse->chardev, &report, 1, &nread, chardev_f_none);
 	if (rc != EOK || report != PS2_MOUSE_ACK) {
 		ddf_msg(LVL_ERROR, "Failed to confirm data reporting: %hhx.",
@@ -232,5 +233,5 @@
 	while (pos < psize) {
 		rc = chardev_read(mouse->chardev, pbuf + pos, psize - pos,
-		    &nread);
+		    &nread, chardev_f_none);
 		if (rc != EOK) {
 			ddf_msg(LVL_WARN, "Error reading packet.");
Index: uspace/drv/hid/xtkbd/xtkbd.c
===================================================================
--- uspace/drv/hid/xtkbd/xtkbd.c	(revision c477c804d1208352d69c7b069a54d3e3b650ff96)
+++ uspace/drv/hid/xtkbd/xtkbd.c	(revision f2d88f3fc01df99a1e5292a3a395c0754a4ef3fa)
@@ -216,5 +216,5 @@
 
 		uint8_t code = 0;
-		rc = chardev_read(kbd->chardev, &code, 1, &nread);
+		rc = chardev_read(kbd->chardev, &code, 1, &nread, chardev_f_none);
 		if (rc != EOK)
 			return EIO;
@@ -229,5 +229,6 @@
 			map_size = sizeof(scanmap_e0) / sizeof(unsigned int);
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nread);
+			rc = chardev_read(kbd->chardev, &code, 1, &nread,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -236,5 +237,6 @@
 
 			if (code == 0x2a) {  /* Print Screen */
-				rc = chardev_read(kbd->chardev, &code, 1, &nread);
+				rc = chardev_read(kbd->chardev, &code, 1, &nread,
+				    chardev_f_none);
 				if (rc != EOK)
 					return EIO;
@@ -243,5 +245,6 @@
 					continue;
 
-				rc = chardev_read(kbd->chardev, &code, 1, &nread);
+				rc = chardev_read(kbd->chardev, &code, 1, &nread,
+				    chardev_f_none);
 				if (rc != EOK)
 					return EIO;
@@ -254,5 +257,6 @@
 
 			if (code == 0x46) {  /* Break */
-				rc = chardev_read(kbd->chardev, &code, 1, &nread);
+				rc = chardev_read(kbd->chardev, &code, 1, &nread,
+				    chardev_f_none);
 				if (rc != EOK)
 					return EIO;
@@ -261,5 +265,6 @@
 					continue;
 
-				rc = chardev_read(kbd->chardev, &code, 1, &nread);
+				rc = chardev_read(kbd->chardev, &code, 1, &nread,
+				    chardev_f_none);
 				if (rc != EOK)
 					return EIO;
@@ -274,5 +279,6 @@
 		/* Extended special set */
 		if (code == KBD_SCANCODE_SET_EXTENDED_SPECIAL) {
-			rc = chardev_read(kbd->chardev, &code, 1, &nread);
+			rc = chardev_read(kbd->chardev, &code, 1, &nread,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -281,5 +287,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nread);
+			rc = chardev_read(kbd->chardev, &code, 1, &nread,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -288,5 +295,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nread);
+			rc = chardev_read(kbd->chardev, &code, 1, &nread,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -295,5 +303,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nread);
+			rc = chardev_read(kbd->chardev, &code, 1, &nread,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
@@ -302,5 +311,6 @@
 				continue;
 
-			rc = chardev_read(kbd->chardev, &code, 1, &nread);
+			rc = chardev_read(kbd->chardev, &code, 1, &nread,
+			    chardev_f_none);
 			if (rc != EOK)
 				return EIO;
