#14254: merge with 3.3.
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index 69fd7b0..b1ef4ca 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -458,6 +458,7 @@
             self.display_no_subprocess_error()
             return None
         self.transfer_path(with_cwd=with_cwd)
+        console.stop_readline()
         # annotate restart in shell window and mark it
         console.text.delete("iomark", "end-1c")
         if was_executing:
@@ -896,6 +897,7 @@
     canceled = False
     endoffile = False
     closing = False
+    _stop_readline_flag = False
 
     def set_warning_stream(self, stream):
         global warning_stream
@@ -971,8 +973,7 @@
                 parent=self.text)
             if response is False:
                 return "cancel"
-        if self.reading:
-            self.top.quit()
+        self.stop_readline()
         self.canceled = True
         self.closing = True
         # Wait for poll_subprocess() rescheduling to stop
@@ -1030,6 +1031,12 @@
         tkinter._default_root = None # 03Jan04 KBK What's this?
         return True
 
+    def stop_readline(self):
+        if not self.reading:  # no nested mainloop to exit.
+            return
+        self._stop_readline_flag = True
+        self.top.quit()
+
     def readline(self):
         save = self.reading
         try:
@@ -1037,6 +1044,9 @@
             self.top.mainloop()  # nested mainloop()
         finally:
             self.reading = save
+        if self._stop_readline_flag:
+            self._stop_readline_flag = False
+            return ""
         line = self.text.get("iomark", "end-1c")
         if len(line) == 0:  # may be EOF if we quit our mainloop with Ctrl-C
             line = "\n"
diff --git a/Misc/NEWS b/Misc/NEWS
index 0badc3f..74fb8d2 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -302,6 +302,8 @@
 Library
 -------
 
+- Issue #14254: IDLE now handles readline correctly across shell restarts.
+
 - Issue #17614: IDLE no longer raises exception when quickly closing a file.
 
 - Issue #6698: IDLE now opens just an editor window when configured to do so.