diff --git a/Cargo.toml b/Cargo.toml
index 258dc34..d136824 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -29,8 +29,8 @@
 iovec    = "0.1.0"
 
 [target.'cfg(target_os = "fuchsia")'.dependencies]
-magenta = "0.2.0"
-magenta-sys = "0.2.0"
+fuchsia-zircon = "0.2.1"
+fuchsia-zircon-sys = "0.2.0"
 
 [target.'cfg(unix)'.dependencies]
 libc   = "0.2.19"
diff --git a/src/lib.rs b/src/lib.rs
index 4858b45..beac3a9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -85,9 +85,9 @@
 extern crate iovec;
 
 #[cfg(target_os = "fuchsia")]
-extern crate magenta;
+extern crate fuchsia_zircon as zircon;
 #[cfg(target_os = "fuchsia")]
-extern crate magenta_sys;
+extern crate fuchsia_zircon_sys as zircon_sys;
 
 #[cfg(unix)]
 extern crate libc;
@@ -203,7 +203,7 @@
     pub use sys::{
         EventedHandle,
     };
-    pub use sys::fuchsia::{FuchsiaReady, mx_signals_t};
+    pub use sys::fuchsia::{FuchsiaReady, zx_signals_t};
 }
 
 /// Windows-only extensions to the mio crate.
diff --git a/src/sys/fuchsia/awakener.rs b/src/sys/fuchsia/awakener.rs
index 553e373..19bc762 100644
--- a/src/sys/fuchsia/awakener.rs
+++ b/src/sys/fuchsia/awakener.rs
@@ -1,13 +1,12 @@
 use {io, poll, Evented, Ready, Poll, PollOpt, Token};
-use sys::fuchsia::status_to_io_err;
-use magenta;
+use zircon;
 use std::sync::{Arc, Mutex, Weak};
 
 pub struct Awakener {
     /// Token and weak reference to the port on which Awakener was registered.
     ///
     /// When `Awakener::wakeup` is called, these are used to send a wakeup message to the port.
-    inner: Mutex<Option<(Token, Weak<magenta::Port>)>>,
+    inner: Mutex<Option<(Token, Weak<zircon::Port>)>>,
 }
 
 impl Awakener {
@@ -27,10 +26,10 @@
         let port = weak_port.upgrade().expect("Tried to wakeup a closed port.");
 
         let status = 0; // arbitrary
-        let packet = magenta::Packet::from_user_packet(
-            token.0 as u64, status, magenta::UserPacket::from_u8_array([0; 32]));
+        let packet = zircon::Packet::from_user_packet(
+            token.0 as u64, status, zircon::UserPacket::from_u8_array([0; 32]));
 
-        port.queue(&packet).map_err(status_to_io_err)
+        Ok(port.queue(&packet)?)
     }
 
     pub fn cleanup(&self) {}
diff --git a/src/sys/fuchsia/eventedfd.rs b/src/sys/fuchsia/eventedfd.rs
index e337666..641fc18 100644
--- a/src/sys/fuchsia/eventedfd.rs
+++ b/src/sys/fuchsia/eventedfd.rs
@@ -1,7 +1,7 @@
 use {io, poll, Evented, Ready, Poll, PollOpt, Token};
 use libc;
-use magenta;
-use magenta::AsHandleRef;
+use zircon;
+use zircon::AsHandleRef;
 use sys::fuchsia::{DontDrop, poll_opts_to_wait_async, sys};
 use std::mem;
 use std::os::unix::io::RawFd;
@@ -11,24 +11,24 @@
 #[derive(Debug)]
 pub struct EventedFdRegistration {
     token: Token,
-    handle: DontDrop<magenta::Handle>,
-    rereg_signals: Option<(magenta::Signals, magenta::WaitAsyncOpts)>,
+    handle: DontDrop<zircon::Handle>,
+    rereg_signals: Option<(zircon::Signals, zircon::WaitAsyncOpts)>,
 }
 
 impl EventedFdRegistration {
     unsafe fn new(token: Token,
-                  raw_handle: sys::mx_handle_t,
-                  rereg_signals: Option<(magenta::Signals, magenta::WaitAsyncOpts)>,
+                  raw_handle: sys::zx_handle_t,
+                  rereg_signals: Option<(zircon::Signals, zircon::WaitAsyncOpts)>,
                   ) -> Self
     {
         EventedFdRegistration {
             token: token,
-            handle: DontDrop::new(magenta::Handle::from_raw(raw_handle)),
+            handle: DontDrop::new(zircon::Handle::from_raw(raw_handle)),
             rereg_signals: rereg_signals
         }
     }
 
-    pub fn rereg_signals(&self) -> Option<(magenta::Signals, magenta::WaitAsyncOpts)> {
+    pub fn rereg_signals(&self) -> Option<(zircon::Signals, zircon::WaitAsyncOpts)> {
         self.rereg_signals
     }
 }
@@ -44,12 +44,12 @@
     /// `fd` is closed on `Drop`, so modifying `fd` is a memory-unsafe operation.
     fd: RawFd,
 
-    /// Owned `mxio_t` ponter.
-    mxio: *const sys::mxio_t,
+    /// Owned `fdio_t` ponter.
+    fdio: *const sys::fdio_t,
 }
 
 impl EventedFdInner {
-    pub fn rereg_for_level(&self, port: &magenta::Port) {
+    pub fn rereg_for_level(&self, port: &zircon::Port) {
         let registration_opt = self.registration.lock().unwrap();
         if let Some(ref registration) = *registration_opt {
             if let Some((rereg_signals, rereg_opts)) = registration.rereg_signals {
@@ -69,25 +69,25 @@
         &self.registration
     }
 
-    pub fn mxio(&self) -> &sys::mxio_t {
-        unsafe { &*self.mxio }
+    pub fn fdio(&self) -> &sys::fdio_t {
+        unsafe { &*self.fdio }
     }
 }
 
 impl Drop for EventedFdInner {
     fn drop(&mut self) {
         unsafe {
-            sys::__mxio_release(self.mxio);
+            sys::__fdio_release(self.fdio);
             let _ = libc::close(self.fd);
         }
     }
 }
 
 // `EventedInner` must be manually declared `Send + Sync` because it contains a `RawFd` and a
-// `*const sys::mxio_t`. These are only used to make thread-safe system calls, so accessing
+// `*const sys::fdio_t`. These are only used to make thread-safe system calls, so accessing
 // them is entirely thread-safe.
 //
-// Note: one minor exception to this are the calls to `libc::close` and `__mxio_release`, which
+// Note: one minor exception to this are the calls to `libc::close` and `__fdio_release`, which
 // happen on `Drop`. These accesses are safe because `drop` can only be called at most once from
 // a single thread, and after it is called no other functions can be called on the `EventedFdInner`.
 unsafe impl Sync for EventedFdInner {}
@@ -100,27 +100,27 @@
 
 impl EventedFd {
     pub unsafe fn new(fd: RawFd) -> Self {
-        let mxio = sys::__mxio_fd_to_io(fd);
-        assert!(mxio != ::std::ptr::null(), "FileDescriptor given to EventedFd must be valid.");
+        let fdio = sys::__fdio_fd_to_io(fd);
+        assert!(fdio != ::std::ptr::null(), "FileDescriptor given to EventedFd must be valid.");
 
         EventedFd {
             inner: Arc::new(EventedFdInner {
                 registration: Mutex::new(None),
                 fd: fd,
-                mxio: mxio,
+                fdio: fdio,
             })
         }
     }
 
     fn handle_and_signals_for_events(&self, interest: Ready, opts: PollOpt)
-                -> (sys::mx_handle_t, magenta::Signals)
+                -> (sys::zx_handle_t, zircon::Signals)
     {
         let epoll_events = ioevent_to_epoll(interest, opts);
 
         unsafe {
-            let mut raw_handle: sys::mx_handle_t = mem::uninitialized();
-            let mut signals: sys::mx_signals_t = mem::uninitialized();
-            sys::__mxio_wait_begin(self.inner.mxio, epoll_events, &mut raw_handle, &mut signals);
+            let mut raw_handle: sys::zx_handle_t = mem::uninitialized();
+            let mut signals: sys::zx_signals_t = mem::uninitialized();
+            sys::__fdio_wait_begin(self.inner.fdio, epoll_events, &mut raw_handle, &mut signals);
 
             (raw_handle, signals)
         }
@@ -158,7 +158,7 @@
         );
 
         // We don't have ownership of the handle, so we can't drop it
-        let handle = DontDrop::new(unsafe { magenta::Handle::from_raw(raw_handle) });
+        let handle = DontDrop::new(unsafe { zircon::Handle::from_raw(raw_handle) });
 
         let registered = poll::selector(poll)
             .register_fd(handle.inner_ref(), self, token, signals, opts);
diff --git a/src/sys/fuchsia/handles.rs b/src/sys/fuchsia/handles.rs
index 269e272..ae6f07f 100644
--- a/src/sys/fuchsia/handles.rs
+++ b/src/sys/fuchsia/handles.rs
@@ -1,12 +1,12 @@
 use {io, poll, Evented, Ready, Poll, PollOpt, Token};
-use magenta_sys::mx_handle_t;
+use zircon_sys::zx_handle_t;
 use std::sync::Mutex;
 
 /// Wrapper for registering a `HandleBase` type with mio.
 #[derive(Debug)]
 pub struct EventedHandle {
     /// The handle to be registered.
-    handle: mx_handle_t,
+    handle: zx_handle_t,
 
     /// The current `Token` with which the handle is registered with mio.
     token: Mutex<Option<Token>>,
@@ -18,7 +18,7 @@
     ///
     /// The underlying handle must not be dropped while the
     /// `EventedHandle` still exists.
-    pub unsafe fn new(handle: mx_handle_t) -> Self {
+    pub unsafe fn new(handle: zx_handle_t) -> Self {
         EventedHandle {
             handle: handle,
             token: Mutex::new(None),
@@ -26,7 +26,7 @@
     }
 
     /// Get the underlying handle being registered.
-    pub fn get_handle(&self) -> mx_handle_t {
+    pub fn get_handle(&self) -> zx_handle_t {
         self.handle
     }
 }
diff --git a/src/sys/fuchsia/mod.rs b/src/sys/fuchsia/mod.rs
index 5e6b639..10728fc 100644
--- a/src/sys/fuchsia/mod.rs
+++ b/src/sys/fuchsia/mod.rs
@@ -1,6 +1,6 @@
 use {io, Ready, PollOpt};
 use libc;
-use magenta;
+use zircon;
 use std::mem;
 use std::net::{IpAddr, Ipv4Addr, SocketAddr};
 use std::ops::{Deref, DerefMut};
@@ -20,7 +20,7 @@
 pub use self::handles::EventedHandle;
 pub use self::net::{TcpListener, TcpStream, UdpSocket};
 pub use self::selector::{Events, Selector};
-pub use self::ready::{FuchsiaReady, mx_signals_t};
+pub use self::ready::{FuchsiaReady, zx_signals_t};
 
 // Set non-blocking (workaround since the std version doesn't work in fuchsia)
 // TODO: fix the std version and replace this
@@ -47,92 +47,41 @@
 mod sys {
     #![allow(non_camel_case_types)]
     use std::os::unix::io::RawFd;
-    pub use magenta_sys::{mx_handle_t, mx_signals_t};
+    pub use zircon_sys::{zx_handle_t, zx_signals_t};
 
     // 17 fn pointers we don't need for mio :)
-    pub type mxio_ops_t = [usize; 17];
+    pub type fdio_ops_t = [usize; 17];
 
     pub type atomic_int_fast32_t = usize; // TODO: https://github.com/rust-lang/libc/issues/631
 
     #[repr(C)]
-    pub struct mxio_t {
-        pub ops: *const mxio_ops_t,
+    pub struct fdio_t {
+        pub ops: *const fdio_ops_t,
         pub magic: u32,
         pub refcount: atomic_int_fast32_t,
         pub dupcount: u32,
         pub flags: u32,
     }
 
-    #[link(name="mxio")]
+    #[link(name="fdio")]
     extern {
-        pub fn __mxio_fd_to_io(fd: RawFd) -> *const mxio_t;
-        pub fn __mxio_release(io: *const mxio_t);
+        pub fn __fdio_fd_to_io(fd: RawFd) -> *const fdio_t;
+        pub fn __fdio_release(io: *const fdio_t);
 
-        pub fn __mxio_wait_begin(
-            io: *const mxio_t,
+        pub fn __fdio_wait_begin(
+            io: *const fdio_t,
             events: u32,
-            handle_out: &mut mx_handle_t,
-            signals_out: &mut mx_signals_t,
+            handle_out: &mut zx_handle_t,
+            signals_out: &mut zx_signals_t,
         );
-        pub fn __mxio_wait_end(
-            io: *const mxio_t,
-            signals: mx_signals_t,
+        pub fn __fdio_wait_end(
+            io: *const fdio_t,
+            signals: zx_signals_t,
             events_out: &mut u32,
         );
     }
 }
 
-/// Convert from magenta::Status to io::Error.
-///
-/// Note: these conversions are done on a "best-effort" basis and may not necessarily reflect
-/// exactly equivalent error types.
-fn status_to_io_err(status: magenta::Status) -> io::Error {
-    use magenta::Status;
-
-    let err_kind: io::ErrorKind = match status {
-        Status::ErrInterruptedRetry => io::ErrorKind::Interrupted,
-        Status::ErrBadHandle => io::ErrorKind::BrokenPipe,
-        Status::ErrTimedOut => io::ErrorKind::TimedOut,
-        Status::ErrShouldWait => io::ErrorKind::WouldBlock,
-        Status::ErrPeerClosed => io::ErrorKind::ConnectionAborted,
-        Status::ErrNotFound => io::ErrorKind::NotFound,
-        Status::ErrAlreadyExists => io::ErrorKind::AlreadyExists,
-        Status::ErrAlreadyBound => io::ErrorKind::AddrInUse,
-        Status::ErrUnavailable => io::ErrorKind::AddrNotAvailable,
-        Status::ErrAccessDenied => io::ErrorKind::PermissionDenied,
-        Status::ErrIoRefused => io::ErrorKind::ConnectionRefused,
-        Status::ErrIoDataIntegrity => io::ErrorKind::InvalidData,
-
-        Status::ErrBadPath |
-        Status::ErrInvalidArgs |
-        Status::ErrOutOfRange |
-        Status::ErrWrongType => io::ErrorKind::InvalidInput,
-
-        Status::UnknownOther |
-        Status::ErrNext |
-        Status::ErrStop |
-        Status::ErrNoSpace |
-        Status::ErrFileBig |
-        Status::ErrNotFile |
-        Status::ErrNotDir |
-        Status::ErrIoDataLoss |
-        Status::ErrIo |
-        Status::ErrCanceled |
-        Status::ErrBadState |
-        Status::ErrBufferTooSmall |
-        Status::ErrBadSyscall |
-        Status::NoError |
-        Status::ErrInternal |
-        Status::ErrNotSupported |
-        Status::ErrNoResources |
-        Status::ErrNoMemory |
-        Status::ErrCallFailed
-        => io::ErrorKind::Other
-    }.into();
-
-    err_kind.into()
-}
-
 fn epoll_event_to_ready(epoll: u32) -> Ready {
     let epoll = epoll as i32; // casts the bits directly
     let mut kind = Ready::empty();
@@ -159,11 +108,11 @@
     */
 }
 
-fn poll_opts_to_wait_async(poll_opts: PollOpt) -> magenta::WaitAsyncOpts {
+fn poll_opts_to_wait_async(poll_opts: PollOpt) -> zircon::WaitAsyncOpts {
     if poll_opts.is_oneshot() {
-        magenta::WaitAsyncOpts::Once
+        zircon::WaitAsyncOpts::Once
     } else {
-        magenta::WaitAsyncOpts::Repeating
+        zircon::WaitAsyncOpts::Repeating
     }
 }
 
diff --git a/src/sys/fuchsia/ready.rs b/src/sys/fuchsia/ready.rs
index 05126d3..97854f8 100644
--- a/src/sys/fuchsia/ready.rs
+++ b/src/sys/fuchsia/ready.rs
@@ -1,8 +1,8 @@
 use event_imp::{Ready, ready_as_usize, ready_from_usize};
-pub use magenta_sys::{
-    mx_signals_t,
-    MX_OBJECT_READABLE,
-    MX_OBJECT_WRITABLE,
+pub use zircon_sys::{
+    zx_signals_t,
+    ZX_OBJECT_READABLE,
+    ZX_OBJECT_WRITABLE,
 };
 use std::ops;
 
@@ -14,12 +14,12 @@
 #[inline]
 pub fn assert_fuchsia_ready_repr() {
     debug_assert!(
-        MX_OBJECT_READABLE.bits() as usize == ready_as_usize(Ready::readable()),
-        "Magenta MX_OBJECT_READABLE should have the same repr as Ready::readable()"
+        ZX_OBJECT_READABLE.bits() as usize == ready_as_usize(Ready::readable()),
+        "Zircon ZX_OBJECT_READABLE should have the same repr as Ready::readable()"
     );
     debug_assert!(
-        MX_OBJECT_WRITABLE.bits() as usize == ready_as_usize(Ready::writable()),
-        "Magenta MX_OBJECT_WRITABLE should have the same repr as Ready::writable()"
+        ZX_OBJECT_WRITABLE.bits() as usize == ready_as_usize(Ready::writable()),
+        "Zircon ZX_OBJECT_WRITABLE should have the same repr as Ready::writable()"
     );
 }
 
@@ -36,32 +36,32 @@
 pub struct FuchsiaReady(Ready);
 
 impl FuchsiaReady {
-    /// Returns the `FuchsiaReady` as raw magenta signals.
+    /// Returns the `FuchsiaReady` as raw zircon signals.
     /// This function is just a more explicit, non-generic version of
     /// `FuchsiaReady::into`.
     #[inline]
-    pub fn into_mx_signals(self) -> mx_signals_t {
-        mx_signals_t::from_bits_truncate(ready_as_usize(self.0) as u32)
+    pub fn into_zx_signals(self) -> zx_signals_t {
+        zx_signals_t::from_bits_truncate(ready_as_usize(self.0) as u32)
     }
 }
 
-impl Into<mx_signals_t> for FuchsiaReady {
+impl Into<zx_signals_t> for FuchsiaReady {
     #[inline]
-    fn into(self) -> mx_signals_t {
-        self.into_mx_signals()
+    fn into(self) -> zx_signals_t {
+        self.into_zx_signals()
     }
 }
 
-impl From<mx_signals_t> for FuchsiaReady {
+impl From<zx_signals_t> for FuchsiaReady {
     #[inline]
-    fn from(src: mx_signals_t) -> Self {
+    fn from(src: zx_signals_t) -> Self {
         FuchsiaReady(src.into())
     }
 }
 
-impl From<mx_signals_t> for Ready {
+impl From<zx_signals_t> for Ready {
     #[inline]
-    fn from(src: mx_signals_t) -> Self {
+    fn from(src: zx_signals_t) -> Self {
         ready_from_usize(src.bits() as usize)
     }
 }
@@ -144,38 +144,38 @@
     }
 }
 
-impl ops::BitOr<mx_signals_t> for FuchsiaReady {
+impl ops::BitOr<zx_signals_t> for FuchsiaReady {
     type Output = FuchsiaReady;
 
     #[inline]
-    fn bitor(self, other: mx_signals_t) -> FuchsiaReady {
+    fn bitor(self, other: zx_signals_t) -> FuchsiaReady {
         self | FuchsiaReady::from(other)
     }
 }
 
-impl ops::BitXor<mx_signals_t> for FuchsiaReady {
+impl ops::BitXor<zx_signals_t> for FuchsiaReady {
     type Output = FuchsiaReady;
 
     #[inline]
-    fn bitxor(self, other: mx_signals_t) -> FuchsiaReady {
+    fn bitxor(self, other: zx_signals_t) -> FuchsiaReady {
         self ^ FuchsiaReady::from(other)
     }
 }
 
-impl ops::BitAnd<mx_signals_t> for FuchsiaReady {
+impl ops::BitAnd<zx_signals_t> for FuchsiaReady {
     type Output = FuchsiaReady;
 
     #[inline]
-    fn bitand(self, other: mx_signals_t) -> FuchsiaReady {
+    fn bitand(self, other: zx_signals_t) -> FuchsiaReady {
         self & FuchsiaReady::from(other)
     }
 }
 
-impl ops::Sub<mx_signals_t> for FuchsiaReady {
+impl ops::Sub<zx_signals_t> for FuchsiaReady {
     type Output = FuchsiaReady;
 
     #[inline]
-    fn sub(self, other: mx_signals_t) -> FuchsiaReady {
+    fn sub(self, other: zx_signals_t) -> FuchsiaReady {
         self - FuchsiaReady::from(other)
     }
 }
diff --git a/src/sys/fuchsia/selector.rs b/src/sys/fuchsia/selector.rs
index caba672..f15c8eb 100644
--- a/src/sys/fuchsia/selector.rs
+++ b/src/sys/fuchsia/selector.rs
@@ -3,14 +3,13 @@
     assert_fuchsia_ready_repr,
     epoll_event_to_ready,
     poll_opts_to_wait_async,
-    status_to_io_err,
     EventedFd,
     EventedFdInner,
     FuchsiaReady,
 };
-use magenta;
-use magenta::AsHandleRef;
-use magenta_sys::mx_handle_t;
+use zircon;
+use zircon::AsHandleRef;
+use zircon_sys::zx_handle_t;
 use std::collections::hash_map;
 use std::fmt;
 use std::mem;
@@ -65,8 +64,8 @@
 pub struct Selector {
     id: usize,
 
-    /// Magenta object on which the handles have been registered, and on which events occur
-    port: Arc<magenta::Port>,
+    /// Zircon object on which the handles have been registered, and on which events occur
+    port: Arc<zircon::Port>,
 
     /// Whether or not `tokens_to_rereg` contains any elements. This is a best-effort attempt
     /// used to prevent having to lock `tokens_to_rereg` when it is empty.
@@ -85,7 +84,7 @@
     tokens_to_rereg: Mutex<Vec<Token>>,
 
     /// Map from tokens to weak references to `EventedFdInner`-- a structure describing a
-    /// file handle, its associated `mxio` object, and its current registration.
+    /// file handle, its associated `fdio` object, and its current registration.
     token_to_fd: Mutex<hash_map::HashMap<Token, Weak<EventedFdInner>>>,
 }
 
@@ -96,8 +95,7 @@
         assert_fuchsia_ready_repr();
 
         let port = Arc::new(
-            magenta::Port::create(magenta::PortOpts::Default)
-                .map_err(status_to_io_err)?
+            zircon::Port::create(zircon::PortOpts::Default)?
         );
 
         // offset by 1 to avoid choosing 0 as the id of a selector
@@ -121,7 +119,7 @@
     }
 
     /// Returns a reference to the underlying port `Arc`.
-    pub fn port(&self) -> &Arc<magenta::Port> { &self.port }
+    pub fn port(&self) -> &Arc<zircon::Port> { &self.port }
 
     /// Reregisters all registrations pointed to by the `tokens_to_rereg` list
     /// if `has_tokens_to_rereg`.
@@ -156,25 +154,25 @@
                 let nanos = duration.as_secs().saturating_mul(1_000_000_000)
                                 .saturating_add(duration.subsec_nanos() as u64);
 
-                magenta::deadline_after(nanos)
+                zircon::deadline_after(nanos)
             }
-            None => magenta::MX_TIME_INFINITE,
+            None => zircon::ZX_TIME_INFINITE,
         };
 
         let packet = match self.port.wait(deadline) {
             Ok(packet) => packet,
-            Err(magenta::Status::ErrTimedOut) => return Ok(false),
-            Err(e) => return Err(status_to_io_err(e)),
+            Err(zircon::Status::ErrTimedOut) => return Ok(false),
+            Err(e) => Err(e)?,
         };
 
         let observed_signals = match packet.contents() {
-            magenta::PacketContents::SignalOne(signal_packet) => {
+            zircon::PacketContents::SignalOne(signal_packet) => {
                 signal_packet.observed()
             }
-            magenta::PacketContents::SignalRep(signal_packet) => {
+            zircon::PacketContents::SignalRep(signal_packet) => {
                 signal_packet.observed()
             }
-            magenta::PacketContents::User(_user_packet) => {
+            zircon::PacketContents::User(_user_packet) => {
                 // User packets are only ever sent by an Awakener
                 return Ok(true);
             }
@@ -190,7 +188,7 @@
                 Ok(false)
             },
             RegType::Fd => {
-                // Convert the signals to epoll events using __mxio_wait_end,
+                // Convert the signals to epoll events using __fdio_wait_end,
                 // and add to reregistration list if necessary.
                 let events: u32;
                 {
@@ -207,7 +205,7 @@
 
                     events = unsafe {
                         let mut events: u32 = mem::uninitialized();
-                        sys::fuchsia::sys::__mxio_wait_end(handle.mxio(), observed_signals, &mut events);
+                        sys::fuchsia::sys::__fdio_wait_end(handle.fdio(), observed_signals, &mut events);
                         events
                     };
 
@@ -238,10 +236,10 @@
 
     /// Register event interests for the given IO handle with the OS
     pub fn register_fd(&self,
-                       handle: &magenta::Handle,
+                       handle: &zircon::Handle,
                        fd: &EventedFd,
                        token: Token,
-                       signals: magenta::Signals,
+                       signals: zircon::Signals,
                        poll_opts: PollOpt) -> io::Result<()>
     {
         {
@@ -256,24 +254,23 @@
 
         let wait_async_opts = poll_opts_to_wait_async(poll_opts);
 
-        let wait_res = handle.wait_async_handle(&self.port, token.0 as u64, signals, wait_async_opts)
-            .map_err(status_to_io_err);
+        let wait_res = handle.wait_async_handle(&self.port, token.0 as u64, signals, wait_async_opts);
 
         if wait_res.is_err() {
             self.token_to_fd.lock().unwrap().remove(&token);
         }
 
-        wait_res
+        Ok(wait_res?)
     }
 
     /// Deregister event interests for the given IO handle with the OS
-    pub fn deregister_fd(&self, handle: &magenta::Handle, token: Token) -> io::Result<()> {
+    pub fn deregister_fd(&self, handle: &zircon::Handle, token: Token) -> io::Result<()> {
         self.token_to_fd.lock().unwrap().remove(&token);
 
         // We ignore NotFound errors since oneshots are automatically deregistered,
         // but mio will attempt to deregister them manually.
         self.port.cancel(&*handle, token.0 as u64)
-            .map_err(status_to_io_err)
+            .map_err(io::Error::from)
             .or_else(|e| if e.kind() == io::ErrorKind::NotFound {
                 Ok(())
             } else {
@@ -282,7 +279,7 @@
     }
 
     pub fn register_handle(&self,
-                           handle: mx_handle_t,
+                           handle: zx_handle_t,
                            token: Token,
                            interests: Ready,
                            poll_opts: PollOpt) -> io::Result<()>
@@ -292,30 +289,28 @@
                       "Repeated level-triggered events are not supported on Fuchsia handles."));
         }
 
-        let temp_handle = unsafe { magenta::Handle::from_raw(handle) };
+        let temp_handle = unsafe { zircon::Handle::from_raw(handle) };
 
         let res = temp_handle.wait_async_handle(
                     &self.port,
                     key_from_token_and_type(token, RegType::Handle)?,
-                    FuchsiaReady::from(interests).into_mx_signals(),
-                    poll_opts_to_wait_async(poll_opts))
-              .map_err(status_to_io_err);
+                    FuchsiaReady::from(interests).into_zx_signals(),
+                    poll_opts_to_wait_async(poll_opts));
 
         mem::forget(temp_handle);
 
-        res
+        Ok(res?)
     }
 
 
-    pub fn deregister_handle(&self, handle: mx_handle_t, token: Token) -> io::Result<()>
+    pub fn deregister_handle(&self, handle: zx_handle_t, token: Token) -> io::Result<()>
     {
-        let temp_handle = unsafe { magenta::Handle::from_raw(handle) };
-        let res = self.port.cancel(&temp_handle, key_from_token_and_type(token, RegType::Handle)?)
-                 .map_err(status_to_io_err);
+        let temp_handle = unsafe { zircon::Handle::from_raw(handle) };
+        let res = self.port.cancel(&temp_handle, key_from_token_and_type(token, RegType::Handle)?);
 
         mem::forget(temp_handle);
 
-        res
+        Ok(res?)
     }
 }
 
diff --git a/test/mod.rs b/test/mod.rs
index ad79234..75cda53 100644
--- a/test/mod.rs
+++ b/test/mod.rs
@@ -12,7 +12,7 @@
 extern crate tempdir;
 
 #[cfg(target_os = "fuchsia")]
-extern crate magenta;
+extern crate fuchsia_zircon as zircon;
 
 pub use ports::localhost;
 
diff --git a/test/test_fuchsia_handles.rs b/test/test_fuchsia_handles.rs
index 589471f..85a1432 100644
--- a/test/test_fuchsia_handles.rs
+++ b/test/test_fuchsia_handles.rs
@@ -1,6 +1,6 @@
 use mio::*;
 use mio::fuchsia::EventedHandle;
-use magenta::{self, AsHandleRef};
+use zircon::{self, AsHandleRef};
 use std::time::Duration;
 
 const MS: u64 = 1_000;
@@ -11,7 +11,7 @@
     let mut event_buffer = Events::with_capacity(1);
     let event_buffer = &mut event_buffer;
 
-    let (channel0, channel1) = magenta::Channel::create(magenta::ChannelOpts::Normal).unwrap();
+    let (channel0, channel1) = zircon::Channel::create(zircon::ChannelOpts::Normal).unwrap();
     let channel1_evented = unsafe { EventedHandle::new(channel1.raw_handle()) };
 
     poll.register(&channel1_evented, Token(1), Ready::readable(), PollOpt::edge()).unwrap();
