diff --git a/src/http/modules/ngx_http_static_handler.c b/src/http/modules/ngx_http_static_handler.c
index cded5f0..56f24cd 100644
--- a/src/http/modules/ngx_http_static_handler.c
+++ b/src/http/modules/ngx_http_static_handler.c
@@ -24,51 +24,84 @@
 
 int ngx_http_static_handler(ngx_http_request_t *r)
 {
-    int rc;
+    int  rc;
+    ngx_err_t    err;
     ngx_hunk_t  *h;
     ngx_http_log_ctx_t  *ctx;
 
-/*
+#if 0
     ngx_http_event_static_handler_loc_conf_t  *cf;
 
     cf = (ngx_http_event_static_handler_loc_conf_t *)
              ngx_get_module_loc_conf(r, &ngx_http_event_static_handler_module);
 
-*/
+#endif
 
     ngx_http_discard_body(r);
     ctx = r->connection->log->data;
     ctx->action = "sending response";
 
-    if (r->fd != -1)
-        r->fd = ngx_open_file(r->filename.data, NGX_FILE_RDONLY);
+    if (r->file.fd == NGX_INVALID_FILE)
+        r->file.fd = ngx_open_file(r->file.name.data, NGX_FILE_RDONLY);
 
-    if (r->fd == -1) {
+    if (r->file.fd == NGX_INVALID_FILE) {
+        err = ngx_errno;
         ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
                       "ngx_http_static_handler: "
-                      ngx_open_file_n " %s failed", r->filename.data);
+                      ngx_open_file_n " %s failed", r->file.name.data);
 
-        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        if (err == NGX_ENOENT)
+            return NGX_HTTP_NOT_FOUND;
+#if (WIN32)
+        else if (err == ERROR_PATH_NOT_FOUND)
+            return NGX_HTTP_NOT_FOUND;
+#endif
+        else
+            return NGX_HTTP_INTERNAL_SERVER_ERROR;
     }
 
-    if (ngx_stat_fd(r->fd, &r->fileinfo) == -1) {
+    if (!r->file.info_valid) {
+        if (ngx_stat_fd(r->file.fd, &r->file.info) == NGX_FILE_ERROR) {
+            ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
+                          "ngx_http_static_handler: "
+                          ngx_stat_fd_n " %s failed", r->file.name.data);
+
+            if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR)
+                ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
+                              "ngx_http_static_handler: "
+                              ngx_close_file_n " %s failed", r->file.name.data);
+
+            return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
+
+        r->file.info_valid = 1;
+    }
+
+#if !(WIN32) /* it's probably Unix specific */
+
+    if (!ngx_is_file(r->file.info)) {
         ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
                       "ngx_http_static_handler: "
-                      ngx_stat_fd_n " %s failed", r->filename.data);
+                      "%s is not regular file", r->file.name.data);
 
-        /* close fd */
-        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR)
+            ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
+                          "ngx_http_static_handler: "
+                          ngx_close_file_n " %s failed", r->file.name.data);
+
+        return NGX_HTTP_NOT_FOUND;
     }
 
+#endif
+
     r->headers_out.status = NGX_HTTP_OK;
-    r->headers_out.content_length = ngx_file_size(r->fileinfo);
-/*
-    r->headers_out.last_modified = ngx_file_mtime(r->fileinfo);
-*/
+    r->headers_out.content_length = ngx_file_size(r->file.info);
+    r->headers_out.last_modified_time = ngx_file_mtime(r->file.info);
 
     ngx_test_null(r->headers_out.content_type,
                   ngx_push_table(r->headers_out.headers),
                   NGX_HTTP_INTERNAL_SERVER_ERROR);
+
     r->headers_out.content_type->key.len = 12;
     r->headers_out.content_type->key.data = "Content-Type";
 
@@ -90,83 +123,29 @@
         r->headers_out.content_type->value.len = 25;
         r->headers_out.content_type->value.data = "text/html; charset=koi8-r";
     }
+    /**/
 
-    /* STUB */
-    rc = ngx_http_header_filter(r);
-/*
-    rc = ngx_send_http_header(r);
-*/
-    if (r->header_only)
-        return rc;
-
-    /* TODO: NGX_HTTP_INTERNAL_SERVER_ERROR is too late */
-
-    /* STUB */
+    /* we need to allocate them before header would be sent */
     ngx_test_null(h, ngx_pcalloc(r->pool, sizeof(ngx_hunk_t)),
                   NGX_HTTP_INTERNAL_SERVER_ERROR);
 
-    h->type = NGX_HUNK_FILE|NGX_HUNK_LAST;
-    h->pos.file = 0;
-    h->last.file = ngx_file_size(r->fileinfo);
-
-    /* STUB */
     ngx_test_null(h->file, ngx_pcalloc(r->pool, sizeof(ngx_file_t)),
                   NGX_HTTP_INTERNAL_SERVER_ERROR);
-    h->file->fd = r->fd;
+
+    rc = ngx_http_send_header(r);
+    if (r->header_only)
+        return rc;
+
+    h->type = NGX_HUNK_FILE|NGX_HUNK_LAST;
+    h->pos.file = 0;
+    h->last.file = ngx_file_size(r->file.info);
+
+    h->file->fd = r->file.fd;
     h->file->log = r->connection->log;
 
     rc = ngx_http_output_filter(r, h);
+
     ngx_log_debug(r->connection->log, "0 output_filter: %d" _ rc);
+
     return rc;
 }
-
-#if 0
-
-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;
-}
-
-#endif
