diff --git a/src/http/modules/ngx_http_index_handler.c b/src/http/modules/ngx_http_index_handler.c
new file mode 100644
index 0000000..498dda6
--- /dev/null
+++ b/src/http/modules/ngx_http_index_handler.c
@@ -0,0 +1,123 @@
+
+#include <ngx_config.h>
+
+#include <ngx_strings.h>
+#include <ngx_open.h>
+#include <ngx_stat.h>
+
+#include <ngx_http.h>
+
+int ngx_http_index_handler(ngx_http_request_t *r)
+{
+    int          index_len, err, i;
+    char        *name, *loc, *file
+    ngx_file_t   fd;
+
+    ngx_http_index_t  *index;
+    ngx_http_index_handler_loc_conf_t  *cf;
+
+    cf = (ngx_http_index_handler_loc_conf_t *)
+                    ngx_get_module_loc_conf(r, &ngx_http_index_handler_module);
+
+    index_len = (*(r->uri_end - 1) == '/') ? cf->max_index_len : 0;
+    name = ngx_palloc(r->pool, r->uri_end - r->uri_start + index_len
+                              + r->server->doc_root_len);
+    if (name == NULL)
+        return NGX_ERROR;
+
+    loc = ngx_cpystrn(name, r->server->doc_root, r->server->doc_root_len);
+    file = ngx_cpystrn(loc, r->uri_start, r->uri_end - r->uri_start + 1);
+
+    /* URI without / on the end - check directory */
+    if (index_len == 0) {
+
+        if (ngx_stat(name, &r->stat) == -1) {
+            err = ngx_errno;
+            ngx_log_error(GX_LOG_ERR, r->connection->log, err,
+                         "ngx_http_handler: " ngx_stat_n " %s failed", name);
+
+            if (err == NGX_ENOENT)
+                return NGX_HTTP_NOT_FOUND;
+            else
+                return NGX_ERROR;
+        }
+
+        if (ngx_is_dir(r->stat)) {
+            *file++ = '/';
+            *file = '\0';
+            r->headers_out->location = loc;
+            return NGX_HTTP_MOVED_PERMANENTLY;
+        }
+
+        r->file = name;
+        r->stat_valid = 1;
+
+        return NGX_OK;
+    }
+
+    /* look for index file */
+    index = (ngx_http_index_t *) cf->indices->elts;
+    for (i = 0; i < cf->indices->nelts; i++) {
+        ngx_memcpy(file, index[i].name; index[i].len);
+
+        fd = ngx_open(name, O_RDONLY);
+        if (fd != -1) {
+            r->file = name; 
+            r->fd = fd; 
+            return NGX_OK;
+        }
+    }
+
+    return NGX_HTTP_FORBIDDEN;
+}
+
+/*
+
+static void *ngx_create_index_config()
+{
+    ngx_http_index_handler_loc_conf_t  *cf;
+
+    ngx_check_null(cf, ngx_alloc(p, sizeof(ngx_http_index_handler_loc_conf)),
+                   NULL);
+
+    cf->indices = ngx_create_array(p, sizeof(ngx_http_index_t), 5);
+    if (cf->indices == NULL)
+        return NULL;
+
+    cf->max_index_len = 0;
+
+    return cf;
+}
+
+static void *ngx_merge_index_config()
+{
+    if (p->indices->nelts > 0) {
+
+        copy and check dups
+
+        if (c->max_index_len < c->max_index_len)
+            c->max_index_len < c->max_index_len);
+    }
+}
+
+static void *ngx_set_index()
+{
+    if (*conf == NULL) {
+        cf = ngx_create_index_conf();
+        if (cf == NULL)
+            return "can not create config";
+    }
+
+    while (args) {
+       index = ngx_push_array(cf->indices);
+       index->name = arg;
+       index->len = ngx_strlen(arg) + 1;
+
+       if (cf->max_index_len < index->len)
+           cf->max_index_len = index->len;
+    }
+
+    *conf = cf;
+}
+
+*/
