                             listens
                             (assoc streams (:send-ch stream2) stream2)
                             results)))
-                 (if-let [[addr-port [close-accept-ch accept-ch]]
-                          (first (filter #(= ch (first (second %))) (seq listens)))]
+                 (if-let [stream (first (filter #(= (:close-recv-ch %) ch) (vals streams)))]
                    (if v
                      (recur (inc ts) listens streams results)
-                     (do (aclose net accept-ch) ; Handle a close-accept-ch.
+                     (do (aclose net (:recv-ch stream)) ; Handle a closed close-recv-ch.
                          (recur (inc ts)
-                                (dissoc listens addr-port)
+                                listens
+                                (assoc streams (:send-ch stream)
+                                       (-> stream
+                                           (dissoc :msgs)
+                                           (dissoc :recv-ch)
+                                           (dissoc :close-recv-ch)))
+                                results)))
+                   (if-let [[addr-port [close-accept-ch accept-ch]]
+                            (first (filter #(= ch (first (second %))) (seq listens)))]
+                     (if v
+                       (recur (inc ts) listens streams results)
+                       (do (aclose net accept-ch) ; Handle a closed close-accept-ch.
+                           (recur (inc ts)
+                                  (dissoc listens addr-port)
+                                  streams
+                                  results)))
+                     (do (aclose net ch) ; Handle a completed result-ch aput.
+                         (recur (inc ts)
+                                listens
                                 streams
-                                results)))
-                   (do (aclose net ch) ; Handle a completed result-ch aput.
-                       (recur (inc ts)
-                              listens
-                              streams
-                              (remove #(= (first %) ch) results)))))))))
+                                (remove #(= (first %) ch) results))))))))))

                         ;  :msgs [[deliver-at msg] ...]}.
             results []] ; A result entry is [result-ch msg].
            (let [close-accept-chs (map first (vals listens))
                  deliverables (mapcat (fn [send-ch stream]
                                         (when-let [[deliver-at msg] (first (:msgs stream))]
                                           (when (>= ts deliver-at)
                                             [[(:recv-ch stream) (first (:msgs stream))]])))
                                       streams)
                  sendables (mapcat (fn [send-ch stream]


(defn make-net [actx request-listen-ch request-connect-ch & opts]
  (ago-loop net actx
            [ts 0        ; A increasing event / time stamp counter.
             listens {}  ; Keyed by [addr port], value is [close-accept-ch accept-ch].
             streams {}  ; A conn is represented by dual streams, where streams
                         ; is keyed by send-ch and a value of...
