diff --git a/src/http/ngx_http_cache.c b/src/http/ngx_http_cache.c
index e29241b..2612293 100644
--- a/src/http/ngx_http_cache.c
+++ b/src/http/ngx_http_cache.c
@@ -1,4 +1,161 @@
 
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
+
+#include <md5.h>
+
+
+int ngx_http_cache_get_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx)
+{
+    int                    small;
+    ssize_t                n, len;
+    MD5_CTX                md5;
+    ngx_err_t              err;
+    ngx_str_t              key;
+    ngx_http_bin_cache_t  *h;
+
+    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);
+    MD5End(&md5,
+           ctx->file.name.data + ctx->path->name.len + 1 + ctx->path->len);
+
+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 */
+
+    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) {
+
+            /* TODO: text size */
+
+            ctx->header.size = 2 * sizeof(ssize_t)
+                               + sizeof(ngx_http_cache_header_t)
+                               + ctx->key.len + 1;
+
+            return NGX_DECLINED;
+        }
+
+        ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
+                      ngx_open_file_n " \"%s\" failed", ctx->file.name.data);
+        return NGX_ERROR;
+    }
+
+    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;
+    }
+
+    len = 0;
+    small = 1;
+
+    if (n > 1) {
+        if (ctx->buf->pos[0] == 'T') {
+            /* STUB */
+            return NGX_ERROR;
+
+        } else if (ctx->buf->pos[0] == 'B') {
+
+            len = sizeof(ngx_http_bin_cache_t);
+
+            if (n > len) {
+                h = (ngx_http_bin_cache_t *) ctx->buf->pos;
+                key.len =  h->key_len;
+
+                if (n >= len + (ssize_t) key.len + 1) {
+                    ctx->header = h->header;
+                    key.data = h->key;
+
+                    small = 0;
+                }
+            }
+
+        } else {
+            ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
+                          "unknown type of cache file \"%s\"",
+                          ctx->file.name.data);
+            return NGX_ERROR;
+        }
+
+    }
+
+    if (small) {
+        ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
+                      "cache file \"%s\" is to small", ctx->file.name.data);
+        return NGX_ERROR;
+    }
+
+    if (key.len != ctx->key.len
+        || ngx_strncmp(key.data, ctx->key.data, key.len) != 0)
+    {
+        key.data[key.len] = '\0';
+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+                          "md5 collision: \"%s\" and \"%s\"",
+                          key.data, ctx->key.data);
+        return NGX_DECLINED;
+    }
+
+    ctx->header.size = len + key.len + 1;
+    ctx->buf->last += n;
+
+    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_FILE_ERROR)
+        {
+            return NGX_OK;
+        }
+
+        err = ngx_errno;
+
+        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;
+    }
+}
+
+
+#if 0
 
 /*
  * small file in malloc()ed memory, mmap()ed file, file descriptor only,
@@ -94,3 +251,5 @@
 
     return sum;
 }
+
+#endif
