diff -r ed91a48e42dc src/edit.c
--- a/src/edit.c	Fri Sep 16 09:21:04 2011 +0900
+++ b/src/edit.c	Sun Sep 18 21:53:36 2011 +0900
@@ -5241,6 +5241,38 @@
 	else
 	    edit_submode = (char_u *)_(CTRL_X_MSG(ctrl_x_mode));
 
+	/*
+	 * If any of the original typed text has been changed, we must add
+	 * back-spaces to the redo buffer.
+	 *
+	 * (This code block was copied from at line 3721 in this file, and
+	 *  arranged.)
+	 */
+	{
+	    char_u  *ptr;
+	    char_u  *p;
+	    int	    temp = 0;
+
+	    if (compl_leader != NULL)
+		ptr = compl_leader;
+	    else
+		ptr = compl_orig_text;
+	    if (compl_orig_text != NULL)
+	    {
+		p = compl_orig_text;
+		for (temp = 0; p[temp] != NUL && p[temp] == ptr[temp]; ++temp)
+		    ;
+#ifdef FEAT_MBYTE
+		if (temp > 0)
+		    temp -= (*mb_head_off)(compl_orig_text, p + temp);
+#endif
+		for (p += temp; *p != NUL; mb_ptr_adv(p))
+		    AppendCharToRedobuff(K_BS);
+	    }
+	    if (ptr != NULL)
+		AppendToRedobuffLit(ptr + temp, -1);
+	}
+
 	/* Always add completion for the original text. */
 	vim_free(compl_orig_text);
 	compl_orig_text = vim_strnsave(line + compl_col, compl_length);
