diff --git a/src/main-conf.c b/src/main-conf.c
index b938926d31714dd621df316ceeaf836e684d3003..a49b2a9e8928d9fac372f6dfb4b2fcc038f8822d 100644
--- a/src/main-conf.c
+++ b/src/main-conf.c
@@ -1048,7 +1048,7 @@ masscan_set_parameter(struct Masscan *masscan,
         struct RangeList ports;
         memset(&ports, 0, sizeof(ports));
 
-        rangelist_parse_ports(&ports, value, &is_error);
+        rangelist_parse_ports(&ports, value, &is_error, 0);
 
         /* Check if there was an error in parsing */
         if (is_error) {
@@ -1161,7 +1161,10 @@ masscan_set_parameter(struct Masscan *masscan,
              || EQUALS("destination-port", name)
              || EQUALS("target-port", name)) {
         unsigned is_error = 0;
-        rangelist_parse_ports(&masscan->ports, value, &is_error);
+        if (masscan->scan_type.udp)
+            rangelist_parse_ports(&masscan->ports, value, &is_error, Templ_UDP);
+        else
+            rangelist_parse_ports(&masscan->ports, value, &is_error, 0);
         if (masscan->op == 0)
             masscan->op = Operation_Scan;
     }
@@ -1182,7 +1185,7 @@ masscan_set_parameter(struct Masscan *masscan,
     }
     else if (EQUALS("exclude-ports", name) || EQUALS("exclude-port", name)) {
         unsigned is_error = 0;
-        rangelist_parse_ports(&masscan->exclude_port, value, &is_error);
+        rangelist_parse_ports(&masscan->exclude_port, value, &is_error, 0);
         if (is_error) {
             LOG(0, "FAIL: bad exclude port: %s\n", value);
             exit(1);
@@ -2179,7 +2182,7 @@ masscan_command_line(struct Masscan *masscan, int argc, char *argv[])
                         break;
                     case 'T': /* TCP connect scan */
                         fprintf(stderr, "nmap(%s): connect() is too synchronous for cool kids\n", argv[i]);
-                        fprintf(stderr, "WARNING: doing SYN scan anyway\n");
+                        fprintf(stderr, "WARNING: doing SYN scan (-sS) anyway, ignoring (-sT)\n");
                         break;
                     case 'U': /* UDP scan */
                         masscan->scan_type.udp = 1;
diff --git a/src/main.c b/src/main.c
index 198e9dd44e3409ace05acbcf99991acae89c3b3b..750a497f040c2e911389ebfc40395b78acf29240 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1068,7 +1068,7 @@ main_scan(struct Masscan *masscan)
         /* If no ports specified on command-line, grab default ports */
         is_error = 0;
         if (rangelist_count(&masscan->ports) == 0)
-            rangelist_parse_ports(&masscan->ports, script->ports, &is_error);
+            rangelist_parse_ports(&masscan->ports, script->ports, &is_error, 0);
         
         /* Kludge: change normal port range to script range */
         for (i=0; i<masscan->ports.count; i++) {
diff --git a/src/proto-dns.c b/src/proto-dns.c
index 52f253fe86dc333e0e344d60d475bb5f30993b47..572e675c562d93ae236236636cdb888d6754c7f5 100644
--- a/src/proto-dns.c
+++ b/src/proto-dns.c
@@ -363,6 +363,7 @@ handle_dns(struct Output *out, time_t timestamp,
     struct DNS_Incoming dns[1];
     unsigned offset;
     uint64_t seqno;
+    const char *reason = 0;
 
     ip_them = parsed->ip_src[0]<<24 | parsed->ip_src[1]<<16
             | parsed->ip_src[2]<< 8 | parsed->ip_src[3]<<0;
@@ -376,16 +377,47 @@ handle_dns(struct Output *out, time_t timestamp,
     if ((seqno & 0xFFFF) != dns->id)
         return 1;
 
+    /*
+     * In practice, DNS queries always have the query count set to 1,
+     * though in theory servers could support multiple queries in a 
+     * single request, almost none of them do
+     */
     if (dns->qr != 1)
         return 0;
-    if (dns->rcode != 0)
+    
+    /*
+     * If we get back NOERROR, we drop through and extract the strings in
+     * the packet. Otherwise, we report the error here.
+     */
+    switch (dns->rcode) {
+        case 0: reason = 0; break; /* NOERROR */
+        case 1: reason = "1:FORMERR"; break;
+        case 2: reason = "2:SERVFAIL"; break;
+        case 3: reason = "3:NXDOMAIN"; break;
+        case 4: reason = "4:NOTIMP"; break;
+        case 5: reason = "5:REFUSED"; break;
+        case 6: reason = "6:YXDOMAIN"; break;
+        case 7: reason = "7:XRRSET"; break;
+        case 8: reason = "8:NOTAUTH"; break;
+        case 9: reason = "9:NOTZONE"; break;
+    }
+    if (reason != 0) {
+        output_report_banner(
+                         out, timestamp,
+                         ip_them, 17, port_them,
+                         PROTO_DNS_VERSIONBIND,
+                         parsed->ip_ttl,
+                         (const unsigned char*)reason,
+                         (unsigned)strlen(reason));
         return 0;
-    if (dns->qdcount != 1)
+    }
+    
+    /*if (dns->qdcount != 1)
         return 0;
     if (dns->ancount < 1)
         return 0;
     if (dns->rr_count < 2)
-        return 0;
+        return 0;*/
 
 
     offset = dns->rr_offset[1];
diff --git a/src/ranges.c b/src/ranges.c
index 366d131a2adf6f072724acb5a14515a4e3e98105..df53fd36ac6e2f3d204d65c5108c61218ae11284 100644
--- a/src/ranges.c
+++ b/src/ranges.c
@@ -598,7 +598,7 @@ regress_pick2()
  * handle multiple stuff on the same line
  ***************************************************************************/
 const char *
-rangelist_parse_ports(struct RangeList *ports, const char *string, unsigned *is_error)
+rangelist_parse_ports(struct RangeList *ports, const char *string, unsigned *is_error, unsigned proto_offset)
 {
     char *p = (char*)string;
 
@@ -606,7 +606,6 @@ rangelist_parse_ports(struct RangeList *ports, const char *string, unsigned *is_
     while (*p) {
         unsigned port;
         unsigned end;
-        unsigned proto_offset = 0;
 
         /* skip whitespace */
         while (*p && isspace(*p & 0xFF))
@@ -791,7 +790,7 @@ ranges_selftest(void)
         unsigned is_error = 0;
         memset(task, 0, sizeof(task[0]));
 
-        rangelist_parse_ports(task, "80,1000-2000,1234,4444", &is_error);
+        rangelist_parse_ports(task, "80,1000-2000,1234,4444", &is_error, 0);
         if (task->count != 3 || is_error) {
             ERROR();
             return 1;
diff --git a/src/ranges.h b/src/ranges.h
index 884657015f834c406a0f3da2dac8885b61049a9b..7285fb289cdca3c28ac93e9fe2e0dbda098c2d74 100644
--- a/src/ranges.h
+++ b/src/ranges.h
@@ -161,7 +161,9 @@ unsigned rangelist_pick(const struct RangeList *targets, uint64_t i);
 const char *
 rangelist_parse_ports(  struct RangeList *ports,
                         const char *string,
-                        unsigned *is_error);
+                        unsigned *is_error,
+                        unsigned proto_offset
+                      );
 
 
 /**
diff --git a/src/templ-payloads.c b/src/templ-payloads.c
index a79db0df7e09470dea79e42e2438189b6374c411..e461e1ba4e6ee315ed8cf48287a9fd8a9ef7cb1f 100644
--- a/src/templ-payloads.c
+++ b/src/templ-payloads.c
@@ -618,7 +618,7 @@ payloads_read_file(FILE *fp, const char *filename,
         /* [ports] */
         if (!get_next_line(fp, &line_number, line, sizeof(line)))
             break;
-        p = rangelist_parse_ports(ports, line, &is_error);
+        p = rangelist_parse_ports(ports, line, &is_error, 0);
         if (is_error) {
             fprintf(stderr, "%s:%u: syntax error, expected ports\n",
                 filename, line_number);