diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
index d94477a..222b3d7 100644
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -26,7 +26,7 @@
     u_char  nns_lo;
     u_char  nar_hi;
     u_char  nar_lo;
-} ngx_resolver_query_t;
+} ngx_resolver_hdr_t;
 
 
 typedef struct {
@@ -1021,31 +1021,31 @@
 static void
 ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n)
 {
-    char                  *err;
-    size_t                 len;
-    ngx_uint_t             i, times, ident, qident, flags, code, nqs, nan,
-                           qtype, qclass;
-    ngx_queue_t           *q;
-    ngx_resolver_qs_t     *qs;
-    ngx_resolver_node_t   *rn;
-    ngx_resolver_query_t  *query;
+    char                 *err;
+    size_t                len;
+    ngx_uint_t            i, times, ident, qident, flags, code, nqs, nan,
+                          qtype, qclass;
+    ngx_queue_t          *q;
+    ngx_resolver_qs_t    *qs;
+    ngx_resolver_hdr_t   *response;
+    ngx_resolver_node_t  *rn;
 
-    if ((size_t) n < sizeof(ngx_resolver_query_t)) {
+    if (n < sizeof(ngx_resolver_hdr_t)) {
         goto short_response;
     }
 
-    query = (ngx_resolver_query_t *) buf;
+    response = (ngx_resolver_hdr_t *) buf;
 
-    ident = (query->ident_hi << 8) + query->ident_lo;
-    flags = (query->flags_hi << 8) + query->flags_lo;
-    nqs = (query->nqs_hi << 8) + query->nqs_lo;
-    nan = (query->nan_hi << 8) + query->nan_lo;
+    ident = (response->ident_hi << 8) + response->ident_lo;
+    flags = (response->flags_hi << 8) + response->flags_lo;
+    nqs = (response->nqs_hi << 8) + response->nqs_lo;
+    nan = (response->nan_hi << 8) + response->nan_lo;
 
     ngx_log_debug6(NGX_LOG_DEBUG_CORE, r->log, 0,
                    "resolver DNS response %ui fl:%04Xui %ui/%ui/%ud/%ud",
                    ident, flags, nqs, nan,
-                   (query->nns_hi << 8) + query->nns_lo,
-                   (query->nar_hi << 8) + query->nar_lo);
+                   (response->nns_hi << 8) + response->nns_lo,
+                   (response->nar_hi << 8) + response->nar_lo);
 
     if (!(flags & 0x8000)) {
         ngx_log_error(r->log_level, r->log, 0,
@@ -1087,7 +1087,7 @@
         goto done;
     }
 
-    i = sizeof(ngx_resolver_query_t);
+    i = sizeof(ngx_resolver_hdr_t);
 
     while (i < (ngx_uint_t) n) {
         if (buf[i] == '\0') {
@@ -1152,7 +1152,7 @@
 
 short_response:
 
-    err = "short dns response";
+    err = "short DNS response";
 
 done:
 
@@ -1180,12 +1180,15 @@
     uint32_t              hash;
     in_addr_t             addr, *addrs;
     ngx_str_t             name;
-    ngx_uint_t            qtype, qident, naddrs, a, i, n, start;
+    ngx_uint_t            type, qident, naddrs, a, i, n, start;
     ngx_resolver_an_t    *an;
     ngx_resolver_ctx_t   *ctx, *next;
     ngx_resolver_node_t  *rn;
 
-    if (ngx_resolver_copy(r, &name, buf, &buf[12], &buf[last]) != NGX_OK) {
+    if (ngx_resolver_copy(r, &name, buf,
+                          buf + sizeof(ngx_resolver_hdr_t), buf + last)
+        != NGX_OK)
+    {
         return;
     }
 
@@ -1215,7 +1218,7 @@
     ngx_resolver_free(r, name.data);
 
     if (code == 0 && nan == 0) {
-        code = 3; /* NXDOMAIN */
+        code = NGX_RESOLVE_NXDOMAIN;
     }
 
     if (code) {
@@ -1246,7 +1249,6 @@
     addr = 0;
     addrs = NULL;
     cname = NULL;
-    qtype = 0;
     ttl = 0;
 
     for (a = 0; a < nan; a++) {
@@ -1273,7 +1275,7 @@
     test_length:
 
         if (i - start < 2) {
-            err = "invalid name in dns response";
+            err = "invalid name in DNS response";
             goto invalid;
         }
 
@@ -1285,7 +1287,7 @@
 
         an = (ngx_resolver_an_t *) &buf[i];
 
-        qtype = (an->type_hi << 8) + an->type_lo;
+        type = (an->type_hi << 8) + an->type_lo;
         len = (an->len_hi << 8) + an->len_lo;
         ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16)
             + (an->ttl[2] << 8) + (an->ttl[3]);
@@ -1294,7 +1296,9 @@
             ttl = 0;
         }
 
-        if (qtype == NGX_RESOLVE_A) {
+        switch (type) {
+
+        case NGX_RESOLVE_A:
 
             i += sizeof(ngx_resolver_an_t);
 
@@ -1309,16 +1313,25 @@
 
             i += len;
 
-        } else if (qtype == NGX_RESOLVE_CNAME) {
+            break;
+
+        case NGX_RESOLVE_CNAME:
+
             cname = &buf[i] + sizeof(ngx_resolver_an_t);
             i += sizeof(ngx_resolver_an_t) + len;
 
-        } else if (qtype == NGX_RESOLVE_DNAME) {
+            break;
+
+        case NGX_RESOLVE_DNAME:
+
             i += sizeof(ngx_resolver_an_t) + len;
 
-        } else {
+            break;
+
+        default:
+
             ngx_log_error(r->log_level, r->log, 0,
-                          "unexpected qtype %ui", qtype);
+                          "unexpected RR type %ui", type);
         }
     }
 
@@ -1347,27 +1360,25 @@
 
                     if (buf[i] & 0xc0) {
                         i += 2;
-                        goto ok;
+                        break;
                     }
 
                     if (buf[i] == 0) {
                         i++;
-                        goto ok;
+                        break;
                     }
 
                     i += 1 + buf[i];
                 }
 
-            ok:
-
                 an = (ngx_resolver_an_t *) &buf[i];
 
-                qtype = (an->type_hi << 8) + an->type_lo;
+                type = (an->type_hi << 8) + an->type_lo;
                 len = (an->len_hi << 8) + an->len_lo;
 
                 i += sizeof(ngx_resolver_an_t);
 
-                if (qtype == NGX_RESOLVE_A) {
+                if (type == NGX_RESOLVE_A) {
 
                     addrs[n++] = htonl((buf[i] << 24) + (buf[i + 1] << 16)
                                        + (buf[i + 2] << 8) + (buf[i + 3]));
@@ -1422,12 +1433,13 @@
         rn->query = NULL;
 
         return;
+    }
 
-    } else if (cname) {
+    if (cname) {
 
         /* CNAME only */
 
-        if (ngx_resolver_copy(r, &name, buf, cname, &buf[last]) != NGX_OK) {
+        if (ngx_resolver_copy(r, &name, buf, cname, buf + last) != NGX_OK) {
             return;
         }
 
@@ -1460,13 +1472,12 @@
     }
 
     ngx_log_error(r->log_level, r->log, 0,
-               "no A or CNAME types in DNS responses, unknown query type: %ui",
-               qtype);
+                  "no A or CNAME types in DNS response");
     return;
 
 short_response:
 
-    err = "short dns response";
+    err = "short DNS response";
 
 invalid:
 
@@ -1494,29 +1505,32 @@
     size_t                len;
     in_addr_t             addr;
     int32_t               ttl;
-    ngx_int_t             digit;
+    ngx_int_t             octet;
     ngx_str_t             name;
     ngx_uint_t            i, mask, qident;
     ngx_resolver_an_t    *an;
     ngx_resolver_ctx_t   *ctx, *next;
     ngx_resolver_node_t  *rn;
 
-    if (ngx_resolver_copy(r, NULL, buf, &buf[12], &buf[n]) != NGX_OK) {
+    if (ngx_resolver_copy(r, NULL, buf,
+                          buf + sizeof(ngx_resolver_hdr_t), buf + n)
+        != NGX_OK)
+    {
         goto invalid_in_addr_arpa;
     }
 
     addr = 0;
-    i = 12;
+    i = sizeof(ngx_resolver_hdr_t);
 
     for (mask = 0; mask < 32; mask += 8) {
         len = buf[i++];
 
-        digit = ngx_atoi(&buf[i], len);
-        if (digit == NGX_ERROR || digit > 255) {
+        octet = ngx_atoi(&buf[i], len);
+        if (octet == NGX_ERROR || octet > 255) {
             goto invalid_in_addr_arpa;
         }
 
-        addr += digit << mask;
+        addr += octet << mask;
         i += len;
     }
 
@@ -1547,7 +1561,7 @@
     }
 
     if (code == 0 && nan == 0) {
-        code = 3; /* NXDOMAIN */
+        code = NGX_RESOLVE_NXDOMAIN;
     }
 
     if (code) {
@@ -1581,7 +1595,7 @@
 
     /* compression pointer to "XX.XX.XX.XX.in-addr.arpa */
 
-    if (buf[i] != 0xc0 || buf[i + 1] != 0x0c) {
+    if (buf[i] != 0xc0 || buf[i + 1] != sizeof(ngx_resolver_hdr_t)) {
         err = "invalid in-addr.arpa name in DNS response";
         goto invalid;
     }
@@ -1607,7 +1621,7 @@
         goto short_response;
     }
 
-    if (ngx_resolver_copy(r, &name, buf, &buf[i], &buf[n]) != NGX_OK) {
+    if (ngx_resolver_copy(r, &name, buf, buf + i, buf + n) != NGX_OK) {
         return;
     }
 
@@ -1796,15 +1810,15 @@
 static ngx_int_t
 ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx)
 {
-    u_char                *p, *s;
-    size_t                 len, nlen;
-    ngx_uint_t             ident;
-    ngx_resolver_qs_t     *qs;
-    ngx_resolver_query_t  *query;
+    u_char              *p, *s;
+    size_t               len, nlen;
+    ngx_uint_t           ident;
+    ngx_resolver_qs_t   *qs;
+    ngx_resolver_hdr_t  *query;
 
     nlen = ctx->name.len ? (1 + ctx->name.len + 1) : 1;
 
-    len = sizeof(ngx_resolver_query_t) + nlen + sizeof(ngx_resolver_qs_t);
+    len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t);
 
     p = ngx_resolver_alloc(ctx->resolver, len);
     if (p == NULL) {
@@ -1814,7 +1828,7 @@
     rn->qlen = (u_short) len;
     rn->query = p;
 
-    query = (ngx_resolver_query_t *) p;
+    query = (ngx_resolver_hdr_t *) p;
 
     ident = ngx_random();
 
@@ -1833,14 +1847,14 @@
     query->nns_hi = 0; query->nns_lo = 0;
     query->nar_hi = 0; query->nar_lo = 0;
 
-    p += sizeof(ngx_resolver_query_t) + nlen;
+    p += sizeof(ngx_resolver_hdr_t) + nlen;
 
     qs = (ngx_resolver_qs_t *) p;
 
     /* query type */
     qs->type_hi = 0; qs->type_lo = (u_char) ctx->type;
 
-    /* IP query class */
+    /* IN query class */
     qs->class_hi = 0; qs->class_lo = 1;
 
     /* convert "www.example.com" to "\3www\7example\3com\0" */
@@ -1885,13 +1899,13 @@
 static ngx_int_t
 ngx_resolver_create_addr_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx)
 {
-    u_char                *p, *d;
-    size_t                 len;
-    ngx_int_t              n;
-    ngx_uint_t             ident;
-    ngx_resolver_query_t  *query;
+    u_char              *p, *d;
+    size_t               len;
+    ngx_int_t            n;
+    ngx_uint_t           ident;
+    ngx_resolver_hdr_t  *query;
 
-    len = sizeof(ngx_resolver_query_t)
+    len = sizeof(ngx_resolver_hdr_t)
           + sizeof(".255.255.255.255.in-addr.arpa.") - 1
           + sizeof(ngx_resolver_qs_t);
 
@@ -1901,7 +1915,7 @@
     }
 
     rn->query = p;
-    query = (ngx_resolver_query_t *) p;
+    query = (ngx_resolver_hdr_t *) p;
 
     ident = ngx_random();
 
@@ -1917,7 +1931,7 @@
     query->nns_hi = 0; query->nns_lo = 0;
     query->nar_hi = 0; query->nar_lo = 0;
 
-    p += sizeof(ngx_resolver_query_t);
+    p += sizeof(ngx_resolver_hdr_t);
 
     for (n = 0; n < 32; n += 8) {
         d = ngx_sprintf(&p[1], "%ud", (ctx->addr >> n) & 0xff);
@@ -1925,7 +1939,7 @@
         p = d;
     }
 
-    /* query type "PTR", IP query class */
+    /* query type "PTR", IN query class */
     ngx_memcpy(p, "\7in-addr\4arpa\0\0\14\0\1", 18);
 
     rn->qlen = (u_short)
