diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 1a5c079807f466c3680bcfe6d34b537291e881d0..6d5d008ef0a32624f299a8c3a30d4b85cfe862c2 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -12916,8 +12916,17 @@ static int sip_reg_timeout(const void *data)
 	}
 
 	if (r->dnsmgr) {
+		struct sip_peer *peer;
 		/* If the registration has timed out, maybe the IP changed.  Force a refresh. */
 		ast_dnsmgr_refresh(r->dnsmgr);
+		/* If we are resolving a peer, we have to make sure the refreshed address gets copied */
+		if ((peer = find_peer(r->hostname, NULL, TRUE, FINDPEERS, FALSE, 0))) {
+			ast_sockaddr_copy(&peer->addr, &r->us);
+			if (r->portno) {
+				ast_sockaddr_set_port(&peer->addr, r->portno);
+			}
+			peer = unref_peer(peer, "unref after find_peer");
+		}
 	}
 
 	/* If the initial tranmission failed, we may not have an existing dialog,
@@ -13036,6 +13045,16 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char *
 			ast_sockaddr_set_port(&r->us, r->portno);
 		}
 
+		/* It is possible that DNS is unavailable at the time the peer is created. Here, if
+		 * we've updated the address in the registry, we copy it to the peer so that
+		 * create_addr() can copy it to the dialog via create_addr_from_peer */
+		if ((peer = find_peer(r->hostname, NULL, TRUE, FINDPEERS, FALSE, 0))) {
+			if (ast_sockaddr_isnull(&peer->addr) && !(ast_sockaddr_isnull(&r->us))) {
+				ast_sockaddr_copy(&peer->addr, &r->us);
+			}
+			peer = unref_peer(peer, "unref after find_peer");
+		}
+
 		/* Find address to hostname */
 		if (create_addr(p, S_OR(r->peername, r->hostname), &r->us, 0, NULL)) {
 			/* we have what we hope is a temporary network error,