Index: uspace/drv/char/i8042/i8042.c
===================================================================
--- uspace/drv/char/i8042/i8042.c	(revision 10b21a1b4acffc43c8b5c6b3509a57de3f6d691e)
+++ uspace/drv/char/i8042/i8042.c	(revision af7b85bb59db696cbde621017721740cf7612ff6)
@@ -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 10b21a1b4acffc43c8b5c6b3509a57de3f6d691e)
+++ uspace/drv/char/msim-con/msim-con.c	(revision af7b85bb59db696cbde621017721740cf7612ff6)
@@ -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 10b21a1b4acffc43c8b5c6b3509a57de3f6d691e)
+++ uspace/drv/char/ns8250/ns8250.c	(revision af7b85bb59db696cbde621017721740cf7612ff6)
@@ -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 10b21a1b4acffc43c8b5c6b3509a57de3f6d691e)
+++ uspace/drv/char/pc-lpt/pc-lpt.c	(revision af7b85bb59db696cbde621017721740cf7612ff6)
@@ -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 10b21a1b4acffc43c8b5c6b3509a57de3f6d691e)
+++ uspace/drv/char/pl050/pl050.c	(revision af7b85bb59db696cbde621017721740cf7612ff6)
@@ -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 10b21a1b4acffc43c8b5c6b3509a57de3f6d691e)
+++ uspace/drv/char/ski-con/ski-con.c	(revision af7b85bb59db696cbde621017721740cf7612ff6)
@@ -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 10b21a1b4acffc43c8b5c6b3509a57de3f6d691e)
+++ uspace/drv/char/sun4v-con/sun4v-con.c	(revision af7b85bb59db696cbde621017721740cf7612ff6)
@@ -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);
 
