diff --git a/ChangeLog b/ChangeLog
index d7fc38b9c2c9e7fd7c5188713648bc6735151665..e423dcd8f90fc18418862a1d94d8db6e07292df7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,10 +1,13 @@
 2007-12-17  David Lawrence Ramsey  <pooka109@gmail.com>
 
-	* ChangeLog.pre-2.1: Add missing attribution.
-	* NEWS: Resync with NEWS from the 2.0 branch.
+	* nano.c (disable_signals, main): Simplify terminal handling by
+	using raw mode instead of cbreak mode.  This eliminates the need
+	for disable_signals().
 	* text.c (execute_command): Call terminal_init() instead of just
 	disable_signals() after executing the command, as the command
 	may have changed the terminal settings.
+	* ChangeLog.pre-2.1: Add missing attribution.
+	* NEWS: Resync with NEWS from the 2.0 branch.
 
 2007-12-10  David Lawrence Ramsey  <pooka109@gmail.com>
 
diff --git a/src/nano.c b/src/nano.c
index 37a78dffea7498101f6e421a11a328bd1734babc..807d825aab60bb6566eeb371764c664dc7fbc604 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -1258,17 +1258,6 @@ void disable_extended_io(void)
     tcsetattr(0, TCSANOW, &term);
 }
 
-/* Disable interpretation of the special control keys in our terminal
- * settings. */
-void disable_signals(void)
-{
-    struct termios term;
-
-    tcgetattr(0, &term);
-    term.c_lflag &= ~ISIG;
-    tcsetattr(0, TCSANOW, &term);
-}
-
 #ifndef NANO_TINY
 /* Enable interpretation of the special control keys in our terminal
  * settings. */
@@ -1304,14 +1293,14 @@ void enable_flow_control(void)
     tcsetattr(0, TCSANOW, &term);
 }
 
-/* Set up the terminal state.  Put the terminal in cbreak mode (read one
- * character at a time and interpret the special control keys), disable
- * translation of carriage return (^M) into newline (^J) so that we can
- * tell the difference between the Enter key and Ctrl-J, and disable
- * echoing of characters as they're typed.  Finally, disable extended
- * input and output processing, disable interpretation of the special
- * control keys, and if we're not in preserve mode, disable
- * interpretation of the flow control characters too. */
+/* Set up the terminal state.  Put the terminal in raw mode (read one
+ * character at a time, disable the special control keys, and disable
+ * the flow control characters), disable translation of carriage return
+ * (^M) into newline (^J) so that we can tell the difference between the
+ * Enter key and Ctrl-J, and disable echoing of characters as they're
+ * typed.  Finally, disable extended input and output processing, and,
+ * if we're not in preserve mode, reenable interpretation of the flow
+ * control characters. */
 void terminal_init(void)
 {
 #ifdef USE_SLANG
@@ -1326,13 +1315,12 @@ void terminal_init(void)
     if (!newterm_set) {
 #endif
 
-	cbreak();
+	raw();
 	nonl();
 	noecho();
 	disable_extended_io();
-	disable_signals();
-	if (!ISSET(PRESERVE))
-	    disable_flow_control();
+	if (ISSET(PRESERVE))
+	    enable_flow_control();
 
 #ifdef USE_SLANG
 	tcgetattr(0, &newterm);
diff --git a/src/proto.h b/src/proto.h
index 0508d377532d8457b60d04e06a0ca06461afa9b8..055e59dc0a39b2a4e2c14c9669173b56ff2c8eb5 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -475,7 +475,6 @@ void allow_pending_sigwinch(bool allow);
 void do_toggle(const toggle *which);
 #endif
 void disable_extended_io(void);
-void disable_signals(void);
 #ifndef NANO_TINY
 void enable_signals(void);
 #endif