--- /dev/null
+diff -pruN2 mutt-1.3.27.orig/commands.c mutt-1.3.27/commands.c
+--- mutt-1.3.27.orig/commands.c Mon Dec 3 11:17:57 2001
++++ mutt-1.3.27/commands.c Wed Jan 23 22:33:11 2002
+@@ -616,9 +616,13 @@ void _mutt_save_message (HEADER *h, CONT
+ mutt_parse_mime_message (Context, h);
+
+- if (mutt_append_message (ctx, Context, h, cmflags, chflags) == 0 && delete)
++ if (mutt_append_message (ctx, Context, h, cmflags, chflags) == 0)
+ {
+- mutt_set_flag (Context, h, M_DELETE, 1);
+- if (option (OPTDELETEUNTAG))
+- mutt_set_flag (Context, h, M_TAG, 0);
++ if (delete)
++ {
++ mutt_set_flag (Context, h, M_DELETE, 1);
++ if (option (OPTDELETEUNTAG))
++ mutt_set_flag (Context, h, M_TAG, 0);
++ }
++ mutt_set_flag (Context, h, M_APPENDED, 1);
+ }
+ }
+diff -pruN2 mutt-1.3.27.orig/flags.c mutt-1.3.27/flags.c
+--- mutt-1.3.27.orig/flags.c Tue Jan 15 22:12:59 2002
++++ mutt-1.3.27/flags.c Wed Jan 23 22:33:11 2002
+@@ -76,4 +76,15 @@ void _mutt_set_flag (CONTEXT *ctx, HEADE
+ break;
+
++ case M_APPENDED:
++ if (bf)
++ {
++ if (!h->appended)
++ {
++ h->appended = 1;
++ if (upd_ctx) ctx->appended++;
++ }
++ }
++ break;
++
+ case M_NEW:
+ if (bf)
+diff -pruN2 mutt-1.3.27.orig/globals.h mutt-1.3.27/globals.h
+--- mutt-1.3.27.orig/globals.h Thu Jan 3 21:56:46 2002
++++ mutt-1.3.27/globals.h Wed Jan 23 22:33:11 2002
+@@ -110,4 +110,5 @@ WHERE char *Status;
+ WHERE char *Tempdir;
+ WHERE char *Tochars;
++WHERE char *TrashPath;
+ WHERE char *Username;
+ WHERE char *Visual;
+diff -pruN2 mutt-1.3.27.orig/init.h mutt-1.3.27/init.h
+--- mutt-1.3.27.orig/init.h Mon Dec 10 11:09:03 2001
++++ mutt-1.3.27/init.h Wed Jan 23 22:33:11 2002
+@@ -2236,4 +2236,11 @@ struct option_t MuttVars[] = {
+ ** was sent to a mailing-list you subscribe to (default: L).
+ */
++ { "trash", DT_PATH, R_NONE, UL &TrashPath, 0 },
++ /*
++ ** .pp
++ ** If set, this variable specifies the path of the trash folder where the
++ ** mails marked for deletion will be moved, instead of being irremediably
++ ** purged.
++ */
+ #ifdef USE_SOCKET
+ { "tunnel", DT_STR, R_NONE, UL &Tunnel, UL 0 },
+diff -pruN2 mutt-1.3.27.orig/mutt.h mutt-1.3.27/mutt.h
+--- mutt-1.3.27.orig/mutt.h Tue Jan 15 22:00:32 2002
++++ mutt-1.3.27/mutt.h Wed Jan 23 22:33:11 2002
+@@ -185,4 +185,5 @@ enum
+ M_UNDELETE,
+ M_DELETED,
++ M_APPENDED,
+ M_FLAG,
+ M_TAG,
+@@ -618,4 +619,5 @@ typedef struct header
+ unsigned int flagged : 1; /* marked important? */
+ unsigned int tagged : 1;
++ unsigned int appended : 1; /* has been saved */
+ unsigned int deleted : 1;
+ unsigned int changed : 1;
+@@ -740,4 +742,5 @@ typedef struct
+ int unread; /* how many unread messages? */
+ int deleted; /* how many deleted messages */
++ int appended; /* how many saved messages? */
+ int flagged; /* how many flagged messages */
+ int msgnotreadyet; /* which msg "new" in pager, -1 if none */
+diff -pruN2 mutt-1.3.27.orig/mx.c mutt-1.3.27/mx.c
+--- mutt-1.3.27.orig/mx.c Tue Jan 15 22:09:53 2002
++++ mutt-1.3.27/mx.c Wed Jan 23 22:33:11 2002
+@@ -816,4 +816,45 @@ static int sync_mailbox (CONTEXT *ctx, i
+ }
+
++/* move deleted mails to the trash folder */
++static int trash_append (CONTEXT *ctx)
++{
++ CONTEXT *ctx_trash;
++ int i;
++ struct stat st, stc;
++
++ if (!TrashPath || !ctx->deleted)
++ return 0;
++
++ if (!mutt_save_confirm (TrashPath, &st))
++ {
++ mutt_error _("message(s) not deleted");
++ return -1;
++ }
++
++ if (lstat (ctx->path, &stc) == 0 && stc.st_ino == st.st_ino
++ && stc.st_dev == st.st_dev && stc.st_rdev == st.st_rdev)
++ return 0; /* we are in the trash folder: simple sync */
++
++ if ((ctx_trash = mx_open_mailbox (TrashPath, M_APPEND, NULL)) != NULL)
++ {
++ for (i = 0 ; i < ctx->msgcount ; i++)
++ if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->appended
++ && mutt_append_message (ctx_trash, ctx, ctx->hdrs[i], 0, 0) == -1)
++ {
++ mx_close_mailbox (ctx_trash, NULL);
++ return -1;
++ }
++
++ mx_close_mailbox (ctx_trash, NULL);
++ }
++ else
++ {
++ mutt_error _("Can't open trash folder");
++ return -1;
++ }
++
++ return 0;
++}
++
+ /* save changes and close mailbox */
+ int mx_close_mailbox (CONTEXT *ctx, int *index_hint)
+@@ -999,9 +1040,17 @@ int mx_close_mailbox (CONTEXT *ctx, int
+ if (ctx->changed || ctx->deleted)
+ {
+- if ((check = sync_mailbox (ctx, index_hint)) != 0)
++ int trsh = 0;
++
++ if ((!ctx->deleted || (trsh = trash_append (ctx)) == 0)
++ && (check = sync_mailbox (ctx, index_hint)) != 0)
+ {
+ ctx->closing = 0;
+ return check;
+ }
++ if (trsh != 0)
++ {
++ ctx->closing = 0;
++ return -1;
++ }
+ }
+ }
+@@ -1174,6 +1223,10 @@ int mx_sync_mailbox (CONTEXT *ctx, int *
+ rc = imap_sync_mailbox (ctx, purge, index_hint);
+ else
+-#endif
++#endif /* enter this block unconditionally if IMAP is not used */
++ {
++ if (trash_append (ctx) == -1)
++ return -1;
+ rc = sync_mailbox (ctx, index_hint);
++ }
+ if (rc == 0)
+ {
+diff -pruN2 mutt-1.3.27.orig/postpone.c mutt-1.3.27/postpone.c
+--- mutt-1.3.27.orig/postpone.c Mon Dec 3 11:17:57 2001
++++ mutt-1.3.27/postpone.c Wed Jan 23 22:33:11 2002
+@@ -271,4 +271,7 @@ int mutt_get_postponed (CONTEXT *ctx, HE
+ mutt_set_flag (PostContext, h, M_DELETE, 1);
+
++ /* and consider it saved, so that it won't be moved to the trash folder */
++ mutt_set_flag (PostContext, h, M_APPENDED, 1);
++
+ /* update the count for the status display */
+ PostCount = PostContext->msgcount - PostContext->deleted;
+diff -pruN mutt-1.3.27.orig/PATCHES mutt-1.3.27/PATCHES
+--- mutt-1.3.27.orig/PATCHES Mon Nov 26 20:16:52 2001
++++ mutt-1.3.27/PATCHES Thu Dec 6 16:27:55 2001
+@@ -1,0 +1 @@
++patch-1.3.27.cd.trash_folder.1