diff --git a/lib/resolve.c b/lib/resolve.c
index 095cab0ab6b7ba19cd1293e71289fb205918b88a..0c0ac3485532eec239ff2a0f2e133c8a92191401 100644
--- a/lib/resolve.c
+++ b/lib/resolve.c
@@ -525,23 +525,6 @@ int kr_resolve_consume(struct kr_request *request, const struct sockaddr *src, k
 	/* Different processing for network error */
 	struct kr_query *qry = array_tail(rplan->pending);
 
-	if (src && !(qry->flags & QUERY_CACHED)) {
-		/* Track response source.
-		 * @todo -- Find a more suitable place to put the source
-		 * address into query/response context. */
-		switch (src->sa_family) {
-		case AF_INET:
-			qry->rsource.ip4 = *(struct sockaddr_in *) src;
-			break;
-		case AF_INET6:
-			qry->rsource.ip6 = *(struct sockaddr_in6 *) src;
-			break;
-		default:
-			qry->rsource.ip4.sin_family = AF_UNSPEC;
-			break;
-		}
-	}
-
 	bool tried_tcp = (qry->flags & QUERY_TCP);
 	if (!packet || packet->size == 0) {
 		if (tried_tcp)
diff --git a/lib/rplan.h b/lib/rplan.h
index de679deb1cee58354b49f7b4b57e5f17c1c5e6fe..aa6fa5fe37908184dc888712fc31e0fc2bce75e5 100644
--- a/lib/rplan.h
+++ b/lib/rplan.h
@@ -76,10 +76,6 @@ struct kr_query {
 	struct kr_zonecut zone_cut;
 	struct kr_nsrep ns;
 	struct kr_layer_pickle *deferred;
-	union {
-		struct sockaddr_in ip4;
-		struct sockaddr_in6 ip6;
-	} rsource; /**< Response source address. */
 };
 
 /** @cond internal Array of queries. */
diff --git a/modules/cookies/cookiemonster.c b/modules/cookies/cookiemonster.c
index bb6793502f1b0f588880c7785bfed0e6cfaa27ee..6a60f5d6bd55804969a605ae8807d9bef74f5032 100644
--- a/modules/cookies/cookiemonster.c
+++ b/modules/cookies/cookiemonster.c
@@ -36,20 +36,21 @@
 
 /**
  * Obtain address from query/response context if if can be obtained.
- * @param qry query context
+ * @param req resolution context
  * @return pointer to where the server socket address, NULL if not provided within context
  */
-static const struct sockaddr *passed_server_sockaddr(const struct kr_query *qry)
+static const struct sockaddr *passed_server_sockaddr(const struct kr_request *req)
 {
-	assert(qry);
+	if (!req || !req->upstream.addr) {
+		return NULL;
+	}
 
-	const struct sockaddr *tmp_sockaddr = NULL;
-	if (qry->rsource.ip4.sin_family == AF_INET ||
-	    qry->rsource.ip4.sin_family == AF_INET6) {
-		tmp_sockaddr = (struct sockaddr *) &qry->rsource.ip4;
+	if (req->upstream.addr->sa_family == AF_INET ||
+	    req->upstream.addr->sa_family == AF_INET6) {
+		return req->upstream.addr;
 	}
 
-	return tmp_sockaddr;
+	return NULL;
 }
 
 /**
@@ -98,19 +99,22 @@ static const struct sockaddr *guess_server_addr(const struct kr_nsrep *nsrep,
  * Obtain pointer to server socket address that matches obtained cookie.
  * @param sockaddr pointer to socket address to be set
  * @param is_current set to true if the cookie was generate from current secret
+ * @param req resolution context
  * @param cc client cookie from the response
  * @param cc_len client cookie size
  * @param clnt_sett client cookie settings structure
  * @return kr_ok() if matching address found, error code else
  */
 static int srvr_sockaddr_cc_check(const struct sockaddr **sockaddr,
-                                  bool *is_current, const struct kr_query *qry,
+                                  bool *is_current, struct kr_request *req,
                                   const uint8_t *cc, uint16_t cc_len,
                                   const struct kr_cookie_settings *clnt_sett)
 {
-	assert(sockaddr && is_current && qry && cc && cc_len && clnt_sett);
+	assert(sockaddr && is_current && req && cc && cc_len && clnt_sett);
+
+	struct kr_query *qry = req->current_query;
 
-	const struct sockaddr *tmp_sockaddr = passed_server_sockaddr(qry);
+	const struct sockaddr *tmp_sockaddr = passed_server_sockaddr(req);
 
 	/* The address must correspond with the client cookie. */
 	if (tmp_sockaddr) {
@@ -222,11 +226,11 @@ static bool is_cookie_cached(kr_cookie_lru_t *cache, const struct sockaddr *sa,
  * Check cookie content and store it to cache.
  */
 static bool check_cookie_content_and_cache(const struct kr_cookie_settings *clnt_sett,
-                                           struct kr_query *qry,
+                                           struct kr_request *req,
                                            uint8_t *pkt_cookie_opt,
                                            kr_cookie_lru_t *cache)
 {
-	assert(clnt_sett && qry && pkt_cookie_opt && cache);
+	assert(clnt_sett && req && pkt_cookie_opt && cache);
 
 	uint8_t *pkt_cookie_data = knot_edns_opt_get_data(pkt_cookie_opt);
 	uint16_t pkt_cookie_len = knot_edns_opt_get_length(pkt_cookie_opt);
@@ -248,7 +252,7 @@ static bool check_cookie_content_and_cache(const struct kr_cookie_settings *clnt
 	/* Check server address against received client cookie. */
 	const struct sockaddr *srvr_sockaddr = NULL;
 	bool returned_current = false;
-	ret = srvr_sockaddr_cc_check(&srvr_sockaddr, &returned_current, qry,
+	ret = srvr_sockaddr_cc_check(&srvr_sockaddr, &returned_current, req,
 	                             pkt_cc, pkt_cc_len, clnt_sett);
 	if (ret != kr_ok()) {
 		DEBUG_MSG(NULL, "%s\n", "could not match received cookie");
@@ -290,7 +294,7 @@ int check_response(knot_layer_t *ctx, knot_pkt_t *pkt)
 
 	kr_cookie_lru_t *cookie_cache = req->ctx->cache_cookie;
 
-	const struct sockaddr *srvr_sockaddr = passed_server_sockaddr(qry);
+	const struct sockaddr *srvr_sockaddr = passed_server_sockaddr(req);
 
 	if (!pkt_cookie_opt && srvr_sockaddr &&
 	    get_cookie_opt(cookie_cache, srvr_sockaddr)) {
@@ -305,7 +309,7 @@ int check_response(knot_layer_t *ctx, knot_pkt_t *pkt)
 		return ctx->state;
 	}
 
-	if (!check_cookie_content_and_cache(&cookie_ctx->clnt, qry,
+	if (!check_cookie_content_and_cache(&cookie_ctx->clnt, req,
 	                                    pkt_cookie_opt, cookie_cache)) {
 		return KNOT_STATE_FAIL;
 	}