[MAJOR] separate sess->proxy into sess->{fe,fi,be}

The references to the proxy from the session have been turned into
Frontend (fe), Filters (fi) and Backend (be). This should ease the
migration to the L7 switching features. Next step will be to kill
the struct proxy and have 3 independant structs instead, each
referenced from entities called listener, frontend, filters and
backend.
diff --git a/include/types/session.h b/include/types/session.h
index 66b1db3..dd12d4f 100644
--- a/include/types/session.h
+++ b/include/types/session.h
@@ -103,7 +103,9 @@
 struct session {
 	struct task *task;			/* the task associated with this session */
 	/* application specific below */
-	struct proxy *proxy;			/* the proxy this socket belongs to */
+	struct proxy *fe;			/* the proxy this session depends on for the client side */
+	struct proxy *fi;			/* the proxy this session depends on for the filtering rules */
+	struct proxy *be;			/* the proxy this session depends on for the server side */
 	int cli_fd;				/* the client side fd */
 	int srv_fd;				/* the server side fd */
 	int cli_state;				/* state of the client side */
@@ -144,7 +146,7 @@
 			struct server *sv;
 			short px_st, sv_st;	/* DATA_ST_INIT or DATA_ST_DATA */
 		} stats;
-	} data_ctx;
+	} data_ctx;				/* used by produce_content to dump the stats right now */
 	unsigned int uniq_id;			/* unique ID used for the traces */
 };
 
diff --git a/src/backend.c b/src/backend.c
index 4d8c613..e01068f 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -155,16 +155,16 @@
 		return SRV_STATUS_INTERNAL;
 
 	if (!(s->flags & SN_ASSIGNED)) {
-		if ((s->proxy->options & PR_O_BALANCE) && !(s->flags & SN_DIRECT)) {
-			if (!s->proxy->srv_act && !s->proxy->srv_bck)
+		if ((s->be->options & PR_O_BALANCE) && !(s->flags & SN_DIRECT)) {
+			if (!s->be->srv_act && !s->be->srv_bck)
 				return SRV_STATUS_NOSRV;
 
-			if (s->proxy->options & PR_O_BALANCE_RR) {
-				s->srv = get_server_rr_with_conns(s->proxy);
+			if (s->be->options & PR_O_BALANCE_RR) {
+				s->srv = get_server_rr_with_conns(s->be);
 				if (!s->srv)
 					return SRV_STATUS_FULL;
 			}
-			else if (s->proxy->options & PR_O_BALANCE_SH) {
+			else if (s->be->options & PR_O_BALANCE_SH) {
 				int len;
 		
 				if (s->cli_addr.ss_family == AF_INET)
@@ -174,7 +174,7 @@
 				else /* unknown IP family */
 					return SRV_STATUS_INTERNAL;
 		
-				s->srv = get_server_sh(s->proxy,
+				s->srv = get_server_sh(s->be,
 						       (void *)&((struct sockaddr_in *)&s->cli_addr)->sin_addr,
 						       len);
 			}
@@ -206,7 +206,7 @@
 	fprintf(stderr,"assign_server_address : s=%p\n",s);
 #endif
 
-	if (s->flags & SN_DIRECT || s->proxy->options & PR_O_BALANCE) {
+	if (s->flags & SN_DIRECT || s->be->options & PR_O_BALANCE) {
 		/* A server is necessarily known for this session */
 		if (!(s->flags & SN_ASSIGNED))
 			return SRV_STATUS_INTERNAL;
@@ -219,17 +219,17 @@
 			struct sockaddr_in sockname;
 			socklen_t namelen = sizeof(sockname);
 
-			if (!(s->proxy->options & PR_O_TRANSP) ||
+			if (!(s->fe->options & PR_O_TRANSP) ||
 			    get_original_dst(s->cli_fd, (struct sockaddr_in *)&sockname, &namelen) == -1)
 				getsockname(s->cli_fd, (struct sockaddr *)&sockname, &namelen);
 			s->srv_addr.sin_port = htons(ntohs(s->srv_addr.sin_port) + ntohs(sockname.sin_port));
 		}
 	}
-	else if (*(int *)&s->proxy->dispatch_addr.sin_addr) {
+	else if (*(int *)&s->be->dispatch_addr.sin_addr) {
 		/* connect to the defined dispatch addr */
-		s->srv_addr = s->proxy->dispatch_addr;
+		s->srv_addr = s->be->dispatch_addr;
 	}
-	else if (s->proxy->options & PR_O_TRANSP) {
+	else if (s->fe->options & PR_O_TRANSP) {
 		/* in transparent mode, use the original dest addr if no dispatch specified */
 		socklen_t salen = sizeof(s->srv_addr);
 
@@ -339,17 +339,17 @@
 		qfprintf(stderr, "Cannot get a server socket.\n");
 
 		if (errno == ENFILE)
-			send_log(s->proxy, LOG_EMERG,
+			send_log(s->be, LOG_EMERG,
 				 "Proxy %s reached system FD limit at %d. Please check system tunables.\n",
-				 s->proxy->id, maxfd);
+				 s->be->id, maxfd);
 		else if (errno == EMFILE)
-			send_log(s->proxy, LOG_EMERG,
+			send_log(s->be, LOG_EMERG,
 				 "Proxy %s reached process FD limit at %d. Please check 'ulimit-n' and restart.\n",
-				 s->proxy->id, maxfd);
+				 s->be->id, maxfd);
 		else if (errno == ENOBUFS || errno == ENOMEM)
-			send_log(s->proxy, LOG_EMERG,
+			send_log(s->be, LOG_EMERG,
 				 "Proxy %s reached system memory limit at %d sockets. Please check system tunables.\n",
-				 s->proxy->id, maxfd);
+				 s->be->id, maxfd);
 		/* this is a resource error */
 		return SN_ERR_RESOURCE;
 	}
@@ -370,7 +370,7 @@
 		return SN_ERR_INTERNAL;
 	}
 
-	if (s->proxy->options & PR_O_TCP_SRV_KA)
+	if (s->be->options & PR_O_TCP_SRV_KA)
 		setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &one, sizeof(one));
 
 	/* allow specific binding :
@@ -381,11 +381,11 @@
 		setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(one));
 		if (bind(fd, (struct sockaddr *)&s->srv->source_addr, sizeof(s->srv->source_addr)) == -1) {
 			Alert("Cannot bind to source address before connect() for server %s/%s. Aborting.\n",
-			      s->proxy->id, s->srv->id);
+			      s->be->id, s->srv->id);
 			close(fd);
-			send_log(s->proxy, LOG_EMERG,
+			send_log(s->be, LOG_EMERG,
 				 "Cannot bind to source address before connect() for server %s/%s.\n",
-				 s->proxy->id, s->srv->id);
+				 s->be->id, s->srv->id);
 			return SN_ERR_RESOURCE;
 		}
 #ifdef CONFIG_HAP_CTTPROXY
@@ -415,33 +415,33 @@
 			if (setsockopt(fd, SOL_IP, IP_TPROXY, &itp1, sizeof(itp1)) == -1 ||
 			    setsockopt(fd, SOL_IP, IP_TPROXY, &itp2, sizeof(itp2)) == -1) {
 				Alert("Cannot bind to tproxy source address before connect() for server %s/%s. Aborting.\n",
-				      s->proxy->id, s->srv->id);
+				      s->be->id, s->srv->id);
 				close(fd);
-				send_log(s->proxy, LOG_EMERG,
+				send_log(s->be, LOG_EMERG,
 					 "Cannot bind to tproxy source address before connect() for server %s/%s.\n",
-					 s->proxy->id, s->srv->id);
+					 s->be->id, s->srv->id);
 				return SN_ERR_RESOURCE;
 			}
 		}
 #endif
 	}
-	else if (s->proxy->options & PR_O_BIND_SRC) {
+	else if (s->be->options & PR_O_BIND_SRC) {
 		setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(one));
-		if (bind(fd, (struct sockaddr *)&s->proxy->source_addr, sizeof(s->proxy->source_addr)) == -1) {
-			Alert("Cannot bind to source address before connect() for proxy %s. Aborting.\n", s->proxy->id);
+		if (bind(fd, (struct sockaddr *)&s->be->source_addr, sizeof(s->be->source_addr)) == -1) {
+			Alert("Cannot bind to source address before connect() for proxy %s. Aborting.\n", s->be->id);
 			close(fd);
-			send_log(s->proxy, LOG_EMERG,
+			send_log(s->be, LOG_EMERG,
 				 "Cannot bind to source address before connect() for server %s/%s.\n",
-				 s->proxy->id, s->srv->id);
+				 s->be->id, s->srv->id);
 			return SN_ERR_RESOURCE;
 		}
 #ifdef CONFIG_HAP_CTTPROXY
-		if (s->proxy->options & PR_O_TPXY_MASK) {
+		if (s->be->options & PR_O_TPXY_MASK) {
 			struct in_tproxy itp1, itp2;
 			memset(&itp1, 0, sizeof(itp1));
 
 			itp1.op = TPROXY_ASSIGN;
-			switch (s->proxy->options & PR_O_TPXY_MASK) {
+			switch (s->be->options & PR_O_TPXY_MASK) {
 			case PR_O_TPXY_ADDR:
 				itp1.v.addr.faddr = s->srv->tproxy_addr.sin_addr;
 				itp1.v.addr.fport = s->srv->tproxy_addr.sin_port;
@@ -462,11 +462,11 @@
 			if (setsockopt(fd, SOL_IP, IP_TPROXY, &itp1, sizeof(itp1)) == -1 ||
 			    setsockopt(fd, SOL_IP, IP_TPROXY, &itp2, sizeof(itp2)) == -1) {
 				Alert("Cannot bind to tproxy source address before connect() for proxy %s. Aborting.\n",
-				      s->proxy->id);
+				      s->be->id);
 				close(fd);
-				send_log(s->proxy, LOG_EMERG,
+				send_log(s->be, LOG_EMERG,
 					 "Cannot bind to tproxy source address before connect() for server %s/%s.\n",
-					 s->proxy->id, s->srv->id);
+					 s->be->id, s->srv->id);
 				return SN_ERR_RESOURCE;
 			}
 		}
@@ -485,9 +485,9 @@
 
 			qfprintf(stderr,"Cannot connect: %s.\n",msg);
 			close(fd);
-			send_log(s->proxy, LOG_EMERG,
+			send_log(s->be, LOG_EMERG,
 				 "Connect() failed for server %s/%s: %s.\n",
-				 s->proxy->id, s->srv->id, msg);
+				 s->be->id, s->srv->id, msg);
 			return SN_ERR_RESOURCE;
 		} else if (errno == ETIMEDOUT) {
 			//qfprintf(stderr,"Connect(): ETIMEDOUT");
@@ -523,8 +523,8 @@
 			s->srv->cur_sess_max = s->srv->cur_sess;
 	}
 
-	if (s->proxy->contimeout)
-		tv_delayfrom(&s->req->cex, &now, s->proxy->contimeout);
+	if (s->be->contimeout)
+		tv_delayfrom(&s->req->cex, &now, s->be->contimeout);
 	else
 		tv_eternity(&s->req->cex);
 	return SN_ERR_NONE;  /* connection is OK */
@@ -545,15 +545,15 @@
 		/* if not retryable anymore, let's abort */
 		tv_eternity(&t->req->cex);
 		srv_close_with_err(t, conn_err, SN_FINST_C,
-				   503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
+				   503, t->fe->errmsg.len503, t->fe->errmsg.msg503);
 		if (t->srv)
 			t->srv->failed_conns++;
-		t->proxy->failed_conns++;
+		t->be->failed_conns++;
 
 		/* We used to have a free connection slot. Since we'll never use it,
 		 * we have to inform the server that it may be used by another session.
 		 */
-		if (may_dequeue_tasks(t->srv, t->proxy))
+		if (may_dequeue_tasks(t->srv, t->be))
 			task_wakeup(&rq, t->srv->queue_mgt);
 		return 1;
 	}
@@ -587,12 +587,12 @@
 		case SN_ERR_INTERNAL:
 			tv_eternity(&t->req->cex);
 			srv_close_with_err(t, SN_ERR_INTERNAL, SN_FINST_C,
-					   500, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
+					   500, t->fe->errmsg.len500, t->fe->errmsg.msg500);
 			if (t->srv)
 				t->srv->failed_conns++;
-			t->proxy->failed_conns++;
+			t->be->failed_conns++;
 			/* release other sessions waiting for this server */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 			return 1;
 		}
@@ -600,18 +600,18 @@
 		if (srv_count_retry_down(t, conn_err)) {
 			return 1;
 		}
-	} while (t->srv == NULL || t->conn_retries > 0 || !(t->proxy->options & PR_O_REDISP));
+	} while (t->srv == NULL || t->conn_retries > 0 || !(t->be->options & PR_O_REDISP));
 
 	/* We're on our last chance, and the REDISP option was specified.
 	 * We will ignore cookie and force to balance or use the dispatcher.
 	 */
 	/* let's try to offer this slot to anybody */
-	if (may_dequeue_tasks(t->srv, t->proxy))
+	if (may_dequeue_tasks(t->srv, t->be))
 		task_wakeup(&rq, t->srv->queue_mgt);
 
 	if (t->srv)
 		t->srv->failed_conns++;
-	t->proxy->failed_conns++;
+	t->be->failed_conns++;
 
 	t->flags &= ~(SN_DIRECT | SN_ASSIGNED | SN_ADDR_SET);
 	t->srv = NULL; /* it's left to the dispatcher to choose a server */
@@ -647,17 +647,17 @@
 		/* note: it is guaranteed that t->srv == NULL here */
 		tv_eternity(&t->req->cex);
 		srv_close_with_err(t, SN_ERR_SRVTO, SN_FINST_C,
-				   503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
+				   503, t->fe->errmsg.len503, t->fe->errmsg.msg503);
 		if (t->srv)
 			t->srv->failed_conns++;
-		t->proxy->failed_conns++;
+		t->be->failed_conns++;
 
 		return 1;
 
 	case SRV_STATUS_QUEUED:
 		/* FIXME-20060503 : we should use the queue timeout instead */
-		if (t->proxy->contimeout)
-			tv_delayfrom(&t->req->cex, &now, t->proxy->contimeout);
+		if (t->be->contimeout)
+			tv_delayfrom(&t->req->cex, &now, t->be->contimeout);
 		else
 			tv_eternity(&t->req->cex);
 		t->srv_state = SV_STIDLE;
@@ -669,13 +669,13 @@
 	default:
 		tv_eternity(&t->req->cex);
 		srv_close_with_err(t, SN_ERR_INTERNAL, SN_FINST_C,
-				   500, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
+				   500, t->fe->errmsg.len500, t->fe->errmsg.msg500);
 		if (t->srv)
 			t->srv->failed_conns++;
-		t->proxy->failed_conns++;
+		t->be->failed_conns++;
 
 		/* release other sessions waiting for this server */
-		if (may_dequeue_tasks(t->srv, t->proxy))
+		if (may_dequeue_tasks(t->srv, t->be))
 			task_wakeup(&rq, t->srv->queue_mgt);
 		return 1;
 	}
diff --git a/src/checks.c b/src/checks.c
index 99b8435..8466b75 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -64,7 +64,7 @@
 		xferred = 0;
 		FOREACH_ITEM_SAFE(pc, pc_bck, &s->pendconns, pc_end, struct pendconn *, list) {
 			sess = pc->sess;
-			if ((sess->proxy->options & PR_O_REDISP)) {
+			if ((sess->be->options & PR_O_REDISP)) {
 				/* The REDISP option was specified. We will ignore
 				 * cookie and force to balance or use the dispatcher.
 				 */
diff --git a/src/client.c b/src/client.c
index e1890f0..26ef186 100644
--- a/src/client.c
+++ b/src/client.c
@@ -156,7 +156,11 @@
 		t->context = s;
 
 		s->task = t;
+#ifdef BUILD_WITH_PROXY
 		s->proxy = p;
+#endif
+		s->be = s->fe = s->fi = p;
+
 		s->cli_state = (p->mode == PR_MODE_HTTP) ?  CL_STHEADERS : CL_STDATA; /* no HTTP headers for non-HTTP proxies */
 		s->srv_state = SV_STIDLE;
 		s->req = s->rep = NULL; /* will be allocated later */
@@ -229,7 +233,7 @@
 			socklen_t namelen = sizeof(sockname);
 
 			if (addr.ss_family != AF_INET ||
-			    !(s->proxy->options & PR_O_TRANSP) ||
+			    !(s->fe->options & PR_O_TRANSP) ||
 			    get_original_dst(cfd, (struct sockaddr_in *)&sockname, &namelen) == -1)
 				getsockname(cfd, (struct sockaddr *)&sockname, &namelen);
 
@@ -270,7 +274,7 @@
 			socklen_t namelen = sizeof(sockname);
 			int len;
 			if (addr.ss_family != AF_INET ||
-			    !(s->proxy->options & PR_O_TRANSP) ||
+			    !(s->fe->options & PR_O_TRANSP) ||
 			    get_original_dst(cfd, (struct sockaddr_in *)&sockname, &namelen) == -1)
 				getsockname(cfd, (struct sockaddr *)&sockname, &namelen);
 
@@ -314,9 +318,9 @@
 		if (s->cli_state == CL_STHEADERS) /* reserve some space for header rewriting */
 			s->req->rlim -= MAXREWRITE;
 
-		s->req->rto = s->proxy->clitimeout;
-		s->req->wto = s->proxy->srvtimeout;
-		s->req->cto = s->proxy->srvtimeout;
+		s->req->rto = s->fe->clitimeout;
+		s->req->wto = s->be->srvtimeout;
+		s->req->cto = s->be->srvtimeout;
 
 		if ((s->rep = pool_alloc(buffer)) == NULL) { /* no memory */
 			pool_free(buffer, s->req);
@@ -332,8 +336,8 @@
 
 		buffer_init(s->rep);
 
-		s->rep->rto = s->proxy->srvtimeout;
-		s->rep->wto = s->proxy->clitimeout;
+		s->rep->rto = s->be->srvtimeout;
+		s->rep->wto = s->be->clitimeout;
 		s->rep->cto = 0;
 
 		fdtab[cfd].owner = t;
@@ -371,11 +375,11 @@
 		tv_eternity(&s->rep->rex);
 		tv_eternity(&s->rep->wex);
 
-		if (s->proxy->clitimeout) {
+		if (s->fe->clitimeout) {
 			if (MY_FD_ISSET(cfd, StaticReadEvent))
-				tv_delayfrom(&s->req->rex, &now, s->proxy->clitimeout);
+				tv_delayfrom(&s->req->rex, &now, s->fe->clitimeout);
 			if (MY_FD_ISSET(cfd, StaticWriteEvent))
-				tv_delayfrom(&s->rep->wex, &now, s->proxy->clitimeout);
+				tv_delayfrom(&s->rep->wex, &now, s->fe->clitimeout);
 		}
 
 		tv_min(&t->expire, &s->req->rex, &s->rep->wex);
diff --git a/src/log.c b/src/log.c
index 3f0625e..fac5d1f 100644
--- a/src/log.c
+++ b/src/log.c
@@ -287,7 +287,11 @@
 void sess_log(struct session *s)
 {
 	char pn[INET6_ADDRSTRLEN + strlen(":65535")];
-	struct proxy *p = s->proxy;
+#if 1  /* FIXME: this should disappear */
+	struct proxy *p = s->fe;
+#endif
+	struct proxy *fe = s->fe;
+	struct proxy *be = s->be;
 	int log;
 	char *uri;
 	char *pxid;
@@ -300,7 +304,7 @@
 	 * computed.
 	 */
 
-	log = p->to_log & ~s->logs.logwait;
+	log = fe->to_log & ~s->logs.logwait;
 
 	if (s->cli_addr.ss_family == AF_INET)
 		inet_ntop(AF_INET,
@@ -312,8 +316,8 @@
 			  pn, sizeof(pn));
 
 	uri = (log & LW_REQ) ? s->logs.uri ? s->logs.uri : "<BADREQ>" : "";
-	pxid = p->id;
-	srv = (p->to_log & LW_SVID) ?
+	pxid = be->id;
+	srv = (be->to_log & LW_SVID) ?
 		(s->data_source != DATA_SRC_STATS) ?
 		(s->srv != NULL) ? s->srv->id : "<NOSRV>" : "<STATS>" : "-";
 
diff --git a/src/proto_http.c b/src/proto_http.c
index f6a3ccd..59f611b 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -88,8 +88,8 @@
 	MY_FD_CLR(s->cli_fd, StaticReadEvent);
 	MY_FD_SET(s->cli_fd, StaticWriteEvent);
 	tv_eternity(&s->req->rex);
-	if (s->proxy->clitimeout)
-		tv_delayfrom(&s->rep->wex, &now, s->proxy->clitimeout);
+	if (s->fe->clitimeout)
+		tv_delayfrom(&s->rep->wex, &now, s->fe->clitimeout);
 	else
 		tv_eternity(&s->rep->wex);
 	shutdown(s->cli_fd, SHUT_RD);
@@ -122,7 +122,7 @@
 	t->srv_state = SV_STCLOSE;
 	if (status > 0) {
 		t->logs.status = status;
-		if (t->proxy->mode == PR_MODE_HTTP)
+		if (t->fe->mode == PR_MODE_HTTP)
 			client_return(t, msglen, msg);
 	}
 	if (!(t->flags & SN_ERR_MASK))
@@ -176,12 +176,12 @@
 		return tv_remain2(&now, &t->expire); /* nothing more to do */
 	}
 
-	s->proxy->nbconn--;
+	s->fe->nbconn--;
 	actconn--;
     
 	if ((global.mode & MODE_DEBUG) && (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))) {
 		int len;
-		len = sprintf(trash, "%08x:%s.closed[%04x:%04x]\n", s->uniq_id, s->proxy->id, (unsigned short)s->cli_fd, (unsigned short)s->srv_fd);
+		len = sprintf(trash, "%08x:%s.closed[%04x:%04x]\n", s->uniq_id, s->be->id, (unsigned short)s->cli_fd, (unsigned short)s->srv_fd);
 		write(1, trash, len);
 	}
 
@@ -192,7 +192,7 @@
 	/* let's do a final log if we need it */
 	if (s->logs.logwait && 
 	    !(s->flags & SN_MONITOR) &&
-	    (!(s->proxy->options & PR_O_NULLNOLOG) || s->req->total))
+	    (!(s->fe->options & PR_O_NULLNOLOG) || s->req->total))
 		sess_log(s);
 
 	/* the task MUST not be in the run queue anymore */
@@ -281,7 +281,7 @@
 					/* no need to go further */
 					t->logs.status = 403;
 					t->logs.t_request = tv_diff(&t->logs.tv_accept, &now); /* let's log the request time */
-					client_retnclose(t, t->proxy->errmsg.len403, t->proxy->errmsg.msg403);
+					client_retnclose(t, t->fe->errmsg.len403, t->fe->errmsg.msg403);
 					if (!(t->flags & SN_ERR_MASK))
 						t->flags |= SN_ERR_PRXCOND;
 					if (!(t->flags & SN_FINST_MASK))
@@ -299,8 +299,8 @@
 				 * test, we include the leading and trailing spaces in the
 				 * comparison.
 				 */
-				if ((t->proxy->monitor_uri_len != 0) &&
-				    (t->req_line.len >= t->proxy->monitor_uri_len)) {
+				if ((t->be->monitor_uri_len != 0) &&
+				    (t->req_line.len >= t->be->monitor_uri_len)) {
 					char *p = t->req_line.str;
 					int idx = 0;
 
@@ -309,8 +309,8 @@
 						idx++;
 					p += idx;
 
-					if (t->req_line.len - idx >= t->proxy->monitor_uri_len &&
-					    !memcmp(p, t->proxy->monitor_uri, t->proxy->monitor_uri_len)) {
+					if (t->req_line.len - idx >= t->be->monitor_uri_len &&
+					    !memcmp(p, t->be->monitor_uri, t->be->monitor_uri_len)) {
 						/*
 						 * We have found the monitor URI
 						 */
@@ -325,10 +325,10 @@
 					}
 				}
 
-				if (t->proxy->uri_auth != NULL
-				    && t->req_line.len >= t->proxy->uri_auth->uri_len + 4) {   /* +4 for "GET /" */
+				if (t->fi->uri_auth != NULL
+				    && t->req_line.len >= t->fi->uri_auth->uri_len + 4) {   /* +4 for "GET /" */
 					if (!memcmp(t->req_line.str + 4,
-						    t->proxy->uri_auth->uri_prefix, t->proxy->uri_auth->uri_len)
+						    t->fi->uri_auth->uri_prefix, t->fi->uri_auth->uri_len)
 					    && !memcmp(t->req_line.str, "GET ", 4)) {
 						struct user_auth *user;
 						int authenticated;
@@ -336,7 +336,7 @@
 						/* we are in front of a interceptable URI. Let's check
 						 * if there's an authentication and if it's valid.
 						 */
-						user = t->proxy->uri_auth->users;
+						user = t->fi->uri_auth->users;
 						if (!user) {
 							/* no user auth required, it's OK */
 							authenticated = 1;
@@ -364,7 +364,7 @@
 
 							/* no need to go further */
 
-							msglen = sprintf(trash, HTTP_401_fmt, t->proxy->uri_auth->auth_realm);
+							msglen = sprintf(trash, HTTP_401_fmt, t->fi->uri_auth->auth_realm);
 							t->logs.status = 401;
 							client_retnclose(t, msglen, trash);
 							if (!(t->flags & SN_ERR_MASK))
@@ -385,12 +385,12 @@
 				}
 
 
-				for (line = 0; line < t->proxy->nb_reqadd; line++) {
-					len = sprintf(trash, "%s\r\n", t->proxy->req_add[line]);
+				for (line = 0; line < t->fi->nb_reqadd; line++) {
+					len = sprintf(trash, "%s\r\n", t->fi->req_add[line]);
 					buffer_replace2(req, req->h, req->h, trash, len);
 				}
 
-				if (t->proxy->options & PR_O_FWDFOR) {
+				if (t->be->options & PR_O_FWDFOR) {
 					if (t->cli_addr.ss_family == AF_INET) {
 						unsigned char *pn;
 						pn = (unsigned char *)&((struct sockaddr_in *)&t->cli_addr)->sin_addr;
@@ -409,7 +409,7 @@
 				}
 
 				/* add a "connection: close" line if needed */
-				if (t->proxy->options & PR_O_HTTP_CLOSE)
+				if (t->fe->options & PR_O_HTTP_CLOSE)
 					buffer_replace2(req, req->h, req->h, "Connection: close\r\n", 19);
 
 				if (!memcmp(req->data, "POST ", 5)) {
@@ -438,8 +438,8 @@
 				 */
 				//break;
 
-				if (!t->proxy->clitimeout ||
-				    (t->srv_state < SV_STDATA && t->proxy->srvtimeout))
+				if (!t->fe->clitimeout ||
+				    (t->srv_state < SV_STDATA && t->be->srvtimeout))
 					/* If the client has no timeout, or if the server is not ready yet,
 					 * and we know for sure that it can expire, then it's cleaner to
 					 * disable the timeout on the client side so that too low values
@@ -463,7 +463,7 @@
 					 * if the client closes first.
 					 */
 					tv_delayfrom(&req->cex, &now,
-						     t->proxy->contimeout ? t->proxy->contimeout : 0);
+						     t->be->contimeout ? t->be->contimeout : 0);
 				}
 
 				goto process_data;
@@ -493,7 +493,7 @@
 			 *   req->r  = end of data (not used at this stage)
 			 */
 
-			if (!method_checked && (t->proxy->appsession_name != NULL) &&
+			if (!method_checked && (t->be->appsession_name != NULL) &&
 			    ((memcmp(req->h, "GET ", 4) == 0) || (memcmp(req->h, "POST ", 4) == 0)) &&
 			    ((request_line = memchr(req->h, ';', req->lr - req->h)) != NULL)) {
 
@@ -502,42 +502,42 @@
 
 				/* look if we have a jsessionid */
 
-				if (strncasecmp(request_line, t->proxy->appsession_name, t->proxy->appsession_name_len) == 0) {
+				if (strncasecmp(request_line, t->be->appsession_name, t->be->appsession_name_len) == 0) {
 
 					/* skip jsessionid= */
-					request_line += t->proxy->appsession_name_len + 1;
+					request_line += t->be->appsession_name_len + 1;
 		
 					/* First try if we allready have an appsession */
 					asession_temp = &local_asession;
 		
 					if ((asession_temp->sessid = pool_alloc_from(apools.sessid, apools.ses_msize)) == NULL) {
 						Alert("Not enough memory process_cli():asession_temp->sessid:calloc().\n");
-						send_log(t->proxy, LOG_ALERT, "Not enough Memory process_cli():asession_temp->sessid:calloc().\n");
+						send_log(t->be, LOG_ALERT, "Not enough Memory process_cli():asession_temp->sessid:calloc().\n");
 						return 0;
 					}
 
 					/* Copy the sessionid */
-					memcpy(asession_temp->sessid, request_line, t->proxy->appsession_len);
-					asession_temp->sessid[t->proxy->appsession_len] = 0;
+					memcpy(asession_temp->sessid, request_line, t->be->appsession_len);
+					asession_temp->sessid[t->be->appsession_len] = 0;
 					asession_temp->serverid = NULL;
 
 					/* only do insert, if lookup fails */
-					if (chtbl_lookup(&(t->proxy->htbl_proxy), (void *)&asession_temp)) {
+					if (chtbl_lookup(&(t->be->htbl_proxy), (void *)&asession_temp)) {
 						if ((asession_temp = pool_alloc(appsess)) == NULL) {
 							Alert("Not enough memory process_cli():asession:calloc().\n");
-							send_log(t->proxy, LOG_ALERT, "Not enough memory process_cli():asession:calloc().\n");
+							send_log(t->be, LOG_ALERT, "Not enough memory process_cli():asession:calloc().\n");
 							return 0;
 						}
 						asession_temp->sessid = local_asession.sessid;
 						asession_temp->serverid = local_asession.serverid;
-						chtbl_insert(&(t->proxy->htbl_proxy), (void *) asession_temp);
+						chtbl_insert(&(t->be->htbl_proxy), (void *) asession_temp);
 					} /* end if (chtbl_lookup()) */
 					else {
 						/*free wasted memory;*/
 						pool_free_to(apools.sessid, local_asession.sessid);
 					}
 
-					tv_delayfrom(&asession_temp->expire, &now, t->proxy->appsession_timeout);
+					tv_delayfrom(&asession_temp->expire, &now, t->be->appsession_timeout);
 					asession_temp->request_count++;
 		
 #if defined(DEBUG_HASH)
@@ -547,10 +547,10 @@
 					if (asession_temp->serverid == NULL) {
 						Alert("Found Application Session without matching server.\n");
 					} else {
-						struct server *srv = t->proxy->srv;
+						struct server *srv = t->be->srv;
 						while (srv) {
 							if (strcmp(srv->id, asession_temp->serverid) == 0) {
-								if (srv->state & SRV_RUNNING || t->proxy->options & PR_O_PERSIST) {
+								if (srv->state & SRV_RUNNING || t->be->options & PR_O_PERSIST) {
 		                /* we found the server and it's usable */
 									t->flags &= ~SN_CK_MASK;
 									t->flags |= SN_CK_VALID | SN_DIRECT | SN_ASSIGNED;
@@ -581,7 +581,7 @@
 				if ((t->logs.uri = pool_alloc(requri)) == NULL) {
 					Alert("HTTP logging : out of memory.\n");
 					t->logs.status = 500;
-					client_retnclose(t, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
+					client_retnclose(t, t->fe->errmsg.len500, t->fe->errmsg.msg500);
 					if (!(t->flags & SN_ERR_MASK))
 						t->flags |= SN_ERR_PRXCOND;
 					if (!(t->flags & SN_FINST_MASK))
@@ -601,7 +601,7 @@
 			else if (t->logs.logwait & LW_REQHDR) {
 				struct cap_hdr *h;
 				int len;
-				for (h = t->proxy->req_cap; h; h = h->next) {
+				for (h = t->fi->req_cap; h; h = h->next) {
 					if ((h->namelen + 2 <= ptr - req->h) &&
 					    (req->h[h->namelen] == ':') &&
 					    (strncasecmp(req->h, h->name, h->namelen) == 0)) {
@@ -624,7 +624,7 @@
 
 			if ((global.mode & MODE_DEBUG) && (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))) {
 				int len, max;
-				len = sprintf(trash, "%08x:%s.clihdr[%04x:%04x]: ", t->uniq_id, t->proxy->id, (unsigned  short)t->cli_fd, (unsigned short)t->srv_fd);
+				len = sprintf(trash, "%08x:%s.clihdr[%04x:%04x]: ", t->uniq_id, t->be->id, (unsigned  short)t->cli_fd, (unsigned short)t->srv_fd);
 				max = ptr - req->h;
 				UBOUND(max, sizeof(trash) - len - 1);
 				len += strlcpy2(trash + len, req->h, max + 1);
@@ -634,20 +634,20 @@
 
 
 			/* remove "connection: " if needed */
-			if (!delete_header && (t->proxy->options & PR_O_HTTP_CLOSE)
+			if (!delete_header && (t->fe->options & PR_O_HTTP_CLOSE)
 			    && (strncasecmp(req->h, "Connection: ", 12) == 0)) {
 				delete_header = 1;
 			}
 
 			/* try headers regexps */
-			if (!delete_header && t->proxy->req_exp != NULL
+			if (!delete_header && t->fi->req_exp != NULL
 			    && !(t->flags & SN_CLDENY)) {
 				struct hdr_exp *exp;
 				char term;
 		
 				term = *ptr;
 				*ptr = '\0';
-				exp = t->proxy->req_exp;
+				exp = t->fi->req_exp;
 				do {
 					if (regexec(exp->preg, req->h, MAX_MATCH, pmatch, 0) == 0) {
 						switch (exp->action) {
@@ -696,7 +696,7 @@
 			 * *MUST* delete it
 			 */
 			if (!delete_header &&
-			    (t->proxy->cookie_name != NULL || t->proxy->capture_name != NULL || t->proxy->appsession_name !=NULL)
+			    (t->be->cookie_name != NULL || t->be->appsession_name !=NULL || t->fi->capture_name != NULL)
 			    && !(t->flags & (SN_CLDENY|SN_CLTARPIT)) && (ptr >= req->h + 8)
 			    && (strncasecmp(req->h, "Cookie: ", 8) == 0)) {
 				char *p1, *p2, *p3, *p4;
@@ -757,26 +757,26 @@
 					}
 					else {
 						/* first, let's see if we want to capture it */
-						if (t->proxy->capture_name != NULL &&
+						if (t->fi->capture_name != NULL &&
 						    t->logs.cli_cookie == NULL &&
-						    (p4 - p1 >= t->proxy->capture_namelen) &&
-						    memcmp(p1, t->proxy->capture_name, t->proxy->capture_namelen) == 0) {
+						    (p4 - p1 >= t->fi->capture_namelen) &&
+						    memcmp(p1, t->fi->capture_name, t->fi->capture_namelen) == 0) {
 							int log_len = p4 - p1;
 
 							if ((t->logs.cli_cookie = pool_alloc(capture)) == NULL) {
 								Alert("HTTP logging : out of memory.\n");
 							} else {
-								if (log_len > t->proxy->capture_len)
-									log_len = t->proxy->capture_len;
+								if (log_len > t->fi->capture_len)
+									log_len = t->fi->capture_len;
 								memcpy(t->logs.cli_cookie, p1, log_len);
 								t->logs.cli_cookie[log_len] = 0;
 							}
 						}
 
-						if ((p2 - p1 == t->proxy->cookie_len) && (t->proxy->cookie_name != NULL) &&
-						    (memcmp(p1, t->proxy->cookie_name, p2 - p1) == 0)) {
+						if ((p2 - p1 == t->be->cookie_len) && (t->be->cookie_name != NULL) &&
+						    (memcmp(p1, t->be->cookie_name, p2 - p1) == 0)) {
 							/* Cool... it's the right one */
-							struct server *srv = t->proxy->srv;
+							struct server *srv = t->be->srv;
 							char *delim;
 
 							/* if we're in cookie prefix mode, we'll search the delimitor so that we
@@ -794,7 +794,7 @@
 							 * +------------------------> req->h
 							 */
 
-							if (t->proxy->options & PR_O_COOK_PFX) {
+							if (t->be->options & PR_O_COOK_PFX) {
 								for (delim = p3; delim < p4; delim++)
 									if (*delim == COOKIE_DELIM)
 										break;
@@ -815,7 +815,7 @@
 
 							while (srv) {
 								if ((srv->cklen == delim - p3) && !memcmp(p3, srv->cookie, delim - p3)) {
-									if (srv->state & SRV_RUNNING || t->proxy->options & PR_O_PERSIST) {
+									if (srv->state & SRV_RUNNING || t->be->options & PR_O_PERSIST) {
 										/* we found the server and it's usable */
 										t->flags &= ~SN_CK_MASK;
 										t->flags |= SN_CK_VALID | SN_DIRECT | SN_ASSIGNED;
@@ -843,7 +843,7 @@
 							 *   application cookie so that it does not get accidentely removed later,
 							 *   if we're in cookie prefix mode
 							 */
-							if ((t->proxy->options & PR_O_COOK_PFX) && (delim != p4)) {
+							if ((t->be->options & PR_O_COOK_PFX) && (delim != p4)) {
 								buffer_replace2(req, p3, delim + 1, NULL, 0);
 								p4  -= (delim + 1 - p3);
 								ptr -= (delim + 1 - p3);
@@ -851,7 +851,7 @@
 								app_cookies++;	/* protect the header from deletion */
 							}
 							else if (del_cookie == NULL &&
-								 (t->proxy->options & (PR_O_COOK_INS | PR_O_COOK_IND)) == (PR_O_COOK_INS | PR_O_COOK_IND)) {
+								 (t->be->options & (PR_O_COOK_INS | PR_O_COOK_IND)) == (PR_O_COOK_INS | PR_O_COOK_IND)) {
 								del_cookie = p1;
 								del_colon = colon;
 							}
@@ -871,8 +871,8 @@
 							}
 						}
 			
-						if ((t->proxy->appsession_name != NULL) &&
-						    (memcmp(p1, t->proxy->appsession_name, p2 - p1) == 0)) {
+						if ((t->be->appsession_name != NULL) &&
+						    (memcmp(p1, t->be->appsession_name, p2 - p1) == 0)) {
 							/* first, let's see if the cookie is our appcookie*/
 			    
 							/* Cool... it's the right one */
@@ -881,25 +881,25 @@
 			  
 							if ((asession_temp->sessid = pool_alloc_from(apools.sessid, apools.ses_msize)) == NULL) {
 								Alert("Not enough memory process_cli():asession->sessid:malloc().\n");
-								send_log(t->proxy, LOG_ALERT, "Not enough memory process_cli():asession->sessid:malloc().\n");
+								send_log(t->be, LOG_ALERT, "Not enough memory process_cli():asession->sessid:malloc().\n");
 								return 0;
 							}
 			  
-							memcpy(asession_temp->sessid, p3, t->proxy->appsession_len);
-							asession_temp->sessid[t->proxy->appsession_len] = 0;
+							memcpy(asession_temp->sessid, p3, t->be->appsession_len);
+							asession_temp->sessid[t->be->appsession_len] = 0;
 							asession_temp->serverid = NULL;
 			    
 							/* only do insert, if lookup fails */
-							if (chtbl_lookup(&(t->proxy->htbl_proxy), (void *) &asession_temp) != 0) {
+							if (chtbl_lookup(&(t->be->htbl_proxy), (void *) &asession_temp) != 0) {
 								if ((asession_temp = pool_alloc(appsess)) == NULL) {
 									Alert("Not enough memory process_cli():asession:calloc().\n");
-									send_log(t->proxy, LOG_ALERT, "Not enough memory process_cli():asession:calloc().\n");
+									send_log(t->be, LOG_ALERT, "Not enough memory process_cli():asession:calloc().\n");
 									return 0;
 								}
 				
 								asession_temp->sessid = local_asession.sessid;
 								asession_temp->serverid = local_asession.serverid;
-								chtbl_insert(&(t->proxy->htbl_proxy), (void *) asession_temp);
+								chtbl_insert(&(t->be->htbl_proxy), (void *) asession_temp);
 							} else {
 								/* free wasted memory */
 								pool_free_to(apools.sessid, local_asession.sessid);
@@ -908,10 +908,10 @@
 							if (asession_temp->serverid == NULL) {
 								Alert("Found Application Session without matching server.\n");
 							} else {
-								struct server *srv = t->proxy->srv;
+								struct server *srv = t->be->srv;
 								while (srv) {
 									if (strcmp(srv->id, asession_temp->serverid) == 0) {
-										if (srv->state & SRV_RUNNING || t->proxy->options & PR_O_PERSIST) {
+										if (srv->state & SRV_RUNNING || t->be->options & PR_O_PERSIST) {
 											/* we found the server and it's usable */
 											t->flags &= ~SN_CK_MASK;
 											t->flags |= SN_CK_VALID | SN_DIRECT | SN_ASSIGNED;
@@ -926,7 +926,7 @@
 								}/* end while(srv) */
 							}/* end else if server == NULL */
 			    
-							tv_delayfrom(&asession_temp->expire, &now, t->proxy->appsession_timeout);
+							tv_delayfrom(&asession_temp->expire, &now, t->be->appsession_timeout);
 						}/* end if ((t->proxy->appsession_name != NULL) ... */
 					}
 
@@ -970,7 +970,7 @@
 
 				/* We might also need the 'Authorization: ' header */
 				if (t->auth_hdr.len < 0 &&
-				    t->proxy->uri_auth != NULL &&
+				    t->fi->uri_auth != NULL &&
 				    ptr > req->h + 15 &&
 				    !strncasecmp("Authorization: ", req->h, 15)) {
 					t->auth_hdr.str = req->h;
@@ -989,8 +989,8 @@
 			 * req->l == rlim-data
 			 */
 			MY_FD_SET(t->cli_fd, StaticReadEvent);
-			if (t->proxy->clitimeout)
-				tv_delayfrom(&req->rex, &now, t->proxy->clitimeout);
+			if (t->fe->clitimeout)
+				tv_delayfrom(&req->rex, &now, t->fe->clitimeout);
 			else
 				tv_eternity(&req->rex);
 		}
@@ -1000,7 +1000,7 @@
 		 */
 		if (req->l >= req->rlim - req->data) {
 			t->logs.status = 400;
-			client_retnclose(t, t->proxy->errmsg.len400, t->proxy->errmsg.msg400);
+			client_retnclose(t, t->fe->errmsg.len400, t->fe->errmsg.msg400);
 			if (!(t->flags & SN_ERR_MASK))
 				t->flags |= SN_ERR_PRXCOND;
 			if (!(t->flags & SN_FINST_MASK))
@@ -1023,7 +1023,7 @@
 			/* read timeout : give up with an error message.
 			 */
 			t->logs.status = 408;
-			client_retnclose(t, t->proxy->errmsg.len408, t->proxy->errmsg.msg408);
+			client_retnclose(t, t->fe->errmsg.len408, t->fe->errmsg.msg408);
 			if (!(t->flags & SN_ERR_MASK))
 				t->flags |= SN_ERR_CLITO;
 			if (!(t->flags & SN_FINST_MASK))
@@ -1074,8 +1074,8 @@
 			/* We must ensure that the read part is still alive when switching
 			 * to shutw */
 			MY_FD_SET(t->cli_fd, StaticReadEvent);
-			if (t->proxy->clitimeout)
-				tv_delayfrom(&req->rex, &now, t->proxy->clitimeout);
+			if (t->fe->clitimeout)
+				tv_delayfrom(&req->rex, &now, t->fe->clitimeout);
 			t->cli_state = CL_STSHUTW;
 			//fprintf(stderr,"%p:%s(%d), c=%d, s=%d\n", t, __FUNCTION__, __LINE__, t->cli_state, t->cli_state);
 			return 1;
@@ -1106,8 +1106,8 @@
 			/* We must ensure that the read part is still alive when switching
 			 * to shutw */
 			MY_FD_SET(t->cli_fd, StaticReadEvent);
-			if (t->proxy->clitimeout)
-				tv_delayfrom(&req->rex, &now, t->proxy->clitimeout);
+			if (t->fe->clitimeout)
+				tv_delayfrom(&req->rex, &now, t->fe->clitimeout);
 
 			t->cli_state = CL_STSHUTW;
 			if (!(t->flags & SN_ERR_MASK))
@@ -1134,8 +1134,8 @@
 			/* there's still some space in the buffer */
 			if (! MY_FD_ISSET(t->cli_fd, StaticReadEvent)) {
 				MY_FD_SET(t->cli_fd, StaticReadEvent);
-				if (!t->proxy->clitimeout ||
-				    (t->srv_state < SV_STDATA && t->proxy->srvtimeout))
+				if (!t->fe->clitimeout ||
+				    (t->srv_state < SV_STDATA && t->be->srvtimeout))
 					/* If the client has no timeout, or if the server not ready yet, and we
 					 * know for sure that it can expire, then it's cleaner to disable the
 					 * timeout on the client side so that too low values cannot make the
@@ -1143,7 +1143,7 @@
 					 */
 					tv_eternity(&req->rex);
 				else
-					tv_delayfrom(&req->rex, &now, t->proxy->clitimeout);
+					tv_delayfrom(&req->rex, &now, t->fe->clitimeout);
 			}
 		}
 
@@ -1157,8 +1157,8 @@
 			/* buffer not empty */
 			if (! MY_FD_ISSET(t->cli_fd, StaticWriteEvent)) {
 				MY_FD_SET(t->cli_fd, StaticWriteEvent); /* restart writing */
-				if (t->proxy->clitimeout) {
-					tv_delayfrom(&rep->wex, &now, t->proxy->clitimeout);
+				if (t->fe->clitimeout) {
+					tv_delayfrom(&rep->wex, &now, t->fe->clitimeout);
 					/* FIXME: to prevent the client from expiring read timeouts during writes,
 					 * we refresh it. */
 					req->rex = rep->wex;
@@ -1230,8 +1230,8 @@
 			/* buffer not empty */
 			if (! MY_FD_ISSET(t->cli_fd, StaticWriteEvent)) {
 				MY_FD_SET(t->cli_fd, StaticWriteEvent); /* restart writing */
-				if (t->proxy->clitimeout) {
-					tv_delayfrom(&rep->wex, &now, t->proxy->clitimeout);
+				if (t->fe->clitimeout) {
+					tv_delayfrom(&rep->wex, &now, t->fe->clitimeout);
 					/* FIXME: to prevent the client from expiring read timeouts during writes,
 					 * we refresh it. */
 					req->rex = rep->wex;
@@ -1298,8 +1298,8 @@
 			/* there's still some space in the buffer */
 			if (! MY_FD_ISSET(t->cli_fd, StaticReadEvent)) {
 				MY_FD_SET(t->cli_fd, StaticReadEvent);
-				if (t->proxy->clitimeout)
-					tv_delayfrom(&req->rex, &now, t->proxy->clitimeout);
+				if (t->fe->clitimeout)
+					tv_delayfrom(&req->rex, &now, t->fe->clitimeout);
 				else
 					tv_eternity(&req->rex);
 				//fprintf(stderr,"%p:%s(%d), c=%d, s=%d\n", t, __FUNCTION__, __LINE__, t->cli_state, t->cli_state);
@@ -1310,7 +1310,7 @@
 	else { /* CL_STCLOSE: nothing to do */
 		if ((global.mode & MODE_DEBUG) && (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))) {
 			int len;
-			len = sprintf(trash, "%08x:%s.clicls[%04x:%04x]\n", t->uniq_id, t->proxy->id, (unsigned short)t->cli_fd, (unsigned short)t->srv_fd);
+			len = sprintf(trash, "%08x:%s.clicls[%04x:%04x]\n", t->uniq_id, t->be->id, (unsigned short)t->cli_fd, (unsigned short)t->srv_fd);
 			write(1, trash, len);
 		}
 		return 0;
@@ -1345,7 +1345,7 @@
 			return 0;	/* stay in idle, waiting for data to reach the client side */
 		else if (c == CL_STCLOSE || c == CL_STSHUTW ||
 			 (c == CL_STSHUTR &&
-			  (t->req->l == 0 || t->proxy->options & PR_O_ABRT_CLOSE))) { /* give up */
+			  (t->req->l == 0 || t->be->options & PR_O_ABRT_CLOSE))) { /* give up */
 			tv_eternity(&req->cex);
 			if (t->pend_pos)
 				t->logs.t_queue = tv_diff(&t->logs.tv_accept, &now);
@@ -1377,7 +1377,7 @@
 				tv_eternity(&req->cex);
 				t->logs.t_queue = tv_diff(&t->logs.tv_accept, &now);
 				srv_close_with_err(t, SN_ERR_PRXCOND, SN_FINST_T,
-						   500, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
+						   500, t->fe->errmsg.len500, t->fe->errmsg.msg500);
 				return 1;
 			}
 
@@ -1394,10 +1394,10 @@
 					tv_eternity(&req->cex);
 					t->logs.t_queue = tv_diff(&t->logs.tv_accept, &now);
 					srv_close_with_err(t, SN_ERR_SRVTO, SN_FINST_Q,
-							   503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
+							   503, t->fe->errmsg.len503, t->fe->errmsg.msg503);
 					if (t->srv)
 						t->srv->failed_conns++;
-					t->proxy->failed_conns++;
+					t->fe->failed_conns++;
 					return 1;
 				}
 			}
@@ -1421,7 +1421,7 @@
 	else if (s == SV_STCONN) { /* connection in progress */
 		if (c == CL_STCLOSE || c == CL_STSHUTW ||
 		    (c == CL_STSHUTR &&
-		     (t->req->l == 0 || t->proxy->options & PR_O_ABRT_CLOSE))) { /* give up */
+		     (t->req->l == 0 || t->be->options & PR_O_ABRT_CLOSE))) { /* give up */
 			tv_eternity(&req->cex);
 			fd_delete(t->srv_fd);
 			if (t->srv)
@@ -1454,17 +1454,17 @@
 			if (srv_count_retry_down(t, conn_err))
 				return 1;
 
-			if (t->srv && t->conn_retries == 0 && t->proxy->options & PR_O_REDISP) {
+			if (t->srv && t->conn_retries == 0 && t->be->options & PR_O_REDISP) {
 				/* We're on our last chance, and the REDISP option was specified.
 				 * We will ignore cookie and force to balance or use the dispatcher.
 				 */
 				/* let's try to offer this slot to anybody */
-				if (may_dequeue_tasks(t->srv, t->proxy))
+				if (may_dequeue_tasks(t->srv, t->be))
 					task_wakeup(&rq, t->srv->queue_mgt);
 
 				if (t->srv)
 					t->srv->failed_conns++;
-				t->proxy->failed_conns++;
+				t->be->failed_conns++;
 
 				t->flags &= ~(SN_DIRECT | SN_ASSIGNED | SN_ADDR_SET);
 				t->srv = NULL; /* it's left to the dispatcher to choose a server */
@@ -1503,8 +1503,8 @@
 				tv_eternity(&req->wex);
 			} else  /* need the right to write */ {
 				MY_FD_SET(t->srv_fd, StaticWriteEvent);
-				if (t->proxy->srvtimeout) {
-					tv_delayfrom(&req->wex, &now, t->proxy->srvtimeout);
+				if (t->be->srvtimeout) {
+					tv_delayfrom(&req->wex, &now, t->be->srvtimeout);
 					/* FIXME: to prevent the server from expiring read timeouts during writes,
 					 * we refresh it. */
 					rep->rex = req->wex;
@@ -1513,10 +1513,10 @@
 					tv_eternity(&req->wex);
 			}
 
-			if (t->proxy->mode == PR_MODE_TCP) { /* let's allow immediate data connection in this case */
+			if (t->be->mode == PR_MODE_TCP) { /* let's allow immediate data connection in this case */
 				MY_FD_SET(t->srv_fd, StaticReadEvent);
-				if (t->proxy->srvtimeout)
-					tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+				if (t->be->srvtimeout)
+					tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 				else
 					tv_eternity(&rep->rex);
 		
@@ -1527,7 +1527,7 @@
 
 				/* if the user wants to log as soon as possible, without counting
 				   bytes from the server, then this is the right moment. */
-				if (t->proxy->to_log && !(t->logs.logwait & LW_BYTES)) {
+				if (t->fe->to_log && !(t->logs.logwait & LW_BYTES)) {
 					t->logs.t_close = t->logs.t_connect; /* to get a valid end date */
 					sess_log(t);
 				}
@@ -1563,7 +1563,7 @@
 				if (t->flags & SN_CACHEABLE) {
 					if ((t->flags & SN_CACHE_COOK) &&
 					    (t->flags & SN_SCK_ANY) &&
-					    (t->proxy->options & PR_O_CHK_CACHE)) {
+					    (t->be->options & PR_O_CHK_CACHE)) {
 
 						/* we're in presence of a cacheable response containing
 						 * a set-cookie header. We'll block it as requested by
@@ -1576,22 +1576,22 @@
 							t->srv->cur_sess--;
 							t->srv->failed_secu++;
 						}
-						t->proxy->failed_secu++;
+						t->be->failed_secu++;
 						t->srv_state = SV_STCLOSE;
 						t->logs.status = 502;
-						client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
+						client_return(t, t->fe->errmsg.len502, t->fe->errmsg.msg502);
 						if (!(t->flags & SN_ERR_MASK))
 							t->flags |= SN_ERR_PRXCOND;
 						if (!(t->flags & SN_FINST_MASK))
 							t->flags |= SN_FINST_H;
 
-						Alert("Blocking cacheable cookie in response from instance %s, server %s.\n", t->proxy->id, t->srv->id);
-						send_log(t->proxy, LOG_ALERT, "Blocking cacheable cookie in response from instance %s, server %s.\n", t->proxy->id, t->srv->id);
+						Alert("Blocking cacheable cookie in response from instance %s, server %s.\n", t->be->id, t->srv->id);
+						send_log(t->be, LOG_ALERT, "Blocking cacheable cookie in response from instance %s, server %s.\n", t->be->id, t->srv->id);
 
 						/* We used to have a free connection slot. Since we'll never use it,
 						 * we have to inform the server that it may be used by another session.
 						 */
-						if (may_dequeue_tasks(t->srv, t->proxy))
+						if (may_dequeue_tasks(t->srv, t->be))
 							task_wakeup(&rq, t->srv->queue_mgt);
 
 						return 1;
@@ -1607,10 +1607,10 @@
 						t->srv->cur_sess--;
 						t->srv->failed_secu++;
 					}
-					t->proxy->failed_secu++;
+					t->be->failed_secu++;
 					t->srv_state = SV_STCLOSE;
 					t->logs.status = 502;
-					client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
+					client_return(t, t->fe->errmsg.len502, t->fe->errmsg.msg502);
 					if (!(t->flags & SN_ERR_MASK))
 						t->flags |= SN_ERR_PRXCOND;
 					if (!(t->flags & SN_FINST_MASK))
@@ -1618,7 +1618,7 @@
 					/* We used to have a free connection slot. Since we'll never use it,
 					 * we have to inform the server that it may be used by another session.
 					 */
-					if (may_dequeue_tasks(t->srv, t->proxy))
+					if (may_dequeue_tasks(t->srv, t->be))
 						task_wakeup(&rq, t->srv->queue_mgt);
 
 					return 1;
@@ -1626,15 +1626,15 @@
 
 				/* we'll have something else to do here : add new headers ... */
 
-				if ((t->srv) && !(t->flags & SN_DIRECT) && (t->proxy->options & PR_O_COOK_INS) &&
-				    (!(t->proxy->options & PR_O_COOK_POST) || (t->flags & SN_POST))) {
+				if ((t->srv) && !(t->flags & SN_DIRECT) && (t->be->options & PR_O_COOK_INS) &&
+				    (!(t->be->options & PR_O_COOK_POST) || (t->flags & SN_POST))) {
 					/* the server is known, it's not the one the client requested, we have to
 					 * insert a set-cookie here, except if we want to insert only on POST
 					 * requests and this one isn't. Note that servers which don't have cookies
 					 * (eg: some backup servers) will return a full cookie removal request.
 					 */
 					len = sprintf(trash, "Set-Cookie: %s=%s; path=/\r\n",
-						      t->proxy->cookie_name,
+						      t->be->cookie_name,
 						      t->srv->cookie ? t->srv->cookie : "; Expires=Thu, 01-Jan-1970 00:00:01 GMT");
 
 					t->flags |= SN_SCK_INSERTED;
@@ -1644,7 +1644,7 @@
 					 * Some caches understand the correct form: 'no-cache="set-cookie"', but
 					 * others don't (eg: apache <= 1.3.26). So we use 'private' instead.
 					 */
-					if (t->proxy->options & PR_O_COOK_NOC)
+					if (t->be->options & PR_O_COOK_NOC)
 						//len += sprintf(newhdr + len, "Cache-control: no-cache=\"set-cookie\"\r\n");
 						len += sprintf(trash + len, "Cache-control: private\r\n");
 
@@ -1655,13 +1655,13 @@
 				}
 
 				/* headers to be added */
-				for (line = 0; line < t->proxy->nb_rspadd; line++) {
-					len = sprintf(trash, "%s\r\n", t->proxy->rsp_add[line]);
+				for (line = 0; line < t->fi->nb_rspadd; line++) {
+					len = sprintf(trash, "%s\r\n", t->fi->rsp_add[line]);
 					buffer_replace2(rep, rep->h, rep->h, trash, len);
 				}
 
 				/* add a "connection: close" line if needed */
-				if (t->proxy->options & PR_O_HTTP_CLOSE)
+				if (t->fe->options & PR_O_HTTP_CLOSE)
 					buffer_replace2(rep, rep->h, rep->h, "Connection: close\r\n", 19);
 
 				t->srv_state = SV_STDATA;
@@ -1672,15 +1672,15 @@
 				 * we close the server's outgoing connection right now.
 				 */
 				if ((req->l == 0) &&
-				    (c == CL_STSHUTR || c == CL_STCLOSE || t->proxy->options & PR_O_FORCE_CLO)) {
+				    (c == CL_STSHUTR || c == CL_STCLOSE || t->be->options & PR_O_FORCE_CLO)) {
 					MY_FD_CLR(t->srv_fd, StaticWriteEvent);
 					tv_eternity(&req->wex);
 
 					/* We must ensure that the read part is still alive when switching
 					 * to shutw */
 					MY_FD_SET(t->srv_fd, StaticReadEvent);
-					if (t->proxy->srvtimeout)
-						tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+					if (t->be->srvtimeout)
+						tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 
 					shutdown(t->srv_fd, SHUT_WR);
 					t->srv_state = SV_STSHUTW;
@@ -1688,7 +1688,7 @@
 
 				/* if the user wants to log as soon as possible, without counting
 				   bytes from the server, then this is the right moment. */
-				if (t->proxy->to_log && !(t->logs.logwait & LW_BYTES)) {
+				if (t->fe->to_log && !(t->logs.logwait & LW_BYTES)) {
 					t->logs.t_close = t->logs.t_data; /* to get a valid end date */
 					t->logs.bytes = rep->h - rep->data;
 					sess_log(t);
@@ -1745,7 +1745,7 @@
 					 *    unless the response includes appropriate
 					 *    Cache-Control or Expires header fields."
 					 */
-					if (!(t->flags & SN_POST) && (t->proxy->options & PR_O_CHK_CACHE))
+					if (!(t->flags & SN_POST) && (t->be->options & PR_O_CHK_CACHE))
 						t->flags |= SN_CACHEABLE | SN_CACHE_COOK;
 					break;
 				default:
@@ -1755,7 +1755,7 @@
 			else if (t->logs.logwait & LW_RSPHDR) {
 				struct cap_hdr *h;
 				int len;
-				for (h = t->proxy->rsp_cap; h; h = h->next) {
+				for (h = t->fi->rsp_cap; h; h = h->next) {
 					if ((h->namelen + 2 <= ptr - rep->h) &&
 					    (rep->h[h->namelen] == ':') &&
 					    (strncasecmp(rep->h, h->name, h->namelen) == 0)) {
@@ -1778,7 +1778,7 @@
 
 			if ((global.mode & MODE_DEBUG) && (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))) {
 				int len, max;
-				len = sprintf(trash, "%08x:%s.srvhdr[%04x:%04x]: ", t->uniq_id, t->proxy->id, (unsigned  short)t->cli_fd, (unsigned short)t->srv_fd);
+				len = sprintf(trash, "%08x:%s.srvhdr[%04x:%04x]: ", t->uniq_id, t->be->id, (unsigned  short)t->cli_fd, (unsigned short)t->srv_fd);
 				max = ptr - rep->h;
 				UBOUND(max, sizeof(trash) - len - 1);
 				len += strlcpy2(trash + len, rep->h, max + 1);
@@ -1787,20 +1787,20 @@
 			}
 
 			/* remove "connection: " if needed */
-			if (!delete_header && (t->proxy->options & PR_O_HTTP_CLOSE)
+			if (!delete_header && (t->fe->options & PR_O_HTTP_CLOSE)
 			    && (strncasecmp(rep->h, "Connection: ", 12) == 0)) {
 				delete_header = 1;
 			}
 
 			/* try headers regexps */
-			if (!delete_header && t->proxy->rsp_exp != NULL
+			if (!delete_header && t->fi->rsp_exp != NULL
 			    && !(t->flags & SN_SVDENY)) {
 				struct hdr_exp *exp;
 				char term;
 		
 				term = *ptr;
 				*ptr = '\0';
-				exp = t->proxy->rsp_exp;
+				exp = t->fi->rsp_exp;
 				do {
 					if (regexec(exp->preg, rep->h, MAX_MATCH, pmatch, 0) == 0) {
 						switch (exp->action) {
@@ -1864,7 +1864,7 @@
 
 			/* check for server cookies */
 			if (!delete_header /*&& (t->proxy->options & PR_O_COOK_ANY)*/
-			    && (t->proxy->cookie_name != NULL || t->proxy->capture_name != NULL || t->proxy->appsession_name !=NULL)
+			    && (t->be->cookie_name != NULL || t->fi->capture_name != NULL || t->be->appsession_name !=NULL)
 			    && (strncasecmp(rep->h, "Set-Cookie: ", 12) == 0)) {
 				char *p1, *p2, *p3, *p4;
 		
@@ -1902,24 +1902,24 @@
 					 */
 
 					/* first, let's see if we want to capture it */
-					if (t->proxy->capture_name != NULL &&
+					if (t->fi->capture_name != NULL &&
 					    t->logs.srv_cookie == NULL &&
-					    (p4 - p1 >= t->proxy->capture_namelen) &&
-					    memcmp(p1, t->proxy->capture_name, t->proxy->capture_namelen) == 0) {
+					    (p4 - p1 >= t->fi->capture_namelen) &&
+					    memcmp(p1, t->fi->capture_name, t->fi->capture_namelen) == 0) {
 						int log_len = p4 - p1;
 
 						if ((t->logs.srv_cookie = pool_alloc(capture)) == NULL) {
 							Alert("HTTP logging : out of memory.\n");
 						}
 
-						if (log_len > t->proxy->capture_len)
-							log_len = t->proxy->capture_len;
+						if (log_len > t->fi->capture_len)
+							log_len = t->fi->capture_len;
 						memcpy(t->logs.srv_cookie, p1, log_len);
 						t->logs.srv_cookie[log_len] = 0;
 					}
 
-					if ((p2 - p1 == t->proxy->cookie_len) && (t->proxy->cookie_name != NULL) &&
-					    (memcmp(p1, t->proxy->cookie_name, p2 - p1) == 0)) {
+					if ((p2 - p1 == t->be->cookie_len) && (t->be->cookie_name != NULL) &&
+					    (memcmp(p1, t->be->cookie_name, p2 - p1) == 0)) {
 						/* Cool... it's the right one */
 						t->flags |= SN_SCK_SEEN;
 			
@@ -1927,20 +1927,20 @@
 						 * this occurrence because we'll insert another one later.
 						 * We'll delete it too if the "indirect" option is set and we're in
 						 * a direct access. */
-						if (((t->srv) && (t->proxy->options & PR_O_COOK_INS)) ||
-						    ((t->flags & SN_DIRECT) && (t->proxy->options & PR_O_COOK_IND))) {
+						if (((t->srv) && (t->be->options & PR_O_COOK_INS)) ||
+						    ((t->flags & SN_DIRECT) && (t->be->options & PR_O_COOK_IND))) {
 							/* this header must be deleted */
 							delete_header = 1;
 							t->flags |= SN_SCK_DELETED;
 						}
-						else if ((t->srv) && (t->proxy->options & PR_O_COOK_RW)) {
+						else if ((t->srv) && (t->be->options & PR_O_COOK_RW)) {
 							/* replace bytes p3->p4 with the cookie name associated
 							 * with this server since we know it.
 							 */
 							buffer_replace2(rep, p3, p4, t->srv->cookie, t->srv->cklen);
 							t->flags |= SN_SCK_INSERTED | SN_SCK_DELETED;
 						}
-						else if ((t->srv) && (t->proxy->options & PR_O_COOK_PFX)) {
+						else if ((t->srv) && (t->be->options & PR_O_COOK_PFX)) {
 							/* insert the cookie name associated with this server
 							 * before existing cookie, and insert a delimitor between them..
 							 */
@@ -1952,8 +1952,8 @@
 					}
 
 					/* first, let's see if the cookie is our appcookie*/
-					if ((t->proxy->appsession_name != NULL) &&
-					    (memcmp(p1, t->proxy->appsession_name, p2 - p1) == 0)) {
+					if ((t->be->appsession_name != NULL) &&
+					    (memcmp(p1, t->be->appsession_name, p2 - p1) == 0)) {
 
 						/* Cool... it's the right one */
 
@@ -1962,22 +1962,22 @@
 		      
 						if ((asession_temp->sessid = pool_alloc_from(apools.sessid, apools.ses_msize)) == NULL) {
 							Alert("Not enought Memory process_srv():asession->sessid:malloc().\n");
-							send_log(t->proxy, LOG_ALERT, "Not enought Memory process_srv():asession->sessid:malloc().\n");
+							send_log(t->be, LOG_ALERT, "Not enought Memory process_srv():asession->sessid:malloc().\n");
 						}
-						memcpy(asession_temp->sessid, p3, t->proxy->appsession_len);
-						asession_temp->sessid[t->proxy->appsession_len] = 0;
+						memcpy(asession_temp->sessid, p3, t->be->appsession_len);
+						asession_temp->sessid[t->be->appsession_len] = 0;
 						asession_temp->serverid = NULL;
 
 						/* only do insert, if lookup fails */
-						if (chtbl_lookup(&(t->proxy->htbl_proxy), (void *) &asession_temp) != 0) {
+						if (chtbl_lookup(&(t->be->htbl_proxy), (void *) &asession_temp) != 0) {
 							if ((asession_temp = pool_alloc(appsess)) == NULL) {
 								Alert("Not enought Memory process_srv():asession:calloc().\n");
-								send_log(t->proxy, LOG_ALERT, "Not enought Memory process_srv():asession:calloc().\n");
+								send_log(t->be, LOG_ALERT, "Not enought Memory process_srv():asession:calloc().\n");
 								return 0;
 							}
 							asession_temp->sessid = local_asession.sessid;
 							asession_temp->serverid = local_asession.serverid;
-							chtbl_insert(&(t->proxy->htbl_proxy), (void *) asession_temp);
+							chtbl_insert(&(t->be->htbl_proxy), (void *) asession_temp);
 						}/* end if (chtbl_lookup()) */
 						else {
 							/* free wasted memory */
@@ -1987,7 +1987,7 @@
 						if (asession_temp->serverid == NULL) {
 							if ((asession_temp->serverid = pool_alloc_from(apools.serverid, apools.ser_msize)) == NULL) {
 								Alert("Not enought Memory process_srv():asession->sessid:malloc().\n");
-								send_log(t->proxy, LOG_ALERT, "Not enought Memory process_srv():asession->sessid:malloc().\n");
+								send_log(t->be, LOG_ALERT, "Not enought Memory process_srv():asession->sessid:malloc().\n");
 							}
 							asession_temp->serverid[0] = '\0';
 						}
@@ -1995,10 +1995,10 @@
 						if (asession_temp->serverid[0] == '\0')
 							memcpy(asession_temp->serverid,t->srv->id,server_id_len);
 		      
-						tv_delayfrom(&asession_temp->expire, &now, t->proxy->appsession_timeout);
+						tv_delayfrom(&asession_temp->expire, &now, t->be->appsession_timeout);
 
 #if defined(DEBUG_HASH)
-						print_table(&(t->proxy->htbl_proxy));
+						print_table(&(t->be->htbl_proxy));
 #endif
 						break;
 					}/* end if ((t->proxy->appsession_name != NULL) ... */
@@ -2015,7 +2015,7 @@
 
 			/* check for any set-cookie in case we check for cacheability */
 			if (!delete_header && !(t->flags & SN_SCK_ANY) &&
-			    (t->proxy->options & PR_O_CHK_CACHE) &&
+			    (t->be->options & PR_O_CHK_CACHE) &&
 			    (strncasecmp(rep->h, "Set-Cookie: ", 12) == 0)) {
 				t->flags |= SN_SCK_ANY;
 			}
@@ -2035,8 +2035,8 @@
 			 * rep->l == rlim-data
 			 */
 			MY_FD_SET(t->srv_fd, StaticReadEvent);
-			if (t->proxy->srvtimeout)
-				tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+			if (t->be->srvtimeout)
+				tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 			else
 				tv_eternity(&rep->rex);
 		}
@@ -2050,11 +2050,11 @@
 				t->srv->cur_sess--;
 				t->srv->failed_resp++;
 			}
-			t->proxy->failed_resp++;
+			t->be->failed_resp++;
 
 			t->srv_state = SV_STCLOSE;
 			t->logs.status = 502;
-			client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
+			client_return(t, t->fe->errmsg.len502, t->fe->errmsg.msg502);
 			if (!(t->flags & SN_ERR_MASK))
 				t->flags |= SN_ERR_SRVCL;
 			if (!(t->flags & SN_FINST_MASK))
@@ -2062,7 +2062,7 @@
 			/* We used to have a free connection slot. Since we'll never use it,
 			 * we have to inform the server that it may be used by another session.
 			 */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 
 			return 1;
@@ -2089,10 +2089,10 @@
 				t->srv->cur_sess--;
 				t->srv->failed_resp++;
 			}
-			t->proxy->failed_resp++;
+			t->be->failed_resp++;
 			t->srv_state = SV_STCLOSE;
 			t->logs.status = 504;
-			client_return(t, t->proxy->errmsg.len504, t->proxy->errmsg.msg504);
+			client_return(t, t->fe->errmsg.len504, t->fe->errmsg.msg504);
 			if (!(t->flags & SN_ERR_MASK))
 				t->flags |= SN_ERR_SRVTO;
 			if (!(t->flags & SN_FINST_MASK))
@@ -2100,7 +2100,7 @@
 			/* We used to have a free connection slot. Since we'll never use it,
 			 * we have to inform the server that it may be used by another session.
 			 */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 
 			return 1;
@@ -2120,8 +2120,8 @@
 			/* We must ensure that the read part is still alive when switching
 			 * to shutw */
 			MY_FD_SET(t->srv_fd, StaticReadEvent);
-			if (t->proxy->srvtimeout)
-				tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+			if (t->be->srvtimeout)
+				tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 
 			shutdown(t->srv_fd, SHUT_WR);
 			t->srv_state = SV_STSHUTW;
@@ -2139,14 +2139,14 @@
 			/* We must ensure that the read part is still alive when switching
 			 * to shutw */
 			MY_FD_SET(t->srv_fd, StaticReadEvent);
-			if (t->proxy->srvtimeout)
-				tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+			if (t->be->srvtimeout)
+				tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 
 			/* We must ensure that the read part is still alive when switching
 			 * to shutw */
 			MY_FD_SET(t->srv_fd, StaticReadEvent);
-			if (t->proxy->srvtimeout)
-				tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+			if (t->be->srvtimeout)
+				tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 
 			t->srv_state = SV_STSHUTW;
 			if (!(t->flags & SN_ERR_MASK))
@@ -2165,8 +2165,8 @@
 		else { /* client buffer not empty */
 			if (! MY_FD_ISSET(t->srv_fd, StaticWriteEvent)) {
 				MY_FD_SET(t->srv_fd, StaticWriteEvent); /* restart writing */
-				if (t->proxy->srvtimeout) {
-					tv_delayfrom(&req->wex, &now, t->proxy->srvtimeout);
+				if (t->be->srvtimeout) {
+					tv_delayfrom(&req->wex, &now, t->be->srvtimeout);
 					/* FIXME: to prevent the server from expiring read timeouts during writes,
 					 * we refresh it. */
 					rep->rex = req->wex;
@@ -2194,7 +2194,7 @@
 				t->srv->cur_sess--;
 				t->srv->failed_resp++;
 			}
-			t->proxy->failed_resp++;
+			t->be->failed_resp++;
 			t->srv_state = SV_STCLOSE;
 			if (!(t->flags & SN_ERR_MASK))
 				t->flags |= SN_ERR_SRVCL;
@@ -2203,7 +2203,7 @@
 			/* We used to have a free connection slot. Since we'll never use it,
 			 * we have to inform the server that it may be used by another session.
 			 */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 
 			return 1;
@@ -2225,8 +2225,8 @@
 			/* We must ensure that the read part is still alive when switching
 			 * to shutw */
 			MY_FD_SET(t->srv_fd, StaticReadEvent);
-			if (t->proxy->srvtimeout)
-				tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+			if (t->be->srvtimeout)
+				tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 
 			t->srv_state = SV_STSHUTW;
 			return 1;
@@ -2251,8 +2251,8 @@
 			/* We must ensure that the read part is still alive when switching
 			 * to shutw */
 			MY_FD_SET(t->srv_fd, StaticReadEvent);
-			if (t->proxy->srvtimeout)
-				tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+			if (t->be->srvtimeout)
+				tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 			t->srv_state = SV_STSHUTW;
 			if (!(t->flags & SN_ERR_MASK))
 				t->flags |= SN_ERR_SRVTO;
@@ -2271,8 +2271,8 @@
 		else { /* buffer not empty, there are still data to be transferred */
 			if (! MY_FD_ISSET(t->srv_fd, StaticWriteEvent)) {
 				MY_FD_SET(t->srv_fd, StaticWriteEvent); /* restart writing */
-				if (t->proxy->srvtimeout) {
-					tv_delayfrom(&req->wex, &now, t->proxy->srvtimeout);
+				if (t->be->srvtimeout) {
+					tv_delayfrom(&req->wex, &now, t->be->srvtimeout);
 					/* FIXME: to prevent the server from expiring read timeouts during writes,
 					 * we refresh it. */
 					rep->rex = req->wex;
@@ -2292,8 +2292,8 @@
 		else {
 			if (! MY_FD_ISSET(t->srv_fd, StaticReadEvent)) {
 				MY_FD_SET(t->srv_fd, StaticReadEvent);
-				if (t->proxy->srvtimeout)
-					tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+				if (t->be->srvtimeout)
+					tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 				else
 					tv_eternity(&rep->rex);
 			}
@@ -2310,7 +2310,7 @@
 				t->srv->cur_sess--;
 				t->srv->failed_resp++;
 			}
-			t->proxy->failed_resp++;
+			t->be->failed_resp++;
 			//close(t->srv_fd);
 			t->srv_state = SV_STCLOSE;
 			if (!(t->flags & SN_ERR_MASK))
@@ -2320,7 +2320,7 @@
 			/* We used to have a free connection slot. Since we'll never use it,
 			 * we have to inform the server that it may be used by another session.
 			 */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 
 			return 1;
@@ -2336,7 +2336,7 @@
 			/* We used to have a free connection slot. Since we'll never use it,
 			 * we have to inform the server that it may be used by another session.
 			 */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 
 			return 1;
@@ -2356,7 +2356,7 @@
 			/* We used to have a free connection slot. Since we'll never use it,
 			 * we have to inform the server that it may be used by another session.
 			 */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 
 			return 1;
@@ -2370,8 +2370,8 @@
 		else { /* buffer not empty */
 			if (! MY_FD_ISSET(t->srv_fd, StaticWriteEvent)) {
 				MY_FD_SET(t->srv_fd, StaticWriteEvent); /* restart writing */
-				if (t->proxy->srvtimeout) {
-					tv_delayfrom(&req->wex, &now, t->proxy->srvtimeout);
+				if (t->be->srvtimeout) {
+					tv_delayfrom(&req->wex, &now, t->be->srvtimeout);
 					/* FIXME: to prevent the server from expiring read timeouts during writes,
 					 * we refresh it. */
 					rep->rex = req->wex;
@@ -2391,7 +2391,7 @@
 				t->srv->cur_sess--;
 				t->srv->failed_resp++;
 			}
-			t->proxy->failed_resp++;
+			t->be->failed_resp++;
 			//close(t->srv_fd);
 			t->srv_state = SV_STCLOSE;
 			if (!(t->flags & SN_ERR_MASK))
@@ -2401,7 +2401,7 @@
 			/* We used to have a free connection slot. Since we'll never use it,
 			 * we have to inform the server that it may be used by another session.
 			 */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 
 			return 1;
@@ -2417,7 +2417,7 @@
 			/* We used to have a free connection slot. Since we'll never use it,
 			 * we have to inform the server that it may be used by another session.
 			 */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 
 			return 1;
@@ -2437,7 +2437,7 @@
 			/* We used to have a free connection slot. Since we'll never use it,
 			 * we have to inform the server that it may be used by another session.
 			 */
-			if (may_dequeue_tasks(t->srv, t->proxy))
+			if (may_dequeue_tasks(t->srv, t->be))
 				task_wakeup(&rq, t->srv->queue_mgt);
 
 			return 1;
@@ -2451,8 +2451,8 @@
 		else {
 			if (! MY_FD_ISSET(t->srv_fd, StaticReadEvent)) {
 				MY_FD_SET(t->srv_fd, StaticReadEvent);
-				if (t->proxy->srvtimeout)
-					tv_delayfrom(&rep->rex, &now, t->proxy->srvtimeout);
+				if (t->be->srvtimeout)
+					tv_delayfrom(&rep->rex, &now, t->be->srvtimeout);
 				else
 					tv_eternity(&rep->rex);
 			}
@@ -2462,7 +2462,7 @@
 	else { /* SV_STCLOSE : nothing to do */
 		if ((global.mode & MODE_DEBUG) && (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))) {
 			int len;
-			len = sprintf(trash, "%08x:%s.srvcls[%04x:%04x]\n", t->uniq_id, t->proxy->id, (unsigned short)t->cli_fd, (unsigned short)t->srv_fd);
+			len = sprintf(trash, "%08x:%s.srvcls[%04x:%04x]\n", t->uniq_id, t->be->id, (unsigned short)t->cli_fd, (unsigned short)t->srv_fd);
 			write(1, trash, len);
 		}
 		return 0;
@@ -2637,13 +2637,13 @@
 				if (px->state == PR_STSTOPPED)
 					goto next_proxy;
 
-				if (s->proxy->uri_auth && s->proxy->uri_auth->scope) {
+				if (s->fi->uri_auth && s->fi->uri_auth->scope) {
 					/* we have a limited scope, we have to check the proxy name */
 					struct stat_scope *scope;
 					int len;
 
 					len = strlen(px->id);
-					scope = s->proxy->uri_auth->scope;
+					scope = s->fi->uri_auth->scope;
 
 					while (scope) {
 						/* match exact proxy name */
@@ -2651,7 +2651,7 @@
 							break;
 
 						/* match '.' which means 'self' proxy */
-						if (!strcmp(scope->px_id, ".") && px == s->proxy)
+						if (!strcmp(scope->px_id, ".") && px == s->fe)
 							break;
 						scope = scope->next;
 					}
@@ -2862,7 +2862,7 @@
 	else {
 		/* unknown data source */
 		s->logs.status = 500;
-		client_retnclose(s, s->proxy->errmsg.len500, s->proxy->errmsg.msg500);
+		client_retnclose(s, s->fe->errmsg.len500, s->fe->errmsg.msg500);
 		if (!(s->flags & SN_ERR_MASK))
 			s->flags |= SN_ERR_PRXCOND;
 		if (!(s->flags & SN_FINST_MASK))
diff --git a/src/queue.c b/src/queue.c
index 8b37da0..1247d25 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -104,13 +104,13 @@
 		if (sess->srv->nbpend > sess->srv->nbpend_max)
 			sess->srv->nbpend_max = sess->srv->nbpend;
 	} else {
-		LIST_ADDQ(&sess->proxy->pendconns, &p->list);
-		sess->logs.prx_queue_size += sess->proxy->nbpend;
-		sess->proxy->nbpend++;
-		if (sess->proxy->nbpend > sess->proxy->nbpend_max)
-			sess->proxy->nbpend_max = sess->proxy->nbpend;
+		LIST_ADDQ(&sess->be->pendconns, &p->list);
+		sess->logs.prx_queue_size += sess->be->nbpend;
+		sess->be->nbpend++;
+		if (sess->be->nbpend > sess->be->nbpend_max)
+			sess->be->nbpend_max = sess->be->nbpend;
 	}
-	sess->proxy->totpend++;
+	sess->be->totpend++;
 	return p;
 }
 
@@ -126,8 +126,8 @@
 	if (p->srv)
 		p->srv->nbpend--;
 	else
-		p->sess->proxy->nbpend--;
-	p->sess->proxy->totpend--;
+		p->sess->be->nbpend--;
+	p->sess->be->totpend--;
 	pool_free(pendconn, p);
 }
 
diff --git a/src/session.c b/src/session.c
index 9a59e28..16047ea 100644
--- a/src/session.c
+++ b/src/session.c
@@ -41,19 +41,19 @@
 
 	if (s->rsp_cap != NULL) {
 		struct cap_hdr *h;
-		for (h = s->proxy->rsp_cap; h; h = h->next) {
+		for (h = s->fi->rsp_cap; h; h = h->next) {
 			if (s->rsp_cap[h->index] != NULL)
 				pool_free_to(h->pool, s->rsp_cap[h->index]);
 		}
-		pool_free_to(s->proxy->rsp_cap_pool, s->rsp_cap);
+		pool_free_to(s->fi->rsp_cap_pool, s->rsp_cap);
 	}
 	if (s->req_cap != NULL) {
 		struct cap_hdr *h;
-		for (h = s->proxy->req_cap; h; h = h->next) {
+		for (h = s->fi->req_cap; h; h = h->next) {
 			if (s->req_cap[h->index] != NULL)
 				pool_free_to(h->pool, s->req_cap[h->index]);
 		}
-		pool_free_to(s->proxy->req_cap_pool, s->req_cap);
+		pool_free_to(s->fi->req_cap_pool, s->req_cap);
 	}
 
 	if (s->logs.uri)