diff -pruN mutt-1.5.17/OPS mutt-1.5.17-purge/OPS
--- mutt-1.5.17/OPS	2007-05-07 14:46:12.000000000 -0400
+++ mutt-1.5.17-purge/OPS	2007-12-21 19:52:37.000000000 -0500
@@ -141,6 +141,7 @@ OP_PREV_ENTRY "move to the previous entr
 OP_PREV_LINE "scroll up one line"
 OP_PREV_PAGE "move to the previous page"
 OP_PRINT "print the current entry"
+OP_PURGE_MESSAGE "really delete the current entry, bypassing the trash folder"
 OP_QUERY "query external program for addresses"
 OP_QUERY_APPEND "append new query results to current results"
 OP_QUIT "save changes to mailbox and quit"
diff -pruN mutt-1.5.17/PATCHES mutt-1.5.17-purge/PATCHES
--- mutt-1.5.17/PATCHES	2007-12-21 19:45:26.000000000 -0500
+++ mutt-1.5.17-purge/PATCHES	2007-12-21 19:52:37.000000000 -0500
@@ -1 +1,2 @@
 patch-1.5.16hg.cd.trash_folder.vl.1
+patch-1.5.17.cd.purge_message.bk.1
diff -pruN mutt-1.5.17/curs_main.c mutt-1.5.17-purge/curs_main.c
--- mutt-1.5.17/curs_main.c	2007-05-28 19:19:50.000000000 -0400
+++ mutt-1.5.17-purge/curs_main.c	2007-12-21 19:52:37.000000000 -0500
@@ -1799,6 +1799,7 @@ int mutt_index_menu (void)
 	MAYBE_REDRAW (menu->redraw);
 	break;
 
+      case OP_PURGE_MESSAGE:
       case OP_DELETE:
 
 	CHECK_MSGCOUNT;
@@ -1809,6 +1810,7 @@ int mutt_index_menu (void)
 	if (tag)
 	{
 	  mutt_tag_set_flag (M_DELETE, 1);
+	  mutt_tag_set_flag (M_PURGED, (op != OP_PURGE_MESSAGE) ? 0 : 1);
 	  if (option (OPTDELETEUNTAG))
 	    mutt_tag_set_flag (M_TAG, 0);
 	  menu->redraw = REDRAW_INDEX;
@@ -1816,6 +1818,8 @@ int mutt_index_menu (void)
 	else
 	{
 	  mutt_set_flag (Context, CURHDR, M_DELETE, 1);
+	  mutt_set_flag (Context, CURHDR, M_PURGED,
+			 (op != OP_PURGE_MESSAGE) ? 0 : 1);
 	  if (option (OPTDELETEUNTAG))
 	    mutt_set_flag (Context, CURHDR, M_TAG, 0);
 	  if (option (OPTRESOLVE))
@@ -2112,11 +2116,13 @@ int mutt_index_menu (void)
 	if (tag)
 	{
 	  mutt_tag_set_flag (M_DELETE, 0);
+	  mutt_tag_set_flag (M_PURGED, 0);
 	  menu->redraw = REDRAW_INDEX;
 	}
 	else
 	{
 	  mutt_set_flag (Context, CURHDR, M_DELETE, 0);
+	  mutt_set_flag (Context, CURHDR, M_PURGED, 0);
 	  if (option (OPTRESOLVE) && menu->current < Context->vcount - 1)
 	  {
 	    menu->current++;
@@ -2137,9 +2143,11 @@ int mutt_index_menu (void)
 	CHECK_ACL(M_ACL_DELETE, _("undelete message(s)"));
 
 	rc = mutt_thread_set_flag (CURHDR, M_DELETE, 0,
-				   op == OP_UNDELETE_THREAD ? 0 : 1);
+				   op == OP_UNDELETE_THREAD ? 0 : 1)
+	  + mutt_thread_set_flag (CURHDR, M_PURGED, 0,
+				  op == OP_UNDELETE_THREAD ? 0 : 1);
 
-	if (rc != -1)
+	if (rc > -1)
 	{
 	  if (option (OPTRESOLVE))
 	  {
diff -pruN mutt-1.5.17/flags.c mutt-1.5.17-purge/flags.c
--- mutt-1.5.17/flags.c	2007-12-21 19:45:26.000000000 -0500
+++ mutt-1.5.17-purge/flags.c	2007-12-21 19:52:37.000000000 -0500
@@ -108,6 +108,16 @@ void _mutt_set_flag (CONTEXT *ctx, HEADE
       }
       break;
 
+    case M_PURGED:
+      if (bf)
+      {
+	if (!h->purged)
+	  h->purged = 1;
+      }
+      else if (h->purged)
+	h->purged = 0;
+      break;
+
     case M_NEW:
 
       if (!mutt_bit_isset(ctx->rights,M_ACL_SEEN))
diff -pruN mutt-1.5.17/functions.h mutt-1.5.17-purge/functions.h
--- mutt-1.5.17/functions.h	2007-05-07 14:45:34.000000000 -0400
+++ mutt-1.5.17-purge/functions.h	2007-12-21 19:52:37.000000000 -0500
@@ -120,6 +120,7 @@ struct binding_t OpMain[] = { /* map: in
   { "toggle-write",		OP_TOGGLE_WRITE,		"%" },
   { "next-thread",		OP_MAIN_NEXT_THREAD,		"\016" },
   { "next-subthread",		OP_MAIN_NEXT_SUBTHREAD,		"\033n" },
+  { "purge-message",		OP_PURGE_MESSAGE,		NULL },
   { "query",			OP_QUERY,			"Q" },
   { "quit",			OP_QUIT,			"q" },
   { "reply",			OP_REPLY,			"r" },
@@ -207,6 +208,7 @@ struct binding_t OpPager[] = { /* map: p
   { "print-message",	OP_PRINT,			"p" },
   { "previous-thread",	OP_MAIN_PREV_THREAD,		"\020" },
   { "previous-subthread",OP_MAIN_PREV_SUBTHREAD,	"\033p" },
+  { "purge-message",	OP_PURGE_MESSAGE,		NULL },
   { "quit",		OP_QUIT,			"Q" },
   { "exit",		OP_EXIT,			"q" },
   { "reply",		OP_REPLY,			"r" },
diff -pruN mutt-1.5.17/mutt.h mutt-1.5.17-purge/mutt.h
--- mutt-1.5.17/mutt.h	2007-12-21 19:45:26.000000000 -0500
+++ mutt-1.5.17-purge/mutt.h	2007-12-21 19:52:37.000000000 -0500
@@ -202,6 +202,7 @@ enum
   M_UNDELETE,
   M_DELETED,
   M_APPENDED,
+  M_PURGED,
   M_FLAG,
   M_TAG,
   M_UNTAG,
@@ -713,6 +714,7 @@ typedef struct header
   unsigned int flagged : 1; 		/* marked important? */
   unsigned int tagged : 1;
   unsigned int appended : 1; /* has been saved */
+  unsigned int purged : 1;   /* bypassing the trash folder */
   unsigned int deleted : 1;
   unsigned int changed : 1;
   unsigned int attach_del : 1; 		/* has an attachment marked for deletion */
diff -pruN mutt-1.5.17/mx.c mutt-1.5.17-purge/mx.c
--- mutt-1.5.17/mx.c	2007-12-21 19:45:26.000000000 -0500
+++ mutt-1.5.17-purge/mx.c	2007-12-21 19:53:07.000000000 -0500
@@ -833,6 +833,7 @@ static int trash_append (CONTEXT *ctx)
     {
       for (i = 0 ; i < ctx->msgcount ; i++)
        if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->appended
+           && !ctx->hdrs[i]->purged
            && mutt_append_message (ctx_trash, ctx, ctx->hdrs[i], 0, 0) == -1)
          {
            mx_close_mailbox (ctx_trash, NULL);
diff -pruN mutt-1.5.17/pager.c mutt-1.5.17-purge/pager.c
--- mutt-1.5.17/pager.c	2007-09-05 14:28:05.000000000 -0400
+++ mutt-1.5.17-purge/pager.c	2007-12-21 19:52:37.000000000 -0500
@@ -2256,12 +2256,15 @@ search_next:
 	MAYBE_REDRAW (redraw);
 	break;
 
+      case OP_PURGE_MESSAGE:
       case OP_DELETE:
 	CHECK_MODE(IsHeader (extra));
 	CHECK_READONLY;
 	CHECK_ACL(M_ACL_DELETE, _("delete message"));
 
 	mutt_set_flag (Context, extra->hdr, M_DELETE, 1);
+	mutt_set_flag (Context, extra->hdr, M_PURGED,
+		       ch != OP_PURGE_MESSAGE ? 0 : 1);
         if (option (OPTDELETEUNTAG))
 	  mutt_set_flag (Context, extra->hdr, M_TAG, 0);
 	redraw = REDRAW_STATUS | REDRAW_INDEX;
@@ -2574,6 +2577,7 @@ search_next:
 	CHECK_ACL(M_ACL_DELETE, _("undelete message"));
 
 	mutt_set_flag (Context, extra->hdr, M_DELETE, 0);
+	mutt_set_flag (Context, extra->hdr, M_PURGED, 0);
 	redraw = REDRAW_STATUS | REDRAW_INDEX;
 	if (option (OPTRESOLVE))
 	{
@@ -2589,9 +2593,11 @@ search_next:
 	CHECK_ACL(M_ACL_DELETE, _("undelete message(s)"));
 
 	r = mutt_thread_set_flag (extra->hdr, M_DELETE, 0,
+				  ch == OP_UNDELETE_THREAD ? 0 : 1)
+	  + mutt_thread_set_flag (extra->hdr, M_PURGED, 0,
 				  ch == OP_UNDELETE_THREAD ? 0 : 1);
 
-	if (r != -1)
+	if (r > -1)
 	{
 	  if (option (OPTRESOLVE))
 	  {
diff -pruN mutt-1.5.17/pattern.c mutt-1.5.17-purge/pattern.c
--- mutt-1.5.17/pattern.c	2007-09-05 14:28:05.000000000 -0400
+++ mutt-1.5.17-purge/pattern.c	2007-12-21 19:52:37.000000000 -0500
@@ -1344,8 +1344,10 @@ int mutt_pattern_func (int op, char *pro
       {
 	switch (op)
 	{
-	  case M_DELETE:
 	  case M_UNDELETE:
+	    mutt_set_flag (Context, Context->hdrs[Context->v2r[i]], M_PURGED,
+			   0);
+	  case M_DELETE:
 	    mutt_set_flag (Context, Context->hdrs[Context->v2r[i]], M_DELETE, 
 			  (op == M_DELETE));
 	    break;
