diff --git a/mongoose.c b/mongoose.c
index eadb05b6224c321c9cf8dda5cd05f739143e9417..879258994ca37c10f4609b53da6ddd08cfb9f402 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -222,6 +222,7 @@ int ns_server_poll(struct ns_server *, int milli);
 void ns_server_wakeup(struct ns_server *);
 void ns_server_wakeup_ex(struct ns_server *, ns_callback_t, void *, size_t);
 void ns_iterate(struct ns_server *, ns_callback_t cb, void *param);
+struct ns_connection *ns_next(struct ns_server *, struct ns_connection *);
 struct ns_connection *ns_add_sock(struct ns_server *, sock_t sock, void *p);
 
 int ns_bind(struct ns_server *, const char *addr);
@@ -876,7 +877,7 @@ int ns_server_poll(struct ns_server *server, int milli) {
     if (server->ctl[1] != INVALID_SOCKET &&
         FD_ISSET(server->ctl[1], &read_set)) {
       struct ctl_msg ctl_msg;
-      int len = recv(server->ctl[1], (char *) &ctl_msg, sizeof(ctl_msg), 0);
+      int len = recv(server->ctl[1], (void *) &ctl_msg, sizeof(ctl_msg), 0);
       send(server->ctl[1], ctl_msg.message, 1, 0);
       if (len >= (int) sizeof(ctl_msg.callback) && ctl_msg.callback != NULL) {
         ns_iterate(server, ctl_msg.callback, ctl_msg.message);
@@ -885,7 +886,6 @@ int ns_server_poll(struct ns_server *server, int milli) {
 
     for (conn = server->active_connections; conn != NULL; conn = tmp_conn) {
       tmp_conn = conn->next;
-      //DBG(("%p LOOP %p", conn, conn->ssl));
       if (FD_ISSET(conn->sock, &read_set)) {
         conn->last_io_time = current_time;
         ns_read_from_socket(conn);
@@ -979,6 +979,10 @@ struct ns_connection *ns_add_sock(struct ns_server *s, sock_t sock, void *p) {
   return conn;
 }
 
+struct ns_connection *ns_next(struct ns_server *s, struct ns_connection *conn) {
+  return conn == NULL ? s->active_connections : conn->next;
+}
+
 void ns_iterate(struct ns_server *server, ns_callback_t cb, void *param) {
   struct ns_connection *conn, *tmp_conn;
 
@@ -995,9 +999,9 @@ void ns_server_wakeup_ex(struct ns_server *server, ns_callback_t cb,
       len < sizeof(ctl_msg.message)) {
     ctl_msg.callback = cb;
     memcpy(ctl_msg.message, data, len);
-    send(server->ctl[0], (char *) &ctl_msg,
+    send(server->ctl[0], (void *) &ctl_msg,
          offsetof(struct ctl_msg, message) + len, 0);
-    recv(server->ctl[0], (char *) &len, 1, 0);
+    recv(server->ctl[0], (void *) &len, 1, 0);
   }
 }
 
@@ -4546,6 +4550,15 @@ static void iter(struct ns_connection *nsconn, enum ns_event ev, void *param) {
   }
 }
 
+struct mg_connection *mg_next(struct mg_server *s, struct mg_connection *c) {
+  struct connection *conn = MG_CONN_2_CONN(c);
+  struct ns_connection *nc = ns_next(&s->ns_server,
+                                     c == NULL ? NULL : conn->ns_conn);
+    
+  return nc == NULL ? NULL :
+    & ((struct connection *) nc->connection_data)->mg_conn;
+}
+
 // Apply function to all active connections.
 void mg_iterate_over_connections(struct mg_server *server, mg_handler_t cb,
   void *param) {
diff --git a/mongoose.h b/mongoose.h
index 760ae06e98576feadc04b62a6fb5b0cbec84772f..d840b38b75f2928935bb3478eaf8bd1e7d8ea6d4 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -93,6 +93,7 @@ const char *mg_get_option(const struct mg_server *server, const char *name);
 void mg_set_listening_socket(struct mg_server *, int sock);
 int mg_get_listening_socket(struct mg_server *);
 void mg_iterate_over_connections(struct mg_server *, mg_handler_t, void *);
+struct mg_connection *mg_next(struct mg_server *, struct mg_connection *);
 void mg_wakeup_server(struct mg_server *);
 void mg_wakeup_server_ex(struct mg_server *, mg_handler_t, const char *, ...);
 struct mg_connection *mg_connect(struct mg_server *, const char *, int, int);