diff --git a/src/server/mod.rs b/src/server/mod.rs
index f660f5a177..fcbb5627f6 100644
--- a/src/server/mod.rs
+++ b/src/server/mod.rs
@@ -107,7 +107,7 @@ S: NetworkStream + Clone + Send> Server<'a, H, L> {
         let guard = thread::spawn(move || pool.accept(work, threads));
 
         Ok(Listening {
-            _guard: guard,
+            _guard: Some(guard),
             socket: socket,
         })
     }
@@ -176,16 +176,28 @@ where S: NetworkStream + Clone, H: Handler {
 /// A listening server, which can later be closed.
 pub struct Listening {
     #[cfg(feature = "nightly")]
-    _guard: JoinHandle<()>,
+    _guard: Option<JoinHandle<()>>,
     #[cfg(not(feature = "nightly"))]
-    _guard: JoinHandle,
+    _guard: Option<JoinHandle>,
     /// The socket addresses that the server is bound to.
     pub socket: SocketAddr,
 }
 
+impl Drop for Listening {
+    fn drop(&mut self) {
+        match self._guard.take() {
+            Some(guard) => {
+                let _ = guard.join();
+            },
+            None => ()
+        }
+    }
+}
+
 impl Listening {
     /// Stop the server from listening to its socket address.
     pub fn close(&mut self) -> HttpResult<()> {
+        let _ = self._guard.take();
         debug!("closing server");
         //try!(self.acceptor.close());
         Ok(())