diff --git a/swarm/swarm.go b/swarm/swarm.go
index 1ac277d0757f152c36e579833ea28f581cdf3afb..d6cbcc721fb073d4620d8eaea189a49b2af0d102 100644
--- a/swarm/swarm.go
+++ b/swarm/swarm.go
@@ -81,6 +81,7 @@ type Swarm struct {
 	connsLock sync.RWMutex
 
 	local *peer.Peer
+	listeners []net.Listener
 }
 
 // NewSwarm constructs a Swarm, with a Chan.
@@ -126,6 +127,9 @@ func (s *Swarm) connListen(maddr *ma.Multiaddr) error {
 		return err
 	}
 
+	// NOTE: this may require a lock around it later. currently, only run on setup
+	s.listeners = append(s.listeners, list)
+
 	// Accept and handle new connections on this listener until it errors
 	go func() {
 		for {
@@ -172,6 +176,10 @@ func (s *Swarm) Close() {
 	}
 	s.Chan.Close <- true // fan out
 	s.Chan.Close <- true // listener
+
+	for _,list := range s.listeners {
+		list.Close()
+	}
 }
 
 // Dial connects to a peer.