diff --git a/src/core/nginx.h b/src/core/nginx.h
index bac01fc..04282ef 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
 #define _NGINX_H_INCLUDED_
 
 
-#define NGINX_VER          "nginx/0.1.2"
+#define NGINX_VER          "nginx/0.1.3"
 
 #define NGINX_VAR          "NGINX"
 #define NGX_NEWPID_EXT     ".newbin"
diff --git a/src/core/ngx_file.h b/src/core/ngx_file.h
index 9a6fe6e..d05b6d7 100644
--- a/src/core/ngx_file.h
+++ b/src/core/ngx_file.h
@@ -26,7 +26,7 @@
 
     ngx_log_t       *log;
 
-    unsigned         info_valid:1;
+    ngx_uint_t       valid_info:1;  /* unsigned  valid_info:1; */
 };
 
 #define NGX_MAX_PATH_LEVEL  3
diff --git a/src/core/ngx_garbage_collector.c b/src/core/ngx_garbage_collector.c
index d73ca95..73f9cc1 100644
--- a/src/core/ngx_garbage_collector.c
+++ b/src/core/ngx_garbage_collector.c
@@ -153,7 +153,7 @@
         ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,
                        "gc path: \"%s\"", fname.data);
 
-        if (!dir.info_valid) {
+        if (!dir.valid_info) {
             if (ngx_de_info(fname.data, &dir) == NGX_FILE_ERROR) {
                 ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
                               ngx_de_info_n " \"%s\" failed", fname.data);
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index 8e4e09a..390ca43 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -41,6 +41,7 @@
  *    %[0][width]ui    ngx_uint_t
  *    %[0][width]uxi   ngx_uint_t in hex
  *    %s               null-terminated string
+ *    %c               char
  *    %%               %
  *
  */
@@ -223,6 +224,13 @@
 
                 continue;
 
+            case 'c':
+                d = va_arg(arg, int);
+                *buf++ = (u_char) (d & 0xff);
+                fmt++;
+
+                continue;
+
             case '%':
                 *buf++ = '%';
                 fmt++;
diff --git a/src/event/ngx_event_connect.h b/src/event/ngx_event_connect.h
index 025b916..345c2f9 100644
--- a/src/event/ngx_event_connect.h
+++ b/src/event/ngx_event_connect.h
@@ -31,7 +31,7 @@
     ngx_int_t           current;
     ngx_int_t           number;
     ngx_int_t           max_fails;
-    ngx_int_t           fail_timeout;
+    time_t              fail_timeout;
     ngx_int_t           last_cached;
 
  /* ngx_mutex_t        *mutex; */
diff --git a/src/event/ngx_event_pipe.c b/src/event/ngx_event_pipe.c
index 71fc500..24bc4d3 100644
--- a/src/event/ngx_event_pipe.c
+++ b/src/event/ngx_event_pipe.c
@@ -619,6 +619,8 @@
 
         b->in_file = 1;
         b->temp_file = 1;
+        b->temporary = 0;
+        b->recycled = 0;
 
         ngx_chain_add_link(p->out, p->last_out, cl);
 
diff --git a/src/http/modules/ngx_http_autoindex_handler.c b/src/http/modules/ngx_http_autoindex_handler.c
new file mode 100644
index 0000000..5f1726e
--- /dev/null
+++ b/src/http/modules/ngx_http_autoindex_handler.c
@@ -0,0 +1,560 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+
+
+#if 0
+
+typedef struct {
+    ngx_buf_t     *buf;
+    size_t         size;
+    ngx_pool_t    *pool;
+    size_t         alloc_size;
+    ngx_chain_t  **last_out;
+} ngx_http_autoindex_ctx_t;
+
+#endif
+
+
+typedef struct {
+    ngx_str_t      name;
+    ngx_uint_t     dir;
+    time_t         mtime;
+    off_t          size;
+} ngx_http_autoindex_entry_t;
+
+
+typedef struct {
+    ngx_flag_t     enable;
+} ngx_http_autoindex_loc_conf_t;
+
+
+#define NGX_HTTP_AUTOINDEX_NAME_LEN  50
+
+
+static int ngx_http_autoindex_cmp_entries(const void *one, const void *two);
+static ngx_int_t ngx_http_autoindex_error(ngx_http_request_t *r, ngx_dir_t *dir,
+                                          u_char *name);
+static ngx_int_t ngx_http_autoindex_init(ngx_cycle_t *cycle);
+static void *ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf);
+static char *ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf,
+                                               void *parent, void *child);
+
+
+static ngx_command_t  ngx_http_autoindex_commands[] = {
+
+    { ngx_string("autoindex"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_autoindex_loc_conf_t, enable),
+      NULL },
+
+      ngx_null_command
+};
+
+
+ngx_http_module_t  ngx_http_autoindex_module_ctx = {
+    NULL,                                  /* pre conf */
+
+    NULL,                                  /* create main configuration */
+    NULL,                                  /* init main configuration */
+
+    NULL,                                  /* create server configuration */
+    NULL,                                  /* merge server configuration */
+
+    ngx_http_autoindex_create_loc_conf,    /* create location configration */
+    ngx_http_autoindex_merge_loc_conf      /* merge location configration */
+};
+
+
+ngx_module_t  ngx_http_autoindex_module = {
+    NGX_MODULE,
+    &ngx_http_autoindex_module_ctx,        /* module context */ 
+    ngx_http_autoindex_commands,           /* module directives */
+    NGX_HTTP_MODULE,                       /* module type */
+    ngx_http_autoindex_init,               /* init module */
+    NULL                                   /* init child */
+};
+
+
+static u_char title[] =
+"<html>" CRLF
+"<head><title>Index of "
+;
+
+
+static u_char header[] =
+"</title></head>" CRLF
+"<body bgcolor=\"white\">" CRLF
+"<h1>Index of "
+;
+
+static u_char tail[] =
+"</body>" CRLF
+"</html>" CRLF
+;
+
+
+static ngx_int_t ngx_http_autoindex_handler(ngx_http_request_t *r)
+{
+    u_char                         *last, scale;
+    size_t                          len;
+    off_t                           length;
+    ngx_tm_t                        tm;
+    ngx_int_t                       rc, size;
+    ngx_uint_t                      i, level;
+    ngx_err_t                       err;
+    ngx_buf_t                      *b;
+    ngx_chain_t                     out;
+    ngx_str_t                       dname, fname;
+    ngx_dir_t                       dir;
+    ngx_pool_t                     *pool;
+    ngx_array_t                     entries;
+    ngx_http_core_loc_conf_t       *clcf;
+    ngx_http_autoindex_entry_t     *entry;
+    ngx_http_autoindex_loc_conf_t  *alcf;
+
+    static char  *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+                               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
+
+    if (r->uri.data[r->uri.len - 1] != '/') {
+        return NGX_DECLINED;
+    }
+
+    alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);
+
+    if (!alcf->enable) {
+        return NGX_DECLINED;
+    }
+
+    /* TODO: pool should be temporary pool */
+    pool = r->pool;
+
+    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
+    if (clcf->alias) {
+        dname.data = ngx_palloc(pool, clcf->root.len + r->uri.len
+                                                     + NGX_DIR_MASK_LEN
+                                                     - clcf->name.len);
+        if (dname.data == NULL) {
+            return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
+    
+        last = ngx_cpymem(dname.data, clcf->root.data, clcf->root.len);
+        last = ngx_cpystrn(last, r->uri.data + clcf->name.len,
+                           r->uri.len - clcf->name.len);
+
+    } else {
+        dname.data = ngx_palloc(pool, clcf->root.len + r->uri.len
+                                                     + NGX_DIR_MASK_LEN);
+        if (dname.data == NULL) {
+            return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
+
+        last = ngx_cpymem(dname.data, clcf->root.data, clcf->root.len);
+        last = ngx_cpystrn(last, r->uri.data, r->uri.len);
+
+    }
+
+    dname.len = last - dname.data;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                   "http autoindex: \"%s\"", dname.data);
+
+
+    if (ngx_open_dir(&dname, &dir) == NGX_ERROR) {
+        err = ngx_errno;
+
+        if (err == NGX_ENOENT || err == NGX_ENOTDIR) {
+            level = NGX_LOG_ERR;
+            rc = NGX_HTTP_NOT_FOUND;
+
+        } else if (err == NGX_EACCES) {
+            level = NGX_LOG_ERR;
+            rc = NGX_HTTP_FORBIDDEN;
+
+        } else {
+            level = NGX_LOG_CRIT;
+            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
+
+        ngx_log_error(level, r->connection->log, err,
+                      ngx_open_dir_n " \"%s\" failed", dname.data);
+
+        return rc;
+    }
+
+#if (NGX_SUPPRESS_WARN)
+    /* MSVC thinks 'entries' may be used without having been initialized */
+    ngx_memzero(&entries, sizeof(ngx_array_t));
+#endif
+
+    if (ngx_array_init(&entries, pool, 50, sizeof(ngx_http_autoindex_entry_t))
+                                                                  == NGX_ERROR)
+    {
+        return ngx_http_autoindex_error(r, &dir, dname.data);
+    }
+
+    fname.len = 0;
+#if (NGX_SUPPRESS_WARN)
+    fname.data = NULL;
+#endif
+
+    for ( ;; ) {
+        ngx_set_errno(0);
+
+        if (ngx_read_dir(&dir) == NGX_ERROR) {
+            err = ngx_errno;
+
+            if (err == NGX_ENOMOREFILES) {
+                rc = NGX_OK;
+
+            } else {
+                ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
+                              ngx_read_dir_n " \"%s\" failed", dname.data);
+                return ngx_http_autoindex_error(r, &dir, dname.data);
+            }
+
+            break; 
+        }
+
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                       "http autoindex file: \"%s\"", ngx_de_name(&dir));
+
+        len = ngx_de_namelen(&dir);
+
+        if (!dir.valid_info) {
+
+            if (dname.len + 1 + len > fname.len) {
+                fname.len = dname.len + 1 + len + 32;
+
+                if (!(fname.data = ngx_palloc(pool, fname.len))) {
+                    return ngx_http_autoindex_error(r, &dir, dname.data);
+                }
+
+                last = ngx_cpystrn(fname.data, dname.data,
+                                   dname.len + 1);
+                *last++ = '/';
+            }
+
+            ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
+
+            if (ngx_de_info(fname.data, &dir) == NGX_FILE_ERROR) {
+                ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
+                              ngx_de_info_n " \"%s\" failed", fname.data);
+                return ngx_http_autoindex_error(r, &dir, dname.data);
+            }
+        }
+
+        if (len == 1 && ngx_de_name(&dir)[0] == '.') {
+            continue;
+        }
+
+        if (len == 2
+            && ngx_de_name(&dir)[0] == '.'
+            && ngx_de_name(&dir)[0] == '.')
+        {
+            continue;
+        }
+
+        if (!(entry = ngx_array_push(&entries))) {
+            return ngx_http_autoindex_error(r, &dir, dname.data);
+        }
+
+        entry->name.len = len;        
+
+        if (!(entry->name.data = ngx_palloc(pool, len + 1))) {
+            return ngx_http_autoindex_error(r, &dir, dname.data);
+        }
+        ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1);
+
+        entry->dir = ngx_de_is_dir(&dir);
+        entry->mtime = ngx_de_mtime(&dir);
+        entry->size = ngx_de_size(&dir);
+    }
+
+    if (ngx_close_dir(&dir) == NGX_ERROR) {
+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
+                      ngx_close_dir_n " \"%s\" failed", dname.data);
+    }
+
+    len = sizeof(title) - 1
+          + r->uri.len
+          + sizeof(header) - 1
+          + r->uri.len
+          + sizeof("</h1>") - 1
+          + sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1
+          + sizeof("</pre><hr>") - 1
+          + sizeof(tail) - 1;
+
+    entry = entries.elts;
+    for (i = 0; i < entries.nelts; i++) {
+        len += sizeof("<a href=\"") - 1
+               + 1                                          /* 1 is for "/" */
+               + entry[i].name.len
+               + sizeof("\">") - 1
+               + NGX_HTTP_AUTOINDEX_NAME_LEN
+               + sizeof("</a>") - 1
+               + 1
+               + sizeof("28-Sep-1970 12:00 ") - 1
+               + sizeof("1023G") - 1
+               + 2;
+    }
+
+    if (!(b = ngx_create_temp_buf(r->pool, len))) {
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+    }
+
+    if (entries.nelts > 1) {
+        ngx_qsort(entry, (size_t) entries.nelts,
+                  sizeof(ngx_http_autoindex_entry_t),
+                  ngx_http_autoindex_cmp_entries);
+    }
+
+    b->last = ngx_cpymem(b->last, title, sizeof(title) - 1);
+    b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);
+    b->last = ngx_cpymem(b->last, header, sizeof(header) - 1);
+    b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len);
+    b->last = ngx_cpymem(b->last, "</h1>", sizeof("</h1>") - 1);
+
+    b->last = ngx_cpymem(b->last, "<hr><pre><a href=\"../\">../</a>" CRLF,
+                         sizeof("<hr><pre><a href=\"../\">../</a>" CRLF) - 1);
+
+    for (i = 0; i < entries.nelts; i++) {
+        b->last = ngx_cpymem(b->last, "<a href=\"", sizeof("<a href=\"") - 1);
+        b->last = ngx_cpymem(b->last, entry[i].name.data, entry[i].name.len);
+
+        if (entry[i].dir) {
+            *b->last++ = '/';
+        }
+
+        *b->last++ = '"';
+        *b->last++ = '>';
+
+        b->last = ngx_cpystrn(b->last, entry[i].name.data,
+                              NGX_HTTP_AUTOINDEX_NAME_LEN + 1);
+
+        len = entry[i].name.len;
+
+        if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
+            b->last = ngx_cpymem(b->last - 3, "..&gt;</a>",
+                                 sizeof("..&gt;</a>") - 1);
+
+        } else {
+            if (entry[i].dir && NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {
+                *b->last++ = '/';
+                len++;
+            }
+
+            b->last = ngx_cpymem(b->last, "</a>", sizeof("</a>") - 1);
+            ngx_memset(b->last, ' ', NGX_HTTP_AUTOINDEX_NAME_LEN - len);
+            b->last += NGX_HTTP_AUTOINDEX_NAME_LEN - len;
+        }
+
+        *b->last++ = ' ';
+
+        ngx_gmtime(entry[i].mtime, &tm);
+
+        b->last = ngx_sprintf(b->last, "%02d-%s-%d %02d:%02d ",
+                              tm.ngx_tm_mday,
+                              months[tm.ngx_tm_mon - 1],
+                              tm.ngx_tm_year,
+                              tm.ngx_tm_hour,
+                              tm.ngx_tm_min);
+
+        if (entry[i].dir) {
+            b->last = ngx_cpymem(b->last, "   -", sizeof("   -") - 1);
+
+        } else {
+            length = entry[i].size;
+
+            if (length > 999999999) {
+                size = (ngx_int_t) length / 1024 * 1024 * 1024;
+                if ((length % 1024 * 1024 * 1024)
+                                                > (1024 * 1024 * 1024 / 2 - 1))
+                {
+                    size++;
+                }
+                scale = 'G';
+
+            } else if (length > 999999) {
+                size = (ngx_int_t) length / 1024 * 1024;
+                if ((length % 1024 * 1024) > (1024 * 1024 / 2 - 1)) {
+                    size++;
+                }
+                scale = 'M';
+
+            } else if (length > 9999) {
+                size = (ngx_int_t) length / 1024;
+                if (length % 1024 > 511) {
+                    size++;
+                }
+                scale = 'K';
+
+            } else {
+                size = (ngx_int_t) length;
+                scale = ' ';
+            }
+
+            b->last = ngx_sprintf(b->last, "%4i", size);
+
+            if (scale != ' ') {
+                *b->last++ = scale;
+            }
+        }
+
+        *b->last++ = CR;
+        *b->last++ = LF;
+    }
+
+    b->last = ngx_cpymem(b->last, "</pre><hr>", sizeof("</pre><hr>") - 1);
+
+    b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1);
+
+    r->headers_out.status = NGX_HTTP_OK;
+    r->headers_out.content_length_n = b->last - b->pos;
+
+    r->headers_out.content_type = ngx_list_push(&r->headers_out.headers);
+    if (r->headers_out.content_type == NULL) {
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+    }
+
+    r->headers_out.content_type->key.len = 0;
+    r->headers_out.content_type->key.data = NULL;
+    r->headers_out.content_type->value.len = sizeof("text/html") - 1;
+    r->headers_out.content_type->value.data = (u_char *) "text/html";
+
+    rc = ngx_http_send_header(r);
+
+    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
+        return rc;
+    }
+
+    if (!r->main) {
+        b->last_buf = 1;
+    }
+
+    out.buf = b;
+    out.next = NULL;
+
+    return ngx_http_output_filter(r, &out);
+}
+
+
+static int ngx_http_autoindex_cmp_entries(const void *one, const void *two)
+{
+    ngx_http_autoindex_entry_t *first = (ngx_http_autoindex_entry_t *) one;
+    ngx_http_autoindex_entry_t *second = (ngx_http_autoindex_entry_t *) two;
+
+    if (first->dir && !second->dir) {
+        /* move the directories to the start */
+        return -1;
+    }
+
+    if (!first->dir && second->dir) {
+        /* move the directories to the start */
+        return 1;
+    }
+
+    return (int) ngx_strcmp(first->name.data, second->name.data);
+}
+
+
+#if 0
+
+static ngx_buf_t *ngx_http_autoindex_alloc(ngx_http_autoindex_ctx_t *ctx,
+                                           size_t size)
+{
+    ngx_chain_t  *cl;
+
+    if (ctx->buf) {
+
+        if ((size_t) (ctx->buf->end - ctx->buf->last) >= size) {
+            return ctx->buf;
+        }
+
+        ctx->size += ctx->buf->last - ctx->buf->pos;
+    }
+
+    if (!(ctx->buf = ngx_create_temp_buf(ctx->pool, ctx->alloc_size))) {
+        return NULL;
+    }
+
+    if (!(cl = ngx_alloc_chain_link(ctx->pool))) {
+        return NULL;
+    }
+
+    cl->buf = ctx->buf;
+    cl->next = NULL;
+
+    *ctx->last_out = cl;
+    ctx->last_out = &cl->next;
+
+    return ctx->buf;
+}
+
+#endif
+
+
+static ngx_int_t ngx_http_autoindex_error(ngx_http_request_t *r, ngx_dir_t *dir,
+                                          u_char *name)
+{
+    if (ngx_close_dir(dir) == NGX_ERROR) {
+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
+                      ngx_close_dir_n " \"%s\" failed", name);
+    }
+
+    return NGX_HTTP_INTERNAL_SERVER_ERROR;
+}
+
+
+static ngx_int_t ngx_http_autoindex_init(ngx_cycle_t *cycle)
+{
+    ngx_http_handler_pt        *h;
+    ngx_http_core_main_conf_t  *cmcf;
+
+    cmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_core_module);
+
+    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
+    if (h == NULL) {
+        return NGX_ERROR;
+    }
+
+    *h = ngx_http_autoindex_handler;
+
+    return NGX_OK;
+}
+
+
+static void *ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf)
+{
+    ngx_http_autoindex_loc_conf_t  *conf;
+
+    conf = ngx_palloc(cf->pool, sizeof(ngx_http_autoindex_loc_conf_t));
+    if (conf == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    conf->enable = NGX_CONF_UNSET;
+
+    return conf;
+}
+
+
+static char *ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf,
+                                               void *parent, void *child)
+{
+    ngx_http_autoindex_loc_conf_t *prev = parent;
+    ngx_http_autoindex_loc_conf_t *conf = child;
+
+    ngx_conf_merge_value(conf->enable, prev->enable, 0);
+
+    return NGX_CONF_OK;
+}
diff --git a/src/http/modules/ngx_http_index_handler.c b/src/http/modules/ngx_http_index_handler.c
index 68a9d36..60b6c01 100644
--- a/src/http/modules/ngx_http_index_handler.c
+++ b/src/http/modules/ngx_http_index_handler.c
@@ -100,7 +100,7 @@
  * that path contains the usual file in place of the directory.
  */
 
-ngx_int_t ngx_http_index_handler(ngx_http_request_t *r)
+static ngx_int_t ngx_http_index_handler(ngx_http_request_t *r)
 {
     u_char                     *name;
     ngx_fd_t                    fd;
diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.c b/src/http/modules/proxy/ngx_http_proxy_handler.c
index 5d61167..64f7c07 100644
--- a/src/http/modules/proxy/ngx_http_proxy_handler.c
+++ b/src/http/modules/proxy/ngx_http_proxy_handler.c
@@ -98,6 +98,13 @@
       offsetof(ngx_http_proxy_loc_conf_t, preserve_host),
       NULL },
 
+    { ngx_string("proxy_set_x_url"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_proxy_loc_conf_t, set_x_url),
+      NULL },
+
     { ngx_string("proxy_set_x_real_ip"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
       ngx_conf_set_flag_slot,
@@ -894,6 +901,7 @@
     conf->send_lowat = NGX_CONF_UNSET_SIZE;
 
     conf->preserve_host = NGX_CONF_UNSET;
+    conf->set_x_url = NGX_CONF_UNSET;
     conf->set_x_real_ip = NGX_CONF_UNSET;
     conf->add_x_forwarded_for = NGX_CONF_UNSET;
 
@@ -938,6 +946,7 @@
     ngx_conf_merge_size_value(conf->send_lowat, prev->send_lowat, 0);
 
     ngx_conf_merge_value(conf->preserve_host, prev->preserve_host, 0);
+    ngx_conf_merge_value(conf->set_x_url, prev->set_x_url, 0);
     ngx_conf_merge_value(conf->set_x_real_ip, prev->set_x_real_ip, 0);
     ngx_conf_merge_value(conf->add_x_forwarded_for,
                          prev->add_x_forwarded_for, 0);
@@ -1147,6 +1156,10 @@
 
         lcf->peers->number = i;
 
+        /* STUB */
+        lcf->peers->max_fails = 1;
+        lcf->peers->fail_timeout = 60;
+
         for (i = 0; h->h_addr_list[i] != NULL; i++) {
             lcf->peers->peers[i].host.data = host;
             lcf->peers->peers[i].host.len = lcf->upstream->host.len;
diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.h b/src/http/modules/proxy/ngx_http_proxy_handler.h
index 3e721ba..76db652 100644
--- a/src/http/modules/proxy/ngx_http_proxy_handler.h
+++ b/src/http/modules/proxy/ngx_http_proxy_handler.h
@@ -75,6 +75,7 @@
     ngx_flag_t                       cyclic_temp_file;
     ngx_flag_t                       cache;
     ngx_flag_t                       preserve_host;
+    ngx_flag_t                       set_x_url;
     ngx_flag_t                       set_x_real_ip;
     ngx_flag_t                       add_x_forwarded_for;
     ngx_flag_t                       pass_server;
diff --git a/src/http/modules/proxy/ngx_http_proxy_upstream.c b/src/http/modules/proxy/ngx_http_proxy_upstream.c
index 88479da..9b3d884 100644
--- a/src/http/modules/proxy/ngx_http_proxy_upstream.c
+++ b/src/http/modules/proxy/ngx_http_proxy_upstream.c
@@ -43,6 +43,7 @@
 
 static char  http_version[] = " HTTP/1.0" CRLF;
 static char  host_header[] = "Host: ";
+static char  x_url_header[] = "X-URL: http";
 static char  x_real_ip_header[] = "X-Real-IP: ";
 static char  x_forwarded_for_header[] = "X-Forwarded-For: ";
 static char  connection_close_header[] = "Connection: close" CRLF;
@@ -142,18 +143,36 @@
     }
 
     len += uc->uri.len
-           + r->uri.len - uc->location->len + escape
-           + 1 + r->args.len                                 /* 1 is for "?" */
-           + sizeof(http_version) - 1
-           + sizeof(connection_close_header) - 1
-           + 2;                         /* 2 is for "\r\n" at the header end */
+        + r->uri.len - uc->location->len + escape
+        + 1 + r->args.len                                   /* 1 is for "?" */
+        + sizeof(http_version) - 1
+        + sizeof(connection_close_header) - 1
+        + 2;                           /* 2 is for "\r\n" at the header end */
+
+
+    if (p->lcf->set_x_url) {
+        len += sizeof(x_url_header) - 1
+            + 4                                          /* 4 is for "s://" */
+            + r->port_text->len
+            + r->unparsed_uri.len
+            + 2;                        /* 2 is for "\r\n" at the header end */
+
+        if (r->headers_in.host) {
+            len += r->headers_in.host_name_len;
+
+        } else {
+            len += r->server_name.len;
+        }
+
+    }
+
 
     if (p->lcf->preserve_host && r->headers_in.host) {
         len += sizeof(host_header) - 1
-               + r->headers_in.host_name_len
-               + 1                                           /* 1 is for ":" */
-               + uc->port_text.len
-               + 2;                                       /* 2 is for "\r\n" */
+            + r->headers_in.host_name_len
+            + 1                                              /* 1 is for ":" */
+            + uc->port_text.len
+            + 2;                                          /* 2 is for "\r\n" */
     } else {                                              /* 2 is for "\r\n" */
         len += sizeof(host_header) - 1 + uc->host_header.len + 2;
     }
@@ -167,10 +186,10 @@
     if (p->lcf->add_x_forwarded_for) {
         if (r->headers_in.x_forwarded_for) {
             len += sizeof(x_forwarded_for_header) - 1
-                   + r->headers_in.x_forwarded_for->value.len
-                   + 2                                      /* 2 is ofr ", " */
-                   + INET_ADDRSTRLEN - 1
-                   + 2;                                   /* 2 is for "\r\n" */
+                + r->headers_in.x_forwarded_for->value.len
+                + 2                                         /* 2 is ofr ", " */
+                + INET_ADDRSTRLEN - 1
+                + 2;                                      /* 2 is for "\r\n" */
         } else {
             len += sizeof(x_forwarded_for_header) - 1 + INET_ADDRSTRLEN - 1 + 2;
                                                           /* 2 is for "\r\n" */
@@ -271,6 +290,39 @@
     *(b->last++) = CR; *(b->last++) = LF;
 
 
+    /* the "X-URL" header */
+
+    if (p->lcf->set_x_url) {
+
+        b->last = ngx_cpymem(b->last, x_url_header,
+                             sizeof(x_url_header) - 1);
+
+#if (NGX_OPENSSL)
+
+        if (r->connection->ssl) {
+            *(b->last++) = 's';
+        }
+
+#endif
+
+        *(b->last++) = ':'; *(b->last++) = '/'; *(b->last++) = '/';
+
+        if (r->headers_in.host) {
+            b->last = ngx_cpymem(b->last, r->headers_in.host->value.data,
+                                 r->headers_in.host_name_len);
+        } else {
+            b->last = ngx_cpymem(b->last, r->server_name.data,
+                                 r->server_name.len);
+        }
+
+        b->last = ngx_cpymem(b->last, r->port_text->data, r->port_text->len);
+        b->last = ngx_cpymem(b->last, r->unparsed_uri.data,
+                             r->unparsed_uri.len);
+
+        *(b->last++) = CR; *(b->last++) = LF;
+    }
+
+
     /* the "X-Real-IP" header */
 
     if (p->lcf->set_x_real_ip) {
@@ -339,6 +391,14 @@
             continue;
         }
 
+        if (&header[i] == r->headers_in.x_real_ip && p->lcf->set_x_real_ip) {
+            continue;
+        }
+
+        if (&header[i] == r->headers_in.x_url && p->lcf->set_x_url) {
+            continue;
+        }
+
         b->last = ngx_cpymem(b->last, header[i].key.data, header[i].key.len);
 
         *(b->last++) = ':'; *(b->last++) = ' ';
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index 8544e25..8f101ba 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -1012,7 +1012,7 @@
         return 1;
     }
 
-    return rc;
+    return (int) rc;
 }
 
 
diff --git a/src/http/ngx_http_header_filter.c b/src/http/ngx_http_header_filter.c
index a083b45..595dd59 100644
--- a/src/http/ngx_http_header_filter.c
+++ b/src/http/ngx_http_header_filter.c
@@ -220,7 +220,7 @@
     {
         r->headers_out.location->key.len = 0;
         len += sizeof("Location: http://") - 1
-               + r->server_name->len + r->headers_out.location->value.len + 2;
+               + r->server_name.len + r->headers_out.location->value.len + 2;
 
         if (r->port != 80) {
             len += r->port_text->len;
@@ -356,8 +356,8 @@
         p = b->last + sizeof("Location: ") - 1;
         b->last = ngx_cpymem(b->last, "Location: http://",
                              sizeof("Location: http://") - 1);
-        b->last = ngx_cpymem(b->last, r->server_name->data,
-                             r->server_name->len);
+        b->last = ngx_cpymem(b->last, r->server_name.data,
+                             r->server_name.len);
         if (r->port != 80) {
             b->last = ngx_cpymem(b->last, r->port_text->data,
                                  r->port_text->len);
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index 74173d8..d78a779 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -84,6 +84,8 @@
 #if (NGX_HTTP_PROXY)
     { ngx_string("X-Forwarded-For"),
                            offsetof(ngx_http_headers_in_t, x_forwarded_for) },
+    { ngx_string("X-Real-IP"), offsetof(ngx_http_headers_in_t, x_real_ip) },
+    { ngx_string("X-URL"), offsetof(ngx_http_headers_in_t, x_url) },
 #endif
     
     { ngx_null_string, 0 }
@@ -351,7 +353,7 @@
 #endif
 
     server_name = cscf->server_names.elts;
-    r->server_name = &server_name->name;
+    r->server_name = server_name->name;
 
     clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
     c->log->file = clcf->err_log->file;
@@ -1122,7 +1124,14 @@
 
             r->srv_conf = name[i].core_srv_conf->ctx->srv_conf;
             r->loc_conf = name[i].core_srv_conf->ctx->loc_conf;
-            r->server_name = &name[i].name;
+
+            if (name[i].wildcard) {
+                r->server_name.len = r->headers_in.host_name_len;
+                r->server_name.data = r->headers_in.host->value.data;
+
+            } else {
+                r->server_name = name[i].name;
+            }
 
             clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
             r->connection->log->file = clcf->err_log->file;
diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h
index 8a9c8f2..f1b957b 100644
--- a/src/http/ngx_http_request.h
+++ b/src/http/ngx_http_request.h
@@ -146,6 +146,8 @@
 
 #if (NGX_HTTP_PROXY)
     ngx_table_elt_t  *x_forwarded_for;
+    ngx_table_elt_t  *x_real_ip;
+    ngx_table_elt_t  *x_url;
 #endif
 
     ngx_array_t       cookies;
@@ -283,7 +285,7 @@
     uint32_t             in_addr;
     ngx_uint_t           port;
     ngx_str_t           *port_text;    /* ":80" */
-    ngx_str_t           *server_name;
+    ngx_str_t            server_name;
     ngx_array_t         *virtual_names;
 
     ngx_uint_t           phase;
diff --git a/src/os/unix/ngx_errno.c b/src/os/unix/ngx_errno.c
index 2faf63a..0c93d23 100644
--- a/src/os/unix/ngx_errno.c
+++ b/src/os/unix/ngx_errno.c
@@ -8,7 +8,7 @@
 #include <ngx_core.h>
 
 
-#if (HAVE_STRERROR_R)
+#if (NGX_STRERROR_R)
 
 ngx_int_t ngx_strerror_r(int err, char *errstr, size_t size)
 {
@@ -31,7 +31,7 @@
     return len;
 }
 
-#elif (HAVE_GNU_STRERROR_R)
+#elif (NGX_GNU_STRERROR_R)
 
 /* Linux strerror_r() */
 
diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h
index 7218bb2..cc9b1d1 100644
--- a/src/os/unix/ngx_errno.h
+++ b/src/os/unix/ngx_errno.h
@@ -51,6 +51,8 @@
 
 #else
 
+/* Solaris has threads-safe strerror() */
+
 #define ngx_strerror_r(err, errstr, size)  \
              (char *) ngx_cpystrn(errstr, strerror(err), size) - (errstr)
 
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c
index f2ba3a4..da75ba0 100644
--- a/src/os/unix/ngx_files.c
+++ b/src/os/unix/ngx_files.c
@@ -15,7 +15,7 @@
     ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
                    "read: %d, %X, %d, " OFF_T_FMT, file->fd, buf, size, offset);
 
-#if (HAVE_PREAD)
+#if (NGX_PREAD)
 
     n = pread(file->fd, buf, size, offset);
 
@@ -57,7 +57,7 @@
 {
     ssize_t n;
 
-#if (HAVE_PWRITE)
+#if (NGX_PWRITE)
 
     n = pwrite(file->fd, buf, size, offset);
 
@@ -206,7 +206,7 @@
         return NGX_ERROR;
     }
 
-    dir->info_valid = 0;
+    dir->valid_info = 0;
 
     return NGX_OK;
 }
diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h
index 06c22f5..b789d61 100644
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -98,7 +98,7 @@
 #define ngx_delete_dir_n         "rmdir()"
 
 
-#define ngx_de_name(dir)         (dir)->de->d_name
+#define ngx_de_name(dir)         ((u_char *) (dir)->de->d_name)
 #if (NGX_FREEBSD)
 #define ngx_de_namelen(dir)      (dir)->de->d_namlen
 #else
diff --git a/src/os/unix/ngx_types.h b/src/os/unix/ngx_types.h
index 49fb17d..870c414 100644
--- a/src/os/unix/ngx_types.h
+++ b/src/os/unix/ngx_types.h
@@ -19,7 +19,8 @@
     DIR              *dir;
     struct dirent    *de;
     struct stat       info;
-    unsigned          info_valid;
+
+    ngx_uint_t        valid_info:1;  /* unsigned  valid_info:1; */
 } ngx_dir_t;
 
 
diff --git a/src/os/win32/ngx_files.c b/src/os/win32/ngx_files.c
index bf6facd..dea3106 100644
--- a/src/os/win32/ngx_files.c
+++ b/src/os/win32/ngx_files.c
@@ -276,7 +276,7 @@
         return NGX_ERROR; 
     }
     
-    dir->info_valid = 1;
+    dir->valid_info = 1;
     dir->ready = 1;
 
     return NGX_OK;
diff --git a/src/os/win32/ngx_files.h b/src/os/win32/ngx_files.h
index 980b585..6d60315 100644
--- a/src/os/win32/ngx_files.h
+++ b/src/os/win32/ngx_files.h
@@ -129,7 +129,7 @@
 #define ngx_delete_dir_n            "RemoveDirectory()"
 
 
-#define ngx_de_name(dir)            (dir)->fd.cFileName
+#define ngx_de_name(dir)            ((u_char *) (dir)->fd.cFileName)
 #define ngx_de_namelen(dir)         ngx_strlen((dir)->fd.cFileName)
 #define ngx_de_info(name, dir)      NGX_OK
 #define ngx_de_info_n               "dummy()"
diff --git a/src/os/win32/ngx_types.h b/src/os/win32/ngx_types.h
index 4536a1f..e7a5151 100644
--- a/src/os/win32/ngx_types.h
+++ b/src/os/win32/ngx_types.h
@@ -19,8 +19,9 @@
 typedef struct {
     HANDLE            dir;
     WIN32_FIND_DATA   fd;
-    unsigned          info_valid;
-    unsigned          ready;
+
+    unsigned          valid_info:1;
+    unsigned          ready:1;
 } ngx_dir_t;
 
 
