diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c
index 08c0519..0d22166 100644
--- a/src/http/ngx_http.c
+++ b/src/http/ngx_http.c
@@ -19,10 +19,10 @@
 
 static ngx_int_t ngx_http_add_addresses(ngx_conf_t *cf,
     ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
-    ngx_http_listen_t *listen);
+    ngx_http_listen_opt_t *lsopt);
 static ngx_int_t ngx_http_add_address(ngx_conf_t *cf,
     ngx_http_core_srv_conf_t *cscf, ngx_http_conf_port_t *port,
-    ngx_http_listen_t *listen);
+    ngx_http_listen_opt_t *lsopt);
 static ngx_int_t ngx_http_add_server(ngx_conf_t *cf,
     ngx_http_core_srv_conf_t *cscf, ngx_http_conf_addr_t *addr);
 
@@ -1095,7 +1095,7 @@
 
 ngx_int_t
 ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
-    ngx_http_listen_t *listen)
+    ngx_http_listen_opt_t *lsopt)
 {
     in_port_t                   p;
     ngx_uint_t                  i;
@@ -1117,7 +1117,7 @@
         }
     }
 
-    sa = (struct sockaddr *) &listen->sockaddr;
+    sa = (struct sockaddr *) &lsopt->sockaddr;
 
     switch (sa->sa_family) {
 
@@ -1143,7 +1143,7 @@
 
         /* a port is already in the port list */
 
-        return ngx_http_add_addresses(cf, cscf, &port[i], listen);
+        return ngx_http_add_addresses(cf, cscf, &port[i], lsopt);
     }
 
     /* add a port to the port list */
@@ -1157,13 +1157,13 @@
     port->port = p;
     port->addrs.elts = NULL;
 
-    return ngx_http_add_address(cf, cscf, port, listen);
+    return ngx_http_add_address(cf, cscf, port, lsopt);
 }
 
 
 static ngx_int_t
 ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
-    ngx_http_conf_port_t *port, ngx_http_listen_t *listen)
+    ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)
 {
     u_char                *p;
     size_t                 len, off;
@@ -1176,7 +1176,7 @@
      * may fill some fields in inherited sockaddr struct's
      */
 
-    sa = (struct sockaddr *) &listen->sockaddr;
+    sa = (struct sockaddr *) &lsopt->sockaddr;
 
     switch (sa->sa_family) {
 
@@ -1193,13 +1193,13 @@
         break;
     }
 
-    p = listen->sockaddr + off;
+    p = lsopt->sockaddr + off;
 
     addr = port->addrs.elts;
 
     for (i = 0; i < port->addrs.nelts; i++) {
 
-        if (ngx_memcmp(p, (u_char *) addr[i].sockaddr + off, len) != 0) {
+        if (ngx_memcmp(p, (u_char *) addr[i].opt.sockaddr + off, len) != 0) {
             continue;
         }
 
@@ -1211,7 +1211,7 @@
 
         /* check the duplicate "default" server for this address:port */
 
-        if (listen->opt.default_server) {
+        if (lsopt->default_server) {
 
             if (addr[i].opt.default_server) {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
@@ -1219,8 +1219,8 @@
                 return NGX_ERROR;
             }
 
+            addr[i].opt = *lsopt;
             addr[i].core_srv_conf = cscf;
-            addr[i].opt = listen->opt;
         }
 
         return NGX_OK;
@@ -1228,7 +1228,7 @@
 
     /* add the address to the addresses list that bound to this port */
 
-    return ngx_http_add_address(cf, cscf, port, listen);
+    return ngx_http_add_address(cf, cscf, port, lsopt);
 }
 
 
@@ -1239,7 +1239,7 @@
 
 static ngx_int_t
 ngx_http_add_address(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
-    ngx_http_conf_port_t *port, ngx_http_listen_t *listen)
+    ngx_http_conf_port_t *port, ngx_http_listen_opt_t *lsopt)
 {
     ngx_http_conf_addr_t  *addr;
 
@@ -1257,8 +1257,7 @@
         return NGX_ERROR;
     }
 
-    ngx_memcpy(addr->sockaddr, listen->sockaddr, listen->socklen);
-    addr->socklen = listen->socklen;
+    addr->opt = *lsopt;
     addr->hash.buckets = NULL;
     addr->hash.size = 0;
     addr->wc_head = NULL;
@@ -1269,7 +1268,6 @@
 #endif
     addr->core_srv_conf = cscf;
     addr->servers.elts = NULL;
-    addr->opt = listen->opt;
 
     return ngx_http_add_server(cf, cscf, addr);
 }
@@ -1629,7 +1627,7 @@
     ngx_http_core_loc_conf_t  *clcf;
     ngx_http_core_srv_conf_t  *cscf;
 
-    ls = ngx_create_listening(cf, addr->sockaddr, addr->socklen);
+    ls = ngx_create_listening(cf, addr->opt.sockaddr, addr->opt.socklen);
     if (ls == NULL) {
         return NULL;
     }
@@ -1698,7 +1696,7 @@
 
     for (i = 0; i < hport->naddrs; i++) {
 
-        sin = (struct sockaddr_in *) addr[i].sockaddr;
+        sin = (struct sockaddr_in *) addr[i].opt.sockaddr;
         addrs[i].addr = sin->sin_addr.s_addr;
         addrs[i].conf.core_srv_conf = addr[i].core_srv_conf;
 #if (NGX_HTTP_SSL)
@@ -1759,7 +1757,7 @@
 
     for (i = 0; i < hport->naddrs; i++) {
 
-        sin6 = (struct sockaddr_in6 *) addr[i].sockaddr;
+        sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr;
         addrs6[i].addr6 = sin6->sin6_addr;
         addrs6[i].conf.core_srv_conf = addr[i].core_srv_conf;
 #if (NGX_HTTP_SSL)
diff --git a/src/http/ngx_http.h b/src/http/ngx_http.h
index 87209f6..08bea59 100644
--- a/src/http/ngx_http.h
+++ b/src/http/ngx_http.h
@@ -58,7 +58,7 @@
 ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,
     ngx_http_core_loc_conf_t *clcf);
 ngx_int_t ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
-    ngx_http_listen_t *listen);
+    ngx_http_listen_opt_t *lsopt);
 
 
 void ngx_http_init_connection(ngx_connection_t *c);
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index a8c33f1..88d58e6 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -2832,16 +2832,16 @@
     ngx_http_core_srv_conf_t *prev = parent;
     ngx_http_core_srv_conf_t *conf = child;
 
-    ngx_http_listen_t        ls;
     struct sockaddr_in      *sin;
+    ngx_http_listen_opt_t    lsopt;
     ngx_http_server_name_t  *sn;
 
     /* TODO: it does not merge, it inits only */
 
     if (!conf->listen) {
-        ngx_memzero(&ls, sizeof(ngx_http_listen_t));
+        ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));
 
-        sin = (struct sockaddr_in *) &ls.sockaddr;
+        sin = (struct sockaddr_in *) &lsopt.sockaddr;
 
         sin->sin_family = AF_INET;
 #if (NGX_WIN32)
@@ -2851,17 +2851,17 @@
 #endif
         sin->sin_addr.s_addr = INADDR_ANY;
 
-        ls.socklen = sizeof(struct sockaddr_in);
+        lsopt.socklen = sizeof(struct sockaddr_in);
 
-        ls.opt.backlog = NGX_LISTEN_BACKLOG;
-        ls.opt.rcvbuf = -1;
-        ls.opt.sndbuf = -1;
-        ls.opt.wildcard = 1;
+        lsopt.backlog = NGX_LISTEN_BACKLOG;
+        lsopt.rcvbuf = -1;
+        lsopt.sndbuf = -1;
+        lsopt.wildcard = 1;
 
-        (void) ngx_sock_ntop((struct sockaddr *) &ls.sockaddr, ls.opt.addr,
+        (void) ngx_sock_ntop((struct sockaddr *) &lsopt.sockaddr, lsopt.addr,
                              NGX_SOCKADDR_STRLEN, 1);
 
-        if (ngx_http_add_listen(cf, conf, &ls) == NGX_OK) {
+        if (ngx_http_add_listen(cf, conf, &lsopt) == NGX_OK) {
             return NGX_CONF_OK;
         }
     }
@@ -3266,10 +3266,10 @@
 {
     ngx_http_core_srv_conf_t *cscf = conf;
 
-    ngx_str_t          *value, size;
-    ngx_url_t           u;
-    ngx_uint_t          n;
-    ngx_http_listen_t   ls;
+    ngx_str_t              *value, size;
+    ngx_url_t               u;
+    ngx_uint_t              n;
+    ngx_http_listen_opt_t   lsopt;
 
     cscf->listen = 1;
 
@@ -3291,21 +3291,21 @@
         return NGX_CONF_ERROR;
     }
 
-    ngx_memzero(&ls, sizeof(ngx_http_listen_t));
+    ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));
 
-    ngx_memcpy(ls.sockaddr, u.sockaddr, u.socklen);
+    ngx_memcpy(lsopt.sockaddr, u.sockaddr, u.socklen);
 
-    ls.socklen = u.socklen;
-    ls.opt.backlog = NGX_LISTEN_BACKLOG;
-    ls.opt.rcvbuf = -1;
-    ls.opt.sndbuf = -1;
-    ls.opt.wildcard = u.wildcard;
+    lsopt.socklen = u.socklen;
+    lsopt.backlog = NGX_LISTEN_BACKLOG;
+    lsopt.rcvbuf = -1;
+    lsopt.sndbuf = -1;
+    lsopt.wildcard = u.wildcard;
 
-    (void) ngx_sock_ntop((struct sockaddr *) &ls.sockaddr, ls.opt.addr,
+    (void) ngx_sock_ntop((struct sockaddr *) &lsopt.sockaddr, lsopt.addr,
                          NGX_SOCKADDR_STRLEN, 1);
 
     if (cf->args->nelts > 2 && ngx_strcmp(value[2].data, "default") == 0) {
-        ls.opt.default_server = 1;
+        lsopt.default_server = 1;
         n = 3;
 
     } else {
@@ -3314,7 +3314,7 @@
 
     for ( /* void */ ; n < cf->args->nelts; n++) {
 
-        if (ls.opt.default_server == 0) {
+        if (lsopt.default_server == 0) {
             ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                "\"%V\" parameter can be specified for "
                                "the default \"listen\" directive only",
@@ -3323,15 +3323,15 @@
         }
 
         if (ngx_strcmp(value[n].data, "bind") == 0) {
-            ls.opt.bind = 1;
+            lsopt.bind = 1;
             continue;
         }
 
         if (ngx_strncmp(value[n].data, "backlog=", 8) == 0) {
-            ls.opt.backlog = ngx_atoi(value[n].data + 8, value[n].len - 8);
-            ls.opt.bind = 1;
+            lsopt.backlog = ngx_atoi(value[n].data + 8, value[n].len - 8);
+            lsopt.bind = 1;
 
-            if (ls.opt.backlog == NGX_ERROR || ls.opt.backlog == 0) {
+            if (lsopt.backlog == NGX_ERROR || lsopt.backlog == 0) {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                    "invalid backlog \"%V\"", &value[n]);
                 return NGX_CONF_ERROR;
@@ -3344,10 +3344,10 @@
             size.len = value[n].len - 7;
             size.data = value[n].data + 7;
 
-            ls.opt.rcvbuf = ngx_parse_size(&size);
-            ls.opt.bind = 1;
+            lsopt.rcvbuf = ngx_parse_size(&size);
+            lsopt.bind = 1;
 
-            if (ls.opt.rcvbuf == NGX_ERROR) {
+            if (lsopt.rcvbuf == NGX_ERROR) {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                    "invalid rcvbuf \"%V\"", &value[n]);
                 return NGX_CONF_ERROR;
@@ -3360,10 +3360,10 @@
             size.len = value[n].len - 7;
             size.data = value[n].data + 7;
 
-            ls.opt.sndbuf = ngx_parse_size(&size);
-            ls.opt.bind = 1;
+            lsopt.sndbuf = ngx_parse_size(&size);
+            lsopt.bind = 1;
 
-            if (ls.opt.sndbuf == NGX_ERROR) {
+            if (lsopt.sndbuf == NGX_ERROR) {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                    "invalid sndbuf \"%V\"", &value[n]);
                 return NGX_CONF_ERROR;
@@ -3374,8 +3374,8 @@
 
         if (ngx_strncmp(value[n].data, "accept_filter=", 14) == 0) {
 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
-            ls.opt.accept_filter = (char *) &value[n].data[14];
-            ls.opt.bind = 1;
+            lsopt.accept_filter = (char *) &value[n].data[14];
+            lsopt.bind = 1;
 #else
             ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                "accept filters \"%V\" are not supported "
@@ -3387,8 +3387,8 @@
 
         if (ngx_strcmp(value[n].data, "deferred") == 0) {
 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
-            ls.opt.deferred_accept = 1;
-            ls.opt.bind = 1;
+            lsopt.deferred_accept = 1;
+            lsopt.bind = 1;
 #else
             ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                "the deferred accept is not supported "
@@ -3401,15 +3401,15 @@
 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
             struct sockaddr  *sa;
 
-            sa = (struct sockaddr *) ls.sockaddr;
+            sa = (struct sockaddr *) lsopt.sockaddr;
 
             if (sa->sa_family == AF_INET6) {
 
                 if (ngx_strcmp(&value[n].data[10], "n") == 0) {
-                    ls.opt.ipv6only = 1;
+                    lsopt.ipv6only = 1;
 
                 } else if (ngx_strcmp(&value[n].data[10], "ff") == 0) {
-                    ls.opt.ipv6only = 2;
+                    lsopt.ipv6only = 2;
 
                 } else {
                     ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
@@ -3418,12 +3418,12 @@
                     return NGX_CONF_ERROR;
                 }
 
-                ls.opt.bind = 1;
+                lsopt.bind = 1;
 
             } else {
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                    "ipv6only is not supported "
-                                   "on addr \"%s\", ignored", ls.opt.addr);
+                                   "on addr \"%s\", ignored", lsopt.addr);
             }
 
             continue;
@@ -3437,7 +3437,7 @@
 
         if (ngx_strcmp(value[n].data, "ssl") == 0) {
 #if (NGX_HTTP_SSL)
-            ls.opt.ssl = 1;
+            lsopt.ssl = 1;
             continue;
 #else
             ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
@@ -3452,7 +3452,7 @@
         return NGX_CONF_ERROR;
     }
 
-    if (ngx_http_add_listen(cf, cscf, &ls) == NGX_OK) {
+    if (ngx_http_add_listen(cf, cscf, &lsopt) == NGX_OK) {
         return NGX_CONF_OK;
     }
 
diff --git a/src/http/ngx_http_core_module.h b/src/http/ngx_http_core_module.h
index ef93a34..303bc9c 100644
--- a/src/http/ngx_http_core_module.h
+++ b/src/http/ngx_http_core_module.h
@@ -43,6 +43,9 @@
 
 
 typedef struct {
+    u_char                     sockaddr[NGX_SOCKADDRLEN];
+    socklen_t                  socklen;
+
     unsigned                   default_server:1;
     unsigned                   bind:1;
     unsigned                   wildcard:1;
@@ -68,14 +71,6 @@
 } ngx_http_listen_opt_t;
 
 
-typedef struct {
-    u_char                     sockaddr[NGX_SOCKADDRLEN];
-    socklen_t                  socklen;
-
-    ngx_http_listen_opt_t      opt;
-} ngx_http_listen_t;
-
-
 typedef enum {
     NGX_HTTP_POST_READ_PHASE = 0,
 
@@ -223,8 +218,7 @@
 
 
 typedef struct {
-    u_char                     sockaddr[NGX_SOCKADDRLEN];
-    socklen_t                  socklen;
+    ngx_http_listen_opt_t      opt;
 
     ngx_hash_t                 hash;
     ngx_hash_wildcard_t       *wc_head;
@@ -238,8 +232,6 @@
     /* the default server configuration for this address:port */
     ngx_http_core_srv_conf_t  *core_srv_conf;
     ngx_array_t                servers;  /* array of ngx_http_core_srv_conf_t */
-
-    ngx_http_listen_opt_t      opt;
 } ngx_http_conf_addr_t;
 
 
