updated for version 7.0109
diff --git a/src/dosinst.c b/src/dosinst.c
index deaf15f..efc6fdf 100644
--- a/src/dosinst.c
+++ b/src/dosinst.c
@@ -2080,7 +2080,7 @@
     printf("    or $HOME directory\n");
 #ifdef WIN3264
     printf("-register-OLE");
-    printf("    Register gvim for OLE\n");
+    printf("    Ignored\n");
 #endif
     printf("\n");
 }
diff --git a/src/edit.c b/src/edit.c
index 7028dd3..bf70961 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -1970,8 +1970,7 @@
     {
 	/* Infer case of completed part -- webb */
 	/* Use IObuff, str would change text in buffer! */
-	STRNCPY(IObuff, str, len);
-	IObuff[len] = NUL;
+	vim_strncpy(IObuff, str, len);
 
 	/* Rule 1: Were any chars converted to lower? */
 	for (idx = 0; idx < completion_length; ++idx)
@@ -2010,7 +2009,7 @@
 	}
 
 	/* Copy the original case of the part we typed */
-	STRNCPY(IObuff, original_text, completion_length);
+	vim_strncpy(IObuff, original_text, completion_length);
 
 	return ins_compl_add(IObuff, len, fname, dir, reuse);
     }
@@ -3053,17 +3052,17 @@
 			    tmp_ptr = find_word_end(tmp_ptr);
 			    if (tmp_ptr > ptr)
 			    {
-				if (*ptr != ')' && IObuff[len-1] != TAB)
+				if (*ptr != ')' && IObuff[len - 1] != TAB)
 				{
-				    if (IObuff[len-1] != ' ')
+				    if (IObuff[len - 1] != ' ')
 					IObuff[len++] = ' ';
 				    /* IObuf =~ "\k.* ", thus len >= 2 */
 				    if (p_js
-					&& (IObuff[len-2] == '.'
+					&& (IObuff[len - 2] == '.'
 					    || (vim_strchr(p_cpo, CPO_JOINSP)
 								       == NULL
-						&& (IObuff[len-2] == '?'
-						    || IObuff[len-2] == '!'))))
+						&& (IObuff[len - 2] == '?'
+						 || IObuff[len - 2] == '!'))))
 					IObuff[len++] = ' ';
 				}
 				/* copy as much as posible of the new word */
@@ -3741,8 +3740,7 @@
 				      curr_match->number, completion_matches);
 		else
 		    sprintf((char *)IObuff, _("match %d"), curr_match->number);
-		STRNCPY(match_ref, IObuff, 30 );
-		match_ref[30] = '\0';
+		vim_strncpy(match_ref, IObuff, 30);
 		edit_submode_extra = match_ref;
 		edit_submode_highl = HLF_R;
 		if (dollar_vcol)
diff --git a/src/eval.c b/src/eval.c
index a1404c2..6adfb4d 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -6197,8 +6197,7 @@
     else
     {
 	/* Avoid a malloc/free by using buf[]. */
-	STRNCPY(buf, key, len);
-	buf[len] = NUL;
+	vim_strncpy(buf, key, len);
 	akey = buf;
     }
 
@@ -10681,10 +10680,7 @@
 	message = get_tv_string_chk(&argvars[0]);
 	if (argvars[1].v_type != VAR_UNKNOWN
 	    && (defstr = get_tv_string_buf_chk(&argvars[1], buf)) != NULL)
-	{
-	    STRNCPY(IObuff, defstr, IOSIZE);
-	    IObuff[IOSIZE - 1] = NUL;
-	}
+	    vim_strncpy(IObuff, defstr, IOSIZE - 1);
 	else
 	    IObuff[0] = NUL;
 	if (message != NULL && defstr != NULL
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index b3faec8..923faf9 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -5511,16 +5511,14 @@
         switch (dsc_line.type)
         {
         case PRT_DSC_TITLE_TYPE:
-            STRNCPY(resource->title, dsc_line.string, dsc_line.len);
-            resource->title[dsc_line.len] = '\0';
+            vim_strncpy(resource->title, dsc_line.string, dsc_line.len);
             seen_title = TRUE;
             if (seen_version)
                 seen_all = TRUE;
             break;
 
         case PRT_DSC_VERSION_TYPE:
-            STRNCPY(resource->version, dsc_line.string, dsc_line.len);
-            resource->version[dsc_line.len] = '\0';
+            vim_strncpy(resource->version, dsc_line.string, dsc_line.len);
             seen_version = TRUE;
             if (seen_title)
                 seen_all = TRUE;
@@ -5862,8 +5860,7 @@
     fontname = (char *)alloc(name_len + 1);
     if (fontname == NULL)
         return FALSE;
-    STRNCPY(fontname, name, name_len);
-    fontname[name_len] = '\0';
+    vim_strncpy((char_u *)fontname, name, name_len);
     prt_ps_mb_font.ps_fontname[font] = fontname;
 
     return TRUE;
@@ -5977,7 +5974,6 @@
     double      bottom;
 #ifdef FEAT_MBYTE
     int         cmap;
-    int         pmcs_len;
     char_u	*p_encoding;
     struct prt_ps_encoding_S *p_mbenc;
     struct prt_ps_encoding_S *p_mbenc_first;
@@ -6035,7 +6031,7 @@
     if (prt_out_mbyte)
     {
         /* Build CMap name - will be same for all multi-byte fonts used */
-        prt_cmap[0] = '\0';
+        prt_cmap[0] = NUL;
 
         prt_custom_cmap = prt_out_mbyte && p_mbchar == NULL;
 
@@ -6051,26 +6047,26 @@
             /* Add charset name if not empty */
             if (p_mbchar->cmap_charset != NULL)
             {
-                STRCAT(prt_cmap, p_mbchar->cmap_charset);
+                vim_strncpy((char_u *)prt_cmap,
+		      (char_u *)p_mbchar->cmap_charset, sizeof(prt_cmap) - 3);
                 STRCAT(prt_cmap, "-");
             }
         }
         else
         {
             /* Add custom CMap character set name */
-            pmcs_len = STRLEN(p_pmcs);
-            if (pmcs_len == 0)
+            if (*p_pmcs == NUL)
             {
                 EMSG(_("E674: printmbcharset cannot be empty with multi-byte encoding."));
                 return FALSE;
             }
-            STRNCPY(prt_cmap, p_pmcs, STRLEN(p_pmcs));
-            prt_cmap[pmcs_len] = '\0';
+            vim_strncpy((char_u *)prt_cmap, p_pmcs, sizeof(prt_cmap) - 3);
             STRCAT(prt_cmap, "-");
         }
 
         /* CMap name ends with (optional) encoding name and -H for horizontal */
-        if (p_mbenc->cmap_encoding != NULL)
+        if (p_mbenc->cmap_encoding != NULL && STRLEN(prt_cmap)
+		      + STRLEN(p_mbenc->cmap_encoding) + 3 < sizeof(prt_cmap))
         {
             STRCAT(prt_cmap, p_mbenc->cmap_encoding);
             STRCAT(prt_cmap, "-");
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 1192622..c96f114 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -3239,10 +3239,7 @@
 	}
 	ss = alloc((unsigned)len + 1);
 	if (ss)
-	{
-	    STRNCPY(ss, xp->xp_files[0], len);
-	    ss[len] = NUL;
-	}
+	    vim_strncpy(ss, xp->xp_files[0], (size_t)len);
 	findex = -1;			    /* next p_wc gets first one */
     }
 
@@ -3749,8 +3746,7 @@
 	retval = alloc(len + 4);
 	if (retval != NULL)
 	{
-	    STRNCPY(retval, fname, len);
-	    retval[len] = NUL;
+	    vim_strncpy(retval, fname, len);
 
 	    /*
 	     * Don't add a star to ~, ~user, $var or `cmd`.
diff --git a/src/fold.c b/src/fold.c
index 0380516..cccc17e 100644
--- a/src/fold.c
+++ b/src/fold.c
@@ -1809,10 +1809,7 @@
 	    return;
 	STRCPY(newline, line);
 	if (p == NULL)
-	{
-	    STRNCPY(newline + line_len, marker, markerlen);
-	    newline[line_len + markerlen] = NUL;
-	}
+	    vim_strncpy(newline + line_len, marker, markerlen);
 	else
 	{
 	    STRCPY(newline + line_len, cms);
diff --git a/src/gui_gtk.c b/src/gui_gtk.c
index 5bde791..cdd645b 100644
--- a/src/gui_gtk.c
+++ b/src/gui_gtk.c
@@ -1476,8 +1476,7 @@
 	const char *text;
 
 	text = gtk_entry_get_text(GTK_ENTRY(dialog_textentry));
-	STRNCPY(dialog_textfield, text, IOSIZE);
-	dialog_textfield[IOSIZE - 1] = NUL;
+	vim_strncpy(dialog_textfield, (char_u *)text, IOSIZE - 1);
     }
 
     /* Destroy the dialog, will break the waiting loop. */
@@ -2340,8 +2339,7 @@
 	    text = (char_u *)gtk_entry_get_text(GTK_ENTRY(entry));
 	    text = CONVERT_FROM_UTF8(text);
 
-	    STRNCPY(textfield, text, IOSIZE);
-	    textfield[IOSIZE - 1] = NUL;
+	    vim_strncpy(textfield, text, IOSIZE - 1);
 
 	    CONVERT_FROM_UTF8_FREE(text);
 	}
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index cd30609..d93f7bc 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -2325,9 +2325,9 @@
     /* Don't write messages to the GUI anymore */
     full_screen = FALSE;
 
-    STRNCPY(IObuff, _("Vim: Received \"die\" request from session manager\n"),
-	    IOSIZE);
-    IObuff[IOSIZE - 1] = NUL;
+    vim_strncpy(IObuff,
+		    _("Vim: Received \"die\" request from session manager\n"),
+	    IOSIZE - 1);
     preserve_exit();
 }
 
@@ -3527,9 +3527,9 @@
 
     if (!exiting) /* only do anything if the destroy was unexpected */
     {
-	STRNCPY(IObuff, _("Vim: Main window unexpectedly destroyed\n"),
-		IOSIZE);
-	IObuff[IOSIZE - 1] = NUL;
+	vim_strncpy(IObuff,
+		(char_u *)_("Vim: Main window unexpectedly destroyed\n"),
+		IOSIZE - 1);
 	preserve_exit();
     }
 }
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 11d0281..f0b4717 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -3592,8 +3592,7 @@
 	if (label == NULL)
 	    break;
 
-	STRNCPY(text, menu->name, nameLen);
-	text[nameLen] = NUL;
+	vim_strncpy(text, menu->name, nameLen);
 	text = vim_strchr(text, TAB);	    /* stop at TAB before actext */
 	if (text == NULL)
 	    text = label + nameLen;	    /* no actext, use whole name */
diff --git a/src/memline.c b/src/memline.c
index 47dc00d..d1cf71f 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -698,8 +698,7 @@
 	/* Systems that cannot translate "~user" back into a path: copy the
 	 * file name unmodified.  Do use slashes instead of backslashes for
 	 * portability. */
-	STRNCPY(b0p->b0_fname, buf->b_ffname, B0_FNAME_SIZE);
-	b0p->b0_fname[B0_FNAME_SIZE - 1] = NUL;
+	vim_strncpy(b0p->b0_fname, buf->b_ffname, B0_FNAME_SIZE - 1);
 # ifdef BACKSLASH_IN_FILENAME
 	forward_slash(b0p->b0_fname);
 # endif
@@ -721,10 +720,7 @@
 	    /* If there is no user name or it is too long, don't use "~/" */
 	    if (get_user_name(uname, B0_UNAME_SIZE) == FAIL
 			 || (ulen = STRLEN(uname)) + flen > B0_FNAME_SIZE - 1)
-	    {
-		STRNCPY(b0p->b0_fname, buf->b_ffname, B0_FNAME_SIZE);
-		b0p->b0_fname[B0_FNAME_SIZE - 1] = NUL;
-	    }
+		vim_strncpy(b0p->b0_fname, buf->b_ffname, B0_FNAME_SIZE - 1);
 	    else
 	    {
 		mch_memmove(b0p->b0_fname + ulen + 1, b0p->b0_fname + 1, flen);
diff --git a/src/menu.c b/src/menu.c
index 08a7314..6787056 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -1258,8 +1258,7 @@
 	    path_name = alloc((unsigned)(after_dot - arg));
 	    if (path_name == NULL)
 		return NULL;
-	    STRNCPY(path_name, arg, after_dot - arg - 1);
-	    path_name[after_dot - arg - 1] = NUL;
+	    vim_strncpy(path_name, arg, after_dot - arg - 1);
 	}
 	name = path_name;
 	while (name != NULL && *name)
diff --git a/src/misc1.c b/src/misc1.c
index 29be8e5..f0de593 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -976,8 +976,7 @@
 		lead_len = 0;
 	    else
 	    {
-		STRNCPY(leader, saved_line, lead_len);
-		leader[lead_len] = NUL;
+		vim_strncpy(leader, saved_line, lead_len);
 
 		/*
 		 * Replace leader with lead_repl, right or left adjusted
@@ -3345,8 +3344,7 @@
 	p = vim_strchr(var + 1, '%');
 	if (p != NULL)
 	{
-	    STRNCPY(NameBuff, var + 1, p - (var + 1));
-	    NameBuff[p - (var + 1)] = NUL;
+	    vim_strncpy(NameBuff, var + 1, p - (var + 1));
 	    exp = mch_getenv(NameBuff);
 	    if (exp != NULL && *exp != NUL
 					&& STRLEN(exp) + STRLEN(p) < MAXPATHL)
diff --git a/src/ops.c b/src/ops.c
index bbeedbf..8941941 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -2532,8 +2532,7 @@
 	{
 	    if ((ins_text = alloc_check((unsigned)(ins_len + 1))) != NULL)
 	    {
-		STRNCPY(ins_text, firstline + bd.textcol, ins_len);
-		ins_text[ins_len] = NUL;
+		vim_strncpy(ins_text, firstline + bd.textcol, (size_t)ins_len);
 		for (linenr = oap->start.lnum + 1; linenr <= oap->end.lnum;
 								     linenr++)
 		{
diff --git a/src/option.c b/src/option.c
index ab0740d..30341d6 100644
--- a/src/option.c
+++ b/src/option.c
@@ -4318,8 +4318,7 @@
 
 	if (errmsg != NULL)
 	{
-	    STRNCPY(IObuff, _(errmsg), IOSIZE - 1);
-	    IObuff[IOSIZE - 1] = NUL;
+	    vim_strncpy(IObuff, (char_u *)_(errmsg), IOSIZE - 1);
 	    i = STRLEN(IObuff) + 2;
 	    if (i + (arg - startarg) < IOSIZE)
 	    {
@@ -9365,7 +9364,7 @@
 	else if ((char_u **)opp->var == &p_pt)
 	    str2specialbuf(p_pt, NameBuff, MAXPATHL);
 	else
-	    STRNCPY(NameBuff, varp, MAXPATHL);
+	    vim_strncpy(NameBuff, varp, MAXPATHL - 1);
     }
 }
 
diff --git a/src/os_amiga.c b/src/os_amiga.c
index 8717825..2c2a770 100644
--- a/src/os_amiga.c
+++ b/src/os_amiga.c
@@ -626,7 +626,7 @@
     char_u  *s;
     int	    len;
 {
-    STRNCPY(s, "Amiga", len);
+    vim_strncpy(s, "Amiga", len - 1);
 }
 
 /*
@@ -690,7 +690,7 @@
 		{
 		    if (i < len - 1 && (i == 0 || buf[i - 1] != ':'))
 			buf[i++] = '/';
-		    STRNCPY(buf + i, fname, len - i);
+		    vim_strncpy(buf + i, fname, len - i - 1);
 		}
 	    }
 	}
diff --git a/src/os_qnx.c b/src/os_qnx.c
index 704061a..1a7250e 100644
--- a/src/os_qnx.c
+++ b/src/os_qnx.c
@@ -148,8 +148,7 @@
 #endif
 	    }
 
-	    STRNCPY( text_clip, str, len );
-	    text_clip[ len ] = NUL;
+	    vim_strncpy( text_clip, str, len );
 
 	    vim_clip[ 1 ] = NUL;
 
diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro
index 936f38f..3f6e2ed 100644
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -36,7 +36,7 @@
 void copy_spaces __ARGS((char_u *ptr, size_t count));
 void copy_chars __ARGS((char_u *ptr, size_t count, int c));
 void del_trailing_spaces __ARGS((char_u *ptr));
-void vim_strncpy __ARGS((char_u *to, char_u *from, int len));
+void vim_strncpy __ARGS((char_u *to, char_u *from, size_t len));
 int copy_option_part __ARGS((char_u **option, char_u *buf, int maxlen, char *sep_chars));
 void vim_free __ARGS((void *x));
 int vim_stricmp __ARGS((char *s1, char *s2));
diff --git a/src/structs.h b/src/structs.h
index b7f39fe..e238d0f 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1067,6 +1067,11 @@
     dict_T	*dv_used_prev;	/* previous dict in used dicts list */
 };
 
+/* values for b_syn_spell: what to do with toplevel text */
+#define SYNSPL_DEFAULT	0	/* spell check if @Spell not defined */
+#define SYNSPL_TOP	1	/* spell check toplevel text */
+#define SYNSPL_NOTOP	2	/* don't spell check toplevel text */
+
 
 /*
  * buffer: structure that holds information about one file
@@ -1429,6 +1434,7 @@
     hashtab_T	b_keywtab;		/* syntax keywords hash table */
     hashtab_T	b_keywtab_ic;		/* idem, ignore case */
     int		b_syn_ic;		/* ignore case for :syn cmds */
+    int		b_syn_spell;		/* SYNSPL_ values */
     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 */
diff --git a/src/syntax.c b/src/syntax.c
index 4ecec9b..54a5061 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -396,6 +396,7 @@
 static int syn_regexec __ARGS((regmmatch_T *rmp, linenr_T lnum, colnr_T col));
 static int check_keyword_id __ARGS((char_u *line, int startcol, int *endcol, long *flags, short **next_list, stateitem_T *cur_si));
 static void syn_cmd_case __ARGS((exarg_T *eap, int syncing));
+static void syn_cmd_spell __ARGS((exarg_T *eap, int syncing));
 static void syntax_sync_clear __ARGS((void));
 static void syn_remove_pattern __ARGS((buf_T *buf, int idx));
 static void syn_clear_pattern __ARGS((buf_T *buf, int i));
@@ -1698,6 +1699,17 @@
     if (syn_buf->b_sst_array == NULL)
 	return 0;
 
+    /* After 'synmaxcol' the attribute is always zero. */
+    if (syn_buf->b_p_smc > 0 && col >= syn_buf->b_p_smc)
+    {
+	clear_current_state();
+#ifdef FEAT_EVAL
+	current_id = 0;
+	current_trans_id = 0;
+#endif
+	return 0;
+    }
+
     /* Make sure current_state is valid */
     if (INVALID_STATE(&current_state))
 	validate_current_state();
@@ -2189,13 +2201,12 @@
 	     * set "can_spell" to TRUE if spell checking is supposed to be
 	     * done in the current item.
 	     */
-
 	    if (syn_buf->b_spell_cluster_id == 0)
 	    {
 		/* There is no @Spell cluster: Do spelling for items without
 		 * @NoSpell cluster. */
 		if (syn_buf->b_nospell_cluster_id == 0 || current_trans_id == 0)
-		    *can_spell = TRUE;
+		    *can_spell = (syn_buf->b_syn_spell != SYNSPL_NOTOP);
 		else
 		{
 		    sps.inc_tag = 0;
@@ -2207,9 +2218,11 @@
 	    else
 	    {
 		/* The @Spell cluster is defined: Do spelling in items with
-		 * the @Spell cluster.  But not when @NoSpell is also there. */
+		 * the @Spell cluster.  But not when @NoSpell is also there.
+		 * At the toplevel only spell check when ":syn spell toplevel"
+		 * was used. */
 		if (current_trans_id == 0)
-		    *can_spell = FALSE;
+		    *can_spell = (syn_buf->b_syn_spell == SYNSPL_TOP);
 		else
 		{
 		    sps.inc_tag = 0;
@@ -2248,8 +2261,11 @@
 	}
     }
     else if (can_spell != NULL)
-	/* Only do spelling when there is no @Spell cluster. */
-	*can_spell = (syn_buf->b_spell_cluster_id == 0);
+	/* Default: Only do spelling when there is no @Spell cluster or when
+	 * ":syn spell toplevel" was used. */
+	*can_spell = syn_buf->b_syn_spell == SYNSPL_DEFAULT
+		    ? (syn_buf->b_spell_cluster_id == 0)
+		    : (syn_buf->b_syn_spell == SYNSPL_TOP);
 
     /* nextgroup ends at end of line, unless "skipnl" or "skipemtpy" present */
     if (current_next_list != NULL
@@ -3050,8 +3066,7 @@
      * Must make a copy of the keyword, so we can add a NUL and make it
      * lowercase.
      */
-    STRNCPY(keyword, kwp, kwlen);
-    keyword[kwlen] = NUL;
+    vim_strncpy(keyword, kwp, kwlen);
 
     /*
      * Try twice:
@@ -3120,6 +3135,33 @@
 }
 
 /*
+ * Handle ":syntax spell" command.
+ */
+/* ARGSUSED */
+    static void
+syn_cmd_spell(eap, syncing)
+    exarg_T	*eap;
+    int		syncing;	    /* not used */
+{
+    char_u	*arg = eap->arg;
+    char_u	*next;
+
+    eap->nextcmd = find_nextcmd(arg);
+    if (eap->skip)
+	return;
+
+    next = skiptowhite(arg);
+    if (STRNICMP(arg, "toplevel", 8) == 0 && next - arg == 8)
+	curbuf->b_syn_spell = SYNSPL_TOP;
+    else if (STRNICMP(arg, "notoplevel", 10) == 0 && next - arg == 10)
+	curbuf->b_syn_spell = SYNSPL_NOTOP;
+    else if (STRNICMP(arg, "default", 4) == 0 && next - arg == 4)
+	curbuf->b_syn_spell = SYNSPL_DEFAULT;
+    else
+	EMSG2(_("E390: Illegal argument: %s"), arg);
+}
+
+/*
  * Clear all syntax info for one buffer.
  */
     void
@@ -3129,6 +3171,7 @@
     int i;
 
     buf->b_syn_ic = FALSE;	    /* Use case, by default */
+    buf->b_syn_spell = SYNSPL_DEFAULT; /* default spell checking */
     buf->b_syn_containedin = FALSE;
 
     /* free the keywords */
@@ -5519,8 +5562,7 @@
 		failed = TRUE;
 		break;
 	    }
-	    STRNCPY(name + 1, p, end - p);
-	    name[end - p + 1] = NUL;
+	    vim_strncpy(name + 1, p, end - p);
 	    if (       STRCMP(name + 1, "ALLBUT") == 0
 		    || STRCMP(name + 1, "ALL") == 0
 		    || STRCMP(name + 1, "TOP") == 0
@@ -5806,6 +5848,7 @@
     {"off",		syn_cmd_off},
     {"region",		syn_cmd_region},
     {"reset",		syn_cmd_reset},
+    {"spell",		syn_cmd_spell},
     {"sync",		syn_cmd_sync},
     {"",		syn_cmd_list},
     {NULL, NULL}
@@ -8131,8 +8174,7 @@
     /* Avoid using stricmp() too much, it's slow on some systems */
     /* Avoid alloc()/free(), these are slow too.  ID names over 200 chars
      * don't deserve to be found! */
-    STRNCPY(name_u, name, 199);
-    name_u[199] = NUL;
+    vim_strncpy(name_u, name, 199);
     vim_strup(name_u);
     for (i = highlight_ga.ga_len; --i >= 0; )
 	if (HL_TABLE()[i].sg_name_u != NULL
diff --git a/src/testdir/test51.in b/src/testdir/test51.in
index a158c86..49c88ec 100644
--- a/src/testdir/test51.in
+++ b/src/testdir/test51.in
@@ -29,6 +29,8 @@
 :%s/ctermbg=\d*/ctermbg=3/
 :" filter out possibly translated error message
 :%s/E475: [^:]*:/E475:/
+:" fix the fileformat
+:set ff&
 :wq!
 ENDTEST
 
diff --git a/src/testdir/test58.in b/src/testdir/test58.in
index 9e14270..e03c8e0 100644
--- a/src/testdir/test58.in
+++ b/src/testdir/test58.in
@@ -7,9 +7,9 @@
 :set enc=latin1
 :e!
 :" First generate a .spl file from a .dic and a .aff file.
-gg:/^affstart1/+1,/^affend1/-1w Xtest.aff
-gg:/^dicstart/+1,/^dicend/-1w Xtest.dic
-:mkspell Xtest Xtest
+gg:/^affstart1/+1,/^affend1/-1w! Xtest.aff
+gg:/^dicstart/+1,/^dicend/-1w! Xtest.dic
+:mkspell! Xtest Xtest
 :"
 :" use that spell file
 :set spl=Xtest.latin1.spl
@@ -71,30 +71,29 @@
 :" also use an addition file
 gg:/^addstart/+1,/^addend/-1w! Xtest.latin1.add
 :mkspell! Xtest.latin1.add.spl Xtest.latin1.add
-:set spl=en
 :set spellfile=Xtest.latin1.add
 /^test2:
 ]s:let str = spellbadword()
 :$put =str
-:set spl=en_us
+:set spl=Xtest_us.latin1.spl
 /^test2:
 ]smm:let str = spellbadword()
 :$put =str
 `m]s:let str = spellbadword()
 :$put =str
-:set spl=en_gb
+:set spl=Xtest_gb.latin1.spl
 /^test2:
 ]smm:let str = spellbadword()
 :$put =str
 `m]s:let str = spellbadword()
 :$put =str
-:set spl=en_nz
+:set spl=Xtest_nz.latin1.spl
 /^test2:
 ]smm:let str = spellbadword()
 :$put =str
 `m]s:let str = spellbadword()
 :$put =str
-:set spl=en_ca
+:set spl=Xtest_ca.latin1.spl
 /^test2:
 ]smm:let str = spellbadword()
 :$put =str
diff --git a/src/version.c b/src/version.c
index e52839c..165ead0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -1159,11 +1159,9 @@
 
     if (*mesg == ' ')
     {
-	STRNCPY(modby, _("Modified by "), MODBY_LEN);
-	modby[MODBY_LEN - 1] = NUL;
+	vim_strncpy(modby, _("Modified by "), MODBY_LEN - 1);
 	l = STRLEN(modby);
-	STRNCPY(modby + l, MODIFIED_BY, MODBY_LEN - l);
-	modby[MODBY_LEN - 1] = NUL;
+	vim_strncpy(modby + l, MODIFIED_BY, MODBY_LEN - l - 1);
 	mesg = modby;
     }
 #endif
diff --git a/src/version.h b/src/version.h
index 1fa3fba..a5695f7 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 Jul 12)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 12, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 18)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 18, compiled "