diff --git a/include/class.mailfetch.php b/include/class.mailfetch.php
index efbe8f2f0511bf1467f547e89bd36a5545bbefd1..73d07a6f90114829a96f8951120d0af11712c026 100644
--- a/include/class.mailfetch.php
+++ b/include/class.mailfetch.php
@@ -584,8 +584,10 @@ class MailFetcher {
             // Fetch deliver status report
             $vars['message'] = $this->getDeliveryStatusMessage($mid);
             $vars['thread-type'] = 'N';
+            $vars['flags']['bounce'] = true;
         }
         else {
+            $vars['flags']['bounce'] = TicketFilter::isBounce($info);
             $vars['message']=Format::stripEmptyLines($this->getBody($mid));
         }
 
diff --git a/include/class.mailparse.php b/include/class.mailparse.php
index 37f9b3bf2779869d565d6bccd946eb8fb9e685cc..c240d4efb06ad8a7cd7aed7ce1859696012216b8 100644
--- a/include/class.mailparse.php
+++ b/include/class.mailparse.php
@@ -532,12 +532,14 @@ class EmailDataParser {
             // Fetch deliver status report
             $data['message'] = $parser->getDeliveryStatusMessage();
             $data['thread-type'] = 'N';
+            $data['flags']['bounce'] = true;
         }
         else {
             // Typical email
             $data['message'] = Format::stripEmptyLines($parser->getBody());
             $data['in-reply-to'] = $parser->struct->headers['in-reply-to'];
             $data['references'] = $parser->struct->headers['references'];
+            $data['flags']['bounce'] = TicketFilter::isBounce($data['header']);
         }
 
         $data['subject'] = $parser->getSubject();
diff --git a/include/class.thread.php b/include/class.thread.php
index 8a1f42ecf0ccce1ef02528dff661e7321900ce4c..41d7730ba16104f458e9f6abc199523827e34aa0 100644
--- a/include/class.thread.php
+++ b/include/class.thread.php
@@ -240,7 +240,7 @@ Class ThreadEntry {
         if(!$id && !($id=$this->getId()))
             return false;
 
-        $sql='SELECT thread.*, info.email_mid '
+        $sql='SELECT thread.*, info.email_mid, info.headers '
             .' ,count(DISTINCT attach.attach_id) as attachments '
             .' FROM '.TICKET_THREAD_TABLE.' thread '
             .' LEFT JOIN '.TICKET_EMAIL_INFO_TABLE.' info
@@ -333,21 +333,21 @@ Class ThreadEntry {
         return $this->ht['email_mid'];
     }
 
-    function getEmailHeaders() {
+    function getEmailHeaderArray() {
         require_once(INCLUDE_DIR.'class.mailparse.php');
 
-        $sql = 'SELECT headers FROM '.TICKET_EMAIL_INFO_TABLE
-            .' WHERE message_id='.$this->getId();
-        $headers = db_result(db_query($sql));
-        return Mail_Parse::splitHeaders($headers);
+        if (!isset($this->ht['@headers']))
+            $this->ht['@headers'] = Mail_Parse::splitHeaders($this->ht['headers']);
+
+        return $this->ht['@headers'];
     }
 
     function getEmailReferences() {
         if (!isset($this->_references)) {
-            $this->_references = $this->getEmailMessageId();
-            $headers = self::getEmailHeaders();
-            if (isset($headers['References']))
-                $this->_references .= " ".$headers['References'];
+            $headers = self::getEmailHeaderArray();
+            if (isset($headers['References']) && $headers['References'])
+                $this->_references = $headers['References']." ";
+            $this->_references .= $this->getEmailMessageId();
         }
         return $this->_references;
     }
@@ -379,8 +379,8 @@ Class ThreadEntry {
     function isAutoReply() {
 
         if (!isset($this->is_autoreply))
-            $this->is_autoreply = $this->getEmailHeader()
-                ?  TicketFilter::isAutoReply($this->getEmailHeader()) : false;
+            $this->is_autoreply = $this->getEmailHeaderArray()
+                ?  TicketFilter::isAutoReply($this->getEmailHeaderArray()) : false;
 
         return $this->is_autoreply;
     }
@@ -388,8 +388,8 @@ Class ThreadEntry {
     function isBounce() {
 
         if (!isset($this->is_bounce))
-            $this->is_bounce = $this->getEmailHeader()
-                ? TicketFilter::isBounce($this->getEmailHeader()) : false;
+            $this->is_bounce = $this->getEmailHeaderArray()
+                ? TicketFilter::isBounce($this->getEmailHeaderArray()) : false;
 
         return $this->is_bounce;
     }
diff --git a/include/class.ticket.php b/include/class.ticket.php
index 8894b817fb6ffe3bae3a067b3d2c00722237c3d3..3a6b7586c55368600a5e2448aa8fe46b657917dd 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -1375,9 +1375,10 @@ class Ticket {
 
         if(!$alerts) return $message; //Our work is done...
 
-        $autorespond = true;
-        if ($autorespond && $message->isBounceOrAutoReply())
-            $autorespond=false;
+        // Do not auto-respond to bounces and other auto-replies
+        $autorespond = isset($vars['flags']) ? !$vars['flags']['bounce'] : true;
+        if ($autorespond && $message->isAutoReply())
+            $autorespond = false;
 
         $this->onMessage($autorespond, $message); //must be called b4 sending alerts to staff.
 
@@ -1605,6 +1606,10 @@ class Ticket {
         if(!($note=$this->getThread()->addNote($vars, $errors)))
             return null;
 
+        if (isset($vars['flags']) && $vars['flags']['bounce'])
+            // No alerts for bounce emails
+            $alert = false;
+
         //Set state: Error on state change not critical!
         if(isset($vars['state']) && $vars['state']) {
             if($this->setState($vars['state']))
@@ -2174,6 +2179,8 @@ class Ticket {
 
         # Messages that are clearly auto-responses from email systems should
         # not have a return 'ping' message
+        if (isset($vars['flags']) && $vars['flags']['bounce'])
+            $autorespond = false;
         if ($autorespond && $message->isAutoReply())
             $autorespond = false;