diff --git a/src/os/unix/ngx_readv_chain.c b/src/os/unix/ngx_readv_chain.c
index 1ea683f..a2fedcf 100644
--- a/src/os/unix/ngx_readv_chain.c
+++ b/src/os/unix/ngx_readv_chain.c
@@ -4,6 +4,10 @@
 #include <ngx_event.h>
 
 
+static int ngx_readv_error(ngx_event_t *rev, ngx_err_t err);
+
+#if (HAVE_KQUEUE)
+
 ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain)
 {
     char          *prev;
@@ -11,6 +15,32 @@
     struct iovec  *iov;
     ngx_err_t      err;
     ngx_array_t    io;
+    ngx_event_t   *rev;
+
+    rev = c->read; 
+
+    if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
+        ngx_log_debug(c->log, "recv: eof:%d, avail:%d, err:%d" _
+                      rev->kq_eof _ rev->available _ rev->kq_errno);
+
+        if (rev->available == 0) {
+            if (rev->kq_eof) {
+                rev->ready = 0;
+                rev->eof = 1;
+
+                if (rev->kq_errno) {
+                    rev->error = 1;
+                    ngx_set_socket_errno(rev->kq_errno);
+                    return ngx_readv_error(rev, rev->kq_errno);
+                }
+
+                return 0;
+
+            } else {
+                return NGX_AGAIN;
+            }
+        }
+    }
 
     prev = NULL;
     iov = NULL;
@@ -37,27 +67,143 @@
 
 ngx_log_debug(c->log, "recv: %d:%d" _ io.nelts _ iov->iov_len);
 
-    n = readv(c->fd, (struct iovec *) io.elts, io.nelts);
+    rev = c->read;
 
-    if (n == 0) {
-        c->read->eof = 1;
+    do {
+        n = readv(c->fd, (struct iovec *) io.elts, io.nelts);
 
-    } else if (n == -1) {
-        c->read->ready = 0;
+        if (n >= 0) {
+            if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
+                rev->available -= n;
 
-        err = ngx_errno;
-        if (err == NGX_EAGAIN) {
-            ngx_log_error(NGX_LOG_INFO, c->log, err, "readv() returned EAGAIN");
-            return NGX_AGAIN;
+                /*
+                 * rev->available can be negative here because some additional
+                 * bytes can be received between kevent() and recv()
+                 */
+
+                if (rev->available <= 0) {
+                    if (!rev->kq_eof) {
+                        rev->ready = 0;
+                    }
+
+                    if (rev->available < 0) {
+                        rev->available = 0;
+                    }
+                }
+
+                return n;
+            }
+
+            if (n < size) {
+                rev->ready = 0;
+            }
+
+            if (n == 0) {
+                rev->eof = 1;
+            }
+
+            return n;
         }
 
-        c->read->error = 1;
-        ngx_log_error(NGX_LOG_ERR, c->log, err, "readv() failed");
-        return NGX_ERROR;
+        n = ngx_readv_error(rev, ngx_socket_errno);
 
-    } else if (n < size) {
-        c->read->ready = 0;
+    } while (n == NGX_EINTR);
+
+    /* NGX_ERROR || NGX_AGAIN */
+
+    rev->ready = 0;
+
+    if (n == NGX_ERROR){
+        c->read->error = 1;
     }
 
     return n;
 }
+
+#else /* ! NAVE_KQUEUE */
+
+ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain)
+{
+    char          *prev;
+    ssize_t        n, size;
+    struct iovec  *iov;
+    ngx_err_t      err;
+    ngx_array_t    io;
+    ngx_event_t   *rev;
+
+    prev = NULL;
+    iov = NULL;
+    size = 0;
+
+    ngx_init_array(io, c->pool, 10, sizeof(struct iovec), NGX_ERROR);
+
+    /* coalesce the neighbouring hunks */
+
+    while (chain) {
+        if (prev == chain->hunk->last) {
+            iov->iov_len += chain->hunk->end - chain->hunk->last;
+
+        } else {
+            ngx_test_null(iov, ngx_push_array(&io), NGX_ERROR);
+            iov->iov_base = chain->hunk->last;
+            iov->iov_len = chain->hunk->end - chain->hunk->last;
+        }
+
+        size += chain->hunk->end - chain->hunk->last;
+        prev = chain->hunk->end;
+        chain = chain->next;
+    }
+
+ngx_log_debug(c->log, "recv: %d:%d" _ io.nelts _ iov->iov_len);
+
+    rev = c->read;
+
+    do {
+        n = readv(c->fd, (struct iovec *) io.elts, io.nelts);
+
+        if (n >= 0) {
+            if (n < size) {
+                rev->ready = 0;
+            }
+
+            if (n == 0) {
+                rev->eof = 1;
+            }
+
+            return n;
+        }
+
+        n = ngx_readv_error(rev, ngx_socket_errno);
+
+    } while (n == NGX_EINTR);
+
+    /* NGX_ERROR || NGX_AGAIN */
+
+    rev->ready = 0;
+
+    if (n == NGX_ERROR){
+        c->read->error = 1;
+    }
+
+    return n;
+}
+
+#endif /* NAVE_KQUEUE */
+
+
+static int ngx_readv_error(ngx_event_t *rev, ngx_err_t err)
+{
+    if (err == NGX_EAGAIN) {
+        ngx_log_error(NGX_LOG_INFO, rev->log, err, "readv() returned EAGAIN");
+        return NGX_AGAIN;
+    }
+
+    if (err == NGX_EINTR) {
+        ngx_log_error(NGX_LOG_INFO, rev->log, err, "readv() returned EINTR");
+        return NGX_EINTR;
+    }
+
+    ngx_log_error(NGX_LOG_ERR, rev->log, err, "readv() failed");
+
+    return NGX_ERROR;
+}
diff --git a/src/os/unix/ngx_recv.c b/src/os/unix/ngx_recv.c
index e759379..7cb949a 100644
--- a/src/os/unix/ngx_recv.c
+++ b/src/os/unix/ngx_recv.c
@@ -40,8 +40,6 @@
     }
 
     do {
-        rev->ready = 1;
-
         n = recv(c->fd, buf, size, 0);
 
         ngx_log_debug(c->log, "recv: %d:%d" _ n _ size);
@@ -79,11 +77,14 @@
             return n;
         }
 
-        rev->ready = 0;
         n = ngx_unix_recv_error(rev, ngx_socket_errno);
 
     } while (n == NGX_EINTR);
 
+    /* NGX_ERROR || NGX_AGAIN */
+
+    rev->ready = 0;
+
     if (n == NGX_ERROR){
         rev->error = 1;
     }
@@ -101,8 +102,6 @@
     rev = c->read;
 
     do {
-        rev->ready = 1;
-
         n = recv(c->fd, buf, size, 0);
 
         ngx_log_debug(c->log, "recv: %d:%d" _ n _ size);
@@ -119,11 +118,14 @@
             return n;
         }
 
-        rev->ready = 0;
         n = ngx_unix_recv_error(rev, ngx_socket_errno);
 
     } while (n == NGX_EINTR);
 
+    /* NGX_ERROR || NGX_AGAIN */
+
+    rev->ready = 0;
+
     if (n == NGX_ERROR){
         rev->error = 1;
     }
