diff --git a/src/or/channel.c b/src/or/channel.c
index 10097ae47710b5926586246451080bee586e47ca..13aa007fc0b6f30c3c68d27be28f339f502cdc38 100644
--- a/src/or/channel.c
+++ b/src/or/channel.c
@@ -3484,7 +3484,15 @@ channel_get_actual_remote_descr(channel_t *chan)
   tor_assert(chan->get_remote_descr);
 
   /* Param 1 indicates the actual description */
-  return chan->get_remote_descr(chan, 1);
+  return chan->get_remote_descr(chan, GRD_FLAG_ORIGINAL);
+}
+
+/** DOCDOC */
+const char *
+channel_get_actual_remote_address(channel_t *chan)
+{
+  /* Param 1 indicates the actual description */
+  return chan->get_remote_descr(chan, GRD_FLAG_ORIGINAL|GRD_FLAG_ADDR_ONLY);
 }
 
 /**
diff --git a/src/or/channel.h b/src/or/channel.h
index 33b7c8f88bc680bfbb7ee726acb9faf48a976d0f..d90335c194279984209de0a792b47134d0bc83ea 100644
--- a/src/or/channel.h
+++ b/src/or/channel.h
@@ -79,10 +79,13 @@ struct channel_s {
    * available.
    */
   int (*get_remote_addr)(channel_t *, tor_addr_t *);
+#define GRD_FLAG_ORIGINAL 1
+#define GRD_FLAG_ADDR_ONLY 2
   /*
-   * Get a text description of the remote endpoint; canonicalized if the
-   * arg is 0, or the one we originally connected to/received from if it's
-   * 1.
+   * Get a text description of the remote endpoint; canonicalized if the flag
+   * GRD_FLAG_ORIGINAL is not set, or the one we originally connected
+   * to/received from if it is.  If GRD_FLAG_ADDR_ONLY is set, we return only
+   * the original address.
    */
   const char * (*get_remote_descr)(channel_t *, int);
   /* Check if the lower layer has queued writes */
@@ -424,6 +427,7 @@ const char * channel_describe_transport(channel_t *chan);
 void channel_dump_statistics(channel_t *chan, int severity);
 void channel_dump_transport_statistics(channel_t *chan, int severity);
 const char * channel_get_actual_remote_descr(channel_t *chan);
+const char * channel_get_actual_remote_address(channel_t *chan);
 int channel_get_addr_if_possible(channel_t *chan, tor_addr_t *addr_out);
 const char * channel_get_canonical_remote_descr(channel_t *chan);
 int channel_has_queued_writes(channel_t *chan);
diff --git a/src/or/channeltls.c b/src/or/channeltls.c
index 234aa3111df6688d3b7218c6d3f5ea1fac5803de..a7ac83f3ae522c62d2f1243b9e8c477073acc045 100644
--- a/src/or/channeltls.c
+++ b/src/or/channeltls.c
@@ -53,7 +53,7 @@ static const char * channel_tls_describe_transport_method(channel_t *chan);
 static int
 channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out);
 static const char *
-channel_tls_get_remote_descr_method(channel_t *chan, int req);
+channel_tls_get_remote_descr_method(channel_t *chan, int flags);
 static int channel_tls_has_queued_writes_method(channel_t *chan);
 static int channel_tls_is_canonical_method(channel_t *chan, int req);
 static int
@@ -412,7 +412,7 @@ channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out)
  */
 
 static const char *
-channel_tls_get_remote_descr_method(channel_t *chan, int req)
+channel_tls_get_remote_descr_method(channel_t *chan, int flags)
 {
 #define MAX_DESCR_LEN 32
 
@@ -427,21 +427,34 @@ channel_tls_get_remote_descr_method(channel_t *chan, int req)
 
   conn = TO_CONN(tlschan->conn);
 
-  switch (req) {
+  switch (flags) {
     case 0:
-      /* Canonical address */
+      /* Canonical address with port*/
       tor_snprintf(buf, MAX_DESCR_LEN + 1,
                    "%s:%u", conn->address, conn->port);
       answer = buf;
       break;
-    case 1:
-      /* Actual address */
+    case GRD_FLAG_ORIGINAL:
+      /* Actual address with port */
       addr_str = tor_dup_addr(&(tlschan->conn->real_addr));
       tor_snprintf(buf, MAX_DESCR_LEN + 1,
                    "%s:%u", addr_str, conn->port);
       tor_free(addr_str);
       answer = buf;
       break;
+    case GRD_FLAG_ADDR_ONLY:
+      /* Canonical address, no port */
+      strlcpy(buf, conn->address, sizeof(buf));
+      answer = buf;
+      break;
+    case GRD_FLAG_ORIGINAL|GRD_FLAG_ADDR_ONLY:
+      /* Actual address, no port */
+      addr_str = tor_dup_addr(&(tlschan->conn->real_addr));
+      strlcpy(buf, addr_str, sizeof(buf));
+      tor_free(addr_str);
+      answer = buf;
+      break;
+
     default:
       /* Something's broken in channel.c */
       tor_assert(1);
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 53b57ebffec7d79ecc360c6098090e78a2d332d9..4d528a810e433a35dddccd656ea85b98588e7e2a 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -3105,7 +3105,7 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ)
      * we might already have corrected base_.addr[ess] for the relay's
      * canonical IP address. */
     if (or_circ && or_circ->p_chan)
-      address = tor_strdup(channel_get_actual_remote_descr(or_circ->p_chan));
+      address = tor_strdup(channel_get_actual_remote_address(or_circ->p_chan));
     else
       address = tor_strdup("127.0.0.1");
     port = 1; /* XXXX This value is never actually used anywhere, and there