diff --git a/src/or/connection.c b/src/or/connection.c
index 90bcd83a3c886fc1ce4d6e5bcae59831c7805528..b7d2c52e04164f51990114eca14732932681c525 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -175,6 +175,8 @@ void connection_free_all(void) {
 void connection_about_to_close_connection(connection_t *conn)
 {
 
+  assert(conn->marked_for_close);
+
   if(conn->type == CONN_TYPE_AP || conn->type == CONN_TYPE_EXIT) {
     if(!conn->has_sent_end)
       log_fn(LOG_WARN,"Edge connection hasn't sent end yet? Bug.");
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 3cbd54d154724681d142dc3ccbc617a703324a74..4f96b14680297ef174348e6688d2a792cd5be338 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -648,7 +648,6 @@ int connection_exit_begin_conn(cell_t *cell, circuit_t *circ) {
     if(rend_service_set_connection_addr_port(n_stream, circ) < 0) {
       log_fn(LOG_INFO,"Didn't find rendezvous service (port %d)",n_stream->port);
       connection_edge_end(n_stream, END_STREAM_REASON_EXITPOLICY, n_stream->cpath_layer);
-      connection_mark_for_close(n_stream);
       connection_free(n_stream);
       circuit_mark_for_close(circ); /* knock the whole thing down, somebody screwed up */
       return 0;
@@ -683,7 +682,6 @@ int connection_exit_begin_conn(cell_t *cell, circuit_t *circ) {
     case -1: /* resolve failed */
       log_fn(LOG_INFO,"Resolve failed (%s).", n_stream->address);
       connection_edge_end(n_stream, END_STREAM_REASON_RESOLVEFAILED, n_stream->cpath_layer);
-      connection_mark_for_close(n_stream);
       connection_free(n_stream);
       break;
     case 0: /* resolve added to pending list */
@@ -710,7 +708,6 @@ void connection_exit_connect(connection_t *conn) {
       router_compare_to_my_exit_policy(conn) == ADDR_POLICY_REJECTED) {
     log_fn(LOG_INFO,"%s:%d failed exit policy. Closing.", conn->address, conn->port);
     connection_edge_end(conn, END_STREAM_REASON_EXITPOLICY, conn->cpath_layer);
-    connection_mark_for_close(conn);
     circuit_detach_stream(circuit_get_by_conn(conn), conn);
     connection_free(conn);
     return;
@@ -720,7 +717,6 @@ void connection_exit_connect(connection_t *conn) {
   switch(connection_connect(conn, conn->address, conn->addr, conn->port)) {
     case -1:
       connection_edge_end(conn, END_STREAM_REASON_CONNECTFAILED, conn->cpath_layer);
-      connection_mark_for_close(conn);
       circuit_detach_stream(circuit_get_by_conn(conn), conn);
       connection_free(conn);
       return;
diff --git a/src/or/dns.c b/src/or/dns.c
index 3809fe7689a7cd4081d5896838f8610d19d3d8a3..a540ade8f27e74e6a973ef3b22433d8639112344 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -125,7 +125,7 @@ static void purge_expired_resolves(uint32_t now) {
         pendconn = pend->conn;
         connection_edge_end(pendconn, END_STREAM_REASON_MISC,
                             pendconn->cpath_layer);
-        connection_mark_for_close(pendconn);
+        circuit_detach_stream(circuit_get_by_conn(pendconn), pendconn);
         connection_free(pendconn);
         tor_free(pend);
       }
@@ -360,15 +360,13 @@ void dns_cancel_pending_resolve(char *address) {
          address);
   while(resolve->pending_connections) {
     pend = resolve->pending_connections;
-    /* So that mark_for_close doesn't double-remove the connection. */
     pend->conn->state = EXIT_CONN_STATE_RESOLVEFAILED;
-    pendconn = pend->conn; /* don't pass complex things to the
-                              connection_mark_for_close macro */
+    pendconn = pend->conn;
     tor_assert(pendconn->s == -1);
     if(!pendconn->marked_for_close) {
       connection_edge_end(pendconn, END_STREAM_REASON_MISC, pendconn->cpath_layer);
-      connection_mark_for_close(pendconn);
     }
+    circuit_detach_stream(circuit_get_by_conn(pendconn), pendconn);
     connection_free(pendconn);
     resolve->pending_connections = pend->next;
     tor_free(pend);
@@ -460,7 +458,6 @@ static void dns_found_answer(char *address, uint32_t addr, char outcome) {
       pendconn->state = EXIT_CONN_STATE_RESOLVEFAILED;
       circuit_detach_stream(circuit_get_by_conn(pendconn), pendconn);
       connection_edge_end(pendconn, END_STREAM_REASON_MISC, pendconn->cpath_layer);
-      connection_mark_for_close(pendconn);
       connection_free(pendconn);
     } else {
       /* prevent double-remove. */