diff --git a/src/term.c b/src/term.c
index 95c29cc..a1ab537 100644
--- a/src/term.c
+++ b/src/term.c
@@ -153,11 +153,6 @@
 static char_u *vim_tgetstr __ARGS((char *s, char_u **pp));
 #endif /* HAVE_TGETENT */
 
-#if defined(FEAT_TERMRESPONSE)
-static int xt_index_in = 0;
-static int xt_index_out = 0;
-#endif
-
 static int  detected_8bit = FALSE;	/* detected 8-bit terminal */
 
 static struct builtin_term builtin_termcaps[] =
@@ -3312,40 +3307,6 @@
 }
 
 #if defined(FEAT_TERMRESPONSE) || defined(PROTO)
-# if defined(UNIX) || defined(PROTO)
-/*
- * Return TRUE when the xterm version was requested or anything else that
- * would send an ESC sequence back to Vim.
- * If not sent yet, prevent it from being sent soon.
- * Used to check whether it is OK to enable checking for DEC mouse codes,
- * which conflict with may xterm ESC sequences.
- */
-    int
-did_request_esc_sequence()
-{
-    if (crv_status == CRV_GET)
-	crv_status = 0;
-    if (u7_status == U7_GET)
-	u7_status = 0;
-    return crv_status == CRV_SENT || u7_status == U7_SENT
-						|| xt_index_out > xt_index_in;
-}
-
-/*
- * If requesting the version was disabled in did_request_esc_sequence(),
- * enable it again.
- */
-    void
-resume_get_esc_sequence()
-{
-    if (crv_status == 0)
-	crv_status = CRV_GET;
-    if (u7_status == 0)
-	u7_status = U7_GET;
-}
-# endif
-
-
 /*
  * Request version string (for xterm) when needed.
  * Only do this after switching to raw mode, otherwise the result will be
@@ -3358,8 +3319,6 @@
  * Insert mode.
  * On Unix only do it when both output and input are a tty (avoid writing
  * request to terminal while reading from a file).
- * Do not do this when a mouse is being detected that starts with the same ESC
- * sequence as the termresponse.
  * The result is caught in check_termcode().
  */
     void
@@ -3373,7 +3332,6 @@
 # ifdef UNIX
 	    && isatty(1)
 	    && isatty(read_cmd_fd)
-	    && !xterm_conflict_mouse
 # endif
 	    && *T_CRV != NUL)
     {
@@ -3742,8 +3700,8 @@
 #if defined(WIN3264) && !defined(FEAT_GUI)
     if (s[0] == K_NUL)
     {
-        STRMOVE(s + 1, s);
-        s[1] = 3;
+	STRMOVE(s + 1, s);
+	s[1] = 3;
     }
 #endif
 
@@ -4212,24 +4170,31 @@
 
 #ifdef FEAT_TERMRESPONSE
 	if (key_name[0] == NUL
-	    /* URXVT mouse uses <ESC>[#;#;#M, but we are matching <ESC>[ */
-	    || key_name[0] == KS_URXVT_MOUSE
-# ifdef FEAT_MBYTE
-	    || u7_status == U7_SENT
+	    /* Mouse codes of DEC, pterm, and URXVT start with <ESC>[.  When
+	     * detecting the start of these mouse codes they might as well be
+	     * another key code or terminal response. */
+# ifdef FEAT_MOUSE_DEC
+	    || key_name[0] == KS_DEC_MOUSE
 # endif
-            )
+# ifdef FEAT_MOUSE_PTERM
+	    || key_name[0] == KS_PTERM_MOUSE
+# endif
+# ifdef FEAT_MOUSE_URXVT
+	    || key_name[0] == KS_URXVT_MOUSE
+# endif
+	   )
 	{
-	    /* Check for some responses from terminal start with "<Esc>[" or
-	     * CSI.
+	    /* Check for some responses from the terminal starting with
+	     * "<Esc>[" or CSI:
 	     *
-	     * - xterm version string: <Esc>[>{x};{vers};{y}c
+	     * - Xterm version string: <Esc>[>{x};{vers};{y}c
 	     *   Also eat other possible responses to t_RV, rxvt returns
 	     *   "<Esc>[?1;2c". Also accept CSI instead of <Esc>[.
 	     *   mrxvt has been reported to have "+" in the version. Assume
 	     *   the escape sequence ends with a letter or one of "{|}~".
 	     *
-	     * - cursor position report: <Esc>[{row};{col}R
-	     *   The final byte is 'R'. now it is only used for checking for
+	     * - Cursor position report: <Esc>[{row};{col}R
+	     *   The final byte must be 'R'. It is used for checking the
 	     *   ambiguous-width character state.
 	     */
 	    p = tp[0] == CSI ? tp + 1 : tp + 2;
@@ -4269,36 +4234,42 @@
 		 * u7_status is not "sent", it may be from a previous Vim that
 		 * just exited.  But not for <S-F3>, it sends something
 		 * similar, check for row and column to make sense. */
-		if (j == 1 && tp[i] == 'R' && row_char == '2' && col >= 2)
+		if (j == 1 && tp[i] == 'R')
 		{
-		    char *aw = NULL;
-
-		    LOG_TR("Received U7 status");
-		    u7_status = U7_GOT;
-# ifdef FEAT_AUTOCMD
-		    did_cursorhold = TRUE;
-# endif
-		    if (col == 2)
-			aw = "single";
-		    else if (col == 3)
-			aw = "double";
-		    if (aw != NULL && STRCMP(aw, p_ambw) != 0)
+		    if (row_char == '2' && col >= 2)
 		    {
-			/* Setting the option causes a screen redraw. Do that
-			 * right away if possible, keeping any messages. */
-			set_option_value((char_u *)"ambw", 0L, (char_u *)aw, 0);
-# ifdef DEBUG_TERMRESPONSE
-			{
-			    char buf[100];
-			    int  r = redraw_asap(CLEAR);
+			char *aw = NULL;
 
-			    sprintf(buf, "set 'ambiwidth', redraw_asap(): %d",
-									   r);
-			    log_tr(buf);
-			}
-# else
-			redraw_asap(CLEAR);
+			LOG_TR("Received U7 status");
+			u7_status = U7_GOT;
+# ifdef FEAT_AUTOCMD
+			did_cursorhold = TRUE;
 # endif
+			if (col == 2)
+			    aw = "single";
+			else if (col == 3)
+			    aw = "double";
+			if (aw != NULL && STRCMP(aw, p_ambw) != 0)
+			{
+			    /* Setting the option causes a screen redraw. Do
+			     * that right away if possible, keeping any
+			     * messages. */
+			    set_option_value((char_u *)"ambw", 0L,
+					     (char_u *)aw, 0);
+# ifdef DEBUG_TERMRESPONSE
+			    {
+				char buf[100];
+				int  r = redraw_asap(CLEAR);
+
+				sprintf(buf,
+					"set 'ambiwidth', redraw_asap(): %d",
+					r);
+				log_tr(buf);
+			    }
+# else
+			    redraw_asap(CLEAR);
+# endif
+			}
 		    }
 		    key_name[0] = (int)KS_EXTRA;
 		    key_name[1] = (int)KE_IGNORE;
@@ -4563,19 +4534,19 @@
 			return -1;
 
 		    /* when mouse reporting is SGR, add 32 to mouse code */
-                    if (key_name[0] == KS_SGR_MOUSE)
-                        mouse_code += 32;
+		    if (key_name[0] == KS_SGR_MOUSE)
+			mouse_code += 32;
 
 		    mouse_col = getdigits(&p) - 1;
 		    if (*p++ != ';')
 			return -1;
 
 		    mouse_row = getdigits(&p) - 1;
-                    if (key_name[0] == KS_SGR_MOUSE && *p == 'm')
+		    if (key_name[0] == KS_SGR_MOUSE && *p == 'm')
 			mouse_code |= MOUSE_RELEASE;
-                    else if (*p != 'M')
+		    else if (*p != 'M')
 			return -1;
-                    p++;
+		    p++;
 
 		    slen += (int)(p - (tp + slen));
 
@@ -4592,7 +4563,7 @@
 			for (slen2 = slen; slen2 < len; slen2++)
 			{
 			    if (tp[slen2] == 'M'
-                                || (key_name[0] == KS_SGR_MOUSE
+				    || (key_name[0] == KS_SGR_MOUSE
 							 && tp[slen2] == 'm'))
 			    {
 				cmd_complete = 1;
@@ -5769,6 +5740,9 @@
  * termcap codes from the terminal itself.
  * We get them one by one to avoid a very long response string.
  */
+static int xt_index_in = 0;
+static int xt_index_out = 0;
+
     static void
 req_codes_from_term()
 {
