diff --git a/gdb/infrun.c b/gdb/infrun.c
index 105862a..4c9979f 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -3178,7 +3178,7 @@ wait_for_inferior (void)
 static void
 reinstall_readline_callback_handler_cleanup (void *arg)
 {
-  if (async_command_editing_p && !sync_execution)
+  if (interpreter_async && async_command_editing_p && !sync_execution)
     gdb_rl_callback_handler_reinstall ();
 }
 
diff --git a/gdb/testsuite/gdb.base/batch-preserve-term-settings.c b/gdb/testsuite/gdb.base/batch-preserve-term-settings.c
new file mode 100644
index 0000000..7e362b2
--- /dev/null
+++ b/gdb/testsuite/gdb.base/batch-preserve-term-settings.c
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2015 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+int
+main (void)
+{
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/batch-preserve-term-settings.exp b/gdb/testsuite/gdb.base/batch-preserve-term-settings.exp
new file mode 100644
index 0000000..834e7a9
--- /dev/null
+++ b/gdb/testsuite/gdb.base/batch-preserve-term-settings.exp
@@ -0,0 +1,186 @@
+# Copyright (C) 2015 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Check that "gdb -batch -ex run" does not leave the terminal in the
+# wrong state.
+
+standard_testfile
+
+if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} {
+    return -1
+}
+
+set file_arg $binfile
+if [is_remote host] {
+  set file_arg [remote_download host $file_arg]
+}
+
+global GDBFLAGS
+set saved_gdbflags $GDBFLAGS
+
+# The shell's prompt.
+set shell_prompt "$ "
+set shell_prompt_re [string_to_regexp $shell_prompt]
+
+# Spawn shell.  Returns true on success, false otherwise.
+
+proc spawn_shell {} {
+    global shell_prompt_re
+
+    set res [remote_spawn host "/bin/sh"]
+    if { $res < 0 || $res == "" } {
+	unsupported "Spawning shell failed."
+	return 0
+    }
+
+    set gotit 0
+    set test "spawn shell"
+    gdb_expect {
+	-re "$shell_prompt_re$" {
+	    pass $test
+	    set gotit 1
+	}
+	timeout {
+	    fail "$test (timeout)"
+	}
+	eof {
+	    fail "$test (eof)"
+	}
+    }
+
+    return $gotit
+}
+
+# Exit the shell.
+
+proc exit_shell {} {
+    global shell_prompt_re
+
+    set test "exit shell"
+    send_gdb "exit\n"
+    gdb_expect {
+	timeout {
+	    fail "$test (timeout)"
+	    return 0
+	}
+	eof {
+	    pass "$test"
+	}
+    }
+    if ![is_remote host] {
+	remote_close host
+    }
+}
+
+# Run "stty" and store the output in $result.  Returns true on
+# success, false otherwise.
+
+proc run_stty {message result} {
+    global shell_prompt_re
+
+    upvar $result output
+
+    send_gdb "stty || echo \"not found\"\n"
+    set gotit 0
+    gdb_expect {
+	-re "not found.*not found.*$shell_prompt_re$" {
+	    pass "$message (not found)"
+	}
+	-re "(.*)$shell_prompt_re$" {
+	    set output $expect_out(1,string)
+	    set gotit 1
+	    pass $message
+	}
+	timeout {
+	    fail "$message (timeout)"
+	}
+	eof {
+	    fail "$message (eof)"
+	}
+    }
+    return $gotit
+}
+
+# Check that "gdb -batch -ex run" does not leave the terminal in the
+# wrong state.
+
+proc test_terminal_settings_preserved {} {
+    global file_arg
+    global GDB INTERNAL_GDBFLAGS GDBFLAGS
+    global gdb_prompt pagination_prompt
+    global saved_gdbflags
+    global shell_prompt_re
+
+    if ![spawn_shell] {
+	return
+    }
+
+    set stty_supported [run_stty "stty before" stty_before]
+
+    set test "gdb -batch -ex run"
+    set GDBFLAGS $saved_gdbflags
+    append GDBFLAGS " -batch"
+    append GDBFLAGS " -ex \"set height unlimited\""
+    append GDBFLAGS " -ex \"start\""
+    append GDBFLAGS " --args \"$file_arg\""
+    send_gdb "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts]\n"
+    gdb_expect {
+	-re "Don't know how to run.*$shell_prompt_re$" {
+	    unsupported $test
+	}
+	-re "$gdb_prompt $" {
+	    # -batch implies no GDB prompt.
+	    fail $test
+	}
+	-re "Temporary breakpoint .*$shell_prompt_re$" {
+	    pass $test
+	}
+	timeout {
+	    fail "$test (timeout)"
+	}
+	eof {
+	    fail "$test (eof)"
+	}
+    }
+
+    set test "echo test_echo"
+    send_gdb "echo test_echo\n"
+    gdb_expect {
+	-re "^echo test_echo\r\ntest_echo\r\n.*$shell_prompt_re$" {
+	    pass $test
+	}
+	timeout {
+	    fail "$test (timeout)"
+	}
+	eof {
+	    fail "$test (eof)"
+	}
+    }
+
+    set test "terminal settings preserved"
+    if $stty_supported {
+	run_stty "stty after" stty_after
+
+	gdb_assert [string equal $stty_before $stty_after] $test
+    } else {
+	unsupported "$test (no stty)"
+    }
+
+    exit_shell
+}
+
+test_terminal_settings_preserved
+
+set GDBFLAGS $saved_gdbflags
