diff --git a/src/libcore/rt/io/net/tcp.rs b/src/libcore/rt/io/net/tcp.rs
index 0c7e0cf129d..ae4a7a20397 100644
--- a/src/libcore/rt/io/net/tcp.rs
+++ b/src/libcore/rt/io/net/tcp.rs
@@ -10,7 +10,6 @@
 
 use option::{Option, Some, None};
 use result::{Ok, Err};
-use ops::Drop;
 use rt::sched::local_sched::unsafe_borrow_io;
 use rt::io::net::ip::IpAddr;
 use rt::io::{Reader, Writer, Listener};
@@ -79,12 +78,6 @@ impl Writer for TcpStream {
     fn flush(&mut self) { fail!() }
 }
 
-impl Drop for TcpStream {
-    fn finalize(&self) {
-        self.rtstream.close();
-    }
-}
-
 pub struct TcpListener {
     rtlistener: ~RtioTcpListenerObject
 }
@@ -120,12 +113,6 @@ impl Listener<TcpStream> for TcpListener {
     }
 }
 
-impl Drop for TcpListener {
-    fn finalize(&self) {
-        self.rtlistener.close();
-    }
-}
-
 #[cfg(test)]
 mod test {
     use super::*;
diff --git a/src/libcore/rt/uv/uvio.rs b/src/libcore/rt/uv/uvio.rs
index 704294102ae..49fbf142963 100644
--- a/src/libcore/rt/uv/uvio.rs
+++ b/src/libcore/rt/uv/uvio.rs
@@ -124,7 +124,7 @@ impl IoFactory for UvIoFactory {
                 rtdebug!("connect: in connect callback");
                 let maybe_stream = if status.is_none() {
                     rtdebug!("status is none");
-                    Ok(~UvTcpStream(stream_watcher))
+                    Ok(~UvTcpStream { watcher: stream_watcher })
                 } else {
                     rtdebug!("status is some");
                     // XXX: Wait for close
@@ -148,7 +148,7 @@ impl IoFactory for UvIoFactory {
     fn tcp_bind(&mut self, addr: IpAddr) -> Result<~RtioTcpListenerObject, IoError> {
         let mut watcher = TcpWatcher::new(self.uv_loop());
         match watcher.bind(addr) {
-            Ok(_) => Ok(~UvTcpListener(watcher)),
+            Ok(_) => Ok(~UvTcpListener { watcher: watcher }),
             Err(uverr) => {
                 // XXX: Should we wait until close completes?
                 watcher.as_stream().close(||());
@@ -158,23 +158,19 @@ impl IoFactory for UvIoFactory {
     }
 }
 
-pub struct UvTcpListener(TcpWatcher);
+// FIXME #6090: Prefer newtype structs but Drop doesn't work
+pub struct UvTcpListener {
+    watcher: TcpWatcher
+}
 
 impl UvTcpListener {
-    fn watcher(&self) -> TcpWatcher {
-        match self { &UvTcpListener(w) => w }
-    }
-
-    fn close(&self) {
-        // XXX: Need to wait until close finishes before returning
-        self.watcher().as_stream().close(||());
-    }
+    fn watcher(&self) -> TcpWatcher { self.watcher }
 }
 
 impl Drop for UvTcpListener {
     fn finalize(&self) {
-        // XXX: Again, this never gets called. Use .close() instead
-        //self.watcher().as_stream().close(||());
+        // XXX: Need to wait until close finishes before returning
+        self.watcher().as_stream().close(||());
     }
 }
 
@@ -200,7 +196,7 @@ impl RtioTcpListener for UvTcpListener {
                     let client_tcp_watcher = TcpWatcher::new(&mut loop_).as_stream();
                     // XXX: Needs to be surfaced in interface
                     server_stream_watcher.accept(client_tcp_watcher);
-                    Ok(~UvTcpStream::new(client_tcp_watcher))
+                    Ok(~UvTcpStream { watcher: client_tcp_watcher })
                 } else {
                     Err(standard_error(OtherIoError))
                 };
@@ -219,28 +215,19 @@ impl RtioTcpListener for UvTcpListener {
     }
 }
 
-pub struct UvTcpStream(StreamWatcher);
+// FIXME #6090: Prefer newtype structs but Drop doesn't work
+pub struct UvTcpStream {
+    watcher: StreamWatcher
+}
 
 impl UvTcpStream {
-    fn new(watcher: StreamWatcher) -> UvTcpStream {
-        UvTcpStream(watcher)
-    }
-
-    fn watcher(&self) -> StreamWatcher {
-        match self { &UvTcpStream(w) => w }
-    }
-
-    // XXX: finalize isn't working for ~UvStream???
-    fn close(&self) {
-        // XXX: Need to wait until this finishes before returning
-        self.watcher().close(||());
-    }
+    fn watcher(&self) -> StreamWatcher { self.watcher }
 }
 
 impl Drop for UvTcpStream {
     fn finalize(&self) {
         rtdebug!("closing stream");
-        //self.watcher().close(||());
+        self.watcher().close(||());
     }
 }
 
@@ -354,8 +341,6 @@ fn test_simple_tcp_server_and_client() {
                     rtdebug!("%u", buf[i] as uint);
                     assert!(buf[i] == i as u8);
                 }
-                stream.close();
-                listener.close();
             }
         }
 
@@ -364,7 +349,6 @@ fn test_simple_tcp_server_and_client() {
                 let io = local_sched::unsafe_borrow_io();
                 let mut stream = (*io).tcp_connect(addr).unwrap();
                 stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
-                stream.close();
             }
         }
     }
@@ -408,9 +392,6 @@ fn test_read_and_block() {
 
             // Make sure we had multiple reads
             assert!(reads > 1);
-
-            stream.close();
-            listener.close();
         }
 
         do spawntask_immediately {
@@ -421,7 +402,6 @@ fn test_read_and_block() {
                 stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
                 stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
                 stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
-                stream.close();
             }
         }
 
@@ -445,8 +425,6 @@ fn test_read_read_read() {
                     stream.write(buf);
                     total_bytes_written += buf.len();
                 }
-                stream.close();
-                listener.close();
             }
         }
 
@@ -465,7 +443,6 @@ fn test_read_read_read() {
                     }
                 }
                 rtdebug!("read %u bytes total", total_bytes_read as uint);
-                stream.close();
             }
         }
     }