updated for version 7.4.186
Problem:    Insert in Visual mode sometimes gives incorrect results.
            (Dominique Pelle)
Solution:   Remember the original insert start position. (Christian Brabandt,
            Dominique Pelle)
diff --git a/src/edit.c b/src/edit.c
index 29d8d3e..57bd776 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -264,6 +264,7 @@
 
 static colnr_T	Insstart_textlen;	/* length of line when insert started */
 static colnr_T	Insstart_blank_vcol;	/* vcol for first inserted blank */
+static int	update_Insstart_orig = TRUE; /* set Insstart_orig to Insstart */
 
 static char_u	*last_insert = NULL;	/* the text of the previous insert,
 					   K_SPECIAL and CSI are escaped */
@@ -340,6 +341,9 @@
      * error message */
     check_for_delay(TRUE);
 
+    /* set Insstart_orig to Insstart */
+    update_Insstart_orig = TRUE;
+
 #ifdef HAVE_SANDBOX
     /* Don't allow inserting in the sandbox. */
     if (sandbox != 0)
@@ -631,6 +635,9 @@
 	if (arrow_used)	    /* don't repeat insert when arrow key used */
 	    count = 0;
 
+	if (update_Insstart_orig)
+	    Insstart_orig = Insstart;
+
 	if (stop_insert_mode)
 	{
 	    /* ":stopinsert" used or 'insertmode' reset */
@@ -6923,6 +6930,7 @@
     if (end_insert_pos != NULL)
     {
 	curbuf->b_op_start = Insstart;
+	curbuf->b_op_start_orig = Insstart_orig;
 	curbuf->b_op_end = *end_insert_pos;
     }
 }
@@ -8257,6 +8265,7 @@
 
 		  /* Need to reset Insstart, esp. because a BS that joins
 		   * a line to the previous one must save for undo. */
+		  update_Insstart_orig = FALSE;
 		  Insstart = curwin->w_cursor;
 		  break;