diff --git a/serial/tools/miniterm.py b/serial/tools/miniterm.py
index a88e23f..b388671 100644
--- a/serial/tools/miniterm.py
+++ b/serial/tools/miniterm.py
@@ -55,6 +55,17 @@
         self.output.write(s)
         self.output.flush()
 
+    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
+    # context manager:
+    # switch terminal temporary to normal mode (e.g. to get user input)
+
+    def __enter__(self):
+        self.cleanup()
+        return self
+
+    def __exit__(self, *args, **kwargs):
+        self.setup()
+
 
 if os.name == 'nt':
     import msvcrt
@@ -403,24 +414,23 @@
         elif c == '\x15':                       # CTRL+U -> upload file
             sys.stderr.write('\n--- File to upload: ')
             sys.stderr.flush()
-            self.console.cleanup()
-            filename = sys.stdin.readline().rstrip('\r\n')
-            if filename:
-                try:
-                    with open(filename, 'rb') as f:
-                        sys.stderr.write('--- Sending file {} ---\n'.format(filename))
-                        while True:
-                            block = f.read(1024)
-                            if not block:
-                                break
-                            self.serial.write(block)
-                            # Wait for output buffer to drain.
-                            self.serial.flush()
-                            sys.stderr.write('.')   # Progress indicator.
-                    sys.stderr.write('\n--- File {} sent ---\n'.format(filename))
-                except IOError as e:
-                    sys.stderr.write('--- ERROR opening file {}: {} ---\n'.format(filename, e))
-            self.console.setup()
+            with self.console:
+                filename = sys.stdin.readline().rstrip('\r\n')
+                if filename:
+                    try:
+                        with open(filename, 'rb') as f:
+                            sys.stderr.write('--- Sending file {} ---\n'.format(filename))
+                            while True:
+                                block = f.read(1024)
+                                if not block:
+                                    break
+                                self.serial.write(block)
+                                # Wait for output buffer to drain.
+                                self.serial.flush()
+                                sys.stderr.write('.')   # Progress indicator.
+                        sys.stderr.write('\n--- File {} sent ---\n'.format(filename))
+                    except IOError as e:
+                        sys.stderr.write('--- ERROR opening file {}: {} ---\n'.format(filename, e))
         elif c in '\x08hH?':                    # CTRL+H, h, H, ? -> Show help
             sys.stderr.write(self.get_help_text())
         elif c == '\x12':                       # CTRL+R -> Toggle RTS
@@ -446,12 +456,11 @@
             dump_port_list()
             sys.stderr.write('--- Enter port name: ')
             sys.stderr.flush()
-            self.console.cleanup()
-            try:
-                port = sys.stdin.readline().strip()
-            except KeyboardInterrupt:
-                port = None
-            self.console.setup()
+            with self.console:
+                try:
+                    port = sys.stdin.readline().strip()
+                except KeyboardInterrupt:
+                    port = None
             if port and port != self.serial.port:
                 # reader thread needs to be shut down
                 self._stop_reader()
@@ -477,16 +486,15 @@
         elif c in 'bB':                         # B -> change baudrate
             sys.stderr.write('\n--- Baudrate: ')
             sys.stderr.flush()
-            self.console.cleanup()
-            backup = self.serial.baudrate
-            try:
-                self.serial.baudrate = int(sys.stdin.readline().strip())
-            except ValueError as e:
-                sys.stderr.write('--- ERROR setting baudrate: %s ---\n'.format(e))
-                self.serial.baudrate = backup
-            else:
-                self.dump_port_settings()
-            self.console.setup()
+            with self.console:
+                backup = self.serial.baudrate
+                try:
+                    self.serial.baudrate = int(sys.stdin.readline().strip())
+                except ValueError as e:
+                    sys.stderr.write('--- ERROR setting baudrate: %s ---\n'.format(e))
+                    self.serial.baudrate = backup
+                else:
+                    self.dump_port_settings()
         elif c == '8':                          # 8 -> change to 8 bits
             self.serial.bytesize = serial.EIGHTBITS
             self.dump_port_settings()
