diff -Naurd mutt-cvs/PATCHES mutt-new/PATCHES
--- mutt-cvs/PATCHES	2002-12-09 17:44:54.000000000 +0000
+++ mutt-new/PATCHES	2006-08-13 11:13:26.000000000 +0000
@@ -0,0 +1 @@
+patch-1.5.12cvs.ats.parent_match.vl.1
diff -Naurd mutt-cvs/doc/manual.xml.head mutt-new/doc/manual.xml.head
--- mutt-cvs/doc/manual.xml.head	2006-08-13 00:17:09.000000000 +0000
+++ mutt-new/doc/manual.xml.head	2006-08-13 11:11:12.000000000 +0000
@@ -5233,6 +5233,12 @@
 </variablelist>
 </para>
 
+<para>
+Normally patterns are compared with the message that is being created.
+If you want a pattern to match against a message that you are replying to,
+you can prefix the pattern with &lt;.
+</para>
+
 </sect3>
 
 <sect3>
diff -Naurd mutt-cvs/mutt.h mutt-new/mutt.h
--- mutt-cvs/mutt.h	2006-08-13 00:17:03.000000000 +0000
+++ mutt-new/mutt.h	2006-08-13 11:11:12.000000000 +0000
@@ -819,6 +819,7 @@
   unsigned int alladdr : 1;
   unsigned int stringmatch : 1;
   unsigned int groupmatch : 1;
+  unsigned int parent : 1;
   int min;
   int max;
   struct pattern_t *next;
diff -Naurd mutt-cvs/pattern.c mutt-new/pattern.c
--- mutt-cvs/pattern.c	2006-08-13 00:17:03.000000000 +0000
+++ mutt-new/pattern.c	2006-08-13 11:12:46.000000000 +0000
@@ -769,6 +769,7 @@
   pattern_t *last = NULL;
   int not = 0;
   int alladdr = 0;
+  int parent = 0;
   int or = 0;
   int implicit = 1;	/* used to detect logical AND operator */
   struct pattern_flags *entry;
@@ -789,6 +790,10 @@
 	ps.dptr++;
 	alladdr = !alladdr;
 	break;
+      case '<':
+	ps.dptr++;
+	parent = !parent;
+	break;
       case '!':
 	ps.dptr++;
 	not = !not;
@@ -818,6 +823,7 @@
 	implicit = 0;
 	not = 0;
 	alladdr = 0;
+	parent = 0;
 	break;
       case '%':
       case '=':
@@ -872,8 +878,10 @@
 	tmp->alladdr = alladdr;
         tmp->stringmatch = (*ps.dptr == '=') ? 1 : 0;
         tmp->groupmatch  = (*ps.dptr == '%') ? 1 : 0;
+	tmp->parent = parent;
 	not = 0;
 	alladdr = 0;
+	parent = 0;
 
 	if (last)
 	  last->next = tmp;
@@ -939,8 +947,10 @@
 	last = tmp;
 	tmp->not ^= not;
 	tmp->alladdr |= alladdr;
+	tmp->parent |= parent;
 	not = 0;
 	alladdr = 0;
+	parent = 0;
 	ps.dptr = p + 1; /* restore location */
 	break;
       default:
@@ -1081,14 +1091,26 @@
 int
 mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, HEADER *h)
 {
+  HEADER *cur_head;
+
+  cur_head = h;
+
+  if (pat->parent)
+  {
+    if (h->thread && h->thread->parent && h->thread->parent->message )
+      h = h->thread->parent->message;
+    else
+      return pat->not;
+  }
+
   switch (pat->op)
   {
     case M_AND:
-      return (pat->not ^ (perform_and (pat->child, flags, ctx, h) > 0));
+      return (pat->not ^ (perform_and (pat->child, flags, ctx, cur_head) > 0));
     case M_OR:
-      return (pat->not ^ (perform_or (pat->child, flags, ctx, h) > 0));
+      return (pat->not ^ (perform_or (pat->child, flags, ctx, cur_head) > 0));
     case M_THREAD:
-      return (pat->not ^ match_threadcomplete(pat->child, flags, ctx, h->thread, 1, 1, 1, 1));
+      return (pat->not ^ match_threadcomplete(pat->child, flags, ctx, cur_head->thread, 1, 1, 1, 1));
     case M_ALL:
       return (!pat->not);
     case M_EXPIRED:
diff -Naurd mutt-cvs/send.c mutt-new/send.c
--- mutt-cvs/send.c	2006-01-30 16:22:52.000000000 +0000
+++ mutt-new/send.c	2006-08-13 11:11:12.000000000 +0000
@@ -1172,6 +1172,13 @@
     }
   }
 
+  /* set parent, for use by < flag in send-hooks */
+  if (cur && !(flags & (SENDPOSTPONED|SENDRESEND)))
+  {
+    msg->thread = safe_calloc (1, sizeof (THREAD));
+    msg->thread->parent = cur->thread;
+  }
+
   /* this is handled here so that the user can match ~f in send-hook */
   if (cur && option (OPTREVNAME) && !(flags & (SENDPOSTPONED|SENDRESEND)))
   {
