diff -pur mutt/buffy.c mutt-mark_old/buffy.c
--- mutt/buffy.c	Wed Oct 10 05:34:11 2001
+++ mutt-mark_old/buffy.c	Sat Oct 27 04:19:12 2001
@@ -100,7 +100,7 @@ int test_last_status_new (FILE * f)
 
   hdr = mutt_new_header ();
   mutt_read_rfc822_header (f, hdr, 0, 0);
-  if (!(hdr->read || hdr->old))
+  if (!(hdr->read || (option(OPTSEEOLD) && hdr->old)))
     result = 1;
   mutt_free_header (&hdr);
 
diff -pur mutt/curs_main.c mutt-mark_old/curs_main.c
--- mutt/curs_main.c	Wed Oct 17 12:03:19 2001
+++ mutt-mark_old/curs_main.c	Sat Oct 27 04:25:18 2001
@@ -204,7 +204,7 @@ static int ci_first_message (void)
       if (! Context->hdrs[Context->v2r[i]]->read &&
 	  ! Context->hdrs[Context->v2r[i]]->deleted)
       {
-	if (! Context->hdrs[Context->v2r[i]]->old)
+	if (! (option(OPTSEEOLD) && Context->hdrs[Context->v2r[i]]->old))
 	  return (i);
 	else if (old == -1)
 	  old = i;
@@ -1288,7 +1288,8 @@ int mutt_index_menu (void)
 	  }
 	  else if ((!CURHDRi->deleted && !CURHDRi->read))
 	  {
-	    if (op == OP_MAIN_NEXT_UNREAD || op == OP_MAIN_PREV_UNREAD || !CURHDRi->old)
+	    if (op == OP_MAIN_NEXT_UNREAD || op == OP_MAIN_PREV_UNREAD ||
+                !(option(OPTSEEOLD) && CURHDRi->old))
 	    {
 	      menu->current = i;
 	      break;
@@ -1368,7 +1369,7 @@ int mutt_index_menu (void)
 	    if (Context->hdrs[Context->v2r[j]]->tagged)
 	    {
 	      if (Context->hdrs[Context->v2r[j]]->read ||
-		  Context->hdrs[Context->v2r[j]]->old)
+		  (option(OPTSEEOLD) && Context->hdrs[Context->v2r[j]]->old))
 		mutt_set_flag (Context, Context->hdrs[Context->v2r[j]], M_NEW, 1);
 	      else
 		mutt_set_flag (Context, Context->hdrs[Context->v2r[j]], M_READ, 1);
@@ -1378,7 +1379,7 @@ int mutt_index_menu (void)
 	}
 	else
 	{
-	  if (CURHDR->read || CURHDR->old)
+	  if (CURHDR->read || (option(OPTSEEOLD) && CURHDR->old))
 	    mutt_set_flag (Context, CURHDR, M_NEW, 1);
 	  else
 	    mutt_set_flag (Context, CURHDR, M_READ, 1);
diff -pur mutt/flags.c mutt-mark_old/flags.c
--- mutt/flags.c	Thu Dec 21 03:19:41 2000
+++ mutt-mark_old/flags.c	Sat Oct 27 04:19:12 2001
@@ -90,7 +90,7 @@ void _mutt_set_flag (CONTEXT *ctx, HEADE
     case M_NEW:
       if (bf)
       {
-	if (h->read || h->old)
+	if (h->read || (option(OPTSEEOLD) && h->old))
 	{
 	  h->old = 0;
 	  if (upd_ctx) ctx->new++;
@@ -312,6 +312,11 @@ int mutt_change_flag (HEADER *h, int bf)
 
     case 'o':
     case 'O':
+      if (!option(OPTSEEOLD)) {
+        mutt_error _("Set $see_old first");
+        return (-1);
+      }
+
       if (h)
 	mutt_set_flag (Context, h, M_READ, !bf);
       else
diff -pur mutt/hdrline.c mutt-mark_old/hdrline.c
--- mutt/hdrline.c	Thu May 10 08:11:59 2001
+++ mutt-mark_old/hdrline.c	Sat Oct 27 04:19:12 2001
@@ -555,7 +555,7 @@ hdr_format_str (char *dest,
 	ch = 'r';
       else if (hdr->read && (ctx && ctx->msgnotreadyet != hdr->msgno))
 	ch = '-';
-      else if (hdr->old)
+      else if (option(OPTSEEOLD) && hdr->old)
 	ch = 'O';
       else
 	ch = 'N';
@@ -632,7 +632,8 @@ hdr_format_str (char *dest,
       snprintf (buf2, sizeof (buf2),
 		"%c%c%c", (THREAD_NEW ? 'n' : (THREAD_OLD ? 'o' : 
 		((hdr->read && (ctx && ctx->msgnotreadyet != hdr->msgno))
-		? (hdr->replied ? 'r' : ' ') : (hdr->old ? 'O' : 'N')))),
+		? (hdr->replied ? 'r' : ' ') :
+                ((option(OPTSEEOLD) && hdr->old) ? 'O' : 'N')))),
 		hdr->deleted ? 'D' : (hdr->attach_del ? 'd' : ch),
 		hdr->tagged ? '*' :
 		(hdr->flagged ? '!' :
diff -pur mutt/imap/message.c mutt-mark_old/imap/message.c
--- mutt/imap/message.c	Thu Oct 11 15:08:44 2001
+++ mutt-mark_old/imap/message.c	Sat Oct 27 04:19:12 2001
@@ -944,7 +944,7 @@ static char* msg_parse_flags (IMAP_HEADE
   if (*s == ')')
   {
     /* if a message is neither seen nor recent, it is OLD. */
-    if (option (OPTMARKOLD) && !recent && !(h->read))
+    if (!recent && !(h->read))
       h->old = 1;
     s++;
   }
diff -pur mutt/init.h mutt-mark_old/init.h
--- mutt/init.h	Mon Oct 22 04:28:24 2001
+++ mutt-mark_old/init.h	Sat Oct 27 04:19:12 2001
@@ -907,16 +907,17 @@ struct option_t MuttVars[] = {
   ** to maildir-style mailboxes.  Setting it will have no effect on other
   ** mailbox types.
   */
-  { "mark_old",		DT_BOOL, R_BOTH, OPTMARKOLD, 1 },
+  { "mark_old",		DT_QUAD, R_NONE, OPT_MARKOLD, M_YES },
   /*
   ** .pp
-  ** Controls whether or not Mutt makes the distinction between \fInew\fP
-  ** messages and \fIold\fP \fBunread\fP messages.  By default, Mutt will
-  ** mark new messages as old if you exit a mailbox without reading them.
-  ** The next time you start Mutt, the messages will show up with an "O"
-  ** next to them in the index menu, indicating that they are old.  In
-  ** order to make Mutt treat all unread messages as new only, you can
-  ** unset this variable.
+  ** When set, Mutt will mark new messages as old if you exit a mailbox
+  ** without reading them.  If not set messages will remain new until they
+  ** are read or the \fInew\fP flag is explicitly removed.  Set this variable
+  ** to ask-yes or ask-no to decide when leaving a folder.  Also see the
+  ** ``$$see_old'' variable.
+  ** .pp
+  ** \fBThis variable does not apply to IMAP folders, these always act as if
+  ** this variable is set to yes.
   */
   { "markers",		DT_BOOL, R_PAGER, OPTMARKERS, 1 },
   /*
@@ -1828,6 +1829,13 @@ struct option_t MuttVars[] = {
   ** ``$$record'' mailbox.
   ** .pp
   ** Also see the ``$$force_name'' variable.
+  */
+  { "see_old",		DT_BOOL, R_BOTH, OPTSEEOLD, 1 },
+  /*
+  ** .pp
+  ** Controls whether or not Mutt makes the distinction between \fInew\fP
+  ** messages and \fIold\fP \fBunread\fP messages.  In order to make Mutt
+  ** treat all unread messages as new only, you can unset this variable.
   */
   { "score", 		DT_BOOL, R_NONE, OPTSCORE, 1 },
   /*
diff -pur mutt/mh.c mutt-mark_old/mh.c
--- mutt/mh.c	Wed Oct 10 18:37:06 2001
+++ mutt-mark_old/mh.c	Sat Oct 27 04:19:12 2001
@@ -642,7 +642,7 @@ static int maildir_parse_dir(CONTEXT *ct
   if(subdir)
   {
     snprintf(buf, sizeof(buf), "%s/%s", ctx->path, subdir);
-    is_old = (mutt_strcmp("cur", subdir) == 0) && option(OPTMARKOLD);
+    is_old = (mutt_strcmp("cur", subdir) == 0);
   }
   else
     strfcpy(buf, ctx->path, sizeof(buf));
diff -pur mutt/mutt.h mutt-mark_old/mutt.h
--- mutt/mutt.h	Wed Sep 26 05:33:09 2001
+++ mutt-mark_old/mutt.h	Sat Oct 27 04:19:12 2001
@@ -260,6 +260,7 @@ enum
   OPT_PRINT,
   OPT_INCLUDE,
   OPT_DELETE,
+  OPT_MARKOLD,
   OPT_MFUPTO,
   OPT_MIMEFWD,
   OPT_MOVE,
@@ -350,7 +351,6 @@ enum
   OPTMAILCAPSANITIZE,
   OPTMAILDIRTRASH,
   OPTMARKERS,
-  OPTMARKOLD,
   OPTMENUSCROLL,	/* scroll menu instead of implicit next-page */
   OPTMETAKEY,		/* interpret ALT-x as ESC-x */
   OPTMETOO,
@@ -377,6 +377,7 @@ enum
   OPTSAVEEMPTY,
   OPTSAVENAME,
   OPTSCORE,
+  OPTSEEOLD,
   OPTSIGDASHES,
   OPTSIGONTOP,
   OPTSORTRE,
diff -pur mutt/mx.c mutt-mark_old/mx.c
--- mutt/mx.c	Wed Oct 10 06:04:25 2001
+++ mutt-mark_old/mx.c	Sat Oct 27 04:19:12 2001
@@ -821,7 +821,7 @@ static int sync_mailbox (CONTEXT *ctx, i
 /* save changes and close mailbox */
 int mx_close_mailbox (CONTEXT *ctx, int *index_hint)
 {
-  int i, move_messages = 0, purge = 1, read_msgs = 0;
+  int i, move_messages = 0, purge = 1, mark_old = 1, read_msgs = 0, new_msgs = 0;
   int check;
   int isSpool = 0;
   CONTEXT f;
@@ -854,6 +854,8 @@ int mx_close_mailbox (CONTEXT *ctx, int 
     if (!ctx->hdrs[i]->deleted && ctx->hdrs[i]->read 
         && !(ctx->hdrs[i]->flagged && option (OPTKEEPFLAGGED)))
       read_msgs++;
+    if (!ctx->hdrs[i]->deleted && !ctx->hdrs[i]->read && !ctx->hdrs[i]->old)
+      new_msgs++;
   }
 
   if (read_msgs && quadoption (OPT_MOVE) != M_NO)
@@ -883,6 +885,14 @@ int mx_close_mailbox (CONTEXT *ctx, int 
     }
   }
 
+  if (new_msgs)
+  {
+    snprintf (buf, sizeof (buf), new_msgs == 1
+	     ? _("Mark new message as old?") : _("Mark new messages as old?"));
+    if ((mark_old = query_quadoption (OPT_MARKOLD, buf)) < 0)
+      return (-1);
+  }
+
   if (ctx->deleted)
   {
     snprintf (buf, sizeof (buf), ctx->deleted == 1
@@ -899,7 +909,8 @@ int mx_close_mailbox (CONTEXT *ctx, int 
   /* IMAP servers manage the OLD flag themselves */
   if (ctx->magic != M_IMAP)
 #endif
-  if (option (OPTMARKOLD))
+  
+  if (mark_old)
   {
     for (i = 0; i < ctx->msgcount; i++)
     {
diff -pur mutt/pager.c mutt-mark_old/pager.c
--- mutt/pager.c	Wed Oct 10 18:23:14 2001
+++ mutt-mark_old/pager.c	Sat Oct 27 04:19:12 2001
@@ -2397,7 +2397,7 @@ mutt_pager (const char *banner, const ch
       case OP_TOGGLE_NEW:
 	CHECK_MODE(IsHeader (extra));
 	CHECK_READONLY;
-	if (extra->hdr->read || extra->hdr->old)
+	if (extra->hdr->read || (option(OPTSEEOLD) && extra->hdr->old))
 	  mutt_set_flag (Context, extra->hdr, M_NEW, 1);
 	else if (!first)
 	  mutt_set_flag (Context, extra->hdr, M_READ, 1);
diff -pur mutt/parse.c mutt-mark_old/parse.c
--- mutt/parse.c	Thu Apr 26 08:36:34 2001
+++ mutt-mark_old/parse.c	Sat Oct 27 04:19:12 2001
@@ -1107,8 +1107,7 @@ int mutt_parse_rfc822_line (ENVELOPE *e,
 	    hdr->replied = 1;
 	    break;
 	    case 'O':
-	    if (option (OPTMARKOLD))
-	      hdr->old = 1;
+	    hdr->old = 1;
 	    break;
 	    case 'R':
 	    hdr->read = 1;
diff -pur mutt/pattern.c mutt-mark_old/pattern.c
--- mutt/pattern.c	Thu Apr 26 08:36:34 2001
+++ mutt-mark_old/pattern.c	Sat Oct 27 04:19:12 2001
@@ -980,13 +980,14 @@ mutt_pattern_exec (struct pattern_t *pat
     case M_TAG:
       return (pat->not ^ h->tagged);
     case M_NEW:
-      return (pat->not ? h->old || h->read : !(h->old || h->read));
+      return (pat->not ^ !((option(OPTSEEOLD) && h->old) || h->read));
     case M_UNREAD:
       return (pat->not ? h->read : !h->read);
     case M_REPLIED:
       return (pat->not ^ h->replied);
     case M_OLD:
-      return (pat->not ? (!h->old || h->read) : (h->old && !h->read));
+      return (pat->not ? (!(option(OPTSEEOLD) && h->old) || h->read) :
+              ((option(OPTSEEOLD) && h->old) && !h->read));
     case M_READ:
       return (pat->not ^ h->read);
     case M_DELETED:
diff -pur mutt/status.c mutt-mark_old/status.c
--- mutt/status.c	Fri Mar  3 04:10:14 2000
+++ mutt-mark_old/status.c	Sat Oct 27 04:19:12 2001
@@ -159,9 +159,11 @@ status_format_str (char *buf, size_t buf
       if (!optional)
       {
 	snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
-	snprintf (buf, buflen, fmt, Context ? Context->new : 0);
+	snprintf (buf, buflen, fmt, Context ?
+                  (option(OPTSEEOLD) ? Context->new : Context->unread) : 0);
       }
-      else if (!Context || !Context->new)
+      else if (!Context ||
+               !(option(OPTSEEOLD) ? Context->new : Context->unread))
 	optional = 0;
       break;
 
@@ -169,9 +171,11 @@ status_format_str (char *buf, size_t buf
       if (!optional)
       {
 	snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
-	snprintf (buf, buflen, fmt, Context ? Context->unread - Context->new : 0);
+	snprintf (buf, buflen, fmt, (Context && option(OPTSEEOLD)) ?
+                  Context->unread - Context->new : 0);
       }
-      else if (!Context || !(Context->unread - Context->new))
+      else if (!Context || !option(OPTSEEOLD) ||
+               !(Context->unread - Context->new))
 	optional = 0;
       break;
 
diff -pur mutt/thread.c mutt-mark_old/thread.c
--- mutt/thread.c	Mon Sep  3 08:59:37 2001
+++ mutt-mark_old/thread.c	Sat Oct 27 04:19:12 2001
@@ -815,7 +815,7 @@ int _mutt_traverse_thread (CONTEXT *ctx,
 
   if (!cur->read && CHECK_LIMIT)
   {
-    if (cur->old)
+    if (option(OPTSEEOLD) && cur->old)
       old = 2;
     else
       new = 1;
@@ -888,7 +888,7 @@ int _mutt_traverse_thread (CONTEXT *ctx,
 
     if (!cur->read && CHECK_LIMIT)
     {
-      if (cur->old)
+      if (option(OPTSEEOLD) && cur->old)
 	old = 2;
       else
 	new = 1;
