--- a/query.c
+++ b/query.c
@@ -193,6 +193,7 @@ static int doit(struct query *z,int stat
   int k;
   int p;
   int q;
+  uint32 cachettl;
 
   errno = error_io;
   if (state == 1) goto HAVEPACKET;
@@ -470,6 +471,7 @@ static int doit(struct query *z,int stat
   rcode = header[3] & 15;
   if (rcode && (rcode != 3)) goto DIE; /* impossible; see irrelevant() */
 
+  cachettl = 0;
   flagout = 0;
   flagcname = 0;
   flagreferral = 0;
@@ -512,6 +514,11 @@ static int doit(struct query *z,int stat
 
     uint16_unpack_big(header + 8,&datalen);
     pos += datalen;
+
+    if (flagsoa && (pos <= len)) {
+      cachettl = ttlget(buf + pos - 4);
+      if (soattl < cachettl) cachettl = soattl;
+    }
   }
   posglue = pos;
 
@@ -689,8 +696,8 @@ static int doit(struct query *z,int stat
   }
 
   if (rcode == 3) {
-    log_nxdomain(whichserver,d,soattl);
-    cachegeneric(DNS_T_ANY,d,"",0,soattl);
+    log_nxdomain(whichserver,d,cachettl);
+    cachegeneric(DNS_T_ANY,d,"",0,cachettl);
 
     NXDOMAIN:
     if (z->level) goto LOWERLEVEL;