diff --git a/src/core/nginx.c b/src/core/nginx.c
index 92c938d..ef4ceca 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -256,501 +256,6 @@
 }
 
 
-#if 0
-
-/* TODO: broken NGX_PROCESS_SINGLE */
-
-static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx)
-{
-    int                signo;
-    sigset_t           set;
-    struct timeval     tv;
-    struct itimerval   itv;
-    ngx_uint_t         i, live;
-    ngx_msec_t         delay;
-    ngx_core_conf_t   *ccf;
-
-    sigemptyset(&set);
-    sigaddset(&set, SIGCHLD);
-    sigaddset(&set, SIGALRM);
-    sigaddset(&set, SIGINT);
-    sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));
-    sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));
-    sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));
-    sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));
-    sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
-    sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));
-
-    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                      "sigprocmask() failed");
-    }
-
-    sigemptyset(&set);
-
-    ngx_setproctitle("master process");
-
-    ngx_new_binary = 0;
-    delay = 0;
-    signo = 0;
-    live = 0;
-
-    for ( ;; ) {
-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "new cycle");
-
-        if (ngx_process == NGX_PROCESS_MASTER) {
-            ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL,
-                              "worker process", NGX_PROCESS_RESPAWN);
-
-            /*
-             * we have to limit the maximum life time of the worker processes
-             * by 1 month because our millisecond event timer is limited
-             * by 49 days on 32-bit platforms
-             */
-
-            itv.it_interval.tv_sec = 0;
-            itv.it_interval.tv_usec = 0;
-            itv.it_value.tv_sec = 30 * 24 * 60 * 60;
-            itv.it_value.tv_usec = 0;
-
-            if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
-                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                              "setitimer() failed");
-            }
-
-            live = 1;
-
-        } else {
-            ngx_init_temp_number();
-
-            for (i = 0; ngx_modules[i]; i++) {
-                if (ngx_modules[i]->init_process) {
-                    if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
-                        /* fatal */
-                        exit(1);
-                    }
-                }
-            }
-        }
-
-        ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,
-                                               ngx_core_module);
-
-        /* a cycle with the same configuration because a new one is invalid */
-
-        for ( ;; ) {
-
-            /* an event loop */
-
-            for ( ;; ) {
-
-                if (ngx_process == NGX_PROCESS_MASTER) {
-                    if (delay) {
-                        delay *= 2;
-
-                        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                                       "temination cycle: %d", delay);
-
-                        itv.it_interval.tv_sec = 0;
-                        itv.it_interval.tv_usec = 0;
-                        itv.it_value.tv_sec = delay / 1000;
-                        itv.it_value.tv_usec = (delay % 1000 ) * 1000;
-
-                        if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
-                            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                                          "setitimer() failed");
-                        }
-                    }
-
-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                                   "sigsuspend");
-
-                    sigsuspend(&set);
-
-                    ngx_gettimeofday(&tv);
-                    ngx_time_update(tv.tv_sec);
-
-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                                   "wake up");
-
-                } else { /* NGX_PROCESS_SINGLE */
-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                                   "worker cycle");
-
-                    ngx_process_events(cycle->log);
-                    live = 0;
-                }
-
-                if (ngx_reap) {
-                    ngx_reap = 0;
-                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                                   "reap childs");
-
-                    live = 0;
-                    for (i = 0; i < ngx_last_process; i++) {
-
-                        ngx_log_debug5(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                                       "child: " PID_T_FMT
-                                       " e:%d t:%d d:%d r:%d",
-                                       ngx_processes[i].pid,
-                                       ngx_processes[i].exiting,
-                                       ngx_processes[i].exited,
-                                       ngx_processes[i].detached,
-                                       ngx_processes[i].respawn);
-
-                        if (ngx_processes[i].exited) {
-
-                            if (ngx_processes[i].respawn
-                                && !ngx_processes[i].exiting
-                                && !ngx_terminate
-                                && !ngx_quit)
-                            {
-                                 if (ngx_spawn_process(cycle,
-                                                       ngx_processes[i].proc,
-                                                       ngx_processes[i].data,
-                                                       ngx_processes[i].name, i)
-                                                                  == NGX_ERROR)
-                                 {
-                                     ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                                                   "can not respawn %s",
-                                                   ngx_processes[i].name);
-                                     continue;
-                                 }
-
-                                 live = 1;
-
-                                 continue;
-                            }
-
-                            if (ngx_processes[i].pid == ngx_new_binary) {
-                                ngx_new_binary = 0;
-
-                                /* TODO: if (ngx_noaccept) ngx_configure = 1 */
-                            }
-
-                            if (i != --ngx_last_process) {
-                                ngx_processes[i--] =
-                                               ngx_processes[ngx_last_process];
-                            }
-
-                        } else if (ngx_processes[i].exiting
-                                   || !ngx_processes[i].detached)
-                        {
-                            live = 1;
-                        }
-                    }
-                }
-
-                if (!live && (ngx_terminate || ngx_quit)) {
-                    ngx_master_exit(cycle, ctx);
-                }
-
-                if (ngx_terminate) {
-                    if (delay == 0) {
-                        delay = 50;
-                    }
-
-                    if (delay > 1000) {
-                        signo = SIGKILL;
-                    } else {
-                        signo = ngx_signal_value(NGX_TERMINATE_SIGNAL);
-                    }
-
-                } else if (ngx_quit) {
-                    signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
-
-                } else if (ngx_timer) {
-                    signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
-
-                } else {
-
-                    if (ngx_noaccept) {
-                        signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
-                    }
-
-                    if (ngx_change_binary) {
-                        ngx_change_binary = 0;
-                        ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
-                                      "changing binary");
-                        ngx_new_binary = ngx_exec_new_binary(cycle, ctx->argv);
-                    }
-
-                    if (ngx_reconfigure) {
-                        signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
-                        ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
-                                      "reconfiguring");
-                    }
-
-                    if (ngx_reopen) {
-                        if (ngx_process == NGX_PROCESS_MASTER) {
-                            if (ccf->worker_reopen != 0) {
-                                signo = ngx_signal_value(NGX_REOPEN_SIGNAL);
-                                ngx_reopen = 0;
-
-                            } else if (ngx_noaccept) {
-                                ngx_reopen = 0;
-
-                            } else {
-                                signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
-                            }
-
-                        } else { /* NGX_PROCESS_SINGLE */
-                            ngx_reopen = 0;
-                        }
-
-                        ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
-                                      "reopening logs");
-                        ngx_reopen_files(cycle,
-                             ccf->worker_reopen != 0 ? ccf->user : (uid_t) -1);
-                    }
-                }
-
-                if (signo) {
-                    for (i = 0; i < ngx_last_process; i++) {
-
-                        if (ngx_processes[i].detached) {
-                            continue;
-                        }
-
-                        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,
-                                       "kill (" PID_T_FMT ", %d)" ,
-                                       ngx_processes[i].pid, signo);
-
-                        if (kill(ngx_processes[i].pid, signo) == -1) {
-                            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                                          "kill(%d, %d) failed",
-                                          ngx_processes[i].pid, signo);
-                            continue;
-                        }
-
-                        if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {
-                            ngx_processes[i].exiting = 1;
-                        }
-                    }
-
-                    signo = 0;
-                }
-
-                if (ngx_reopen || ngx_reconfigure || ngx_timer) {
-                    break;
-                }
-            }
-
-            if (ngx_reopen) {
-                ngx_reopen = 0;
-
-            } else if (ngx_timer) {
-                ngx_timer = 0;
-
-            } else if (ngx_noaccept) {
-                ngx_noaccept = 0;
-                ngx_reconfigure = 0;
-
-            } else {
-                cycle = ngx_init_cycle(cycle);
-                if (cycle == NULL) {
-                    cycle = (ngx_cycle_t *) ngx_cycle;
-                    continue;
-                }
-
-                ngx_cycle = cycle;
-                ngx_reconfigure = 0;
-            }
-
-            break;
-        }
-    }
-}
-
-
-static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx)
-{
-    char  *name;
-
-    if (ngx_inherited && getppid() > 1) {
-        name = ctx->pid.name.data;
-
-    } else {
-        name = ctx->name;
-    }
-
-    if (ngx_delete_file(name) == NGX_FILE_ERROR) {
-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                      ngx_delete_file_n " \"%s\" failed", name);
-    }
-
-    ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exit");
-    exit(0);
-}
-
-
-static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
-{
-    sigset_t          set;
-    ngx_int_t         i;
-    ngx_listening_t  *ls;
-    ngx_core_conf_t  *ccf;
-#if (NGX_THREADS)
-    ngx_tid_t         tid;
-#endif
-
-    ngx_process = NGX_PROCESS_WORKER;
-    ngx_last_process = 0;
-
-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
-
-    if (ccf->group != (gid_t) NGX_CONF_UNSET) {
-        if (setuid(ccf->group) == -1) {
-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
-                          "setgid(%d) failed", ccf->group);
-            /* fatal */
-            exit(2);
-        }
-    }
-
-    if (ccf->user != (uid_t) NGX_CONF_UNSET && geteuid() == 0) {
-        if (setuid(ccf->user) == -1) {
-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
-                          "setuid(%d) failed", ccf->user);
-            /* fatal */
-            exit(2);
-        }
-    }
-
-#if (HAVE_PR_SET_DUMPABLE)
-
-    /* allow coredump after setuid() in Linux 2.4.x */
-
-    if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                      "prctl(PR_SET_DUMPABLE) failed");
-    }
-
-#endif
-
-    sigemptyset(&set);
-
-    if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                      "sigprocmask() failed");
-    }
-
-    ngx_init_temp_number();
-
-    /*
-     * disable deleting previous events for the listening sockets because
-     * in the worker processes there are no events at all at this point
-     */ 
-    ls = cycle->listening.elts;
-    for (i = 0; i < cycle->listening.nelts; i++) {
-        ls[i].remain = 0;
-    }
-
-    for (i = 0; ngx_modules[i]; i++) {
-        if (ngx_modules[i]->init_process) {
-            if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
-                /* fatal */
-                exit(1);
-            }
-        }
-    }
-
-    ngx_setproctitle("worker process");
-
-#if (NGX_THREADS)
-
-    if (ngx_init_threads(5, 128 * 1024 * 1024, cycle) == NGX_ERROR) {
-        /* fatal */
-        exit(1);
-    }
-
-    for (i = 0; i < 1; i++) {
-        if (ngx_create_thread(&tid, ngx_worker_thread_cycle,
-                              cycle, cycle->log) != 0)
-        {
-            /* fatal */
-            exit(1);
-        }
-    }
-
-#endif
-
-    for ( ;; ) {
-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
-
-        ngx_process_events(cycle->log);
-
-        if (ngx_terminate) {
-            ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
-            exit(0);
-        }
-
-        if (ngx_quit) {
-            ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
-                          "gracefully shutting down");
-            ngx_setproctitle("worker process is shutting down");
-            break;
-        }
-
-        if (ngx_reopen) {
-            ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs");
-            ngx_reopen_files(cycle, -1);
-            ngx_reopen = 0;
-        }
-    }
-
-    ngx_close_listening_sockets(cycle);
-
-    for ( ;; ) {
-        if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
-            ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
-            exit(0);
-        }
-
-        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
-
-        ngx_process_events(cycle->log);
-
-        if (ngx_reopen) {
-            ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs");
-            ngx_reopen_files(cycle, -1);
-            ngx_reopen = 0;
-        }
-    }
-}
-
-
-#if (NGX_THREADS)
-
-int ngx_worker_thread_cycle(void *data)
-{
-    ngx_cycle_t *cycle = data;
-
-    struct timeval  tv;
-
-    /* STUB */
-
-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, ngx_errno,
-                   "thread %d started", ngx_thread_self());
-
-    ngx_setproctitle("worker thread");
-
-    sleep(5);
-
-    ngx_gettimeofday(&tv);
-    ngx_time_update(tv.tv_sec);
-
-    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, ngx_errno,
-                   "thread %d done", ngx_thread_self());
-
-    return 1;
-}
-
-#endif
-
-#endif
-
-
 static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle, char **envp)
 {
     char                *p, *v;
@@ -824,7 +329,7 @@
     env[1] = NULL;
     ctx.envp = (char *const *) &env;
 
-    pid = ngx_exec(cycle, &ctx);
+    pid = ngx_execute(cycle, &ctx);
 
     ngx_free(var);
 
