diff --git a/src/or/circuit.c b/src/or/circuit.c
index 6b68df275ae020b50c1e6a60db58b1ab3e89fde3..fcfdedd5873e23cf4154e7d2f1921b88574c56d6 100644
--- a/src/or/circuit.c
+++ b/src/or/circuit.c
@@ -522,8 +522,10 @@ void circuit_close(circuit_t *circ) {
   circuit_t *youngest=NULL;
 
   assert(circ);
-  if(options.APPort)
+  if(options.APPort) {
     youngest = circuit_get_newest_by_edge_type(EDGE_AP);
+    log(LOG_DEBUG,"circuit_close(): youngest %d, circ %d.",youngest,circ);
+  }
   circuit_remove(circ);
   for(conn=circ->n_conn; conn; conn=conn->next_topic) {
     connection_send_destroy(circ->n_aci, circ->n_conn); 
@@ -585,17 +587,13 @@ send_end:
     return;
   }
 
+  /* this connection speaks cells. We must close all the circuits on it. */
   while((circ = circuit_get_by_conn(conn))) {
-    circuit_remove(circ);
     if(circ->n_conn == conn) /* it's closing in front of us */
-      for(tmpconn=circ->p_conn; tmpconn; tmpconn=tmpconn->next_topic) {
-        connection_send_destroy(circ->p_aci, tmpconn); 
-      }
+      circ->n_conn = NULL;
     if(circ->p_conn == conn) /* it's closing behind us */
-      for(tmpconn=circ->n_conn; tmpconn; tmpconn=tmpconn->next_topic) {
-        connection_send_destroy(circ->n_aci, tmpconn); 
-      }
-    circuit_free(circ);
+      circ->p_conn = NULL;
+    circuit_close(circ);
   }  
 }
 
@@ -644,6 +642,9 @@ void circuit_expire_unused_circuits(void) {
 void circuit_launch_new(int failure_status) {
   static int failures=0;
 
+  if(!options.APPort) /* we're not an application proxy. no need for circuits. */
+    return;
+
   if(failure_status == -1) { /* I was called because a circuit succeeded */
     failures = 0;
     return;
diff --git a/src/or/command.c b/src/or/command.c
index 230a117c633c792f92ce978c48a2880e44316763..00a079e00ded06ef178a70b03fb1bc7cb769a4d8 100644
--- a/src/or/command.c
+++ b/src/or/command.c
@@ -272,19 +272,11 @@ void command_process_destroy_cell(cell_t *cell, connection_t *conn) {
     onion_pending_remove(circ);
   }
 
-  circuit_remove(circ);
-
-  if(cell->aci == circ->p_aci) { /* the destroy came from behind */
-    for(tmpconn = circ->n_conn; tmpconn; tmpconn=tmpconn->next_topic) {
-      connection_send_destroy(circ->n_aci, tmpconn);
-    }
-  }
-  if(cell->aci == circ->n_aci) { /* the destroy came from ahead */
-    for(tmpconn = circ->p_conn; tmpconn; tmpconn=tmpconn->next_topic) {
-      connection_send_destroy(circ->p_aci, tmpconn);
-    }
-  }
-  circuit_free(circ);
+  if(cell->aci == circ->p_aci) /* the destroy came from behind */
+    circ->p_conn = NULL;
+  if(cell->aci == circ->n_aci) /* the destroy came from ahead */
+    circ->n_conn = NULL;
+  circuit_close(circ);
 }
 
 /*