diff --git a/src/http/modules/ngx_http_event_proxy_handler.c b/src/http/modules/ngx_http_event_proxy_handler.c
index d7d6178..9c2cc3a 100644
--- a/src/http/modules/ngx_http_event_proxy_handler.c
+++ b/src/http/modules/ngx_http_event_proxy_handler.c
@@ -8,7 +8,7 @@
 #include <ngx_http.h>
 #include <ngx_http_event_proxy_handler.h>
 
-ngx_http_module_t  ngx_http_proxy_module;
+ngx_http_module_t  ngx_http_proxy_module_ctx;
 
 
 static ngx_chain_t *ngx_http_proxy_create_request(ngx_http_request_t *r);
@@ -36,10 +36,11 @@
     ngx_chain_t           *chain;
     ngx_http_proxy_ctx_t  *p;
 
-    p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
+    p = (ngx_http_proxy_ctx_t *)
+                         ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
 
     if (p == NULL)
-        ngx_http_create_ctx(r, p, ngx_http_proxy_module,
+        ngx_http_create_ctx(r, p, ngx_http_proxy_module_ctx,
                             sizeof(ngx_http_proxy_ctx_t));
 
     chain = ngx_http_proxy_create_request(r);
@@ -244,7 +245,8 @@
 
     c = (ngx_connection_t *) ev->data;
     r = (ngx_http_request_t *) c->data;
-    p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
+    p = (ngx_http_proxy_ctx_t *)
+                         ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
 
     chain = ngx_event_write(c, p->out, 0);
     if (chain == (ngx_chain_t *) -1)
@@ -269,7 +271,8 @@
 
     c = (ngx_connection_t *) ev->data;
     r = (ngx_http_request_t *) c->data;
-    p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
+    p = (ngx_http_proxy_ctx_t *)
+                         ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
 
     if (p->header_in == NULL) {
         ngx_test_null(p->header_in,
@@ -389,7 +392,8 @@
 
     c = (ngx_connection_t *) ev->data;
     r = (ngx_http_request_t *) c->data;
-    p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
+    p = (ngx_http_proxy_ctx_t *)
+                         ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
 
     left = 0;
 
@@ -464,7 +468,8 @@
 
     c = (ngx_connection_t *) ev->data;
     r = (ngx_http_request_t *) c->data;
-    p = (ngx_http_proxy_ctx_t *) ngx_get_module_ctx(r, ngx_http_proxy_module);
+    p = (ngx_http_proxy_ctx_t *)
+                         ngx_http_get_module_ctx(r, ngx_http_proxy_module_ctx);
 
     do {
         h = ((ngx_hunk_t **) p->hunks->elts)[p->hunk_n];
diff --git a/src/http/modules/ngx_http_index_handler.c b/src/http/modules/ngx_http_index_handler.c
index d2084f0..65a896c 100644
--- a/src/http/modules/ngx_http_index_handler.c
+++ b/src/http/modules/ngx_http_index_handler.c
@@ -13,32 +13,43 @@
 static void *ngx_http_index_create_conf(ngx_pool_t *pool);
 static void *ngx_http_index_merge_conf(ngx_pool_t *p,
                                        void *parent, void *child);
-static char *ngx_http_index_set_index(ngx_pool_t *p, void *conf,
-                                      ngx_str_t *value);
+static char *ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd,
+                                      char *conf);
 
 
 static ngx_command_t ngx_http_index_commands[] = {
 
-    {"index", ngx_http_index_set_index, 0,
-     NGX_HTTP_LOC_CONF, NGX_CONF_ITERATE,
-     "set index files"},
+    {ngx_string("index"),
+     NGX_CONF_ANY,
+     ngx_http_index_set_index,
+     NGX_HTTP_LOC_CONF,
+     0},
 
-    {NULL}
-
+    {ngx_string(""), 0, NULL, 0, 0}
 };
 
 
-ngx_http_module_t  ngx_http_index_module = {
+ngx_http_module_t  ngx_http_index_module_ctx = {
     NGX_HTTP_MODULE,
 
     NULL,                                  /* create server config */
     ngx_http_index_create_conf,            /* create location config */
-    ngx_http_index_commands,               /* module directives */
 
-    NULL,                                  /* init module */
     NULL,                                  /* translate handler */
 
-    NULL,                                  /* init output body filter */
+    NULL,                                  /* output header filter */
+    NULL,                                  /* next output header filter */
+    NULL,                                  /* output body filter */
+    NULL,                                  /* next output body filter */
+
+};
+
+
+ngx_module_t  ngx_http_index_module = {
+    &ngx_http_index_module_ctx,            /* module context */
+    ngx_http_index_commands,               /* module directives */
+    NGX_HTTP_MODULE_TYPE,                  /* module type */
+    NULL                                   /* init module */
 };
 
 
@@ -53,7 +64,7 @@
     ngx_http_index_conf_t  *cf;
 
     cf = (ngx_http_index_conf_t *)
-                            ngx_get_module_loc_conf(r, ngx_http_index_module);
+                   ngx_http_get_module_loc_conf(r, ngx_http_index_module_ctx);
 
     ngx_test_null(name,
                   ngx_palloc(r->pool,
@@ -71,11 +82,13 @@
         fd = ngx_open_file(name, NGX_FILE_RDONLY);
         if (fd == NGX_INVALID_FILE) {
             err = ngx_errno;
-            if (err == NGX_ENOENT)
+            if (err == NGX_ENOENT) {
                 continue;
+            }
 #if (WIN32)
-            if (err == ERROR_PATH_NOT_FOUND)
+            if (err == ERROR_PATH_NOT_FOUND) {
                 continue;
+            }
 #endif
 
             ngx_log_error(NGX_LOG_ERR, r->connection->log, err,
@@ -117,8 +130,9 @@
     ngx_str_t  *index;
 
     if (conf->max_index_len == 0) {
-        if (prev->max_index_len != 0)
+        if (prev->max_index_len != 0) {
             return prev;
+        }
 
         ngx_test_null(index, ngx_push_array(conf->indices), NULL);
         index->len = sizeof(NGX_HTTP_INDEX) - 1;
@@ -130,18 +144,23 @@
 }
 
 
-static char *ngx_http_index_set_index(ngx_pool_t *p, void *conf,
-                                      ngx_str_t *value)
+static char *ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd,
+                                      char *conf)
 {
-    ngx_http_index_conf_t *cf = (ngx_http_index_conf_t *) conf;
-    ngx_str_t  *index;
+    ngx_http_index_conf_t *icf = (ngx_http_index_conf_t *) conf;
+    int  i;
+    ngx_str_t  *index, *value;
 
-    ngx_test_null(index, ngx_push_array(cf->indices), NULL);
-    index->len = value->len;
-    index->data = value->data;
+    value = (ngx_str_t *) cf->args->elts;
+    for (i = 1; i < cf->args->nelts; i++) {
+        ngx_test_null(index, ngx_push_array(icf->indices), NULL);
+        index->len = value[i].len;
+        index->data = value[i].data;
 
-    if (cf->max_index_len < index->len)
-        cf->max_index_len = index->len;
+        if (icf->max_index_len < index->len) {
+            icf->max_index_len = index->len;
+        }
+    }
 
     return NULL;
 }
diff --git a/src/http/modules/ngx_http_index_handler.h b/src/http/modules/ngx_http_index_handler.h
index 66261b0..3dd6bd8 100644
--- a/src/http/modules/ngx_http_index_handler.h
+++ b/src/http/modules/ngx_http_index_handler.h
@@ -9,13 +9,14 @@
 
 #define NGX_HTTP_INDEX   "index.html"
 
+
 typedef struct {
     ngx_array_t  *indices;
     size_t        max_index_len;
 } ngx_http_index_conf_t;
 
 
-extern ngx_http_module_t  ngx_http_index_module;
+extern ngx_module_t  ngx_http_index_module;
 
 
 #endif /* _NGX_HTTP_INDEX_HANDLER_H_INCLUDED_ */
diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c
index aa4bcb4..80936c8 100644
--- a/src/http/ngx_http.c
+++ b/src/http/ngx_http.c
@@ -39,7 +39,8 @@
     ngx_http_server.doc_root_len = strlen(ngx_http_server.doc_root) + 1;
 
 
-    ngx_http_config_modules(pool, ngx_http_modules);
+    ngx_http_config_modules(pool, ngx_modules);
+#if 0
 
     /* STUB */
     ngx_http_output_filter_set_stub(pool, ngx_http_modules);
@@ -47,7 +48,8 @@
     ngx_http_index_set_stub(pool, ngx_http_modules);
 
     ngx_http_init_modules(pool, ngx_http_modules);
-    ngx_http_init_filters(pool, ngx_http_modules);
+#endif
+    ngx_http_init_filters(pool, ngx_modules);
 
     ls = ngx_push_array(ngx_listening_sockets);
     ngx_memzero(ls, sizeof(ngx_listen_t));
diff --git a/src/http/ngx_http.h b/src/http/ngx_http.h
index 61ac548..8e94ab9 100644
--- a/src/http/ngx_http.h
+++ b/src/http/ngx_http.h
@@ -188,29 +188,18 @@
 
 
 typedef struct {
-    int               index;
+    int      index;
 
-    void           *(*create_srv_conf)(ngx_pool_t *p);
-    void           *(*create_loc_conf)(ngx_pool_t *p);
+    void  *(*create_srv_conf)(ngx_pool_t *p);
+    void  *(*create_loc_conf)(ngx_pool_t *p);
 
-    int             (*translate_handler)(ngx_http_request_t *r);
+    int    (*translate_handler)(ngx_http_request_t *r);
 
-    int             (*output_header_filter) (ngx_http_request_t *r);
-    int             (*next_output_header_filter) (ngx_http_request_t *r);
+    int    (*output_header_filter) (ngx_http_request_t *r);
+    int    (*next_output_header_filter) (ngx_http_request_t *r);
 
-    ngx_http_output_body_filter_p  output_body_filter;
-    ngx_http_output_body_filter_p  next_output_body_filter;
-
-#if 0
-    int             (*output_body_filter)();
-    int             (*next_output_body_filter)
-                                      (ngx_http_request_t *r, ngx_chain_t *ch);
-#endif
-
-#if 0
-    int             (*next_output_body_filter)(int (**next_filter)
-                                     (ngx_http_request_t *r, ngx_chain_t *ch));
-#endif
+    int    (*output_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);
+    int    (*next_output_body_filter) (ngx_http_request_t *r, ngx_chain_t *ch);
 } ngx_http_module_t;
 
 
@@ -219,11 +208,6 @@
 #define NGX_HTTP_MODULE_TYPE   0x50545448   /* "HTTP" */
 
 
-/* STUB */
-#define ngx_get_module_loc_conf(r, module)  r->loc_conf[module.index]
-#define ngx_get_module_ctx(r, module)  r->ctx[module.index]
-/**/
-
 #define ngx_http_get_module_srv_conf(r, module)  r->srv_conf[module.index]
 #define ngx_http_get_module_loc_conf(r, module)  r->loc_conf[module.index]
 #define ngx_http_get_module_ctx(r, module)       r->ctx[module.index]
diff --git a/src/http/ngx_http_config.c b/src/http/ngx_http_config.c
index f33fc62..b003c02 100644
--- a/src/http/ngx_http_config.c
+++ b/src/http/ngx_http_config.c
@@ -3,58 +3,106 @@
 #include <ngx_core.h>
 #include <ngx_config_file.h>
 #include <ngx_http.h>
+#include <ngx_http_core.h>
+#include <ngx_http_config.h>
 #include <ngx_http_write_filter.h>
 #include <ngx_http_output_filter.h>
 #include <ngx_http_index_handler.h>
 
 
-int ngx_max_module;
-
-int (*ngx_http_top_header_filter) (ngx_http_request_t *r);
-
-/* STUB: gobal srv and loc conf */
+/* STUB */
 void **ngx_srv_conf;
 void **ngx_loc_conf;
+/**/
 
-#if 0
-int ngx_http_block(ngx_conf_t *cf)
+
+static int ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, char *dummy);
+
+
+void *null_loc_conf;
+
+
+static ngx_command_t  ngx_http_commands[] = {
+
+    {ngx_string("http"),
+     NGX_CONF_BLOCK|NGX_CONF_NOARGS,
+     ngx_http_block,
+     0,
+     0},
+
+    {ngx_string(""), 0, NULL, 0, 0}
+};
+
+
+static ngx_http_module_t  ngx_http_module_ctx = {
+    NGX_HTTP_MODULE,
+
+    NULL,                                  /* create server config */
+    NULL,                                  /* create location config */
+
+    NULL,                                  /* translate handler */
+
+    NULL,                                  /* output header filter */
+    NULL,                                  /* next output header filter */
+    NULL,                                  /* output body filter */
+    NULL                                   /* next output body filter */
+};
+
+
+ngx_module_t  ngx_http_module = {
+    &ngx_http_module_ctx,                  /* module context */
+    ngx_http_commands,                     /* module directives */
+    0,                                     /* module type */
+    NULL                                   /* init module */
+};
+
+
+static int ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, char *dummy)
 {
+    int  i, j;
+    ngx_http_module_t    *module;
     ngx_http_conf_ctx_t  *ctx;
 
-    ngx_test_null(ctx,
-                  ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)),
+    for (i = 0; ngx_modules[i]; i++) {
+        if (ngx_modules[i]->type != NGX_HTTP_MODULE_TYPE) {
+            continue;
+        }
+
+        module = (ngx_http_module_t *) ngx_modules[i]->ctx;
+        module->index = i;
+    }
+
+    ngx_http_max_module = i;
+
+    ngx_test_null(null_loc_conf,
+                  ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module),
                   NGX_ERROR);
 
-#if 0
-    /* null server config */
-    ngx_test_null(ctx->srv_conf,
-                  ngx_pcalloc(cf->pool, sizeof(void *) * ngx_max_module),
-                  NGX_ERROR);
-#endif
+    ctx->srv_conf = NULL;
+    ctx->loc_conf = null_loc_conf;
 
-    /* null location config */
-    ngx_test_null(ctx->loc_conf,
-                  ngx_pcalloc(cf->pool, sizeof(void *) * ngx_max_module),
-                  NGX_ERROR);
+    for (i = 0, j = 0; ngx_modules[i]; i++) {
+        if (ngx_modules[i]->type != NGX_HTTP_MODULE_TYPE) {
+            continue;
+        }
 
-    for (i = 0; modules[i]; i++) {
-#if 0
-        if (modules[i]->create_srv_conf)
-            ngx_test_null(ctx->srv_conf[i],
-                          modules[i]->create_srv_conf(cf->pool),
+        module = (ngx_http_module_t *) ngx_modules[i]->ctx;
+        module->index = i;
+        if (module->create_loc_conf) {
+            ngx_test_null(null_loc_conf,
+                          module->create_loc_conf(cf->pool),
                           NGX_ERROR);
-#endif
-
-        if (modules[i]->create_loc_conf)
-            ngx_test_null(ctx->loc_conf[i],
-                          modules[i]->create_loc_conf(cf->pool),
-                          NGX_ERROR);
+            j++;
+        }
     }
 
     cf->ctx = ctx;
-    return ngx_conf_parse(cf);
+    cf->type = NGX_HTTP_MODULE_TYPE;
+    return ngx_conf_parse(cf, NULL);
 }
 
+
+#if 0
 int ngx_server_block(ngx_conf_t *cf)
 {
     ngx_http_conf_ctx_t  *ctx, *prev;
@@ -155,21 +203,29 @@
 
 #endif
 
-int ngx_http_config_modules(ngx_pool_t *pool, ngx_http_module_t **modules)
+
+int ngx_http_config_modules(ngx_pool_t *pool, ngx_module_t **modules)
 {
     int i;
+    ngx_http_module_t  *module;
 
     for (i = 0; modules[i]; i++) {
-        modules[i]->index = i;
+        if (modules[i]->type != NGX_HTTP_MODULE_TYPE) {
+            continue;
+        }
+
+        module = (ngx_http_module_t *) modules[i]->ctx;
+        module->index = i;
     }
 
-    ngx_max_module = i;
+    ngx_http_max_module = i;
 
+#if 0
     ngx_test_null(ngx_srv_conf,
-                  ngx_pcalloc(pool, sizeof(void *) * ngx_max_module),
+                  ngx_pcalloc(pool, sizeof(void *) * ngx_http_max_module),
                   NGX_ERROR);
     ngx_test_null(ngx_loc_conf,
-                  ngx_pcalloc(pool, sizeof(void *) * ngx_max_module),
+                  ngx_pcalloc(pool, sizeof(void *) * ngx_http_max_module),
                   NGX_ERROR);
 
     for (i = 0; modules[i]; i++) {
@@ -179,94 +235,36 @@
         if (modules[i]->create_loc_conf)
             ngx_loc_conf[i] = modules[i]->create_loc_conf(pool);
     }
+#endif
 }
 
-int ngx_http_init_modules(ngx_pool_t *pool, ngx_http_module_t **modules)
-{
-    int i;
 
-    for (i = 0; modules[i]; i++) {
-        if (modules[i]->init_module)
-            modules[i]->init_module(pool);
-    }
-}
-
-int ngx_http_init_filters(ngx_pool_t *pool, ngx_http_module_t **modules)
+void ngx_http_init_filters(ngx_pool_t *pool, ngx_module_t **modules)
 {
-    int i;
+    int  i;
+    ngx_http_module_t  *module;
     int (*ohf)(ngx_http_request_t *r);
     int (*obf)(ngx_http_request_t *r, ngx_chain_t *ch);
 
     ohf = NULL;
+    obf = NULL;
 
     for (i = 0; modules[i]; i++) {
-        if (modules[i]->output_header_filter) {
-            modules[i]->next_output_header_filter = ohf;
-            ohf = modules[i]->output_header_filter;
+        if (modules[i]->type != NGX_HTTP_MODULE_TYPE) {
+            continue;
+        }
+
+        module = (ngx_http_module_t *) modules[i]->ctx;
+        if (module->output_header_filter) {
+            module->next_output_header_filter = ohf;
+            ohf = module->output_header_filter;
+        }
+
+        if (module->output_body_filter) {
+            module->next_output_body_filter = obf;
+            obf = module->output_body_filter;
         }
     }
 
     ngx_http_top_header_filter = ohf;
-
-    obf = NULL;
-
-    for (i = 0; modules[i]; i++) {
-        if (modules[i]->output_body_filter) {
-            modules[i]->next_output_body_filter = obf;
-            obf = modules[i]->output_body_filter;
-        }
-    }
-}
-
-
-/* STUB */
-ngx_http_output_filter_set_stub(ngx_pool_t *pool, ngx_http_module_t **modules)
-{
-    int i;
-    ngx_command_t *cmd;
-
-    for (i = 0; modules[i]; i++) {
-        if (modules[i] == &ngx_http_output_filter_module) {
-            for (cmd = modules[i]->commands; cmd->name; cmd++) {
-                if (strcmp(cmd->name, "output_buffer") == 0) {
-                    cmd->set(ngx_loc_conf[i], cmd->offset, "32768");
-                }
-            }
-        }
-    }
-}
-
-ngx_http_write_filter_set_stub(ngx_pool_t *pool, ngx_http_module_t **modules)
-{
-    int i;
-    ngx_command_t *cmd;
-
-    for (i = 0; modules[i]; i++) {
-        if (modules[i] == &ngx_http_write_filter_module) {
-            for (cmd = modules[i]->commands; cmd->name; cmd++) {
-                if (strcmp(cmd->name, "write_buffer") == 0) {
-                    cmd->set(ngx_loc_conf[i], cmd->offset, "1500");
-                }
-            }
-        }
-    }
-}
-
-ngx_http_index_set_stub(ngx_pool_t *pool, ngx_http_module_t **modules)
-{
-    int i;
-    ngx_str_t index;
-    ngx_command_t *cmd;
-
-    for (i = 0; modules[i]; i++) {
-        if (modules[i] == &ngx_http_index_module) {
-            for (cmd = modules[i]->commands; cmd->name; cmd++) {
-                if (strcmp(cmd->name, "index") == 0) {
-                    index.len = sizeof("index.html") - 1;
-                    index.data = "index.html";
-                    cmd->set(pool, ngx_loc_conf[i], &index);
-                }
-            }
-        }
-    }
 }
diff --git a/src/http/ngx_http_config.h b/src/http/ngx_http_config.h
index 43cd5ec..f0321f6 100644
--- a/src/http/ngx_http_config.h
+++ b/src/http/ngx_http_config.h
@@ -5,9 +5,21 @@
 #include <ngx_alloc.h>
 #include <ngx_http.h>
 
-#define NGX_HTTP_LOC_CONF  0
 
-int ngx_http_config_modules(ngx_pool_t *pool, ngx_http_module_t **modules);
+typedef struct {
+    void  **srv_conf;
+    void  **loc_conf;
+} ngx_http_conf_ctx_t;
+
+
+#define NGX_HTTP_SRV_CONF  offsetof(ngx_http_conf_ctx_t, srv_conf)
+#define NGX_HTTP_LOC_CONF  offsetof(ngx_http_conf_ctx_t, loc_conf)
+
+
+int ngx_http_config_modules(ngx_pool_t *pool, ngx_module_t **modules);
+
+
+extern ngx_module_t  ngx_http_module;
 
 
 extern int (*ngx_http_top_header_filter) (ngx_http_request_t *r);
diff --git a/src/http/ngx_http_core.c b/src/http/ngx_http_core.c
index e20d468..0890ca5 100644
--- a/src/http/ngx_http_core.c
+++ b/src/http/ngx_http_core.c
@@ -7,7 +7,6 @@
 #include <ngx_http_config.h>
 
 /* STUB */
-#include <ngx_http_output_filter.h>
 int ngx_http_static_handler(ngx_http_request_t *r);
 int ngx_http_index_handler(ngx_http_request_t *r);
 int ngx_http_proxy_handler(ngx_http_request_t *r);
@@ -18,60 +17,85 @@
 static int ngx_http_core_translate_handler(ngx_http_request_t *r);
 
 
+int (*ngx_http_top_header_filter) (ngx_http_request_t *r);
+
+int ngx_http_max_module;
+
+
 static ngx_command_t ngx_http_core_commands[] = {
 
-    {"send_timeout", ngx_conf_set_time_slot,
-     offsetof(ngx_http_core_loc_conf_t, send_timeout),
-     NGX_HTTP_LOC_CONF, NGX_CONF_TAKE1,
-     "set timeout for sending response"},
+    {ngx_string("send_timeout"),
+     NGX_CONF_TAKE1, 
+     ngx_conf_set_time_slot,
+     NGX_HTTP_LOC_CONF,
+     offsetof(ngx_http_core_loc_conf_t, send_timeout)},
 
-    {NULL}
-
+    {ngx_string(""), 0, NULL, 0, 0}
 };
 
 
-ngx_http_module_t  ngx_http_core_module = {
+ngx_http_module_t  ngx_http_core_module_ctx = {
     NGX_HTTP_MODULE,
 
     ngx_http_core_create_srv_conf,         /* create server config */
     ngx_http_core_create_loc_conf,         /* create location config */
-    ngx_http_core_commands,                /* module directives */
 
-    /* STUB */ NULL,                                  /* init module */
     ngx_http_core_translate_handler,       /* translate handler */
 
-    NULL                                   /* init output body filter */
+    NULL,                                  /* output header filter */
+    NULL,                                  /* next output header filter */
+    NULL,                                  /* output body filter */
+    NULL,                                  /* next output body filter */
+};
+
+
+ngx_module_t  ngx_http_core_module = {
+    &ngx_http_core_module_ctx,             /* module context */
+    ngx_http_core_commands,                /* module directives */
+    NGX_HTTP_MODULE_TYPE,                  /* module type */
+    NULL                                   /* init module */
 };
 
 
 int ngx_http_handler(ngx_http_request_t *r)
 {
     int  rc, i;
+    ngx_http_module_t *module;
 
     r->connection->unexpected_eof = 0;
     r->lingering_close = 1;
     r->keepalive = 0;
 
-#if 1
+#if 0
     r->filter = NGX_HTTP_FILTER_NEED_IN_MEMORY;
 #endif
 
     /* run translation phase */
-    for (i = 0; ngx_http_modules[i]; i++) {
-        if (ngx_http_modules[i]->translate_handler) {
-            rc = ngx_http_modules[i]->translate_handler(r);
-            if (rc == NGX_OK)
-                break;
+    for (i = 0; ngx_modules[i]; i++) {
+        if (ngx_modules[i]->type != NGX_HTTP_MODULE_TYPE) {
+            continue;
+        }
 
-            if (rc >= NGX_HTTP_SPECIAL_RESPONSE)
-                return ngx_http_special_response(r, rc);
+        module = (ngx_http_module_t *) ngx_modules[i]->ctx;
+        if (module->translate_handler == NULL) {
+            continue;
+        }
+
+        rc = module->translate_handler(r);
+        if (rc == NGX_OK) {
+            break;
+        }
+
+        if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
+            return ngx_http_special_response(r, rc);
         }
     }
 
     rc = r->handler(r);
 
-    if (rc >= NGX_HTTP_SPECIAL_RESPONSE)
+    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
         return ngx_http_special_response(r, rc);
+    }
 
     return rc;
 }
@@ -122,18 +146,20 @@
                       "ngx_http_core_translate_handler: "
                       ngx_file_type_n " %s failed", r->file.name.data);
 
-        if (err == ERROR_FILE_NOT_FOUND)
+        if (err == ERROR_FILE_NOT_FOUND) {
             return NGX_HTTP_NOT_FOUND;
-        else if (err == ERROR_PATH_NOT_FOUND)
+        } else if (err == ERROR_PATH_NOT_FOUND) {
             return NGX_HTTP_NOT_FOUND;
-        else
+        } else {
             return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
     }
 
 #else
 
-    if (r->file.fd == NGX_INVALID_FILE)
+    if (r->file.fd == NGX_INVALID_FILE) {
         r->file.fd = ngx_open_file(r->file.name.data, NGX_FILE_RDONLY);
+    }
 
     if (r->file.fd == NGX_INVALID_FILE) {
         err = ngx_errno;
@@ -141,10 +167,11 @@
                       "ngx_http_core_handler: "
                       ngx_open_file_n " %s failed", r->file.name.data);
 
-        if (err == NGX_ENOENT)
+        if (err == NGX_ENOENT) {
             return NGX_HTTP_NOT_FOUND;
-        else
+        } else {
             return NGX_HTTP_INTERNAL_SERVER_ERROR;
+        }
     }
 
     if (!r->file.info_valid) {
@@ -153,10 +180,11 @@
                           "ngx_http_core_handler: "
                           ngx_stat_fd_n " %s failed", r->file.name.data);
 
-            if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR)
+            if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR) {
                 ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
                               "ngx_http_core_handler: "
                               ngx_close_file_n " %s failed", r->file.name.data);
+            }
 
             return NGX_HTTP_INTERNAL_SERVER_ERROR;
         }
@@ -169,10 +197,11 @@
         ngx_log_debug(r->connection->log, "HTTP DIR: '%s'" _ r->file.name.data);
 
 #if !(WIN9X)
-        if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR)
+        if (ngx_close_file(r->file.fd) == NGX_FILE_ERROR) {
             ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,
                           "ngx_http_core_handler: "
                           ngx_close_file_n " %s failed", r->file.name.data);
+        }
 #endif
 
         /* BROKEN: need to include server name */
diff --git a/src/http/ngx_http_core.h b/src/http/ngx_http_core.h
index e9846f8..513ed6e 100644
--- a/src/http/ngx_http_core.h
+++ b/src/http/ngx_http_core.h
@@ -9,16 +9,22 @@
     int dummy;
 } ngx_http_core_conf_t;
 
+
 typedef struct {
     int dummy;
 } ngx_http_core_srv_conf_t;
 
+
 typedef struct {
     time_t  send_timeout;
 } ngx_http_core_loc_conf_t;
 
 
-extern ngx_http_module_t  ngx_http_core_module;
+extern ngx_http_module_t  ngx_http_core_module_ctx;
+extern ngx_module_t  ngx_http_core_module;
+
+extern int (*ngx_http_top_header_filter) (ngx_http_request_t *r);
+extern int ngx_http_max_module;
 
 
 #endif /* _NGX_HTTP_CORE_H_INCLUDED_ */
diff --git a/src/http/ngx_http_event.c b/src/http/ngx_http_event.c
index 1587670..b2f5876 100644
--- a/src/http/ngx_http_event.c
+++ b/src/http/ngx_http_event.c
@@ -177,7 +177,8 @@
     ngx_test_null(r->pool, ngx_create_pool(srv->request_pool_size, ev->log),
                   ngx_http_close_request(r));
 
-    ngx_test_null(r->ctx, ngx_pcalloc(r->pool, sizeof(void *) * ngx_max_module),
+    ngx_test_null(r->ctx,
+                  ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module),
                   ngx_http_close_request(r));
 
     r->headers_out.headers = ngx_create_table(r->pool, 10);
@@ -519,8 +520,8 @@
 
         if (c->sent > 0) {
             conf = (ngx_http_core_loc_conf_t *)
-                        ngx_get_module_loc_conf(r->main ? r->main : r,
-                                                ngx_http_core_module);
+                        ngx_http_get_module_loc_conf(r->main ? r->main : r,
+                                                     ngx_http_core_module_ctx);
 
             timeout = (ngx_msec_t) (c->sent * conf->send_timeout);
 
diff --git a/src/http/ngx_http_header_filter.c b/src/http/ngx_http_header_filter.c
index fb51235..acc5df5 100644
--- a/src/http/ngx_http_header_filter.c
+++ b/src/http/ngx_http_header_filter.c
@@ -6,19 +6,20 @@
 #include <ngx_string.h>
 #include <ngx_table.h>
 #include <ngx_hunk.h>
+#include <ngx_config_file.h>
 #include <ngx_http.h>
+#include <ngx_http_write_filter.h>
 
 
 static int ngx_http_header_filter(ngx_http_request_t *r);
 
-ngx_http_module_t  ngx_http_header_filter_module = {
+
+ngx_http_module_t  ngx_http_header_filter_module_ctx = {
     NGX_HTTP_MODULE,
 
     NULL,                                  /* create server config */
     NULL,                                  /* create location config */
-    NULL,                                  /* module directives */
 
-    NULL,                                  /* init module */
     NULL,                                  /* translate handler */
 
     ngx_http_header_filter,                /* output header filter */
@@ -28,12 +29,23 @@
 };
 
 
+ngx_module_t  ngx_http_header_filter_module = {
+    &ngx_http_header_filter_module_ctx,    /* module context */
+    NULL,                                  /* module directives */
+    NGX_HTTP_MODULE_TYPE,                  /* module type */
+    NULL                                   /* init module */
+};
+
+
 static char server_string[] = "Server: " NGINX_VER CRLF;
 
 
 static ngx_str_t http_codes[] = {
 
+    ngx_string("200 OK"),
+#if 0
     { 6,  "200 OK" },
+#endif
 
     { 21, "301 Moved Permanently" },
     { 21, "302 Moved Temporarily" },
@@ -59,8 +71,9 @@
     ngx_chain_t      *ch;
     ngx_table_elt_t  *header;
 
-    if (r->http_version < NGX_HTTP_VERSION_10)
+    if (r->http_version < NGX_HTTP_VERSION_10) {
         return NGX_OK;
+    }
 
     /* 9 is for "HTTP/1.x ", 2 is for trailing "\r\n"
        and 2 is for end of header */
@@ -89,19 +102,21 @@
     /* status line */
     if (r->headers_out.status_line.len) {
         len += r->headers_out.status_line.len;
+
     } else {
-        if (r->headers_out.status < NGX_HTTP_MOVED_PERMANENTLY)
+        if (r->headers_out.status < NGX_HTTP_MOVED_PERMANENTLY) {
             status = r->headers_out.status - NGX_HTTP_OK;
 
-        else if (r->headers_out.status < NGX_HTTP_BAD_REQUEST)
+        } else if (r->headers_out.status < NGX_HTTP_BAD_REQUEST) {
             status = r->headers_out.status - NGX_HTTP_MOVED_PERMANENTLY + 1;
 
-        else if (r->headers_out.status < NGX_HTTP_INTERNAL_SERVER_ERROR)
+        } else if (r->headers_out.status < NGX_HTTP_INTERNAL_SERVER_ERROR) {
             status = r->headers_out.status - NGX_HTTP_BAD_REQUEST + 1 + 4;
 
-        else
+        } else {
             status = r->headers_out.status
                                  - NGX_HTTP_INTERNAL_SERVER_ERROR + 1 + 4 + 5;
+        }
 
         len += http_codes[status].len;
     }
@@ -122,8 +137,9 @@
     }
 
     /* 2^64 is 20 characters */
-    if (r->headers_out.content_length >= 0)
+    if (r->headers_out.content_length >= 0) {
         len += 48;
+    }
 
 #if 0
     if (r->headers_out.content_type.len)
@@ -138,15 +154,17 @@
         len += 46;
     }
 
-    if (r->keepalive)
+    if (r->keepalive) {
         len += 24;
-    else
+    } else {
         len += 19;
+    }
 
     header = (ngx_table_elt_t *) r->headers_out.headers->elts;
     for (i = 0; i < r->headers_out.headers->nelts; i++) {
-        if (header[i].key.len == 0)
+        if (header[i].key.len == 0) {
             continue;
+        }
 
         len += header[i].key.len + 2 + header[i].value.len + 2;
     }
@@ -183,9 +201,10 @@
     }
 
     /* 2^64 is 20 characters  */
-    if (r->headers_out.content_length >= 0)
+    if (r->headers_out.content_length >= 0) {
         h->last.mem += ngx_snprintf(h->last.mem, 49, "Content-Length: %u" CRLF,
                                     r->headers_out.content_length);
+    }
 
 #if 0
     if (r->headers_out.content_type.len) {
@@ -219,8 +238,9 @@
     }
 
     for (i = 0; i < r->headers_out.headers->nelts; i++) {
-        if (header[i].key.len == 0)
+        if (header[i].key.len == 0) {
             continue;
+        }
 
         ngx_memcpy(h->last.mem, header[i].key.data, header[i].key.len);
         h->last.mem += header[i].key.len;
@@ -239,8 +259,9 @@
     /* end of HTTP header */
     *(h->last.mem++) = CR; *(h->last.mem++) = LF;
 
-    if (r->header_only)
+    if (r->header_only) {
         h->type |= NGX_HUNK_LAST;
+    }
 
     ngx_test_null(ch, ngx_palloc(r->pool, sizeof(ngx_chain_t)), NGX_ERROR);
 
diff --git a/src/http/ngx_http_output_filter.c b/src/http/ngx_http_output_filter.c
index 5a33d53..8b8b0e6 100644
--- a/src/http/ngx_http_output_filter.c
+++ b/src/http/ngx_http_output_filter.c
@@ -10,7 +10,6 @@
 #include <ngx_http_output_filter.h>
 
 
-static int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk);
 static int ngx_http_output_filter_copy_hunk(ngx_hunk_t *dst, ngx_hunk_t *src);
 static void *ngx_http_output_filter_create_conf(ngx_pool_t *pool);
 
@@ -18,12 +17,12 @@
 static ngx_command_t  ngx_http_output_filter_commands[] = {
 
     {ngx_string("output_buffer"),
+     NGX_CONF_TAKE1,
      ngx_conf_set_size_slot,
-     offsetof(ngx_http_output_filter_conf_t, hunk_size),
      NGX_HTTP_LOC_CONF,
-     NGX_CONF_TAKE1},
+     offsetof(ngx_http_output_filter_conf_t, hunk_size)},
 
-    {ngx_string(""), NULL, 0, 0, 0}
+    {ngx_string(""), 0, NULL, 0, 0}
 };
 
 
@@ -37,8 +36,8 @@
 
     NULL,                                  /* output header filter */
     NULL,                                  /* next output header filter */
-    (ngx_http_output_body_filter_p) ngx_http_output_filter,
-                                           /* output body filter */
+    (int (*)(ngx_http_request_t *, ngx_chain_t *))
+        ngx_http_output_filter,            /* output body filter */
     NULL                                   /* next output body filter */
 };
 
@@ -51,7 +50,7 @@
 };
 
 
-static int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk)
+int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk)
 {
     int      rc, once;
     size_t   size;
diff --git a/src/http/ngx_http_output_filter.h b/src/http/ngx_http_output_filter.h
index 63807d1..f409b54 100644
--- a/src/http/ngx_http_output_filter.h
+++ b/src/http/ngx_http_output_filter.h
@@ -23,6 +23,9 @@
 } ngx_http_output_filter_ctx_t;
 
 
+int ngx_http_output_filter(ngx_http_request_t *r, ngx_hunk_t *hunk);
+
+
 extern ngx_module_t  ngx_http_output_filter_module;
 
 
diff --git a/src/http/ngx_http_write_filter.c b/src/http/ngx_http_write_filter.c
index 1dce403..7c60d8f 100644
--- a/src/http/ngx_http_write_filter.c
+++ b/src/http/ngx_http_write_filter.c
@@ -5,35 +5,30 @@
 #include <ngx_event_write.h>
 #include <ngx_http.h>
 #include <ngx_http_config.h>
-#include <ngx_http_output_filter.h>
 #include <ngx_http_write_filter.h>
 
 
-int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in);
-
 static void *ngx_http_write_filter_create_conf(ngx_pool_t *pool);
 
 
 static ngx_command_t ngx_http_write_filter_commands[] = {
 
-    {"write_buffer", ngx_conf_set_size_slot,
-     offsetof(ngx_http_write_filter_conf_t, buffer_output),
-     NGX_HTTP_LOC_CONF, NGX_CONF_TAKE1, 
-     "set write filter size to buffer output"},
+    {ngx_string("write_buffer"),
+     NGX_CONF_TAKE1, 
+     ngx_conf_set_size_slot,
+     NGX_HTTP_LOC_CONF,
+     offsetof(ngx_http_write_filter_conf_t, buffer_output)},
 
-    {NULL}
-
+    {ngx_string(""), 0, NULL, 0, 0}
 };
 
 
-ngx_http_module_t  ngx_http_write_filter_module = {
+ngx_http_module_t  ngx_http_write_filter_module_ctx = {
     NGX_HTTP_MODULE,
 
     NULL,                                  /* create server config */
     ngx_http_write_filter_create_conf,     /* create location config */
-    ngx_http_write_filter_commands,        /* module directives */
 
-    NULL,                                  /* init module */
     NULL,                                  /* translate handler */
 
     NULL,                                  /* output header filter */
@@ -43,6 +38,14 @@
 };
 
 
+ngx_module_t  ngx_http_write_filter_module = {
+    &ngx_http_write_filter_module_ctx,     /* module context */
+    ngx_http_write_filter_commands,        /* module directives */
+    NGX_HTTP_MODULE_TYPE,                  /* module type */
+    NULL                                   /* init module */
+};
+
+
 int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
 {
     int    last;
@@ -53,12 +56,13 @@
 
 
     ctx = (ngx_http_write_filter_ctx_t *)
-                              ngx_get_module_ctx(r->main ? r->main : r,
-                                                 ngx_http_write_filter_module);
-    if (ctx == NULL)
+                     ngx_http_get_module_ctx(r->main ? r->main : r,
+                                             ngx_http_write_filter_module_ctx);
+    if (ctx == NULL) {
         ngx_http_create_ctx(r, ctx,
-                            ngx_http_write_filter_module,
+                            ngx_http_write_filter_module_ctx,
                             sizeof(ngx_http_write_filter_ctx_t));
+    }
 
     size = flush = 0;
     last = 0;
@@ -73,11 +77,13 @@
                       ch->hunk->type _ ch->hunk->pos.file _
                       ch->hunk->last.file - ch->hunk->pos.file);
 
-        if (ch->hunk->type & (NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED))
+        if (ch->hunk->type & (NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED)) {
             flush = size;
+        }
 
-        if (ch->hunk->type & NGX_HUNK_LAST)
+        if (ch->hunk->type & NGX_HUNK_LAST) {
             last = 1;
+        }
     }
 
     /* add new chain to existent one */
@@ -94,25 +100,29 @@
                       ch->hunk->type _ ch->hunk->pos.file _
                       ch->hunk->last.file - ch->hunk->pos.file);
 
-        if (ch->hunk->type & (NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED))
+        if (ch->hunk->type & (NGX_HUNK_FLUSH|NGX_HUNK_RECYCLED)) {
             flush = size;
+        }
 
-        if (ch->hunk->type & NGX_HUNK_LAST)
+        if (ch->hunk->type & NGX_HUNK_LAST) {
             last = 1;
+        }
     }
 
     conf = (ngx_http_write_filter_conf_t *)
-                   ngx_get_module_loc_conf(r->main ? r->main : r,
-                                                ngx_http_write_filter_module);
+                ngx_http_get_module_loc_conf(r->main ? r->main : r,
+                                             ngx_http_write_filter_module_ctx);
 
     ngx_log_debug(r->connection->log, "l:%d f:%d" _ last _ flush);
 
-    if (!last && flush == 0 && size < conf->buffer_output)
+    if (!last && flush == 0 && size < conf->buffer_output) {
         return NGX_OK;
+    }
 
     chain = ngx_event_write(r->connection, ctx->out, flush);
-    if (chain == (ngx_chain_t *) -1)
+    if (chain == (ngx_chain_t *) -1) {
         return NGX_ERROR;
+    }
 
     ctx->out = chain;
 
diff --git a/src/http/ngx_http_write_filter.h b/src/http/ngx_http_write_filter.h
index cb209c2..492d4d8 100644
--- a/src/http/ngx_http_write_filter.h
+++ b/src/http/ngx_http_write_filter.h
@@ -10,6 +10,7 @@
     size_t        buffer_output;
 } ngx_http_write_filter_conf_t;
 
+
 typedef struct {
     ngx_chain_t  *out;
 } ngx_http_write_filter_ctx_t;
@@ -17,7 +18,8 @@
 
 int ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in);
 
-extern ngx_http_module_t  ngx_http_write_filter_module;
+
+extern ngx_module_t  ngx_http_write_filter_module;
 
 
 #endif /* _NGX_HTTP_WRITE_FILTER_H_INCLUDED_ */
