diff --git a/src/core/nginx.c b/src/core/nginx.c
index b967393..b011df3 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -27,13 +27,12 @@
 
 int main(int argc, char *const *argv)
 {
-    int          i;
-    ngx_str_t    conf_file;
-    ngx_log_t   *log;
-    ngx_pool_t  *pool;
-    ngx_conf_t   conf;
+    ngx_str_t     conf_file;
+    ngx_log_t    *log;
+    ngx_conf_t    conf;
+    ngx_cycle_t  *cycle;
 
-    ngx_max_sockets = -1;
+    /* TODO */ ngx_max_sockets = -1;
 
     log = ngx_log_init_errlog();
 
@@ -46,11 +45,8 @@
         ngx_modules[i]->index = ngx_max_module++;
     }
 
-    ngx_test_null(pool, ngx_create_pool(16 * 1024, log), 1);
-    ngx_test_null(cycle, ngx_pcalloc(pool, sizeof(ngx_cycle_t)), 1);
-    cycle->pool = pool;
-
-    if (ngx_init_conf(cycle) == NGX_ERROR) {
+    cycle = ngx_init_cycle(NULL, log);
+    if (cycle == NULL) {
         return 1;
     }
 
@@ -70,62 +66,11 @@
 
             worker(cycle->log);
 
-            pool = ngx_create_pool(16 * 1024, cycle->log);
-
-            if (pool == NULL) {
+            new_cycle = ngx_init_cycle(cycle, cycle->log);
+            if (new_cycle) == NULL) {
                 continue;
             }
 
-            new_cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));
-
-            if (new_cycle == NULL) {
-                ngx_destroy_pool(pool);
-                continue;
-            }
-
-            new_cycle->pool = pool;
-
-            if (ngx_init_conf(new_cycle, cycle->log) == NGX_ERROR) {
-                ngx_destroy_pool(new_cycle->pool);
-                continue;
-            }
-
-            nls = new_cycle->listening.elts;
-            for (n = 0; n < new_cycle->listening.nelts; n++) {
-                ls = cycle->listening.elts;
-                for (i = 0; i < cycle->listening.nelts; i++) {
-                    if (ngx_memcmp(nls[n].sockaddr,
-                                   ls[i].sockaddr, ls[i].socklen) == 0)
-                    {
-                        nls[n].fd = ls[i].fd;
-                        break;
-                    }
-                }
-
-                if (nls[n].fd == -1) {
-                    nls[n].new = 1;
-                }
-            }
-
-            if (ngx_open_listening_sockets(new_cycle) == NGX_ERROR) {
-                for (n = 0; n < new_cycle->listening.nelts; n++) {
-                    if (nls[n].new && nls[n].fd != -1) {
-                        if (ngx_close_socket(nls[n].fd) == -1)
-                            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                                          ngx_close_socket_n " %s failed",
-                                          nls[n].addr_text.data);
-                        }
-                    }
-                }
-
-                ngx_destroy_pool(new_cycle->pool);
-                continue;
-            }
-
-            new_cycle->log = new log;
-
-            ngx_destroy_pool(cycle->pool);
-
             cycle = new_cycle;
             break;
         }
@@ -137,10 +82,12 @@
 
 static int ngx_init_cycle(ngx_cycle_t *old_cycle, ngx_log_t *log)
 {
-    int           n;
-    ngx_conf_t    conf;
-    ngx_pool_t   *pool;
-    ngx_cycle_t  *cycle;
+    int               i, n;
+    ngx_conf_t        conf;
+    ngx_pool_t       *pool;
+    ngx_cycle_t      *cycle;
+    ngx_open_file_t  *file;
+    ngx_listening_t  *ls, *nls;
 
 
     pool = ngx_create_pool(16 * 1024, log);
@@ -240,6 +187,28 @@
     }
 
     if (!failed) {
+        ls = old_cycle->listening.elts;
+        for (i = 0; i < old_cycle->listening.nelts; i++) {
+            ls[i].remain = 0;
+        }
+
+        nls = cycle->listening.elts;
+        for (n = 0; n < cycle->listening.nelts; n++) {
+            for (i = 0; i < old_cycle->listening.nelts; i++) {
+                if (ngx_memcmp(nls[n].sockaddr,
+                               ls[i].sockaddr, ls[i].socklen) == 0)
+                {
+                    nls[n].fd = ls[i].fd;
+                    ls[i].remain = 1;
+                    break;
+                }
+            }
+
+            if (nls[n].fd == -1) {
+                nls[n].new = 1;
+            }
+        }
+
         if (ngx_open_listening_sockets(new_cycle) == NGX_ERROR) {
             failed = 1;
         }
@@ -257,23 +226,27 @@
 
         file = cycle->open_files.elts;
         for (i = 0; i < cycle->open_files.nelts; i++) {
-            if (file->fd != NGX_INVALID_FILE) {
-                if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {
-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
-                                  ngx_close_file_n " \"%s\" failed",
-                                  file->name.data);
-                }
+            if (file->fd == NGX_INVALID_FILE) {
+                continue;
+            }
+
+            if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {
+                ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+                              ngx_close_file_n " \"%s\" failed",
+                              file->name.data);
             }
         }
 
         ls[i] = cycle->listening.elts;
         for (i = 0; i < cycle->listening.nelts; i++) {
-            if (ls[i].new && ls[i].fd != -1) {
-                if (ngx_close_socket(ls[i].fd) == -1)
-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                                  ngx_close_socket_n " %s failed",
-                                  ls[i].addr_text.data);
-                }
+            if (ls[i].new && ls[i].fd == -1) {
+                continue;
+            }
+
+            if (ngx_close_socket(ls[i].fd) == -1)
+                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+                              ngx_close_socket_n " %s failed",
+                              ls[i].addr_text.data);
             }
         }
 
@@ -291,76 +264,43 @@
         }
     }
 
+    ls = old_cycle->listening.elts;
+    for (i = 0; i < old_cycle->listening.nelts; i++) {
+        if (ls[i].remain) {
+            continue;
+        }
+
+        if (ngx_close_socket(ls[i].fd) == -1)
+            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+                          ngx_close_socket_n " %s failed",
+                          ls[i].addr_text.data);
+        }
+    }
+
+    file = old_cycle->open_files.elts;
+    for (i = 0; i < cycle->old_open_files.nelts; i++) {
+        if (file->fd == NGX_INVALID_FILE) {
+            continue;
+        }
+
+        if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {
+            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+                          ngx_close_file_n " \"%s\" failed",
+                          file->name.data);
+        }
+    }
+
     new_cycle->log = ???;
     pool->log = ???;
 
+    ngx_destroy_pool(old_cycle->pool);
+
     return cycle;
-
-
-
-
-
-
-----------------
-
-    ngx_init_array(cycle->listening, cycle->pool, 10, sizeof(ngx_listening_t),
-                   NGX_ERROR);
-
-    ngx_memzero(&conf, sizeof(ngx_conf_t));
-
-    ngx_test_null(conf.args,
-                  ngx_create_array(cycle->pool, 10, sizeof(ngx_str_t)),
-                  NGX_ERROR);
-
-    ngx_test_null(cycle->conf_ctx,
-                  ngx_pcalloc(cycle->pool, ngx_max_module * sizeof(void *)),
-                  NGX_ERROR);
-
-    conf.ctx = cycle->conf_ctx;
-    conf.cycle = cycle;
-    /* STUB */ conf.pool = cycle->pool; conf.log = cycle->log;
-    conf.module_type = NGX_CORE_MODULE;
-    conf.cmd_type = NGX_MAIN_CONF;
-
-    conf_file.len = sizeof(NGINX_CONF) - 1;
-    conf_file.data = NGINX_CONF;
-
-    if (ngx_conf_parse(&conf, &conf_file) == NGX_CONF_OK) {
-        for (i = 0; ngx_modules[i]; i++) {
-            if (ngx_modules[i]->init_module) {
-                if (ngx_modules[i]->init_module(pool) == NGX_ERROR) {
-                    failed = 1;
-                    break;
-                }
-            }
-        }
-
-    } else {
-        failed = 1;
-    }
-
-    if (failed) {
-        for (i = 0; ngx_modules[i]; i++) {
-            if (ngx_modules[i]->rollback_module) {
-                ngx_modules[i]->rollback_module(pool);
-            }
-        }
-
-        return NGX_ERROR;
-
-    } else {
-        for (i = 0; ngx_modules[i]; i++) {
-            if (ngx_modules[i]->commit_module) {
-                ngx_modules[i]->commit_module(pool);
-            }
-        }
-    }
-
-    return NGX_OK;
 }
 
 
-#endif
+
+#else
 
 
 int main(int argc, char *const *argv)
@@ -454,6 +394,8 @@
     return 0;
 }
 
+#endif
+
 
 static int ngx_open_listening_sockets(ngx_log_t *log)
 {
