updated for version 7.0063
diff --git a/src/Make_bc3.mak b/src/Make_bc3.mak
index df219ba..e485750 100644
--- a/src/Make_bc3.mak
+++ b/src/Make_bc3.mak
@@ -83,6 +83,7 @@
 	regexp.obj \
 	screen.obj \
 	search.obj \
+	spell.obj \
 	syntax.obj \
 	tag.obj \
 	term.obj \
diff --git a/src/Make_ming.mak b/src/Make_ming.mak
index 1633b65..ead13c7 100644
--- a/src/Make_ming.mak
+++ b/src/Make_ming.mak
@@ -392,6 +392,7 @@
 	$(OUTDIR)/regexp.o \
 	$(OUTDIR)/screen.o \
 	$(OUTDIR)/search.o \
+	$(OUTDIR)/spell.o \
 	$(OUTDIR)/syntax.o \
 	$(OUTDIR)/tag.o \
 	$(OUTDIR)/term.o \
diff --git a/src/Make_ro.mak b/src/Make_ro.mak
index 65f176c..4297568 100644
--- a/src/Make_ro.mak
+++ b/src/Make_ro.mak
@@ -15,8 +15,8 @@
 	o.ex_docmd o.ex_eval o.ex_getln o.fileio o.fold o.getchar o.hashtable o.main o.mark o.mbyte  \
 	o.memfile o.memline o.menu o.message o.misc1 o.misc2 o.move     \
 	o.normal o.ops o.option o.quickfix o.regexp o.screen o.search   \
-	o.syntax o.tag o.term o.termlib o.ui o.undo o.version o.window  \
-	o.os_riscos o.swis o.gui o.gui_riscos
+	o.spell o.syntax o.tag o.term o.termlib o.ui o.undo o.version	\
+	o.window o.os_riscos o.swis o.gui o.gui_riscos
 
 Vim: $(OBJS)
 	$(GCC) -o Vim $(OBJS)
@@ -109,6 +109,8 @@
 
 o.search:	c.search
 
+o.spell:	c.spell
+
 o.syntax:	c.syntax
 
 o.tag:		c.tag
diff --git a/src/Make_w16.mak b/src/Make_w16.mak
index 1b71f31..303c662 100644
--- a/src/Make_w16.mak
+++ b/src/Make_w16.mak
@@ -110,6 +110,7 @@
    $(INTDIR)\regexp.obj\
    $(INTDIR)\screen.obj\
    $(INTDIR)\search.obj\
+   $(INTDIR)\spell.obj\
    $(INTDIR)\syntax.obj\
    $(INTDIR)\tag.obj\
    $(INTDIR)\term.obj\
diff --git a/src/charset.c b/src/charset.c
index b51d072..bd319ff 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -130,12 +130,13 @@
      */
     vim_memset(buf->b_chartab, 0, (size_t)32);
 #ifdef FEAT_MBYTE
-    for (c = 0; c < 256; ++c)
-    {
-	/* double-byte characters are probably word characters */
-	if (enc_dbcs != 0 && MB_BYTE2LEN(c) == 2)
-	    SET_CHARTAB(buf, c);
-    }
+    if (enc_dbcs != 0)
+	for (c = 0; c < 256; ++c)
+	{
+	    /* double-byte characters are probably word characters */
+	    if (MB_BYTE2LEN(c) == 2)
+		SET_CHARTAB(buf, c);
+	}
 #endif
 
 #ifdef FEAT_LISP
@@ -913,6 +914,96 @@
 # endif
     return (GET_CHARTAB(buf, *p) != 0);
 }
+
+static char spell_chartab[256];
+
+/*
+ * Init the chartab used for spelling.  Only depends on 'encoding'.
+ * Called once while starting up and when 'encoding' was changed.
+ * Unfortunately, we can't use isalpha() here, since the current locale may
+ * differ from 'encoding'.
+ */
+    void
+init_spell_chartab()
+{
+    int	    i;
+
+    /* ASCII is always the same, no matter what 'encoding' is used.
+     * EBCDIC is not supported! */
+    for (i = 0; i < '0'; ++i)
+	spell_chartab[i] = FALSE;
+    /* We include numbers.  A word shouldn't start with a number, but handling
+     * that is done separately. */
+    for ( ; i <= '9'; ++i)
+	spell_chartab[i] = TRUE;
+    for ( ; i < 'A'; ++i)
+	spell_chartab[i] = FALSE;
+    for ( ; i <= 'Z'; ++i)
+	spell_chartab[i] = TRUE;
+    for ( ; i < 'a'; ++i)
+	spell_chartab[i] = FALSE;
+    for ( ; i <= 'z'; ++i)
+	spell_chartab[i] = TRUE;
+#ifdef FEAT_MBYTE
+    if (enc_dbcs)
+    {
+	/* DBCS: assume double-wide characters are word characters. */
+	for ( ; i <= 255; ++i)
+	    if (MB_BYTE2LEN(i) == 2)
+		spell_chartab[i] = TRUE;
+	    else
+		spell_chartab[i] = FALSE;
+    }
+    else if (STRCMP(p_enc, "cp850") == 0)
+#endif
+#if defined(MSDOS) || defined(FEAT_MBYTE)
+    {
+	/* cp850, MS-DOS */
+	for ( ; i < 128; ++i)
+	    spell_chartab[i] = FALSE;
+	for ( ; i <= 0x9a; ++i)
+	    spell_chartab[i] = TRUE;
+	for ( ; i < 0xa0; ++i)
+	    spell_chartab[i] = FALSE;
+	for ( ; i <= 0xa5; ++i)
+	    spell_chartab[i] = TRUE;
+	for ( ; i <= 255; ++i)
+	    spell_chartab[i] = FALSE;
+    }
+#endif
+#ifdef FEAT_MBYTE
+    else
+#endif
+#if defined(FEAT_MBYTE) || !defined(MSDOS)
+    {
+	/* Rough guess: anything we don't recognize assumes word characters
+	 * like latin1. */
+	for ( ; i < 0xc0; ++i)
+	    spell_chartab[i] = FALSE;
+	for ( ; i <= 255; ++i)
+	    spell_chartab[i] = TRUE;
+# ifdef FEAT_MBYTE
+	if (STRCMP(p_enc, "latin1") == 0)
+# endif
+	    spell_chartab[0xf7] = FALSE;	    /* divide-by */
+    }
+#endif
+}
+
+/*
+ * Return TRUE if "p" points to a word character.
+ * This only depends on 'encoding', not on 'iskeyword'.
+ */
+    int
+spell_iswordc(p)
+    char_u *p;
+{
+# ifdef FEAT_MBYTE
+    if (has_mbyte && MB_BYTE2LEN(*p) > 1)
+	return mb_get_class(p) >= 2;
+# endif
+    return spell_chartab[*p];
+}
 #endif
 
 /*
diff --git a/src/globals.h b/src/globals.h
index 1253f35..af4eed0 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -362,7 +362,7 @@
  * When the DEC mouse has been pressed but not yet released we enable
  * automatic querys for the mouse position.
  */
-EXTERN int	WantQueryMouse INIT(= 0);
+EXTERN int	WantQueryMouse INIT(= FALSE);
 # endif
 
 # ifdef FEAT_GUI
diff --git a/src/mbyte.c b/src/mbyte.c
index 695b651..7f8400d 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -3096,7 +3096,7 @@
 	    else
 	    {
 		l = (*mb_ptr2len_check)((char_u *)from);
-		if (l > fromlen)
+		if (l > (int)fromlen)
 		    l = fromlen;
 	    }
 	    from += l;
diff --git a/src/misc2.c b/src/misc2.c
index d4d975d..ebf3933 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -3146,7 +3146,7 @@
     int new_mouse_shape;
 
     /* Only works in GUI mode. */
-    if (!gui.in_use)
+    if (!gui.in_use || gui.starting)
 	return;
 
     /* Postpone the updating when more is to come.  Speeds up executing of
diff --git a/src/option.c b/src/option.c
index b4593a7..1e94dc8 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2029,7 +2029,7 @@
 			    (char_u *)NULL, PV_NONE,
 #endif
 			    {(char_u *)FALSE, (char_u *)0L}},
-    {"spelllang",   "spl",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA,
+    {"spelllang",   "spl",  P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_RBUF,
 #ifdef FEAT_SYN_HL
 			    (char_u *)&p_spl, PV_SPL,
 			    {(char_u *)"", (char_u *)0L}
@@ -2825,6 +2825,11 @@
     /* Must be before option_expand(), because that one needs vim_isIDc() */
     didset_options();
 
+#ifdef FEAT_SYN_HL
+    /* Use the current chartab for the generic chartab. */
+    init_spell_chartab();
+#endif
+
 #ifdef FEAT_LINEBREAK
     /*
      * initialize the table for 'breakat'.
@@ -5558,7 +5563,8 @@
 	    errmsg = e_invarg;
 	else
 	    check_mouse_termcode();
-	setmouse();	/* may switch it on again */
+	if (termcap_active)
+	    setmouse();		/* may switch it on again */
     }
 #endif
 
@@ -5656,7 +5662,7 @@
 #endif
 
 #ifdef FEAT_SYN_HL
-    /* When 'spellang' is set, load the wordlists. */
+    /* When 'spelllang' is set, load the wordlists. */
     else if (varp == &(curbuf->b_p_spl))
     {
 	errmsg = did_set_spelllang(curbuf);
diff --git a/src/os_unix.c b/src/os_unix.c
index 284a68e..f41ed46 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -4273,7 +4273,7 @@
     /* May need to query the mouse position. */
     if (WantQueryMouse)
     {
-	WantQueryMouse = 0;
+	WantQueryMouse = FALSE;
 	mch_write((char_u *)IF_EB("\033[1'|", ESC_STR "[1'|"), 5);
     }
 #endif
diff --git a/src/screen.c b/src/screen.c
index fe33685..28565fa 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -3600,7 +3600,7 @@
 									    1);
 
 			spell_attr = 0;
-			iswordc = vim_iswordc_buf(prev_ptr, wp->w_buffer);
+			iswordc = spell_iswordc(prev_ptr);
 			if (iswordc && !prev_iswordc)
 			{
 			    word_end = v + spell_check(wp, prev_ptr,
diff --git a/src/structs.h b/src/structs.h
index 78f2929..a45a98e 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1424,6 +1424,7 @@
     garray_T	b_syn_patterns;		/* table for syntax patterns */
     garray_T	b_syn_clusters;		/* table for syntax clusters */
     int		b_spell_cluster_id;	/* @Spell cluster ID or 0 */
+    int		b_nospell_cluster_id;	/* @NoSpell cluster ID or 0 */
     int		b_syn_containedin;	/* TRUE when there is an item with a
 					   "containedin" argument */
     int		b_syn_sync_flags;	/* flags about how to sync */
diff --git a/src/syntax.c b/src/syntax.c
index 662b8a5..a6741cf 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -2202,9 +2202,20 @@
 	     * done in the current item.
 	     */
 
-	    /* Always do spelling if there is no @Spell cluster. */
+	    /* If there is no @Spell cluster: Do spelling for items without
+	     * @NoSpell.  Otherwise only in items with @Spell */
 	    if (syn_buf->b_spell_cluster_id == 0)
-		*can_spell = TRUE;
+	    {
+		if (syn_buf->b_nospell_cluster_id == 0 || current_trans_id == 0)
+		    *can_spell = TRUE;
+		else
+		{
+		    sps.inc_tag = 0;
+		    sps.id = syn_buf->b_nospell_cluster_id;
+		    sps.cont_in_list = NULL;
+		    *can_spell = !in_id_list(sip, sip->si_cont_list, &sps, 0);
+		}
+	    }
 	    else if (current_trans_id == 0)
 		*can_spell = FALSE;
 	    else
@@ -5094,6 +5105,8 @@
 
     if (STRICMP(name, "Spell") == 0)
 	curbuf->b_spell_cluster_id = len + SYNID_CLUSTER;
+    if (STRICMP(name, "NoSpell") == 0)
+	curbuf->b_nospell_cluster_id = len + SYNID_CLUSTER;
 
     return len + SYNID_CLUSTER;
 }
diff --git a/src/term.c b/src/term.c
index 2f9568a..c4f2d9f 100644
--- a/src/term.c
+++ b/src/term.c
@@ -4521,23 +4521,23 @@
 			 {
 			     held_button = mouse_code;
 			     mouse_code |= MOUSE_DRAG;
-			     WantQueryMouse = 1;
+			     WantQueryMouse = TRUE;
 			 }
 			 is_drag = TRUE;
 			 showmode();
 			 break;
 		case  2: mouse_code = MOUSE_LEFT;
-			 WantQueryMouse = 1;
+			 WantQueryMouse = TRUE;
 			 break;
 		case  3: mouse_code = MOUSE_RELEASE | MOUSE_LEFT;
 			 break;
 		case  4: mouse_code = MOUSE_MIDDLE;
-			 WantQueryMouse = 1;
+			 WantQueryMouse = TRUE;
 			 break;
 		case  5: mouse_code = MOUSE_RELEASE | MOUSE_MIDDLE;
 			 break;
 		case  6: mouse_code = MOUSE_RIGHT;
-			 WantQueryMouse = 1;
+			 WantQueryMouse = TRUE;
 			 break;
 		case  7: mouse_code = MOUSE_RELEASE | MOUSE_RIGHT;
 			 break;
diff --git a/src/version.h b/src/version.h
index 5d04e57..2f2da8b 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT	"vim70aa"
 #define VIM_VERSION_SHORT	"7.0aa"
 #define VIM_VERSION_MEDIUM	"7.0aa ALPHA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Mar 20)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Mar 20, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Mar 22)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Mar 22, compiled "