acceptLimiter   map[ipStr]int
        dialRateLimiter *rate.Limiter
+       numHalfOpen     int
 
        websocketTrackers websocketTrackers
 }
                panic("invariant broken")
        }
        delete(t.halfOpen, addr)
-       t.openNewConns()
+       cl.numHalfOpen--
+       for _, t := range cl.torrents {
+               t.openNewConns()
+       }
 }
 
 // Performs initiator handshakes and returns a connection. Returns nil *connection if no connection
 
        MinDialTimeout             time.Duration
        EstablishedConnsPerTorrent int
        HalfOpenConnsPerTorrent    int
+       TotalHalfOpenConns         int
        // Maximum number of peer addresses in reserve.
        TorrentPeersHighWater int
        // Minumum number of peers before effort is made to obtain more peers.
                MinDialTimeout:                 3 * time.Second,
                EstablishedConnsPerTorrent:     50,
                HalfOpenConnsPerTorrent:        25,
+               TotalHalfOpenConns:             100,
                TorrentPeersHighWater:          500,
                TorrentPeersLowWater:           50,
                HandshakesTimeout:              4 * time.Second,
 
        return int(min(max(5, extraIncoming)+establishedHeadroom, int64(t.cl.config.HalfOpenConnsPerTorrent)))
 }
 
-func (t *Torrent) openNewConns() {
+func (t *Torrent) openNewConns() (initiated int) {
        defer t.updateWantPeersEvent()
        for t.peers.Len() != 0 {
                if !t.wantConns() {
                if len(t.cl.dialers) == 0 {
                        return
                }
+               if t.cl.numHalfOpen >= t.cl.config.TotalHalfOpenConns {
+                       return
+               }
                p := t.peers.PopMax()
                t.initiateConn(p)
+               initiated++
        }
+       return
 }
 
 func (t *Torrent) getConnPieceInclination() []int {
        if peer.Id == t.cl.peerID {
                return
        }
-
        if t.cl.badPeerAddr(peer.Addr) && !peer.Trusted {
                return
        }
        if t.addrActive(addr.String()) {
                return
        }
+       t.cl.numHalfOpen++
        t.halfOpen[addr.String()] = peer
        go t.cl.outgoingConnection(t, addr, peer.Source, peer.Trusted)
 }