diff --git a/auto/sources b/auto/sources
index f2f0401..14bb80d 100644
--- a/auto/sources
+++ b/auto/sources
@@ -169,6 +169,7 @@
             src/http/ngx_http_special_response.c \
             src/http/ngx_http_request.c \
             src/http/ngx_http_cache.c \
+            src/http/ngx_http_file_cache.c \
             src/http/ngx_http_busy_lock.c \
             src/http/ngx_http_parse.c \
             src/http/ngx_http_headers.c \
diff --git a/src/http/modules/ngx_http_index_handler.c b/src/http/modules/ngx_http_index_handler.c
index ee5efd2..edcf54a 100644
--- a/src/http/modules/ngx_http_index_handler.c
+++ b/src/http/modules/ngx_http_index_handler.c
@@ -132,7 +132,7 @@
             ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,
                            "http index cache get: " PTR_FMT, ctx->cache);
 
-            if (ctx->cache && ctx->cache->valid) {
+            if (ctx->cache && !ctx->cache->expired) {
 
                 ctx->cache->accessed = ngx_cached_time;
 
@@ -266,7 +266,6 @@
                 ctx->cache->accessed = ngx_cached_time;
                 ctx->cache->last_modified = 0;
                 ctx->cache->updated = ngx_cached_time;
-                ctx->cache->valid = 1;
                 ctx->cache->memory = 1;
                 ngx_http_cache_unlock(ilcf->index_cache, ctx->cache, log);
             }
diff --git a/src/http/modules/ngx_http_static_handler.c b/src/http/modules/ngx_http_static_handler.c
index 1c754a0..31dd1fb 100644
--- a/src/http/modules/ngx_http_static_handler.c
+++ b/src/http/modules/ngx_http_static_handler.c
@@ -91,7 +91,7 @@
      * and it must be already registered in r->cleanup
      */
 
-    if (r->cache && r->cache->valid) {
+    if (r->cache && !r->cache->expired) {
         return ngx_http_send_cached(r);
     }
 
@@ -146,7 +146,7 @@
         ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,
                        "http open file cache get: " PTR_FMT, file);
 
-        if (file && file->valid) {
+        if (file && !file->expired) {
             r->cache = file;
             return ngx_http_send_cached(r);
         }
@@ -165,7 +165,7 @@
         ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,
                        "http redirect cache get: " PTR_FMT, redirect);
 
-        if (redirect && redirect->valid) {
+        if (redirect && !redirect->expired) {
 
             /*
              * We do not copy a cached value so the cache entry is locked
@@ -336,7 +336,6 @@
                 redirect->accessed = ngx_cached_time;
                 redirect->last_modified = 0;
                 redirect->updated = ngx_cached_time;
-                redirect->valid = 1;
                 redirect->memory = 1;
                 ngx_http_cache_unlock(slcf->redirect_cache, redirect, log);
                 redirect_cleanup->valid = 0;
@@ -375,7 +374,7 @@
             }
             file->accessed = ngx_cached_time;
             file->updated = ngx_cached_time;
-            file->valid = 1;
+            file->expired = 0;
             r->cache = file;
 
             return ngx_http_send_cached(r);
@@ -409,7 +408,6 @@
             file->accessed = ngx_cached_time;
             file->last_modified = ngx_file_mtime(&fi);
             file->updated = ngx_cached_time;
-            file->valid = 1;
             r->cache = file;
         }
 
diff --git a/src/http/ngx_http_cache.c b/src/http/ngx_http_cache.c
index 89f405e..a36db36 100644
--- a/src/http/ngx_http_cache.c
+++ b/src/http/ngx_http_cache.c
@@ -4,14 +4,6 @@
 #include <ngx_http.h>
 
 
-#include <md5.h>
-
-#if (HAVE_OPENSSL_MD5)
-#define  MD5Init    MD5_Init
-#define  MD5Update  MD5_Update
-#define  MD5Final   MD5_Final
-#endif
-
 
 static ngx_http_module_t  ngx_http_cache_module_ctx = {
     NULL,                                  /* pre conf */
@@ -58,13 +50,10 @@
             c[i].refs++;
             ngx_mutex_unlock(&hash->mutex);
 
-            if (c[i].notify) {
-                if (!(ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)) {
-                    c[i].valid = 0;
-                }
-
-            } else if (ngx_cached_time - c[i].updated >= hash->update) {
-                c[i].valid = 0;
+            if ((!(c[i].notify && (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)))
+                && (ngx_cached_time - c[i].updated >= hash->update))
+            {
+                c[i].expired = 1;
             }
 
             if (cleanup) {
@@ -168,8 +157,8 @@
     cache->refs = 1;
     cache->count = 0;
 
-    cache->valid = 1;
     cache->deleted = 0;
+    cache->expired = 0;
     cache->memory = 0;
     cache->mmap = 0;
     cache->notify = 0;
@@ -253,7 +242,7 @@
     ngx_memzero(ev, sizeof(ngx_event_t);
 
     ev->data = data;
-    ev->event_handler = handler;
+    ev->event_handler = ngx_http_cache_invalidate;
 
     return ngx_add_event(ev, NGX_VNODE_EVENT, 0);
 }
@@ -280,173 +269,6 @@
 #endif
 
 
-int ngx_http_cache_get_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx)
-{
-    MD5_CTX  md5;
-
-    /* we use offsetof() because sizeof() pads struct size to int size */
-    ctx->header_size = offsetof(ngx_http_cache_header_t, key)
-                                                            + ctx->key.len + 1;
-
-    ctx->file.name.len = ctx->path->name.len + 1 + ctx->path->len + 32;
-    if (!(ctx->file.name.data = ngx_palloc(r->pool, ctx->file.name.len + 1))) {
-        return NGX_ERROR;
-    }
-
-    ngx_memcpy(ctx->file.name.data, ctx->path->name.data, ctx->path->name.len);
-
-    MD5Init(&md5);
-    MD5Update(&md5, (u_char *) ctx->key.data, ctx->key.len);
-    MD5Final(ctx->md5, &md5);
-
-    ngx_md5_text(ctx->file.name.data + ctx->path->name.len + 1 + ctx->path->len,
-                 ctx->md5);
-
-ngx_log_debug(r->connection->log, "URL: %s, md5: %s" _ ctx->key.data _
-              ctx->file.name.data + ctx->path->name.len + 1 + ctx->path->len);
-
-    ngx_create_hashed_filename(&ctx->file, ctx->path);
-
-ngx_log_debug(r->connection->log, "FILE: %s" _ ctx->file.name.data);
-
-    /* TODO: look open files cache */
-
-    return ngx_http_cache_open_file(ctx, 0);
-}
-
-
-int ngx_http_cache_open_file(ngx_http_cache_ctx_t *ctx, ngx_file_uniq_t uniq)
-{
-    ssize_t                   n;
-    ngx_err_t                 err;
-    ngx_http_cache_header_t  *h;
-
-    ctx->file.fd = ngx_open_file(ctx->file.name.data,
-                                 NGX_FILE_RDONLY, NGX_FILE_OPEN);
-
-    if (ctx->file.fd == NGX_INVALID_FILE) {
-        err = ngx_errno;
-
-        if (err == NGX_ENOENT || err == NGX_ENOTDIR) {
-            return NGX_DECLINED;
-        }
-
-        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
-                      ngx_open_file_n " \"%s\" failed", ctx->file.name.data);
-        return NGX_ERROR;
-    }
-
-    if (uniq) {
-        if (ngx_fd_info(ctx->file.fd, &ctx->file.info) == NGX_FILE_ERROR) {
-            ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
-                          ngx_fd_info_n " \"%s\" failed", ctx->file.name.data);
-
-            return NGX_ERROR;
-        }
-
-        if (ngx_file_uniq(&ctx->file.info) == uniq) {
-            if (ngx_close_file(ctx->file.fd) == NGX_FILE_ERROR) {
-                ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
-                              ngx_close_file_n " \"%s\" failed",
-                              ctx->file.name.data);
-            }
-
-            return NGX_HTTP_CACHE_THE_SAME;
-        }
-    }
-
-    n = ngx_read_file(&ctx->file, ctx->buf->pos,
-                      ctx->buf->end - ctx->buf->last, 0);
-
-    if (n == NGX_ERROR || n == NGX_AGAIN) {
-        return n;
-    }
-
-    if (n <= ctx->header_size) {
-        ngx_log_error(NGX_LOG_CRIT, ctx->log, 0,
-                      "cache file \"%s\" is too small", ctx->file.name.data);
-        return NGX_ERROR;
-    }
-
-    h = (ngx_http_cache_header_t *) ctx->buf->pos;
-    ctx->expires = h->expires;
-    ctx->last_modified= h->last_modified;
-    ctx->date = h->date;
-    ctx->length = h->length;
-
-    if (h->key_len > (size_t) (ctx->buf->end - ctx->buf->pos)) {
-        ngx_log_error(NGX_LOG_ALERT, ctx->log, 0,
-                      "cache file \"%s\" is probably invalid",
-                      ctx->file.name.data);
-        return NGX_DECLINED;
-    }
-
-    if (ctx->key.len
-        && (h->key_len != ctx->key.len
-            || ngx_strncmp(h->key, ctx->key.data, h->key_len) != 0))
-    {
-        h->key[h->key_len] = '\0';
-        ngx_log_error(NGX_LOG_ALERT, ctx->log, 0,
-                          "md5 collision: \"%s\" and \"%s\"",
-                          h->key, ctx->key.data);
-        return NGX_DECLINED;
-    }
-
-    ctx->buf->last += n;
-
-    if (ctx->expires < ngx_time()) {
-ngx_log_debug(ctx->log, "EXPIRED");
-        return NGX_HTTP_CACHE_STALE;
-    }
-
-    /* TODO: NGX_HTTP_CACHE_AGED */
-
-    return NGX_OK;
-}
-
-
-int ngx_http_cache_update_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx,
-                               ngx_str_t *temp_file)
-{
-    int        retry;
-    ngx_err_t  err;
-
-    retry = 0;
-
-    for ( ;; ) {
-        if (ngx_rename_file(temp_file->data, ctx->file.name.data) == NGX_OK) {
-            return NGX_OK;
-        }
-
-        err = ngx_errno;
-
-#if (WIN32)
-        if (err == NGX_EEXIST) {
-            if (ngx_win32_rename_file(temp_file, &ctx->file.name, r->pool)
-                                                                  == NGX_ERROR)
-            {
-                return NGX_ERROR;
-            }
-        }
-#endif
-
-        if (retry || (err != NGX_ENOENT && err != NGX_ENOTDIR)) {
-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
-                          ngx_rename_file_n "(\"%s\", \"%s\") failed",
-                          temp_file->data, ctx->file.name.data);
-
-            return NGX_ERROR;
-        }
-
-        if (ngx_create_path(&ctx->file, ctx->path) == NGX_ERROR) {
-            return NGX_ERROR;
-        }
-
-        retry = 1;
-    }
-}
-
-
 /* TODO: currently fd only */
 
 ngx_int_t ngx_http_send_cached(ngx_http_request_t *r)
@@ -486,7 +308,7 @@
     h->type = r->main ? NGX_HUNK_FILE : NGX_HUNK_FILE|NGX_HUNK_LAST;
 
     h->file_pos = 0;
-    h->file_last = ngx_file_size(&r->file.info);
+    h->file_last = r->cache->data.size;
 
     h->file->fd = r->cache->fd;
     h->file->log = r->connection->log;
@@ -498,50 +320,6 @@
 }
 
 
-int ngx_garbage_collector_http_cache_handler(ngx_gc_t *gc, ngx_str_t *name,
-                                             ngx_dir_t *dir)
-{
-    int                   rc;
-    char                  data[sizeof(ngx_http_cache_header_t)];
-    ngx_hunk_t            buf;
-    ngx_http_cache_ctx_t  ctx;
-
-    ctx.file.fd = NGX_INVALID_FILE;
-    ctx.file.name = *name;
-    ctx.file.log = gc->log;
-
-    ctx.header_size = sizeof(ngx_http_cache_header_t);
-    ctx.buf = &buf;
-    ctx.log = gc->log;
-    ctx.key.len = 0;
-
-    buf.type = NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP;
-    buf.pos = data;
-    buf.last = data;
-    buf.start = data;
-    buf.end = data + sizeof(ngx_http_cache_header_t);
-
-    rc = ngx_http_cache_open_file(&ctx, 0);
-
-    /* TODO: NGX_AGAIN */
-
-    if (rc != NGX_ERROR && rc != NGX_DECLINED && rc != NGX_HTTP_CACHE_STALE) {
-        return NGX_OK;
-    }
-
-    if (ngx_delete_file(name->data) == NGX_FILE_ERROR) {
-        ngx_log_error(NGX_LOG_CRIT, gc->log, ngx_errno,
-                      ngx_delete_file_n " \"%s\" failed", name->data);
-        return NGX_ERROR;
-    }
-
-    gc->deleted++;
-    gc->freed += ngx_de_size(dir);
-
-    return NGX_OK;
-}
-
-
 char *ngx_http_set_cache_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
     char  *p = conf;
diff --git a/src/http/ngx_http_cache.h b/src/http/ngx_http_cache.h
index b2088a0..b289c1f 100644
--- a/src/http/ngx_http_cache.h
+++ b/src/http/ngx_http_cache.h
@@ -22,8 +22,8 @@
 
     unsigned         count:NGX_HTTP_CACHE_LAZY_ALLOCATION_BITS;
 
-    unsigned         valid:1;
     unsigned         deleted:1;
+    unsigned         expired:1;
     unsigned         memory:1;
     unsigned         mmap:1;
     unsigned         notify:1;
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c
new file mode 100644
index 0000000..b8a24db
--- /dev/null
+++ b/src/http/ngx_http_file_cache.c
@@ -0,0 +1,225 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+
+
+#include <md5.h>
+
+#if (HAVE_OPENSSL_MD5)
+#define  MD5Init    MD5_Init
+#define  MD5Update  MD5_Update
+#define  MD5Final   MD5_Final
+#endif
+
+
+
+int ngx_http_cache_get_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx)
+{
+    MD5_CTX  md5;
+
+    /* we use offsetof() because sizeof() pads struct size to int size */
+    ctx->header_size = offsetof(ngx_http_cache_header_t, key)
+                                                            + ctx->key.len + 1;
+
+    ctx->file.name.len = ctx->path->name.len + 1 + ctx->path->len + 32;
+    if (!(ctx->file.name.data = ngx_palloc(r->pool, ctx->file.name.len + 1))) {
+        return NGX_ERROR;
+    }
+
+    ngx_memcpy(ctx->file.name.data, ctx->path->name.data, ctx->path->name.len);
+
+    MD5Init(&md5);
+    MD5Update(&md5, (u_char *) ctx->key.data, ctx->key.len);
+    MD5Final(ctx->md5, &md5);
+
+    ngx_md5_text(ctx->file.name.data + ctx->path->name.len + 1 + ctx->path->len,
+                 ctx->md5);
+
+ngx_log_debug(r->connection->log, "URL: %s, md5: %s" _ ctx->key.data _
+              ctx->file.name.data + ctx->path->name.len + 1 + ctx->path->len);
+
+    ngx_create_hashed_filename(&ctx->file, ctx->path);
+
+ngx_log_debug(r->connection->log, "FILE: %s" _ ctx->file.name.data);
+
+    /* TODO: look open files cache */
+
+    return ngx_http_cache_open_file(ctx, 0);
+}
+
+
+int ngx_http_cache_open_file(ngx_http_cache_ctx_t *ctx, ngx_file_uniq_t uniq)
+{
+    ssize_t                   n;
+    ngx_err_t                 err;
+    ngx_http_cache_header_t  *h;
+
+    ctx->file.fd = ngx_open_file(ctx->file.name.data,
+                                 NGX_FILE_RDONLY, NGX_FILE_OPEN);
+
+    if (ctx->file.fd == NGX_INVALID_FILE) {
+        err = ngx_errno;
+
+        if (err == NGX_ENOENT || err == NGX_ENOTDIR) {
+            return NGX_DECLINED;
+        }
+
+        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
+                      ngx_open_file_n " \"%s\" failed", ctx->file.name.data);
+        return NGX_ERROR;
+    }
+
+    if (uniq) {
+        if (ngx_fd_info(ctx->file.fd, &ctx->file.info) == NGX_FILE_ERROR) {
+            ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
+                          ngx_fd_info_n " \"%s\" failed", ctx->file.name.data);
+
+            return NGX_ERROR;
+        }
+
+        if (ngx_file_uniq(&ctx->file.info) == uniq) {
+            if (ngx_close_file(ctx->file.fd) == NGX_FILE_ERROR) {
+                ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno,
+                              ngx_close_file_n " \"%s\" failed",
+                              ctx->file.name.data);
+            }
+
+            return NGX_HTTP_CACHE_THE_SAME;
+        }
+    }
+
+    n = ngx_read_file(&ctx->file, ctx->buf->pos,
+                      ctx->buf->end - ctx->buf->last, 0);
+
+    if (n == NGX_ERROR || n == NGX_AGAIN) {
+        return n;
+    }
+
+    if (n <= ctx->header_size) {
+        ngx_log_error(NGX_LOG_CRIT, ctx->log, 0,
+                      "cache file \"%s\" is too small", ctx->file.name.data);
+        return NGX_ERROR;
+    }
+
+    h = (ngx_http_cache_header_t *) ctx->buf->pos;
+    ctx->expires = h->expires;
+    ctx->last_modified= h->last_modified;
+    ctx->date = h->date;
+    ctx->length = h->length;
+
+    if (h->key_len > (size_t) (ctx->buf->end - ctx->buf->pos)) {
+        ngx_log_error(NGX_LOG_ALERT, ctx->log, 0,
+                      "cache file \"%s\" is probably invalid",
+                      ctx->file.name.data);
+        return NGX_DECLINED;
+    }
+
+    if (ctx->key.len
+        && (h->key_len != ctx->key.len
+            || ngx_strncmp(h->key, ctx->key.data, h->key_len) != 0))
+    {
+        h->key[h->key_len] = '\0';
+        ngx_log_error(NGX_LOG_ALERT, ctx->log, 0,
+                          "md5 collision: \"%s\" and \"%s\"",
+                          h->key, ctx->key.data);
+        return NGX_DECLINED;
+    }
+
+    ctx->buf->last += n;
+
+    if (ctx->expires < ngx_time()) {
+ngx_log_debug(ctx->log, "EXPIRED");
+        return NGX_HTTP_CACHE_STALE;
+    }
+
+    /* TODO: NGX_HTTP_CACHE_AGED */
+
+    return NGX_OK;
+}
+
+
+int ngx_http_cache_update_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx,
+                               ngx_str_t *temp_file)
+{
+    int        retry;
+    ngx_err_t  err;
+
+    retry = 0;
+
+    for ( ;; ) {
+        if (ngx_rename_file(temp_file->data, ctx->file.name.data) == NGX_OK) {
+            return NGX_OK;
+        }
+
+        err = ngx_errno;
+
+#if (WIN32)
+        if (err == NGX_EEXIST) {
+            if (ngx_win32_rename_file(temp_file, &ctx->file.name, r->pool)
+                                                                  == NGX_ERROR)
+            {
+                return NGX_ERROR;
+            }
+        }
+#endif
+
+        if (retry || (err != NGX_ENOENT && err != NGX_ENOTDIR)) {
+            ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
+                          ngx_rename_file_n "(\"%s\", \"%s\") failed",
+                          temp_file->data, ctx->file.name.data);
+
+            return NGX_ERROR;
+        }
+
+        if (ngx_create_path(&ctx->file, ctx->path) == NGX_ERROR) {
+            return NGX_ERROR;
+        }
+
+        retry = 1;
+    }
+}
+
+
+int ngx_garbage_collector_http_cache_handler(ngx_gc_t *gc, ngx_str_t *name,
+                                             ngx_dir_t *dir)
+{
+    int                   rc;
+    char                  data[sizeof(ngx_http_cache_header_t)];
+    ngx_hunk_t            buf;
+    ngx_http_cache_ctx_t  ctx;
+
+    ctx.file.fd = NGX_INVALID_FILE;
+    ctx.file.name = *name;
+    ctx.file.log = gc->log;
+
+    ctx.header_size = sizeof(ngx_http_cache_header_t);
+    ctx.buf = &buf;
+    ctx.log = gc->log;
+    ctx.key.len = 0;
+
+    buf.type = NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP;
+    buf.pos = data;
+    buf.last = data;
+    buf.start = data;
+    buf.end = data + sizeof(ngx_http_cache_header_t);
+
+    rc = ngx_http_cache_open_file(&ctx, 0);
+
+    /* TODO: NGX_AGAIN */
+
+    if (rc != NGX_ERROR && rc != NGX_DECLINED && rc != NGX_HTTP_CACHE_STALE) {
+        return NGX_OK;
+    }
+
+    if (ngx_delete_file(name->data) == NGX_FILE_ERROR) {
+        ngx_log_error(NGX_LOG_CRIT, gc->log, ngx_errno,
+                      ngx_delete_file_n " \"%s\" failed", name->data);
+        return NGX_ERROR;
+    }
+
+    gc->deleted++;
+    gc->freed += ngx_de_size(dir);
+
+    return NGX_OK;
+}
