updated for version 7.0226
diff --git a/src/buffer.c b/src/buffer.c
index 44aac34..7e848f6 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3017,15 +3017,23 @@
 	if (*p_titlestring != NUL)
 	{
 #ifdef FEAT_STL_OPT
-	    int	    use_sandbox = FALSE;
+	    if (stl_syntax & STL_IN_TITLE)
+	    {
+		int	use_sandbox = FALSE;
+		int	save_called_emsg = called_emsg;
 
 # ifdef FEAT_EVAL
-	    use_sandbox = was_set_insecurely((char_u *)"titlestring", 0);
+		use_sandbox = was_set_insecurely((char_u *)"titlestring", 0);
 # endif
-	    if (stl_syntax & STL_IN_TITLE)
+		called_emsg = FALSE;
 		build_stl_str_hl(curwin, t_str, sizeof(buf),
 					      p_titlestring, use_sandbox,
 					      0, maxlen, NULL, NULL);
+		if (called_emsg)
+		    set_string_option_direct((char_u *)"titlestring", -1,
+					   (char_u *)"", OPT_FREE, SID_ERROR);
+		called_emsg |= save_called_emsg;
+	    }
 	    else
 #endif
 		t_str = p_titlestring;
@@ -3114,15 +3122,23 @@
 	if (*p_iconstring != NUL)
 	{
 #ifdef FEAT_STL_OPT
-	    int	    use_sandbox = FALSE;
+	    if (stl_syntax & STL_IN_ICON)
+	    {
+		int	use_sandbox = FALSE;
+		int	save_called_emsg = called_emsg;
 
 # ifdef FEAT_EVAL
-	    use_sandbox = was_set_insecurely((char_u *)"iconstring", 0);
+		use_sandbox = was_set_insecurely((char_u *)"iconstring", 0);
 # endif
-	    if (stl_syntax & STL_IN_ICON)
+		called_emsg = FALSE;
 		build_stl_str_hl(curwin, i_str, sizeof(buf),
 						    p_iconstring, use_sandbox,
 						    0, 0, NULL, NULL);
+		if (called_emsg)
+		    set_string_option_direct((char_u *)"iconstring", -1,
+					   (char_u *)"", OPT_FREE, SID_ERROR);
+		called_emsg |= save_called_emsg;
+	    }
 	    else
 #endif
 		i_str = p_iconstring;
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 3ba0d37..cfb55df 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -8196,7 +8196,10 @@
 ex_undo(eap)
     exarg_T	*eap;
 {
-    u_undo(1);
+    if (eap->addr_count == 1)	    /* :undo 123 */
+	undo_time(eap->line2, FALSE, TRUE);
+    else
+	u_undo(1);
 }
 
 /*
@@ -8238,7 +8241,7 @@
     if (*p != NUL)
 	EMSG2(_(e_invarg2), eap->arg);
     else
-	undo_time(eap->cmdidx == CMD_earlier ? -count : count, sec);
+	undo_time(eap->cmdidx == CMD_earlier ? -count : count, sec, FALSE);
 }
 
 /*
diff --git a/src/gui.c b/src/gui.c
index 0a2286b..07d7788 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -4394,6 +4394,10 @@
     win_T	*wp;
     char_u	st[6];
 
+    /* Ignore this while still starting up. */
+    if (!gui.in_use || gui.starting)
+	return;
+
 #ifdef FEAT_MOUSESHAPE
     /* Get window pointer, and update mouse shape as well. */
     wp = xy2win(x, y);
diff --git a/src/normal.c b/src/normal.c
index cf82d68..aae515c 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -8009,7 +8009,8 @@
     case '+':
     case '-': /* "g+" and "g-": undo or redo along the timeline */
 	if (!checkclearopq(oap))
-	    undo_time(cap->nchar == '-' ? -cap->count1 : cap->count1, FALSE);
+	    undo_time(cap->nchar == '-' ? -cap->count1 : cap->count1,
+								FALSE, FALSE);
 	break;
 
     default:
diff --git a/src/proto/undo.pro b/src/proto/undo.pro
index 01ef518..58c6db8 100644
--- a/src/proto/undo.pro
+++ b/src/proto/undo.pro
@@ -6,8 +6,9 @@
 int u_savedel __ARGS((linenr_T lnum, long nlines));
 void u_undo __ARGS((int count));
 void u_redo __ARGS((int count));
-void undo_time __ARGS((long step, int sec));
+void undo_time __ARGS((long step, int sec, int absolute));
 void u_sync __ARGS((void));
+void ex_undolist __ARGS((exarg_T *eap));
 void ex_undojoin __ARGS((exarg_T *eap));
 void u_unchanged __ARGS((buf_T *buf));
 void u_clearall __ARGS((buf_T *buf));