diff --git ../vim-7.3.353/src/option.c src/option.c
index f76b0f9..8afd714 100644
--- ../vim-7.3.353/src/option.c
+++ src/option.c
@@ -3011,6 +3011,7 @@ static void set_option_scriptID_idx __ARGS((int opt_idx, int opt_flags, int id))
 #endif
 static char_u *set_bool_option __ARGS((int opt_idx, char_u *varp, int value, int opt_flags));
 static char_u *set_num_option __ARGS((int opt_idx, char_u *varp, long value, char_u *errbuf, size_t errbuflen, int opt_flags));
+static int is_safe_option_on_curswant __ARGS((char_u *varp));
 static void check_redraw __ARGS((long_u flags));
 static int findoption __ARGS((char_u *));
 static int find_key_option __ARGS((char_u *));
@@ -8520,7 +8521,7 @@ set_num_option(opt_idx, varp, value, errbuf, errbuflen, opt_flags)
     options[opt_idx].flags |= P_WAS_SET;
 
     comp_col();			    /* in case 'columns' or 'ls' changed */
-    if (curwin->w_curswant != MAXCOL)
+    if (curwin->w_curswant != MAXCOL && !is_safe_option_on_curswant(varp))
 	curwin->w_set_curswant = TRUE;  /* in case 'tabstop' changed */
     check_redraw(options[opt_idx].flags);
 
@@ -8528,6 +8529,21 @@ set_num_option(opt_idx, varp, value, errbuf, errbuflen, opt_flags)
 }
 
 /*
+ * Check whether an option does affect to cursor position or not.
+ * Return 1 for option without side effect, or 0 for option with side effect.
+ */
+    static int
+is_safe_option_on_curswant(varp)
+    char_u	*varp;			/* pointer to the option variable */
+{
+    return (
+	varp == (char_u *)&p_tm		/* 'timeoutlen' */
+	|| varp == (char_u *)&p_ttm	/* 'ttimeoutlen' */
+	/* TODO: List more safe options. */
+    );
+}
+
+/*
  * Called after an option changed: check if something needs to be redrawn.
  */
     static void
diff --git ../vim-7.3.353/src/testdir/Makefile src/testdir/Makefile
index a1cc22d..405ebd4 100644
--- ../vim-7.3.353/src/testdir/Makefile
+++ src/testdir/Makefile
@@ -26,7 +26,8 @@ SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
 		test64.out test65.out test66.out test67.out test68.out \
 		test69.out test70.out test71.out test72.out test73.out \
 		test74.out test75.out test76.out test77.out test78.out \
-		test79.out test80.out test81.out test82.out test83.out
+		test79.out test80.out test81.out test82.out test83.out \
+		test84.out
 
 SCRIPTS_GUI = test16.out
 
diff --git ../vim-7.3.353/src/testdir/test84.in src/testdir/test84.in
new file mode 100644
index 0000000..b7a816e
--- /dev/null
+++ src/testdir/test84.in
@@ -0,0 +1,33 @@
+Tests for curswant change on setting options
+
+STARTTEST
+:/^start target options$/+1,/^end target options$/-1 yank
+:let target_option_names = split(@0)
+:function TestCurswant(option_name)
+:  normal! ggf8j
+:  let curswant_before = winsaveview().curswant
+:  execute 'let' '&'.a:option_name '=' '&'.a:option_name
+:  let curswant_after = winsaveview().curswant
+:  return [a:option_name, curswant_before, curswant_after]
+:endfunction
+:
+:new
+:put =['1234567890', '12345']
+:1 delete _
+:let result = []
+:for option_name in target_option_names
+:  call add(result, TestCurswant(option_name))
+:endfor
+:
+:new
+:put =map(copy(result), 'join(v:val, '' '')')
+:1 delete _
+:write test.out
+:
+:qall!
+ENDTEST
+
+start target options
+	timeoutlen
+	ttimeoutlen
+end target options
diff --git ../vim-7.3.353/src/testdir/test84.ok src/testdir/test84.ok
new file mode 100644
index 0000000..bc383a6
--- /dev/null
+++ src/testdir/test84.ok
@@ -0,0 +1,2 @@
+timeoutlen 7 7
+ttimeoutlen 7 7
