diff -ru pdns-recursor-3.6.4/dnsparser.cc pdns-recursor-3.6.4-spuriourrs/dnsparser.cc
--- pdns-recursor-3.6.4/dnsparser.cc	2015-06-09 14:10:22.000000000 +0200
+++ pdns-recursor-3.6.4-spuriourrs/dnsparser.cc	2016-12-09 11:56:29.604155570 +0100
@@ -142,7 +142,7 @@
   memcpy(&packet[pos], &drh, sizeof(drh)); pos+=sizeof(drh);
   memcpy(&packet[pos], serialized.c_str(), serialized.size()); pos+=(uint16_t)serialized.size();
 
-  MOADNSParser mdp((char*)&*packet.begin(), (unsigned int)packet.size());
+  MOADNSParser mdp(false, (char*)&*packet.begin(), (unsigned int)packet.size());
   shared_ptr<DNSRecordContent> ret= mdp.d_answers.begin()->first.d_content;
   ret->header.d_type=ret->d_qtype;
   ret->label=mdp.d_answers.begin()->first.d_label;
@@ -217,7 +217,7 @@
   return zmakermap;
 }
 
-void MOADNSParser::init(const char *packet, unsigned int len)
+void MOADNSParser::init(bool query, const char *packet, unsigned int len)
 {
   if(len < sizeof(dnsheader))
     throw MOADNSException("Packet shorter than minimal header");
@@ -231,6 +231,9 @@
   d_header.ancount=ntohs(d_header.ancount);
   d_header.nscount=ntohs(d_header.nscount);
   d_header.arcount=ntohs(d_header.arcount);
+
+  if (query && (d_header.qdcount > 1))
+    throw MOADNSException("Query with QD > 1 ("+lexical_cast<string>(d_header.qdcount)+")");
   
   uint16_t contentlen=len-sizeof(dnsheader);
 
@@ -275,7 +278,13 @@
       dr.d_label=label;
       dr.d_clen=ah.d_clen;
 
-      dr.d_content=boost::shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(dr, pr, d_header.opcode));
+      if (query && (dr.d_place == DNSRecord::Answer || dr.d_place == DNSRecord::Nameserver || (dr.d_type != QType::OPT && dr.d_type != QType::TSIG && dr.d_type != QType::SIG) || ((dr.d_type == QType::TSIG || dr.d_type == QType::SIG) && dr.d_class != 0xff))) {
+        dr.d_content=boost::shared_ptr<DNSRecordContent>(new UnknownRecordContent(dr, pr));
+      }
+      else {
+        dr.d_content=boost::shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(dr, pr, d_header.opcode));
+      }
+
       d_answers.push_back(make_pair(dr, pr.d_pos));
 
       if(dr.d_type == QType::TSIG && dr.d_class == 0xff) 
diff -ru pdns-recursor-3.6.4/dnsparser.hh pdns-recursor-3.6.4-spuriourrs/dnsparser.hh
--- pdns-recursor-3.6.4/dnsparser.hh	2015-06-09 14:10:22.000000000 +0200
+++ pdns-recursor-3.6.4-spuriourrs/dnsparser.hh	2016-12-09 11:54:14.029131314 +0100
@@ -306,15 +306,15 @@
 {
 public:
   //! Parse from a string
-  MOADNSParser(const string& buffer)  : d_tsigPos(0)
+  MOADNSParser(bool query, const string& buffer)  : d_tsigPos(0)
   {
-    init(buffer.c_str(), (unsigned int)buffer.size());
+    init(query, buffer.c_str(), (unsigned int)buffer.size());
   }
 
   //! Parse from a pointer and length
-  MOADNSParser(const char *packet, unsigned int len) : d_tsigPos(0)
+  MOADNSParser(bool query, const char *packet, unsigned int len) : d_tsigPos(0)
   {
-    init(packet, len);
+    init(query, packet, len);
   }
 
   dnsheader d_header;
@@ -340,7 +340,7 @@
   }
 private:
   void getDnsrecordheader(struct dnsrecordheader &ah);
-  void init(const char *packet, unsigned int len);
+  void init(bool query, const char *packet, unsigned int len);
   vector<uint8_t> d_content;
   uint16_t d_tsigPos;
 };
diff -ru pdns-recursor-3.6.4/lwres.cc pdns-recursor-3.6.4-spuriourrs/lwres.cc
--- pdns-recursor-3.6.4/lwres.cc	2015-06-09 14:10:22.000000000 +0200
+++ pdns-recursor-3.6.4-spuriourrs/lwres.cc	2016-12-09 11:54:27.325637269 +0100
@@ -157,7 +157,7 @@
   lwr->d_result.clear();
   try {
     lwr->d_tcbit=0;
-    MOADNSParser mdp((const char*)buf.get(), len);
+    MOADNSParser mdp(false, (const char*)buf.get(), len);
     lwr->d_aabit=mdp.d_header.aa;
     lwr->d_tcbit=mdp.d_header.tc;
     lwr->d_rcode=mdp.d_header.rcode;
diff -ru pdns-recursor-3.6.4/pdns_recursor.cc pdns-recursor-3.6.4-spuriourrs/pdns_recursor.cc
--- pdns-recursor-3.6.4/pdns_recursor.cc	2015-06-09 14:10:22.000000000 +0200
+++ pdns-recursor-3.6.4-spuriourrs/pdns_recursor.cc	2016-12-09 11:51:37.521015710 +0100
@@ -130,7 +130,7 @@
 
 //! used to send information to a newborn mthread
 struct DNSComboWriter {
-  DNSComboWriter(const char* data, uint16_t len, const struct timeval& now) : d_mdp(data, len), d_now(now), 
+  DNSComboWriter(const char* data, uint16_t len, const struct timeval& now) : d_mdp(true, data, len), d_now(now), 
                                                                                                         d_tcp(false), d_socket(-1)
   {}
   MOADNSParser d_mdp;
