updated for version 7.0101
diff --git a/src/spell.c b/src/spell.c
index f8b8460..015a710 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -607,7 +607,7 @@
 static int set_spell_chartab __ARGS((char_u *fol, char_u *low, char_u *upp));
 static void write_spell_chartab __ARGS((FILE *fd));
 static int spell_casefold __ARGS((char_u *p, int len, char_u *buf, int buflen));
-static void spell_find_suggest __ARGS((char_u *badptr, suginfo_T *su, int maxcount, int banbadword));
+static void spell_find_suggest __ARGS((char_u *badptr, suginfo_T *su, int maxcount, int banbadword, int need_cap));
 #ifdef FEAT_EVAL
 static void spell_suggest_expr __ARGS((suginfo_T *su, char_u *expr));
 #endif
@@ -5952,6 +5952,10 @@
     suginfo_T	sug;
     suggest_T	*stp;
     int		mouse_used;
+    int		need_cap;
+    regmatch_T	regmatch;
+    int		endcol;
+    char_u	*line_copy = NULL;
 
     /* Find the start of the badly spelled word. */
     if (spell_move_to(FORWARD, TRUE, TRUE) == FAIL
@@ -5983,8 +5987,62 @@
     /* Get the word and its length. */
     line = ml_get_curline();
 
+    /* Figure out if the word should be capitalised. */
+    need_cap = FALSE;
+    if (curbuf->b_cap_prog != NULL)
+    {
+	endcol = 0;
+	if (skipwhite(line) - line == curwin->w_cursor.col)
+	{
+	    /* At start of line, check if previous line is empty or sentence
+	     * ends there. */
+	    if (curwin->w_cursor.lnum == 1)
+		need_cap = TRUE;
+	    else
+	    {
+		line = ml_get(curwin->w_cursor.lnum - 1);
+		if (*skipwhite(line) == NUL)
+		    need_cap = TRUE;
+		else
+		{
+		    /* Append a space in place of the line break. */
+		    line_copy = concat_str(line, (char_u *)" ");
+		    line = line_copy;
+		    endcol = STRLEN(line);
+		}
+	    }
+	}
+	else
+	    endcol = curwin->w_cursor.col;
+
+	if (endcol > 0)
+	{
+	    /* Check if sentence ends before the bad word. */
+	    regmatch.regprog = curbuf->b_cap_prog;
+	    regmatch.rm_ic = FALSE;
+	    p = line + endcol;
+	    for (;;)
+	    {
+		mb_ptr_back(line, p);
+		if (p == line || SPELL_ISWORDP(p))
+		    break;
+		if (vim_regexec(&regmatch, p, 0)
+					 && regmatch.endp[0] == line + endcol)
+		{
+		    need_cap = TRUE;
+		    break;
+		}
+	    }
+	}
+
+	/* get the line again, we may have been using the previous one */
+	line = ml_get_curline();
+	vim_free(line_copy);
+    }
+
     /* Get the list of suggestions */
-    spell_find_suggest(line + curwin->w_cursor.col, &sug, (int)Rows - 2, TRUE);
+    spell_find_suggest(line + curwin->w_cursor.col, &sug, (int)Rows - 2,
+							      TRUE, need_cap);
 
     if (sug.su_ga.ga_len == 0)
 	MSG(_("Sorry, no suggestions"));
@@ -6159,7 +6217,7 @@
     suggest_T	*stp;
     char_u	*wcopy;
 
-    spell_find_suggest(word, &sug, maxcount, FALSE);
+    spell_find_suggest(word, &sug, maxcount, FALSE, FALSE);
 
     /* Make room in "gap". */
     ga_init2(gap, sizeof(char_u *), sug.su_ga.ga_len + 1);
@@ -6192,11 +6250,12 @@
  * This is based on the mechanisms of Aspell, but completely reimplemented.
  */
     static void
-spell_find_suggest(badptr, su, maxcount, banbadword)
+spell_find_suggest(badptr, su, maxcount, banbadword, need_cap)
     char_u	*badptr;
     suginfo_T	*su;
     int		maxcount;
     int		banbadword;	/* don't include badword in suggestions */
+    int		need_cap;	/* word should start with capital */
 {
     int		attr = 0;
     char_u	buf[MAXPATHL];
@@ -6230,6 +6289,8 @@
 						    su->su_fbadword, MAXWLEN);
     /* get caps flags for bad word */
     su->su_badflags = captype(su->su_badptr, su->su_badptr + su->su_badlen);
+    if (need_cap)
+	su->su_badflags |= WF_ONECAP;
 
     /* If the word is not capitalised and spell_check() doesn't consider the
      * word to be bad then it might need to be capitalised.  Add a suggestion
@@ -6237,7 +6298,7 @@
 #ifdef FEAT_MBYTE
     c = mb_ptr2char(su->su_badptr);
 #else
-    c = *p;
+    c = *su->su_badptr;
 #endif
     if (!SPELL_ISUPPER(c) && attr == 0)
     {
@@ -7972,6 +8033,7 @@
 				    char_u	*p;
 				    int		score;
 
+				    flags |= su->su_badflags;
 				    if (round == 1 && (flags & WF_CAPMASK) != 0)
 				    {
 					/* Need to fix case according to