diff -u mutt-1.5.20-trashfolder/OPS mutt-1.5.20-trash+purge/OPS
--- mutt-1.5.20-trashfolder/OPS	2009-05-12 22:01:13.000000000 -0700
+++ mutt-1.5.20-trash+purge/OPS	2009-09-06 06:58:12.000000000 -0700
@@ -141,6 +141,7 @@
 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"
Common subdirectories: mutt-1.5.20-trashfolder/contrib and mutt-1.5.20-trash+purge/contrib
diff -u mutt-1.5.20-trashfolder/curs_main.c mutt-1.5.20-trash+purge/curs_main.c
--- mutt-1.5.20-trashfolder/curs_main.c	2009-06-13 19:48:36.000000000 -0700
+++ mutt-1.5.20-trash+purge/curs_main.c	2009-09-06 07:09:07.000000000 -0700
@@ -1803,6 +1803,7 @@
 	MAYBE_REDRAW (menu->redraw);
 	break;
 
+      case OP_PURGE_MESSAGE:
       case OP_DELETE:
 
 	CHECK_MSGCOUNT;
@@ -1813,6 +1814,7 @@
 	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;
@@ -1820,6 +1822,8 @@
 	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))
@@ -2116,11 +2120,13 @@
 	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++;
@@ -2141,9 +2147,11 @@
 	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))
 	  {
Common subdirectories: mutt-1.5.20-trashfolder/doc and mutt-1.5.20-trash+purge/doc
diff -u mutt-1.5.20-trashfolder/flags.c mutt-1.5.20-trash+purge/flags.c
--- mutt-1.5.20-trashfolder/flags.c	2009-09-06 06:54:10.000000000 -0700
+++ mutt-1.5.20-trash+purge/flags.c	2009-09-06 07:11:28.000000000 -0700
@@ -104,6 +104,16 @@
       }
       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 -u mutt-1.5.20-trashfolder/functions.h mutt-1.5.20-trash+purge/functions.h
--- mutt-1.5.20-trashfolder/functions.h	2009-04-29 22:36:17.000000000 -0700
+++ mutt-1.5.20-trash+purge/functions.h	2009-09-06 07:13:40.000000000 -0700
@@ -120,6 +120,7 @@
   { "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" },
@@ -209,6 +210,7 @@
   { "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" },
Common subdirectories: mutt-1.5.20-trashfolder/imap and mutt-1.5.20-trash+purge/imap
Common subdirectories: mutt-1.5.20-trashfolder/intl and mutt-1.5.20-trash+purge/intl
Common subdirectories: mutt-1.5.20-trashfolder/m4 and mutt-1.5.20-trash+purge/m4
diff -u mutt-1.5.20-trashfolder/mutt.h mutt-1.5.20-trash+purge/mutt.h
--- mutt-1.5.20-trashfolder/mutt.h	2009-09-06 06:54:10.000000000 -0700
+++ mutt-1.5.20-trash+purge/mutt.h	2009-09-06 07:15:06.000000000 -0700
@@ -188,6 +188,7 @@
   M_UNDELETE,
   M_DELETED,
   M_APPENDED,
+  M_PURGED,
   M_FLAG,
   M_TAG,
   M_UNTAG,
@@ -704,6 +705,7 @@
   unsigned int tagged : 1;
   unsigned int deleted : 1;
   unsigned int appended : 1;            /* has been saved */
+  unsigned int purged : 1;		/* bypassing the trash folder */
   unsigned int changed : 1;
   unsigned int attach_del : 1; 		/* has an attachment marked for deletion */
   unsigned int old : 1;
diff -u mutt-1.5.20-trashfolder/mx.c mutt-1.5.20-trash+purge/mx.c
--- mutt-1.5.20-trashfolder/mx.c	2009-09-06 06:54:10.000000000 -0700
+++ mutt-1.5.20-trash+purge/mx.c	2009-09-06 07:17:46.000000000 -0700
@@ -803,6 +803,7 @@
     {
       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 -u mutt-1.5.20-trashfolder/pager.c mutt-1.5.20-trash+purge/pager.c
--- mutt-1.5.20-trashfolder/pager.c	2009-06-03 13:48:31.000000000 -0700
+++ mutt-1.5.20-trash+purge/pager.c	2009-09-06 07:23:05.000000000 -0700
@@ -2309,12 +2309,15 @@
 	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;
@@ -2641,6 +2644,7 @@
 	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))
 	{
@@ -2656,9 +2660,11 @@
 	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 -u mutt-1.5.20-trashfolder/pattern.c mutt-1.5.20-trash+purge/pattern.c
--- mutt-1.5.20-trashfolder/pattern.c	2009-06-03 13:48:31.000000000 -0700
+++ mutt-1.5.20-trash+purge/pattern.c	2009-09-06 07:25:36.000000000 -0700
@@ -1347,8 +1347,10 @@
       {
 	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;
Common subdirectories: mutt-1.5.20-trashfolder/po and mutt-1.5.20-trash+purge/po
