diff -ruN ../mutt-1.5.20.orig/init.h ./init.h
--- mutt-1.5.20.orig/init.h	2009-06-14 05:35:21.000000000 +0800
+++ init.h	2009-06-29 09:52:08.000000000 +0800
@@ -287,6 +287,11 @@
   ** .pp
   ** Also see $$fast_reply.
   */
+  { "bbsislame",	DT_BOOL, R_NONE, OPTBBSISLAME, 0 },
+  /*
+  ** .pp
+  ** When this variable is set, mutt will beep when an error occurs.
+  */
   { "beep",		DT_BOOL, R_NONE, OPTBEEP, 1 },
   /*
   ** .pp
@@ -2435,7 +2440,7 @@
   ** For the pager, this variable specifies the number of lines shown
   ** before search results. By default, search results will be top-aligned.
   */
-  { "send_charset",	DT_STR,  R_NONE, UL &SendCharset, UL "us-ascii:iso-8859-1:utf-8" },
+  { "send_charset",	DT_STR,  R_NONE, UL &SendCharset, UL "big5:gb2312:us-ascii:iso-8859-1:utf-8" },
   /*
   ** .pp
   ** A colon-delimited list of character sets for outgoing messages. Mutt will use the
@@ -3205,7 +3210,7 @@
   ** When \fIset\fP, Mutt will jump to the next unread message, if any,
   ** when the current thread is \fIun\fPcollapsed.
   */
-  { "use_8bitmime",	DT_BOOL, R_NONE, OPTUSE8BITMIME, 0 },
+  { "use_8bitmime",	DT_BOOL, R_NONE, OPTUSE8BITMIME, 1 },
   /*
   ** .pp
   ** \fBWarning:\fP do not set this variable unless you are using a version
diff -ruN ../mutt-1.5.20.orig/mbyte.c ./mbyte.c
--- mutt-1.5.20.orig/mbyte.c	2009-01-05 06:53:54.000000000 +0800
+++ mbyte.c	2009-06-29 09:51:38.000000000 +0800
@@ -24,6 +24,9 @@
 # include "config.h"
 #endif
 
+/*
+ * Trad. Chinese (Big5) support by yjchou@linux.cis.nctu.edu.tw
+ */
 #include "mutt.h"
 #include "mbyte.h"
 #include "charset.h"
@@ -39,6 +42,7 @@
 int Charset_is_utf8 = 0;
 #ifndef HAVE_WC_FUNCS
 static int charset_is_ja = 0;
+static int charset_is_big5 = 0;
 static iconv_t charset_to_utf8 = (iconv_t)(-1);
 static iconv_t charset_from_utf8 = (iconv_t)(-1);
 #endif
@@ -52,6 +56,7 @@
   Charset_is_utf8 = 0;
 #ifndef HAVE_WC_FUNCS
   charset_is_ja = 0;
+  charset_is_big5 = 0;
   if (charset_to_utf8 != (iconv_t)(-1))
   {
     iconv_close (charset_to_utf8);
@@ -82,6 +87,14 @@
     charset_from_utf8 = mutt_iconv_open (charset, "utf-8", 0);
   }
 #endif
+#ifndef HAVE_WC_FUNCS
+  else if (!strcmp(buffer, "big5"))
+  {
+    charset_is_big5 = 1;
+    charset_to_utf8 = iconv_open ("UTF-8", charset);
+    charset_from_utf8 = iconv_open (charset, "UTF-8");
+  }
+#endif
 
 #if defined(HAVE_BIND_TEXTDOMAIN_CODESET) && defined(ENABLE_NLS)
   bind_textdomain_codeset(PACKAGE, buffer);
@@ -256,7 +269,7 @@
 
 int iswprint (wint_t wc)
 {
-  if (Charset_is_utf8 || charset_is_ja)
+  if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
     return ((0x20 <= wc && wc < 0x7f) || 0xa0 <= wc);
   else
     return (0 <= wc && wc < 256) ? IsPrint (wc) : 0;
@@ -264,7 +277,7 @@
 
 int iswspace (wint_t wc)
 {
-  if (Charset_is_utf8 || charset_is_ja)
+  if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
     return (9 <= wc && wc <= 13) || wc == 32;
   else
     return (0 <= wc && wc < 256) ? isspace (wc) : 0;
@@ -345,7 +358,7 @@
 
 wint_t towupper (wint_t wc)
 {
-  if (Charset_is_utf8 || charset_is_ja)
+  if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
     return towupper_ucs (wc);
   else
     return (0 <= wc && wc < 256) ? toupper (wc) : wc;
@@ -353,7 +366,7 @@
 
 wint_t towlower (wint_t wc)
 {
-  if (Charset_is_utf8 || charset_is_ja)
+  if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
     return towlower_ucs (wc);
   else
     return (0 <= wc && wc < 256) ? tolower (wc) : wc;
@@ -361,7 +374,7 @@
 
 int iswalnum (wint_t wc)
 {
-  if (Charset_is_utf8 || charset_is_ja)
+  if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
     return iswalnum_ucs (wc);
   else
     return (0 <= wc && wc < 256) ? isalnum (wc) : 0;
@@ -402,13 +415,31 @@
     return -1;
 }
 
+int wcwidth_big5(wchar_t ucs)
+{
+  return wcwidth_ja (ucs);
+}
+
 int wcwidth_ucs(wchar_t ucs);
 
 int wcwidth (wchar_t wc)
 {
   if (!Charset_is_utf8)
   {
-    if (!charset_is_ja)
+    if (charset_is_ja)
+    {
+      /* Japanese */
+      int k = wcwidth_ja (wc);
+      if (k != -1)
+	return k;
+    }
+    else if (charset_is_big5)
+    {
+      int k = wcwidth_big5 (wc);
+      if (k != -1)
+        return k;
+    }
+    else
     {
       /* 8-bit case */
       if (!wc)
@@ -418,13 +449,6 @@
       else
 	return -1;
     }
-    else
-    {
-      /* Japanese */
-      int k = wcwidth_ja (wc);
-      if (k != -1)
-	return k;
-    }
   }
   return wcwidth_ucs (wc);
 }
diff -ruN ../mutt-1.5.20.orig/mutt.h ./mutt.h
--- mutt-1.5.20.orig/mutt.h	2009-06-13 06:15:42.000000000 +0800
+++ mutt.h	2009-06-29 09:51:38.000000000 +0800
@@ -322,6 +322,7 @@
   OPTATTACHSPLIT,
   OPTAUTOEDIT,
   OPTAUTOTAG,
+  OPTBBSISLAME,
   OPTBEEP,
   OPTBEEPNEW,
   OPTBOUNCEDELIVERED,
diff -ruN ../mutt-1.5.20.orig/myiconv.c ./myiconv.c
--- mutt-1.5.20.orig/myiconv.c	1970-01-01 08:00:00.000000000 +0800
+++ myiconv.c	2009-06-29 09:51:38.000000000 +0800
@@ -0,0 +1,167 @@
+/*
+ * Contributed by Kuang-che Wu <kcwu@kcwu.dyndns.org>
+ */
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "mutt.h"
+#include "charset.h"
+#include <hz.h>
+#include <dlfcn.h>                   
+
+
+
+#ifdef HAVE_ICONV
+
+typedef struct myiconv {
+    iconv_t cd;
+    int incode,outcode;
+    int myjob;
+} myiconv_t;
+
+static int is_init;
+static void *dlh;
+static iconv_t (*old_iconv_open)(const char *tocode, const char *fromcode);
+static size_t (*old_iconv)(iconv_t cd, ICONV_CONST char **inbuf, 
+	size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
+static int (*old_iconv_close) (iconv_t cd);
+static int inst;
+
+static void init(void)
+{
+    hz_setup();
+    dlh=dlopen("libiconv.so",RTLD_LAZY);
+    if(dlh) {
+	old_iconv_open=dlsym(dlh,"iconv_open");
+	old_iconv=dlsym(dlh,"iconv");
+	old_iconv_close=dlsym(dlh,"iconv_close");
+    }
+    is_init=1;
+}
+
+static size_t myconv(ICONV_CONST char **inbuf, 
+	size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
+{
+    /* reference to autogb.c */
+    int count;
+    char buff[MAX_BUFFER*3];
+    char *pbuf,*ps;
+    size_t rt=0;
+
+    pbuf=&buff[2];
+
+    count=*inbytesleft;
+    if(count>MAX_BUFFER) count=MAX_BUFFER;
+    memcpy(pbuf,*inbuf,count);
+    *inbuf+=count;
+    *inbytesleft-=count;
+    while(count>0) {
+	rt+=count;
+	ps=hz_convert(pbuf,&count,0);
+	memcpy(*outbuf,ps,count);
+	*outbuf+=count; *outbytesleft+=count;
+	pbuf=&buff[2];
+
+	count=*inbytesleft;
+	if(count>MAX_BUFFER) count=MAX_BUFFER;
+	memcpy(pbuf,*inbuf,count);
+	*inbuf+=count;
+	*inbytesleft-=count;
+    }
+    return rt;
+}
+
+int conv_str(const char* str_code)
+{
+    int i;
+    char *str;
+    struct mapping {
+	char *code;
+	int value;
+    } map[]={
+	{"gb2312",GB_CODE},
+	{"euccn",GB_CODE},
+	{"big5",BIG5_CODE},
+	{0,OTHER_CODE}, /* should we handle below cases? */
+	{"hz",HZ_CODE},
+	{"uni",UNI_CODE},
+	{"utf7",UTF7_CODE},
+	{"utf8",UTF8_CODE},
+    };
+    str=strdup(str_code);
+    if(strchr(str,'/'))
+	*strchr(str,'/')=0;
+    for(i=0;map[i].code;i++)
+	if(mutt_chscmp(str,map[i].code))
+	    break;
+    free(str);
+    return map[i].value; 
+}
+
+iconv_t iconv_open (const char *tocode, const char *fromcode)
+{
+    myiconv_t *mycd=(myiconv_t*)-1;
+    iconv_t cd;
+    char *_tocode, *_fromcode;
+
+    _tocode = tocode;
+    _fromcode = fromcode;
+
+    if (!mutt_strcmp(tocode,"big5")) _tocode = "big5-hkscs";
+    if (!mutt_strcmp(fromcode,"big5")) _fromcode = "big5-hkscs";
+
+    if(!is_init) init();
+    if(!old_iconv_open) 
+	return (iconv_t)(-1);
+
+    if((cd=old_iconv_open(_tocode,_fromcode))!=(iconv_t)-1) {
+    	mycd=(myiconv_t*)calloc(1,sizeof(myiconv_t));
+	mycd->cd=cd;
+	mycd->incode=conv_str(fromcode);
+	mycd->outcode=conv_str(tocode);
+	/* inst==0 is because:
+	   libhz only has one stack, and 
+	   it will destroy all instance's data when setup stack.
+
+	   If want to fix, libhz's init func should know which inst.
+	 */
+	if(inst==0 && mycd->incode!=mycd->outcode && 
+		hz_search(mycd->incode,mycd->outcode,8)) {
+	    inst++;
+	    mycd->myjob=1;
+	}
+    }
+    return (iconv_t)mycd;
+}
+
+size_t iconv (iconv_t cd, ICONV_CONST char **inbuf, size_t *inbytesleft,
+	      char **outbuf, size_t *outbytesleft)
+{
+    myiconv_t *mycd=(myiconv_t*)cd;
+    size_t rt=(size_t)0;
+    if(mycd->myjob) {
+	if(!inbuf || !*inbuf || !outbuf || !*outbuf)
+	    hz_search(mycd->incode,mycd->outcode,8);
+	else
+	    rt=myconv(inbuf,inbytesleft,outbuf,outbytesleft);
+    } else if(old_iconv)
+	rt=old_iconv(mycd->cd,inbuf,inbytesleft,outbuf,outbytesleft);
+    return rt;
+}
+
+int iconv_close (iconv_t cd)
+{
+    myiconv_t *mycd=(myiconv_t*)cd;
+    if(!old_iconv_close)
+	return 0;
+    old_iconv_close(mycd->cd);
+    if(mycd->myjob)
+	inst--;
+    free(mycd);
+    return 0;
+}
+
+#endif
diff -ruN ../mutt-1.5.20.orig/pager.c ./pager.c
--- mutt-1.5.20.orig/pager.c	2009-06-04 04:48:31.000000000 +0800
+++ pager.c	2009-06-29 09:51:38.000000000 +0800
@@ -20,6 +20,10 @@
 # include "config.h"
 #endif
 
+/*
+ * Trad. Chinese support by Michael Hsin <mhsin@mhsin.org>
+ */
+
 #include "mutt.h"
 #include "mutt_curses.h"
 #include "mutt_regex.h"
@@ -1066,7 +1070,7 @@
 {
   int space = -1; /* index of the last space or TAB */
   int col = option (OPTMARKERS) ? (*lineInfo)[n].continuation : 0;
-  int ch, vch, k, last_special = -1, special = 0, t;
+  int ch, vch, k, last_special = -1, special = 0, t = 0, old_t = 0;
   wchar_t wc;
   mbstate_t mbstate;
 
@@ -1164,7 +1168,10 @@
     {
       if (wc == ' ')
 	space = ch;
+      old_t = t;
       t = wcwidth (wc);
+      if(t > 1 || old_t > 1)
+        space = ch;
       if (col + t > wrap_cols)
 	break;
       col += t;
@@ -1385,6 +1392,7 @@
       {
 	buf_ptr = buf + ch;
 	/* skip trailing blanks */
+	ch --;
 	while (ch && (buf[ch] == ' ' || buf[ch] == '\t' || buf[ch] == '\r'))
 	  ch--;
         /* a very long word with leading spaces causes infinite wrapping */
diff -ruN ../mutt-1.5.20.orig/parse.c ./parse.c
--- mutt-1.5.20.orig/parse.c	2009-06-02 00:29:32.000000000 +0800
+++ parse.c	2009-06-29 09:51:38.000000000 +0800
@@ -381,7 +381,10 @@
     s++;
     SKIPWS (s);
     if ((s = mutt_get_parameter ("filename", (parms = parse_parameters (s)))))
-      mutt_str_replace (&ct->filename, s);
+       {
+ 	mutt_str_replace (&ct->filename, s);
+ 	rfc2047_decode (&ct->filename);
+       }
     if ((s = mutt_get_parameter ("name", parms)))
       ct->form_name = safe_strdup (s);
     mutt_free_parameter (&parms);
diff -ruN ../mutt-1.5.20.orig/pgp.c ./pgp.c
--- mutt-1.5.20.orig/pgp.c	2009-05-31 01:20:08.000000000 +0800
+++ pgp.c	2009-06-29 09:51:38.000000000 +0800
@@ -1024,7 +1024,7 @@
   int empty = 1;
   pid_t thepid;
   
-  convert_to_7bit (a); /* Signed data _must_ be in 7-bit format. */
+  if (!option(OPTBBSISLAME)) convert_to_7bit (a); /* Signed data _must_ be in 7-bit format. */
 
   mutt_mktemp (sigfile);
   if ((fp = safe_fopen (sigfile, "w")) == NULL)
diff -ruN ../mutt-1.5.20.orig/po/zh_TW.po ./po/zh_TW.po
--- mutt-1.5.20.orig/po/zh_TW.po	2009-06-15 02:54:11.000000000 +0800
+++ po/zh_TW.po	2009-06-29 09:51:38.000000000 +0800
@@ -1802,7 +1802,7 @@
 "~w 檔案\t\t將訊息寫入檔案\n"
 "~x\t\t停止修改並離開編輯器\n"
 "~?\t\t這訊息\n"
-".\t\t如果是一行裏的唯一字符，則代表結束輸入\n"
+".\t\t如果是一行裡的唯一字符，則代表結束輸入\n"
 
 #: edit.c:52
 #, fuzzy
@@ -1834,7 +1834,7 @@
 "~w 檔案\t\t將訊息寫入檔案\n"
 "~x\t\t停止修改並離開編輯器\n"
 "~?\t\t這訊息\n"
-".\t\t如果是一行裏的唯一字符，則代表結束輸入\n"
+".\t\t如果是一行裡的唯一字符，則代表結束輸入\n"
 
 #: edit.c:187
 #, c-format
@@ -1843,7 +1843,7 @@
 
 #: edit.c:329
 msgid "(End message with a . on a line by itself)\n"
-msgstr "（在一行裏輸入一個 . 符號來結束信件）\n"
+msgstr "（在一行裡輸入一個 . 符號來結束信件）\n"
 
 #: edit.c:388
 msgid "No mailbox.\n"
@@ -4634,7 +4634,7 @@
 
 #: ../keymap_alldefs.h:43
 msgid "rename/move an attached file"
-msgstr "更改檔名∕移動 已被附帶的檔案"
+msgstr "更改檔名/移動 已被附帶的檔案"
 
 #: ../keymap_alldefs.h:44
 msgid "send the message"
@@ -4642,7 +4642,7 @@
 
 #: ../keymap_alldefs.h:45
 msgid "toggle disposition between inline/attachment"
-msgstr "切換 合拼∕附件式 觀看模式"
+msgstr "切換 合拼/附件式 觀看模式"
 
 #: ../keymap_alldefs.h:46
 msgid "toggle whether to delete file after sending it"
@@ -5253,11 +5253,11 @@
 
 #: ../keymap_alldefs.h:195
 msgid "Select the previous element of the chain"
-msgstr "選擇鏈結裏對上一個部份"
+msgstr "選擇鏈結裡對上一個部份"
 
 #: ../keymap_alldefs.h:196
 msgid "Select the next element of the chain"
-msgstr "選擇鏈結裏跟著的一個部份"
+msgstr "選擇鏈結裡跟著的一個部份"
 
 #: ../keymap_alldefs.h:197
 msgid "send the message through a mixmaster remailer chain"
diff -ruN ../mutt-1.5.20.orig/sendlib.c ./sendlib.c
--- mutt-1.5.20.orig/sendlib.c	2009-06-14 23:46:11.000000000 +0800
+++ sendlib.c	2009-06-29 09:51:38.000000000 +0800
@@ -2383,7 +2383,7 @@
   rfc2047_encode_adrlist (env->reply_to, "Reply-To");
   rfc2047_encode_string (&env->x_label);
 
-  if (env->subject)
+  if (env->subject && !option(OPTBBSISLAME))
   {
     rfc2047_encode_string (&env->subject);
   }
