Upgrade to nix 0.9
diff --git a/Cargo.toml b/Cargo.toml
index 4a1c1bd..aedced4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -21,7 +21,7 @@
 unicode-segmentation = "1.0"
 
 [target.'cfg(unix)'.dependencies]
-nix = "0.8"
+nix = "0.9"
 
 [target.'cfg(windows)'.dependencies]
 winapi = "0.2"
diff --git a/src/error.rs b/src/error.rs
index 2ac7ef4..db70cae 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -36,7 +36,7 @@
             #[cfg(unix)]
             ReadlineError::Char(ref err) => err.fmt(f),
             #[cfg(unix)]
-            ReadlineError::Errno(ref err) => write!(f, "Errno: {}", err.errno().desc()),
+            ReadlineError::Errno(ref err) => err.fmt(f),
             #[cfg(windows)]
             ReadlineError::WindowResize => write!(f, "WindowResize"),
             #[cfg(windows)]
@@ -54,7 +54,7 @@
             #[cfg(unix)]
             ReadlineError::Char(ref err) => err.description(),
             #[cfg(unix)]
-            ReadlineError::Errno(ref err) => err.errno().desc(),
+            ReadlineError::Errno(ref err) => err.description(),
             #[cfg(windows)]
             ReadlineError::WindowResize => "WindowResize",
             #[cfg(windows)]
diff --git a/src/lib.rs b/src/lib.rs
index 6116ca4..bd94189 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -806,7 +806,7 @@
     prompt: &str,
     initial: Option<(&str, &str)>,
     editor: &mut Editor<H>,
-    original_mode: tty::Mode,
+    original_mode: &tty::Mode,
 ) -> Result<String> {
     let completer = editor.helper.as_ref().map(|h| h.completer());
     let hinter = editor.helper.as_ref().map(|h| h.hinter() as &Hinter);
@@ -1078,12 +1078,12 @@
     Ok(s.line.into_string())
 }
 
-struct Guard(tty::Mode);
+struct Guard<'m>(&'m tty::Mode);
 
 #[allow(unused_must_use)]
-impl Drop for Guard {
+impl<'m> Drop for Guard<'m> {
     fn drop(&mut self) {
-        let Guard(mode) = *self;
+        let Guard(ref mode) = *self;
         mode.disable_raw_mode();
     }
 }
@@ -1096,8 +1096,8 @@
     editor: &mut Editor<H>,
 ) -> Result<String> {
     let original_mode = try!(editor.term.enable_raw_mode());
-    let guard = Guard(original_mode);
-    let user_input = readline_edit(prompt, initial, editor, original_mode);
+    let guard = Guard(&original_mode);
+    let user_input = readline_edit(prompt, initial, editor, &original_mode);
     if editor.config.auto_add_history() {
         if let Ok(ref line) = user_input {
             editor.add_history_entry(line.as_ref());
diff --git a/src/tty/mod.rs b/src/tty/mod.rs
index 95cd762..b6f10af 100644
--- a/src/tty/mod.rs
+++ b/src/tty/mod.rs
@@ -7,7 +7,7 @@
 use line_buffer::LineBuffer;
 
 /// Terminal state
-pub trait RawMode: Copy + Sized {
+pub trait RawMode: Sized {
     /// Disable RAW mode for the terminal.
     fn disable_raw_mode(&self) -> Result<()>;
 }
diff --git a/src/tty/unix.rs b/src/tty/unix.rs
index 6e5280a..7fc3c6e 100644
--- a/src/tty/unix.rs
+++ b/src/tty/unix.rs
@@ -9,6 +9,7 @@
 use nix::poll;
 use nix::sys::signal;
 use nix::sys::termios;
+use nix::sys::termios::SetArg;
 use unicode_segmentation::UnicodeSegmentation;
 use unicode_width::UnicodeWidthStr;
 
@@ -65,7 +66,7 @@
 impl RawMode for Mode {
     /// Disable RAW mode for the terminal.
     fn disable_raw_mode(&self) -> Result<()> {
-        try!(termios::tcsetattr(STDIN_FILENO, termios::TCSADRAIN, self));
+        try!(termios::tcsetattr(STDIN_FILENO, SetArg::TCSADRAIN, self));
         Ok(())
     }
 }
@@ -264,7 +265,7 @@
         let mut key = consts::char_to_key_press(c);
         if key == KeyPress::Esc {
             let mut fds = [
-                poll::PollFd::new(STDIN_FILENO, poll::POLLIN, poll::EventFlags::empty()),
+                poll::PollFd::new(STDIN_FILENO, poll::POLLIN),
             ];
             match poll::poll(&mut fds, self.timeout_ms) {
                 Ok(n) if n == 0 => {
@@ -569,23 +570,24 @@
     fn enable_raw_mode(&self) -> Result<Mode> {
         use nix::errno::Errno::ENOTTY;
         use nix::sys::termios::{CS8, BRKINT, ECHO, ICANON, ICRNL, IEXTEN, INPCK, ISIG, ISTRIP,
-                                IXON, /* OPOST, */ VMIN, VTIME};
+                                IXON, /* OPOST, */};
+        use nix::sys::termios::SpecialCharacterIndices;
         if !self.stdin_isatty {
             try!(Err(nix::Error::from_errno(ENOTTY)));
         }
         let original_mode = try!(termios::tcgetattr(STDIN_FILENO));
-        let mut raw = original_mode;
+        let mut raw = original_mode.clone();
         // disable BREAK interrupt, CR to NL conversion on input,
         // input parity check, strip high bit (bit 8), output flow control
-        raw.c_iflag &= !(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
+        raw.input_flags &= !(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
         // we don't want raw output, it turns newlines into straight linefeeds
         // raw.c_oflag = raw.c_oflag & !(OPOST); // disable all output processing
-        raw.c_cflag |= CS8; // character-size mark (8 bits)
-        // disable echoing, canonical mode, extended input processing and signals
-        raw.c_lflag &= !(ECHO | ICANON | IEXTEN | ISIG);
-        raw.c_cc[VMIN] = 1; // One character-at-a-time input
-        raw.c_cc[VTIME] = 0; // with blocking read
-        try!(termios::tcsetattr(STDIN_FILENO, termios::TCSADRAIN, &raw));
+        raw.control_flags |= CS8; // character-size mark (8 bits)
+                            // disable echoing, canonical mode, extended input processing and signals
+        raw.local_flags &= !(ECHO | ICANON | IEXTEN | ISIG);
+        raw.control_chars[SpecialCharacterIndices::VMIN as usize] = 1; // One character-at-a-time input
+        raw.control_chars[SpecialCharacterIndices::VTIME as usize] = 0; // with blocking read
+        try!(termios::tcsetattr(STDIN_FILENO, SetArg::TCSADRAIN, &raw));
         Ok(original_mode)
     }
 
@@ -601,8 +603,9 @@
 
 #[cfg(unix)]
 pub fn suspend() -> Result<()> {
+    use nix::unistd::Pid;
     // suspend the whole process group
-    try!(signal::kill(0, signal::SIGTSTP));
+    try!(signal::kill(Pid::from_raw(0), signal::SIGTSTP));
     Ok(())
 }