diff --git a/xio-listen.c b/xio-listen.c
index 2358d78..1ea2d3f 100644
--- a/xio-listen.c
+++ b/xio-listen.c
@@ -24,6 +24,8 @@ const struct optdesc opt_fork    = { "fork",      NULL, OPT_FORK,        GROUP_C
 const struct optdesc opt_range   = { "range",     NULL, OPT_RANGE,       GROUP_RANGE,  PH_ACCEPT, TYPE_STRING, OFUNC_SPEC };
 #endif
 
+char redirect_hostname[255]; /* retreived host IP address for REDIRECT mode. Accessed from other places. */
+char redirect_port[32]; /* retrieved port number for REDIRECT mode. Accessed from other places. */
 
 /*
    applies and consumes the following option:
@@ -119,10 +121,13 @@ int _xioopen_listen(struct single *xfd, int xioflags, struct sockaddr *us, sockl
    char lisname[256];
    union sockaddr_union _peername;
    union sockaddr_union _sockname;
+   union sockaddr_union _destname;
    union sockaddr_union *pa = &_peername;	/* peer address */
    union sockaddr_union *la = &_sockname;	/* local address */
+   union sockaddr_union *da = &_destname;	/* destination address (before REDIRECT)*/
    socklen_t pas = sizeof(_peername);	/* peer address size */
    socklen_t las = sizeof(_sockname);	/* local address size */
+   socklen_t das = sizeof(_destname);	/* destination address size */
    int result;
 
    retropt_bool(opts, OPT_FORK, &dofork);
@@ -225,6 +230,7 @@ int _xioopen_listen(struct single *xfd, int xioflags, struct sockaddr *us, sockl
    while (true) {	/* but we only loop if fork option is set */
       char peername[256];
       char sockname[256];
+      char destname[256];
       int ps;		/* peer socket */
       salen = sizeof(struct sockaddr);
 
@@ -260,11 +266,27 @@ int _xioopen_listen(struct single *xfd, int xioflags, struct sockaddr *us, sockl
 	       ps, la, las, strerror(errno));
 	 la = NULL;
       }
+       #ifndef SO_ORIGINAL_DST
+	#define SO_ORIGINAL_DST 80
+       #endif
+      if (Getsockopt(ps, SOL_IP, SO_ORIGINAL_DST, &da->soa, &das) != 0) {
+	 Warn4("getsockopt(%d, %p, {"F_socklen"}): %s",
+	       ps, da, das, strerror(errno));
+	 da = NULL;
+      } 
+
+      strncpy(redirect_hostname,inet_ntoa(_destname.ip4.sin_addr),256);
+      sprintf(redirect_port,"%d", ntohs(_destname.ip4.sin_port));
+
       Notice2("accepting connection from %s on %s",
 	      pa?
 	      sockaddr_info(&pa->soa, pas, peername, sizeof(peername)):"NULL",
 	      la?
 	      sockaddr_info(&la->soa, las, sockname, sizeof(sockname)):"NULL");
+      if(memcmp(&la->soa,&da->soa,sizeof(da->soa))) {
+         Notice1("actual non-REDIRECT-ed destination is %s",
+	      da?sockaddr_info(&da->soa, das, destname, sizeof(destname)):"NULL");
+      }
 
       if (pa != NULL && la != NULL && xiocheckpeer(xfd, pa, la) < 0) {
 	 if (Shutdown(ps, 2) < 0) {
@@ -336,6 +358,7 @@ int _xioopen_listen(struct single *xfd, int xioflags, struct sockaddr *us, sockl
    /* set the env vars describing the local and remote sockets */
    if (la != NULL)  xiosetsockaddrenv("SOCK", la, las, proto);
    if (pa != NULL)  xiosetsockaddrenv("PEER", pa, pas, proto);
+   if (da != NULL)  xiosetsockaddrenv("DEST", da, das, proto);
 
    return 0;
 }
diff --git a/xioopen.h b/xioopen.h
index 8984ebc..a7e2fb5 100644
--- a/xioopen.h
+++ b/xioopen.h
@@ -99,5 +99,7 @@ extern int xioopen_makedual(xiofile_t *file);
 #  define retropt_gidt(x,y,z) retropt_ulong(x,y,z)
 #endif
 
+extern char redirect_hostname[255]; /* retreived host IP address for REDIRECT mode. */
+extern char redirect_port[32]; /* retrieved port number for REDIRECT mode. */
 
 #endif /* !defined(__xioopen_h_included) */
-- 1.7.0.3 
