diff --git a/patches/nginx-1.0.6-no_Werror.patch b/patches/nginx-1.0.6-no_Werror.patch
new file mode 100644
index 0000000..70f8101
--- /dev/null
+++ b/patches/nginx-1.0.6-no_Werror.patch
@@ -0,0 +1,24 @@
+diff -ur nginx-1.0.6/auto/cc/gcc nginx-1.0.6-patched/auto/cc/gcc
+--- nginx-1.0.6/auto/cc/gcc	2011-06-27 19:53:00.205737804 +0800
++++ nginx-1.0.6-patched/auto/cc/gcc	2011-06-27 19:53:13.837741087 +0800
+@@ -169,7 +169,7 @@
+ 
+ 
+ # stop on warning
+-CFLAGS="$CFLAGS -Werror"
++#CFLAGS="$CFLAGS -Werror"
+ 
+ # debug
+ CFLAGS="$CFLAGS -g"
+diff -ur nginx-1.0.6/auto/cc/icc nginx-1.0.6-patched/auto/cc/icc
+--- nginx-1.0.6/auto/cc/icc	2011-06-27 19:52:56.370157068 +0800
++++ nginx-1.0.6-patched/auto/cc/icc	2011-06-27 19:53:19.508916811 +0800
+@@ -139,7 +139,7 @@
+ esac
+ 
+ # stop on warning
+-CFLAGS="$CFLAGS -Werror"
++#CFLAGS="$CFLAGS -Werror"
+ 
+ # debug
+ CFLAGS="$CFLAGS -g"
diff --git a/patches/nginx-1.0.6-no_error_pages.patch b/patches/nginx-1.0.6-no_error_pages.patch
new file mode 100644
index 0000000..a47659e
--- /dev/null
+++ b/patches/nginx-1.0.6-no_error_pages.patch
@@ -0,0 +1,90 @@
+--- nginx-1.0.6/src/http/ngx_http_core_module.c	2010-12-14 18:38:42.000000000 +0800
++++ nginx-1.0.6-patched/src/http/ngx_http_core_module.c	2011-01-30 19:24:34.956354518 +0800
+@@ -57,6 +57,8 @@
+     void *conf);
+ static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
+     void *conf);
++static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
++    void *conf);
+ static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
+     void *conf);
+ static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
+@@ -614,6 +616,14 @@
+       0,
+       NULL },
+ 
++    { ngx_string("no_error_pages"),
++      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
++                        |NGX_CONF_NOARGS,
++      ngx_http_core_no_error_pages,
++      NGX_HTTP_LOC_CONF_OFFSET,
++      0,
++      NULL },
++
+     { ngx_string("try_files"),
+       NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
+       ngx_http_core_try_files,
+@@ -3052,7 +3062,6 @@
+      *     clcf->types = NULL;
+      *     clcf->default_type = { 0, NULL };
+      *     clcf->error_log = NULL;
+-     *     clcf->error_pages = NULL;
+      *     clcf->try_files = NULL;
+      *     clcf->client_body_path = NULL;
+      *     clcf->regex = NULL;
+@@ -3062,6 +3071,7 @@
+      *     clcf->gzip_proxied = 0;
+      */
+ 
++    clcf->error_pages = NGX_CONF_UNSET_PTR;
+     clcf->client_max_body_size = NGX_CONF_UNSET;
+     clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
+     clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
+@@ -3250,9 +3260,7 @@
+         }
+     }
+ 
+-    if (conf->error_pages == NULL && prev->error_pages) {
+-        conf->error_pages = prev->error_pages;
+-    }
++    ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
+ 
+     ngx_conf_merge_str_value(conf->default_type,
+                               prev->default_type, "text/plain");
+@@ -3988,6 +3996,10 @@
+     ngx_http_compile_complex_value_t   ccv;
+ 
+     if (clcf->error_pages == NULL) {
++        return "conflicts with \"no_error_pages\"";
++    }
++
++    if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
+         clcf->error_pages = ngx_array_create(cf->pool, 4,
+                                              sizeof(ngx_http_err_page_t));
+         if (clcf->error_pages == NULL) {
+@@ -4095,6 +4107,25 @@
+ 
+ 
+ static char *
++ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
++{
++    ngx_http_core_loc_conf_t *clcf = conf;
++
++    if (clcf->error_pages == NULL) {
++        return "is duplicate";
++    }
++
++    if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
++        return "conflicts with \"error_page\"";
++    }
++
++    clcf->error_pages = NULL;
++
++    return NGX_CONF_OK;
++}
++
++
++static char *
+ ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+ {
+     ngx_http_core_loc_conf_t *clcf = conf;
diff --git a/patches/nginx-1.0.6-no_pool.patch b/patches/nginx-1.0.6-no_pool.patch
new file mode 100644
index 0000000..9270d7a
--- /dev/null
+++ b/patches/nginx-1.0.6-no_pool.patch
@@ -0,0 +1,483 @@
+diff -ur nginx-1.0.6/src/core/nginx.h nginx-1.0.6-no-pool/src/core/nginx.h
+--- nginx-1.0.6/src/core/nginx.h	2011-05-26 15:31:40.000000000 +0800
++++ nginx-1.0.6-no-pool/src/core/nginx.h	2011-06-30 17:00:43.540946999 +0800
+@@ -10,7 +10,7 @@
+ 
+ #define nginx_version      1000004
+ #define NGINX_VERSION      "1.0.6"
+-#define NGINX_VER          "ngx_openresty/" NGINX_VERSION ".unknown"
++#define NGINX_VER          "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
+ 
+ #define NGINX_VAR          "NGINX"
+ #define NGX_OLDPID_EXT     ".oldbin"
+diff -ur nginx-1.0.6/src/core/ngx_array.c nginx-1.0.6-no-pool/src/core/ngx_array.c
+--- nginx-1.0.6/src/core/ngx_array.c	2008-06-17 23:00:30.000000000 +0800
++++ nginx-1.0.6-no-pool/src/core/ngx_array.c	2011-06-30 17:00:43.540946999 +0800
+@@ -39,13 +39,7 @@
+ 
+     p = a->pool;
+ 
+-    if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
+-        p->d.last -= a->size * a->nalloc;
+-    }
+-
+-    if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
+-        p->d.last = (u_char *) a;
+-    }
++    ngx_pfree(p, a);
+ }
+ 
+ 
+@@ -64,29 +58,17 @@
+ 
+         p = a->pool;
+ 
+-        if ((u_char *) a->elts + size == p->d.last
+-            && p->d.last + a->size <= p->d.end)
+-        {
+-            /*
+-             * the array allocation is the last in the pool
+-             * and there is space for new allocation
+-             */
+-
+-            p->d.last += a->size;
+-            a->nalloc++;
+-
+-        } else {
+-            /* allocate a new array */
+-
+-            new = ngx_palloc(p, 2 * size);
+-            if (new == NULL) {
+-                return NULL;
+-            }
+-
+-            ngx_memcpy(new, a->elts, size);
+-            a->elts = new;
+-            a->nalloc *= 2;
++        /* allocate a new array */
++
++        new = ngx_palloc(p, 2 * size);
++        if (new == NULL) {
++            return NULL;
+         }
++
++        ngx_memcpy(new, a->elts, size);
++        a->elts = new;
++        a->nalloc *= 2;
++
+     }
+ 
+     elt = (u_char *) a->elts + a->size * a->nelts;
+@@ -112,31 +94,16 @@
+ 
+         p = a->pool;
+ 
+-        if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
+-            && p->d.last + size <= p->d.end)
+-        {
+-            /*
+-             * the array allocation is the last in the pool
+-             * and there is space for new allocation
+-             */
+-
+-            p->d.last += size;
+-            a->nalloc += n;
+-
+-        } else {
+-            /* allocate a new array */
+-
+-            nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
+-
+-            new = ngx_palloc(p, nalloc * a->size);
+-            if (new == NULL) {
+-                return NULL;
+-            }
+-
+-            ngx_memcpy(new, a->elts, a->nelts * a->size);
+-            a->elts = new;
+-            a->nalloc = nalloc;
++        nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
++
++        new = ngx_palloc(p, nalloc * a->size);
++        if (new == NULL) {
++            return NULL;
+         }
++
++        ngx_memcpy(new, a->elts, a->nelts * a->size);
++        a->elts = new;
++        a->nalloc = nalloc;
+     }
+ 
+     elt = (u_char *) a->elts + a->size * a->nelts;
+diff -ur nginx-1.0.6/src/core/ngx_palloc.c nginx-1.0.6-no-pool/src/core/ngx_palloc.c
+--- nginx-1.0.6/src/core/ngx_palloc.c	2009-12-17 20:25:46.000000000 +0800
++++ nginx-1.0.6-no-pool/src/core/ngx_palloc.c	2011-06-30 17:06:36.060946999 +0800
+@@ -8,24 +8,31 @@
+ #include <ngx_core.h>
+ 
+ 
+-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
+ static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
+ 
+ 
+ ngx_pool_t *
+ ngx_create_pool(size_t size, ngx_log_t *log)
+ {
+-    ngx_pool_t  *p;
++    ngx_pool_t		*p;
++    ngx_pool_data_t     *d;
+ 
+-    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
++    size = sizeof(ngx_pool_t);
++    p = ngx_alloc(size, log);
+     if (p == NULL) {
+         return NULL;
+     }
+ 
+-    p->d.last = (u_char *) p + sizeof(ngx_pool_t);
+-    p->d.end = (u_char *) p + size;
+-    p->d.next = NULL;
+-    p->d.failed = 0;
++    d = ngx_alloc(sizeof(ngx_pool_data_t), log);
++	
++    if (d == NULL) {
++	return NULL;
++    }
++
++    d->next = d;
++    d->prev = d;
++    d->alloc = NULL;
++    p->d = d;
+ 
+     size = size - sizeof(ngx_pool_t);
+     p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
+@@ -43,7 +50,7 @@
+ void
+ ngx_destroy_pool(ngx_pool_t *pool)
+ {
+-    ngx_pool_t          *p, *n;
++    ngx_pool_data_t     *d, *n;
+     ngx_pool_large_t    *l;
+     ngx_pool_cleanup_t  *c;
+ 
+@@ -55,7 +62,7 @@
+         }
+     }
+ 
+-    for (l = pool->large; l; l = l->next) {
++    for (l = pool->large; l ; l = l->next) {
+ 
+         ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
+ 
+@@ -71,34 +78,45 @@
+      * so we can not use this log while the free()ing the pool
+      */
+ 
+-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
++    for (d = pool->d, n = d->next; ; d = n, n = n->next) {
+         ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
+-                       "free: %p, unused: %uz", p, p->d.end - p->d.last);
++                       "free: %p", d);
+ 
+-        if (n == NULL) {
++        if (n == pool->d) {
+             break;
+         }
+     }
+ 
+ #endif
++    if (pool->d->next == pool->d) {
++    	ngx_free(pool->d);
++    } else {
++        for (d = pool->d, n = d->next; ; d = n, n = n->next) {
++            if (d->alloc) {
++    	        ngx_free(d->alloc);
++            }
++            ngx_free(d);
+ 
+-    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
+-        ngx_free(p);
+-
+-        if (n == NULL) {
+-            break;
++            if (n == pool->d) {
++                break;
++            }
+         }
+     }
++
++    ngx_free(pool);
+ }
+ 
+ 
+ void
+ ngx_reset_pool(ngx_pool_t *pool)
+ {
+-    ngx_pool_t        *p;
+-    ngx_pool_large_t  *l;
++    ngx_pool_data_t     *p, *tmp;
++    ngx_pool_large_t    *l;
++
++    for (l = pool->large; l ; l = l->next) {
++
++        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
+ 
+-    for (l = pool->large; l; l = l->next) {
+         if (l->alloc) {
+             ngx_free(l->alloc);
+         }
+@@ -106,109 +124,65 @@
+ 
+     pool->large = NULL;
+ 
+-    for (p = pool; p; p = p->d.next) {
+-        p->d.last = (u_char *) p + sizeof(ngx_pool_t);
++    p = pool->d->next;
++    while (p != pool->d) {
++        tmp = p;
++        ngx_free(p->alloc);
++        p->prev->next = p->next;
++        p->next->prev = p->prev;
++        p = p->next;
++        ngx_free(tmp);
+     }
+-}
+ 
++    ngx_free(pool->d->alloc);
++    pool->d->alloc = NULL;
++
++}
+ 
+ void *
+-ngx_palloc(ngx_pool_t *pool, size_t size)
++ngx_malloc(ngx_pool_t *pool, size_t size)
+ {
+-    u_char      *m;
+-    ngx_pool_t  *p;
+-
+-    if (size <= pool->max) {
++    ngx_pool_data_t     *new;
++    void        	*m;
+ 
+-        p = pool->current;
+-
+-        do {
+-            m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
+-
+-            if ((size_t) (p->d.end - m) >= size) {
+-                p->d.last = m + size;
+-
+-                return m;
+-            }
+-
+-            p = p->d.next;
+-
+-        } while (p);
++    m = ngx_alloc(size, pool->log);
++    if (m == NULL) {
++	return NULL;
++    }
+ 
+-        return ngx_palloc_block(pool, size);
++    new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
++    if (new == NULL){
++        ngx_free(m);
++	return NULL;
+     }
+ 
+-    return ngx_palloc_large(pool, size);
++    new->alloc = m;
++    new->next = pool->d;
++    new->prev = pool->d->prev;
++    pool->d->prev->next = new;
++    pool->d->prev = new;
++    return m;	
+ }
+ 
+-
+ void *
+-ngx_pnalloc(ngx_pool_t *pool, size_t size)
++ngx_palloc(ngx_pool_t *pool, size_t size)
+ {
+-    u_char      *m;
+-    ngx_pool_t  *p;
+-
+-    if (size <= pool->max) {
+-
+-        p = pool->current;
+-
+-        do {
+-            m = p->d.last;
+-
+-            if ((size_t) (p->d.end - m) >= size) {
+-                p->d.last = m + size;
+-
+-                return m;
+-            }
+-
+-            p = p->d.next;
+-
+-        } while (p);
+-
+-        return ngx_palloc_block(pool, size);
++    if (size <= 1024) {
++        return ngx_malloc(pool, size);
+     }
+ 
+     return ngx_palloc_large(pool, size);
+ }
+ 
+ 
+-static void *
+-ngx_palloc_block(ngx_pool_t *pool, size_t size)
++void *
++ngx_pnalloc(ngx_pool_t *pool, size_t size)
+ {
+-    u_char      *m;
+-    size_t       psize;
+-    ngx_pool_t  *p, *new, *current;
+-
+-    psize = (size_t) (pool->d.end - (u_char *) pool);
+-
+-    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
+-    if (m == NULL) {
+-        return NULL;
++    if (size <= 1024) {
++        return ngx_malloc(pool, size);
+     }
+ 
+-    new = (ngx_pool_t *) m;
+-
+-    new->d.end = m + psize;
+-    new->d.next = NULL;
+-    new->d.failed = 0;
+-
+-    m += sizeof(ngx_pool_data_t);
+-    m = ngx_align_ptr(m, NGX_ALIGNMENT);
+-    new->d.last = m + size;
+-
+-    current = pool->current;
+-
+-    for (p = current; p->d.next; p = p->d.next) {
+-        if (p->d.failed++ > 4) {
+-            current = p->d.next;
+-        }
+-    }
+-
+-    p->d.next = new;
+-
+-    pool->current = current ? current : new;
+-
+-    return m;
++    return ngx_palloc_large(pool, size);
+ }
+ 
+ 
+@@ -226,18 +200,7 @@
+ 
+     n = 0;
+ 
+-    for (large = pool->large; large; large = large->next) {
+-        if (large->alloc == NULL) {
+-            large->alloc = p;
+-            return p;
+-        }
+-
+-        if (n++ > 3) {
+-            break;
+-        }
+-    }
+-
+-    large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
++    large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
+     if (large == NULL) {
+         ngx_free(p);
+         return NULL;
+@@ -262,7 +225,7 @@
+         return NULL;
+     }
+ 
+-    large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
++    large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
+     if (large == NULL) {
+         ngx_free(p);
+         return NULL;
+@@ -279,17 +242,41 @@
+ ngx_int_t
+ ngx_pfree(ngx_pool_t *pool, void *p)
+ {
+-    ngx_pool_large_t  *l;
++    ngx_pool_large_t    *l;
++    ngx_pool_large_t    *ll;
++    ngx_pool_data_t     *d, *n;
+ 
+-    for (l = pool->large; l; l = l->next) {
++    for (l = pool->large, ll = l; l; ll = l, l = l->next) {
+         if (p == l->alloc) {
+             ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
+                            "free: %p", l->alloc);
+             ngx_free(l->alloc);
+             l->alloc = NULL;
++	    if (l == pool->large) {
++		pool->large = NULL;
++	    }
++
++            ll->next = l->next;
++	    p = l;
++	    break;
++        }
++    }
+ 
++    for (d = pool->d, n = d->next; ; d = n, n = d->next) {
++        if (p == d->alloc) {
++            ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
++            if (d->alloc) {
++                ngx_free(d->alloc);
++            }
++            d->alloc = NULL;
++            d->prev->next = d->next;
++            d->next->prev = d->prev;
++            ngx_free(d);
+             return NGX_OK;
+         }
++        if (d->next == pool->d) {
++            break;
++        }
+     }
+ 
+     return NGX_DECLINED;
+Only in nginx-1.0.6-no-pool/src/core: ngx_palloc.c~
+diff -ur nginx-1.0.6/src/core/ngx_palloc.h nginx-1.0.6-no-pool/src/core/ngx_palloc.h
+--- nginx-1.0.6/src/core/ngx_palloc.h	2009-12-17 20:25:46.000000000 +0800
++++ nginx-1.0.6-no-pool/src/core/ngx_palloc.h	2011-06-30 17:00:43.540946999 +0800
+@@ -38,6 +38,7 @@
+ 
+ 
+ typedef struct ngx_pool_large_s  ngx_pool_large_t;
++typedef struct ngx_pool_data_s   ngx_pool_data_t;
+ 
+ struct ngx_pool_large_s {
+     ngx_pool_large_t     *next;
+@@ -45,16 +46,15 @@
+ };
+ 
+ 
+-typedef struct {
+-    u_char               *last;
+-    u_char               *end;
+-    ngx_pool_t           *next;
+-    ngx_uint_t            failed;
+-} ngx_pool_data_t;
++struct ngx_pool_data_s{
++    ngx_pool_data_t		*next;
++    ngx_pool_data_t		*prev;
++	void				*alloc;
++};
+ 
+ 
+ struct ngx_pool_s {
+-    ngx_pool_data_t       d;
++    ngx_pool_data_t      *d;
+     size_t                max;
+     ngx_pool_t           *current;
+     ngx_chain_t          *chain;
diff --git a/patches/nginx-1.0.6-request_body_in_single_buf.patch b/patches/nginx-1.0.6-request_body_in_single_buf.patch
new file mode 100644
index 0000000..7d50d73
--- /dev/null
+++ b/patches/nginx-1.0.6-request_body_in_single_buf.patch
@@ -0,0 +1,27 @@
+# HG changeset patch
+# User Maxim Dounin <mdounin@mdounin.ru>
+# Date 1309799136 -14400
+# Node ID 99e276bba8596bc4df9e638482ee413f4c6bf700
+# Parent  e7b2f945d55ae44a2295facf9e3336dc4633e5b5
+Core: fix body with request_body_in_single_buf.
+
+If there were preread data and request body was big enough first part
+of request body was duplicated.
+
+See report here:
+http://nginx.org/pipermail/nginx/2011-July/027756.html
+
+diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
+--- a/src/http/ngx_http_request_body.c
++++ b/src/http/ngx_http_request_body.c
+@@ -372,7 +372,9 @@ ngx_http_do_read_client_request_body(ngx
+         }
+     }
+ 
+-    if (r->request_body_in_file_only && rb->bufs->next) {
++    if (rb->bufs->next
++        && (r->request_body_in_file_only || r->request_body_in_single_buf))
++    {
+         rb->bufs = rb->bufs->next;
+     }
+ 
diff --git a/patches/nginx-1.0.6-request_body_preread_fix.patch b/patches/nginx-1.0.6-request_body_preread_fix.patch
new file mode 100644
index 0000000..0639368
--- /dev/null
+++ b/patches/nginx-1.0.6-request_body_preread_fix.patch
@@ -0,0 +1,17 @@
+# HG changeset patch
+# User Maxim Dounin <mdounin@mdounin.ru>
+# Date 1309776931 -14400
+# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
+# Parent  610e909bb9e29766188aa86fae3abe0bd3432940
+Core: fix body if it's preread and there are extra data.
+
+--- nginx-1.0.6/src/http/ngx_http_request_body.c	2011-07-05 12:11:21.619264633 +0800
++++ nginx-1.0.6-patched/src/http/ngx_http_request_body.c	2011-07-05 12:14:30.694321554 +0800
+@@ -141,6 +141,7 @@
+ 
+             /* the whole request body was pre-read */
+ 
++            b->last = b->pos + r->headers_in.content_length_n;
+             r->header_in->pos += (size_t) r->headers_in.content_length_n;
+             r->request_length += r->headers_in.content_length_n;
+ 
diff --git a/patches/nginx-1.0.6-server_header.patch b/patches/nginx-1.0.6-server_header.patch
new file mode 100644
index 0000000..3dfedbc
--- /dev/null
+++ b/patches/nginx-1.0.6-server_header.patch
@@ -0,0 +1,26 @@
+diff -ur lz-nginx-1.0.6/nginx-1.0.6/src/core/nginx.h lz-nginx-1.0.6-patched/nginx-1.0.6/src/core/nginx.h
+--- lz-nginx-1.0.6/nginx-1.0.6/src/core/nginx.h	2010-02-12 17:31:01.000000000 +0800
++++ lz-nginx-1.0.6-patched/nginx-1.0.6/src/core/nginx.h	2010-03-30 10:52:13.240702627 +0800
+@@ -10,7 +10,7 @@
+ 
+ #define nginx_version         1000006
+ #define NGINX_VERSION      "1.0.6"
+-#define NGINX_VER          "nginx/" NGINX_VERSION
++#define NGINX_VER          "ngx_openresty/" NGINX_VERSION ".unknown"
+ 
+ #define NGINX_VAR          "NGINX"
+ #define NGX_OLDPID_EXT     ".oldbin"
+Only in lz-nginx-1.0.6-patched/nginx-1.0.6/src/core: nginx.h.orig
+Only in lz-nginx-1.0.6-patched/nginx-1.0.6/src/core: nginx.h.rej
+diff -ur lz-nginx-1.0.6/nginx-1.0.6/src/http/ngx_http_header_filter_module.c lz-nginx-1.0.6-patched/nginx-1.0.6/src/http/ngx_http_header_filter_module.c
+--- lz-nginx-1.0.6/nginx-1.0.6/src/http/ngx_http_header_filter_module.c	2010-03-03 23:14:04.000000000 +0800
++++ lz-nginx-1.0.6-patched/nginx-1.0.6/src/http/ngx_http_header_filter_module.c	2010-03-30 10:52:53.670909405 +0800
+@@ -45,7 +45,7 @@
+ };
+ 
+ 
+-static char ngx_http_server_string[] = "Server: nginx" CRLF;
++static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
+ static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
+ 
+ 
diff --git a/patches/nginx-1.0.6-subrequest_loop.patch b/patches/nginx-1.0.6-subrequest_loop.patch
new file mode 100644
index 0000000..0b9ca69
--- /dev/null
+++ b/patches/nginx-1.0.6-subrequest_loop.patch
@@ -0,0 +1,40 @@
+# HG changeset patch
+# User Maxim Dounin <mdounin@mdounin.ru>
+# Date 1309187571 -14400
+# Node ID 283a416b2235d5383c12a975edc8866f007fb628
+# Parent  f5fc40783ddcbf4db33859ee2a9bce54cf32c350
+Core: protect from subrequest loops.
+
+Without protection subrequest loop results in r->count overflow and
+SIGSEGV.  Protection was broken in 0.7.25.
+
+Note that this also limits number of parallel subrequests.  This
+wasn't exactly the case before 0.7.25 as local subrequests were
+completed directly.
+
+See here for details:
+
+http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
+
+diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
+--- a/src/http/ngx_http_core_module.c
++++ b/src/http/ngx_http_core_module.c
+@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
+    sr->start_sec = tp->sec;
+    sr->start_msec = tp->msec;
+ 
+-    r->main->subrequests++;
+    r->main->count++;
+ 
+    *psr = sr;
+diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
+--- a/src/http/ngx_http_request.c
++++ b/src/http/ngx_http_request.c
+@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
+        if (r == c->data) {
+ 
+            r->main->count--;
++            r->main->subrequests++;
+ 
+            if (!r->logged) {
+
diff --git a/util/ver b/util/ver
index 0098e18..41e22e7 100755
--- a/util/ver
+++ b/util/ver
@@ -1,7 +1,7 @@
 #!/bin/bash
 
-main_ver=1.0.5
-minor_ver=1
+main_ver=1.0.6
+minor_ver=0rc1
 version=$main_ver.$minor_ver
 echo $version