--- a/lib/mhamain.pl
+++ b/lib/mhamain.pl
@@ -73,6 +73,8 @@
     TERM TRAP USR1 USR2 VTALRM XCPU XFSZ
 );
 
+use Carp;
+
 ###############################################################################
 ##	Public routines
 ###############################################################################
@@ -936,6 +938,16 @@
     } else {
 	$ctype = 'text/plain';
     }
+    
+    ##-----------------------------##
+    ## Get Custom Archives headers ##
+    ##-----------------------------##
+    if (defined($fields->{'x-archives-hash'})) {
+	$msghash = $fields->{'x-archives-hash'}[0];
+    }
+    if(!defined($msghash)) {
+	confess("No X-Archives-Hash header in $handle");
+    }
 
     ## Insure uniqueness of index
     my $t = $index;
@@ -961,6 +973,7 @@
     $Subject{$index} = $sub;
     $MsgHead{$index} = htmlize_header($fields);
     $ContentType{$index} = $ctype;
+    $MsgHash{$index} = $msghash;
     if ($msgid) {
 	$MsgId{$msgid} = $index;
 	$NewMsgId{$msgid} = $index;	# Track new message-ids
@@ -972,6 +985,7 @@
     } else {
 	$IndexNum{$index} = getNewMsgNum();
     }
+    #$MsgHash{$IndexNum{$index}} = $msghash;
 
     $Refs{$index} = [ @refs ]  if (@refs);
 
@@ -1121,7 +1135,7 @@
 
     my $adding	     = ($ADD && !$force && !$SINGLE);
     my $i_p0 	     = fmt_msgnum($msgnum);
-    my $filename     = msgnum_filename($msgnum);
+    my $filename     = msgnum_filename($index);
     my $filepathname = join($DIRSEP, $OUTDIR, $filename);
     my $tmppathname;
 
@@ -1179,7 +1193,9 @@
 		"<!--X-Message-Id: ",
 		    commentize($Index2MsgId{$index}), " -->\n",
 		"<!--X-Content-Type: ",
-		    commentize($ContentType{$index}), " -->\n";
+		    commentize($ContentType{$index}), " -->\n",
+		"<!--X-Archives-Hash: ",
+		    commentize($MsgHash{$index}), " -->\n";
 
 	    if (defined($Refs{$index})) {
 		foreach (@{$Refs{$index}}) {
@@ -1475,8 +1491,9 @@
     #&defineIndex2MsgId();
     my $msgnum = $IndexNum{$key};
     return (undef, undef)  if ($msgnum eq '');
-    my $filename = join($DIRSEP, $OUTDIR, &msgnum_filename($msgnum));
+    my $filename = join($DIRSEP, $OUTDIR, &msgnum_filename($key));
 
+    delete $MsgHash{$key};
     delete $ContentType{$key};
     delete $Date{$key};
     delete $From{$key};
--- a/lib/mhdb.pl
+++ b/lib/mhdb.pl
@@ -61,6 +61,7 @@
 
 ## Meta-data
 print_var($db,'ContentType', \%ContentType);
+print_var($db,'MsgHash',     \%MsgHash);
 print_var($db,'Date',        \%Date);
 print_var($db,'Derived',     \%Derived);
 print_var($db,'FollowOld',   \%Follow);
--- a/lib/mhinit.pl
+++ b/lib/mhinit.pl
@@ -248,6 +248,7 @@
 %Follow  	= ();	# Index key to follow-ups
 %FolCnt   	= ();	# Index key to number of follow-ups
 %ContentType	= ();	# Index key to base content-type of message
+%MsgHash	= ();	# Custom hash from header in mail
 %Icons    	= ();	# Index key to icon URL for content-type
 %AddIndex 	= ();	# Flags for messages that must be written
 
--- a/lib/mhmsgfile.pl
+++ b/lib/mhmsgfile.pl
@@ -123,6 +123,10 @@
     if (defined($href->{'derived'})) {
 	$Derived{$index} = $href->{'derived'};
     }
+    
+    if (defined($href->{'archives-hash'})) {
+	$MsgHash{$index} = $href->{'archives-hash'};
+    }
 
     $IndexNum{$index} = int($msgnum);
 
--- a/lib/mhopt.pl
+++ b/lib/mhopt.pl
@@ -798,6 +798,7 @@
     delete($MsgId{''});
     delete($FollowOld{''});
     delete($ContentType{''});
+    delete($MsgHash{''});
     delete($Refs{''});
 
     # update DOCURL if default old value
--- a/lib/mhrcvars.pl
+++ b/lib/mhrcvars.pl
@@ -225,7 +225,7 @@
 	}
     	if ($var eq 'MSG') {		## Filename of message page
 	    ($lref, $key, $pos) = compute_msg_pos($index, $var, $arg);
-	    $tmp = defined($key) ? &msgnum_filename($IndexNum{$key}) : "";
+	    $tmp = defined($key) ? &msgnum_filename($key) : "";
 	    last REPLACESW;
 	}
 	if ($var eq 'MSGHFIELD') {	## Message header field
@@ -447,7 +447,7 @@
 	    if (!defined($key)) { $tmp = ""; last REPLACESW; }
 	    $tmp = qq/name="/ . &fmt_msgnum($IndexNum{$key}) .
 		   qq/" href="/ .
-		   &msgnum_filename($IndexNum{$key}) .
+		   &msgnum_filename($key) .
 		   qq/"/;
 	    last REPLACESW;
 	}
@@ -462,7 +462,7 @@
 	    $isurl = 0;
 	    ($lref, $key, $pos) = compute_msg_pos($index, $var, $arg);
 	    if (!defined($key)) { $tmp = ""; last REPLACESW; }
-	    $tmp = qq/href="/ . &msgnum_filename($IndexNum{$key}) . qq/"/;
+	    $tmp = qq/href="/ . &msgnum_filename($key) . qq/"/;
 	    last REPLACESW;
 	}
     	if ($var eq 'IDXFNAME') {	## Filename of index page
@@ -760,7 +760,7 @@
     $ret = qq|<a name="| .
 	   &fmt_msgnum($IndexNum{$index}) .
 	   qq|" href="| .
-	   &msgnum_filename($IndexNum{$index}) .
+	   &msgnum_filename($index) .
 	   qq|">$ret</a>|
 	if $var eq 'SUBJECT' && $arg eq "" && !$mailto;
 
--- a/lib/mhutil.pl
+++ b/lib/mhutil.pl
@@ -28,6 +28,7 @@
 package mhonarc;
 
 use MHonArc::RFC822;
+use Carp;
 
 ## RFC 2369 header fields to check for URLs
 %HFieldsList = (
@@ -313,16 +314,20 @@
 ##	Routine to get filename of a message number.
 ##
 sub msgnum_filename {
-    my($fmtstr) = "$MsgPrefix%05d.$HtmlExt";
+    my $msgnum = $_[0];
+    my($fmtstr) = "$MsgPrefix%s.$HtmlExt";
     $fmtstr .= ".gz"  if $GzipLinks;
-    sprintf($fmtstr, $_[0]);
+    if(!defined($MsgHash{$msgnum})) {
+	confess("Could not find X-Archives-Hash for msgnum=$msgnum");
+    }
+    sprintf($fmtstr, $MsgHash{$msgnum});
 }
 
 ##---------------------------------------------------------------------------
 ##	Routine to get filename of an index
 ##
 sub get_filename_from_index {
-    &msgnum_filename($IndexNum{$_[0]});
+    &msgnum_filename($_[0]);
 }
 
 ##---------------------------------------------------------------------------
