diff --git a/mongoose.c b/mongoose.c
index ac4ce2d68fca5181d07d717e0c104ca8ddacf020..0dc9bae7f5ba8175f3d8f01ddbcbddefd98421ea 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -1602,8 +1602,9 @@ int mg_printf(struct mg_connection *conn, const char *fmt, ...) {
 }
 
 static void ns_forward(struct ns_connection *from, struct ns_connection *to) {
+  DBG(("%p -> %p %zu bytes", from, to, from->recv_iobuf.len));
   ns_send(to, from->recv_iobuf.buf, from->recv_iobuf.len);
-  iobuf_remove(&from->recv_iobuf, from->recv_iobuf.len);  
+  iobuf_remove(&from->recv_iobuf, from->recv_iobuf.len);
 }
 
 #ifndef MONGOOSE_NO_CGI
@@ -4007,10 +4008,10 @@ static void proxify_connection(struct connection *conn) {
   struct mg_connection *c = &conn->mg_conn;
   struct ns_server *server = &conn->server->ns_server;
   struct ns_connection *pc;
-  int i;
+  int i, n, sent_close_header = 0;
 
-  if (parse_url(c->uri, proto, sizeof(proto), host, sizeof(host), &port) &&
-      (pc = ns_connect(server, host, port, 0, conn)) != NULL) {
+  n = parse_url(c->uri, proto, sizeof(proto), host, sizeof(host), &port);
+  if (n > 0 && (pc = ns_connect(server, host, port, 0, conn)) != NULL) {
     // Interlink two connections
     pc->flags |= MG_PROXY_CONN;
     conn->endpoint_type = EP_PROXY;
@@ -4022,11 +4023,21 @@ static void proxify_connection(struct connection *conn) {
       mg_printf(c, "%s", "HTTP/1.1 200 OK\r\n\r\n");
     } else {
       // For other methods, forward the request to the target host.
-      ns_printf(pc, "%s %s HTTP/%s\r\n", c->request_method, c->uri,
+      ns_printf(pc, "%s %s HTTP/%s\r\n", c->request_method, c->uri + n,
                 c->http_version);
       for (i = 0; i < c->num_headers; i++) {
-        ns_printf(pc, "%s: %s\r\n", c->http_headers[i].name, 
-                  c->http_headers[i].value);
+        if (mg_strcasecmp(c->http_headers[i].name, "Connection") == 0) {
+          // Force connection close, cause we don't parse proxy replies
+          // therefore we don't know message boundaries
+          ns_printf(pc, "%s: %s\r\n", "Connection", "close");
+          sent_close_header = 1;
+        } else {
+          ns_printf(pc, "%s: %s\r\n", c->http_headers[i].name,
+                    c->http_headers[i].value);
+        }
+      }
+      if (!sent_close_header) {
+        ns_printf(pc, "%s: %s\r\n", "Connection", "close");
       }
       ns_printf(pc, "%s", "\r\n");
       ns_send(pc, c->content, c->content_len);
@@ -4774,7 +4785,7 @@ static void mg_ev_handler(struct ns_connection *nc, enum ns_event ev, void *p) {
     case NS_CLOSE:
       nc->connection_data = NULL;
       if ((nc->flags & MG_CGI_CONN) || (nc->flags & MG_PROXY_CONN)) {
-        DBG(("%p %d closing cgi/proxy conn", conn, conn->endpoint_type));
+        DBG(("%p closing cgi/proxy conn", conn));
         if (conn && conn->ns_conn) {
           conn->ns_conn->flags &= ~NSF_BUFFER_BUT_DONT_SEND;
           conn->ns_conn->flags |= conn->ns_conn->send_iobuf.len > 0 ?
@@ -4830,7 +4841,7 @@ static void iter2(struct ns_connection *nc, enum ns_event ev, void *param) {
   int n;
   (void) ev;
 
-  DBG(("%p [%s]", conn, msg));
+  //DBG(("%p [%s]", conn, msg));
   if (sscanf(msg, "%p %n", &func, &n) && func != NULL) {
     conn->mg_conn.callback_param = (void *) (msg + n);
     func(&conn->mg_conn, MG_POLL);