diff --git a/src/auth.c b/src/auth.c
index 8b7d268..7f6ad0a 100644
--- a/src/auth.c
+++ b/src/auth.c
@@ -276,7 +276,7 @@
 
 	/* Browse the userlist for searching user. */
 	for (u = ul->users; u; u = u->next) {
-		if (strcmp(smp->data.str.str, u->user) == 0)
+		if (strcmp(smp->data.data.str.str, u->user) == 0)
 			break;
 	}
 	if (!u)
diff --git a/src/backend.c b/src/backend.c
index 9e8e9b6..adfd388 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -476,7 +476,7 @@
 	b_rew(s->req.buf, rewind = s->req.buf->o);
 
 	ret = fetch_rdp_cookie_name(s, &smp, px->hh_name, px->hh_len);
-	len = smp.data.str.len;
+	len = smp.data.data.str.len;
 
 	b_adv(s->req.buf, rewind);
 
@@ -490,7 +490,7 @@
 	/* Found a the hh_name in the headers.
 	 * we will compute the hash based on this value ctx.val.
 	 */
-	hash = gen_hash(px, smp.data.str.str, len);
+	hash = gen_hash(px, smp.data.data.str.str, len);
 
 	if ((px->lbprm.algo & BE_LB_HASH_MOD) == BE_LB_HMOD_AVAL)
 		hash = full_hash(hash);
@@ -1218,10 +1218,10 @@
 			if (smp) {
 				/* get write access to terminate with a zero */
 				smp_dup(smp);
-				if (smp->data.str.len >= smp->data.str.size)
-					smp->data.str.len = smp->data.str.size - 1;
-				smp->data.str.str[smp->data.str.len] = 0;
-				ssl_sock_set_servername(srv_conn, smp->data.str.str);
+				if (smp->data.data.str.len >= smp->data.data.str.size)
+					smp->data.data.str.len = smp->data.data.str.size - 1;
+				smp->data.data.str.str[smp->data.data.str.len] = 0;
+				ssl_sock_set_servername(srv_conn, smp->data.data.str.str);
 				srv_conn->flags |= CO_FL_PRIVATE;
 			}
 		}
@@ -1361,14 +1361,14 @@
 	memset(&smp, 0, sizeof(smp));
 
 	ret = fetch_rdp_cookie_name(s, &smp, s->be->rdp_cookie_name, s->be->rdp_cookie_len);
-	if (ret == 0 || (smp.flags & SMP_F_MAY_CHANGE) || smp.data.str.len == 0)
+	if (ret == 0 || (smp.flags & SMP_F_MAY_CHANGE) || smp.data.data.str.len == 0)
 		goto no_cookie;
 
 	memset(&addr, 0, sizeof(addr));
 	addr.sin_family = AF_INET;
 
 	/* Considering an rdp cookie detected using acl, str ended with <cr><lf> and should return */
-	addr.sin_addr.s_addr = strtoul(smp.data.str.str, &p, 10);
+	addr.sin_addr.s_addr = strtoul(smp.data.data.str.str, &p, 10);
 	if (*p != '.')
 		goto no_cookie;
 	p++;
@@ -1602,15 +1602,15 @@
 	struct proxy *px;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
+	smp->data.type = SMP_T_SINT;
 	px = args->data.prx;
 
 	if (px->srv_act)
-		smp->data.sint = px->srv_act;
+		smp->data.data.sint = px->srv_act;
 	else if (px->lbprm.fbck)
-		smp->data.sint = 1;
+		smp->data.data.sint = 1;
 	else
-		smp->data.sint = px->srv_bck;
+		smp->data.data.sint = px->srv_bck;
 
 	return 1;
 }
@@ -1626,12 +1626,12 @@
 	struct server *srv = args->data.srv;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_BOOL;
+	smp->data.type = SMP_T_BOOL;
 	if (!(srv->admin & SRV_ADMF_MAINT) &&
 	    (!(srv->check.state & CHK_ST_CONFIGURED) || (srv->state != SRV_ST_STOPPED)))
-		smp->data.sint = 1;
+		smp->data.data.sint = 1;
 	else
-		smp->data.sint = 0;
+		smp->data.data.sint = 0;
 	return 1;
 }
 
@@ -1645,8 +1645,8 @@
 	struct server *iterator;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	for (iterator = args->data.prx->srv; iterator; iterator = iterator->next) {
 		if (iterator->state == SRV_ST_STOPPED)
@@ -1654,11 +1654,11 @@
 
 		if (iterator->maxconn == 0 || iterator->maxqueue == 0) {
 			/* configuration is stupid */
-			smp->data.sint = -1;  /* FIXME: stupid value! */
+			smp->data.data.sint = -1;  /* FIXME: stupid value! */
 			return 1;
 		}
 
-		smp->data.sint += (iterator->maxconn - iterator->cur_sess)
+		smp->data.data.sint += (iterator->maxconn - iterator->cur_sess)
 		                       +  (iterator->maxqueue - iterator->nbpend);
 	}
 
@@ -1670,8 +1670,8 @@
 smp_fetch_be_id(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TXN;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = smp->strm->be->uuid;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = smp->strm->be->uuid;
 	return 1;
 }
 
@@ -1682,8 +1682,8 @@
 	if (!objt_server(smp->strm->target))
 		return 0;
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = objt_server(smp->strm->target)->puid;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = objt_server(smp->strm->target)->puid;
 
 	return 1;
 }
@@ -1696,8 +1696,8 @@
 smp_fetch_be_sess_rate(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = read_freq_ctr(&args->data.prx->be_sess_per_sec);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = read_freq_ctr(&args->data.prx->be_sess_per_sec);
 	return 1;
 }
 
@@ -1709,8 +1709,8 @@
 smp_fetch_be_conn(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = args->data.prx->beconn;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = args->data.prx->beconn;
 	return 1;
 }
 
@@ -1722,8 +1722,8 @@
 smp_fetch_queue_size(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = args->data.prx->totpend;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = args->data.prx->totpend;
 	return 1;
 }
 
@@ -1742,7 +1742,7 @@
 	struct proxy *px;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
+	smp->data.type = SMP_T_SINT;
 	px = args->data.prx;
 
 	if (px->srv_act)
@@ -1753,9 +1753,9 @@
 		nbsrv = px->srv_bck;
 
 	if (nbsrv > 0)
-		smp->data.sint = (px->totpend + nbsrv - 1) / nbsrv;
+		smp->data.data.sint = (px->totpend + nbsrv - 1) / nbsrv;
 	else
-		smp->data.sint = px->totpend * 2;
+		smp->data.data.sint = px->totpend * 2;
 
 	return 1;
 }
@@ -1768,8 +1768,8 @@
 smp_fetch_srv_conn(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = args->data.srv->cur_sess;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = args->data.srv->cur_sess;
 	return 1;
 }
 
@@ -1781,8 +1781,8 @@
 smp_fetch_srv_sess_rate(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = read_freq_ctr(&args->data.srv->sess_per_sec);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = read_freq_ctr(&args->data.srv->sess_per_sec);
 	return 1;
 }
 
diff --git a/src/compression.c b/src/compression.c
index ec5ab33..eddf944 100644
--- a/src/compression.c
+++ b/src/compression.c
@@ -840,8 +840,8 @@
 static int
 smp_fetch_res_comp(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = (smp->strm->comp_algo != NULL);
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = (smp->strm->comp_algo != NULL);
 	return 1;
 }
 
@@ -852,10 +852,10 @@
 	if (!smp->strm->comp_algo)
 		return 0;
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
-	smp->data.str.str = smp->strm->comp_algo->cfg_name;
-	smp->data.str.len = smp->strm->comp_algo->cfg_name_len;
+	smp->data.data.str.str = smp->strm->comp_algo->cfg_name;
+	smp->data.data.str.len = smp->strm->comp_algo->cfg_name_len;
 	return 1;
 }
 
diff --git a/src/da.c b/src/da.c
index 2b809e4..a2e78c6 100644
--- a/src/da.c
+++ b/src/da.c
@@ -147,8 +147,8 @@
 	tmp = get_trash_chunk();
 	chunk_reset(tmp);
 
-	i = smp->data.str.len > sizeof(useragentbuf) ? sizeof(useragentbuf) : smp->data.str.len;
-	memcpy(useragentbuf, smp->data.str.str, i - 1);
+	i = smp->data.data.str.len > sizeof(useragentbuf) ? sizeof(useragentbuf) : smp->data.data.str.len;
+	memcpy(useragentbuf, smp->data.data.str.str, i - 1);
 	useragentbuf[i - 1] = 0;
 
 	useragent = (const char *)useragentbuf;
@@ -211,8 +211,8 @@
 		tmp->str[tmp->len] = 0;
 	}
 
-	smp->data.str.str = tmp->str;
-	smp->data.str.len = strlen(tmp->str);
+	smp->data.data.str.str = tmp->str;
+	smp->data.data.str.len = strlen(tmp->str);
 
 	return 1;
 }
diff --git a/src/dumpstats.c b/src/dumpstats.c
index ea53d25..2d091af 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -5633,10 +5633,10 @@
 			chunk_reset(&trash);
 
 			/* execute pattern matching */
-			sample.type = SMP_T_STR;
+			sample.data.type = SMP_T_STR;
 			sample.flags |= SMP_F_CONST;
-			sample.data.str.len = appctx->ctx.map.chunk.len;
-			sample.data.str.str = appctx->ctx.map.chunk.str;
+			sample.data.data.str.len = appctx->ctx.map.chunk.len;
+			sample.data.data.str.str = appctx->ctx.map.chunk.str;
 			if (appctx->ctx.map.expr->pat_head->match &&
 			    sample_convert(&sample, appctx->ctx.map.expr->pat_head->expect_type))
 				pat = appctx->ctx.map.expr->pat_head->match(&sample, appctx->ctx.map.expr, 1);
diff --git a/src/frontend.c b/src/frontend.c
index 83e8425..9e64b38 100644
--- a/src/frontend.c
+++ b/src/frontend.c
@@ -162,8 +162,8 @@
 smp_fetch_fe_id(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_SESS;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = smp->sess->fe->uuid;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = smp->sess->fe->uuid;
 	return 1;
 }
 
@@ -175,8 +175,8 @@
 smp_fetch_fe_sess_rate(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = read_freq_ctr(&args->data.prx->fe_sess_per_sec);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = read_freq_ctr(&args->data.prx->fe_sess_per_sec);
 	return 1;
 }
 
@@ -188,8 +188,8 @@
 smp_fetch_fe_conn(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = args->data.prx->feconn;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = args->data.prx->feconn;
 	return 1;
 }
 
diff --git a/src/hlua.c b/src/hlua.c
index d3c968d..c38e582 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -382,19 +382,19 @@
  */
 static int hlua_smp2lua(lua_State *L, struct sample *smp)
 {
-	switch (smp->type) {
+	switch (smp->data.type) {
 	case SMP_T_SINT:
 	case SMP_T_BOOL:
-		lua_pushinteger(L, smp->data.sint);
+		lua_pushinteger(L, smp->data.data.sint);
 		break;
 
 	case SMP_T_BIN:
 	case SMP_T_STR:
-		lua_pushlstring(L, smp->data.str.str, smp->data.str.len);
+		lua_pushlstring(L, smp->data.data.str.str, smp->data.data.str.len);
 		break;
 
 	case SMP_T_METH:
-		switch (smp->data.meth.meth) {
+		switch (smp->data.data.meth.meth) {
 		case HTTP_METH_OPTIONS: lua_pushstring(L, "OPTIONS"); break;
 		case HTTP_METH_GET:     lua_pushstring(L, "GET");     break;
 		case HTTP_METH_HEAD:    lua_pushstring(L, "HEAD");    break;
@@ -404,7 +404,7 @@
 		case HTTP_METH_TRACE:   lua_pushstring(L, "TRACE");   break;
 		case HTTP_METH_CONNECT: lua_pushstring(L, "CONNECT"); break;
 		case HTTP_METH_OTHER:
-			lua_pushlstring(L, smp->data.meth.str.str, smp->data.meth.str.len);
+			lua_pushlstring(L, smp->data.data.meth.str.str, smp->data.data.meth.str.len);
 			break;
 		default:
 			lua_pushnil(L);
@@ -415,9 +415,9 @@
 	case SMP_T_IPV4:
 	case SMP_T_IPV6:
 	case SMP_T_ADDR: /* This type is never used to qualify a sample. */
-		if (sample_casts[smp->type][SMP_T_STR] &&
-		    sample_casts[smp->type][SMP_T_STR](smp))
-			lua_pushlstring(L, smp->data.str.str, smp->data.str.len);
+		if (sample_casts[smp->data.type][SMP_T_STR] &&
+		    sample_casts[smp->data.type][SMP_T_STR](smp))
+			lua_pushlstring(L, smp->data.data.str.str, smp->data.data.str.len);
 		else
 			lua_pushnil(L);
 		break;
@@ -434,15 +434,15 @@
  */
 static int hlua_smp2lua_str(lua_State *L, struct sample *smp)
 {
-	switch (smp->type) {
+	switch (smp->data.type) {
 
 	case SMP_T_BIN:
 	case SMP_T_STR:
-		lua_pushlstring(L, smp->data.str.str, smp->data.str.len);
+		lua_pushlstring(L, smp->data.data.str.str, smp->data.data.str.len);
 		break;
 
 	case SMP_T_METH:
-		switch (smp->data.meth.meth) {
+		switch (smp->data.data.meth.meth) {
 		case HTTP_METH_OPTIONS: lua_pushstring(L, "OPTIONS"); break;
 		case HTTP_METH_GET:     lua_pushstring(L, "GET");     break;
 		case HTTP_METH_HEAD:    lua_pushstring(L, "HEAD");    break;
@@ -452,7 +452,7 @@
 		case HTTP_METH_TRACE:   lua_pushstring(L, "TRACE");   break;
 		case HTTP_METH_CONNECT: lua_pushstring(L, "CONNECT"); break;
 		case HTTP_METH_OTHER:
-			lua_pushlstring(L, smp->data.meth.str.str, smp->data.meth.str.len);
+			lua_pushlstring(L, smp->data.data.meth.str.str, smp->data.data.meth.str.len);
 			break;
 		default:
 			lua_pushstring(L, "");
@@ -465,9 +465,9 @@
 	case SMP_T_IPV4:
 	case SMP_T_IPV6:
 	case SMP_T_ADDR: /* This type is never used to qualify a sample. */
-		if (sample_casts[smp->type][SMP_T_STR] &&
-		    sample_casts[smp->type][SMP_T_STR](smp))
-			lua_pushlstring(L, smp->data.str.str, smp->data.str.len);
+		if (sample_casts[smp->data.type][SMP_T_STR] &&
+		    sample_casts[smp->data.type][SMP_T_STR](smp))
+			lua_pushlstring(L, smp->data.data.str.str, smp->data.data.str.len);
 		else
 			lua_pushstring(L, "");
 		break;
@@ -487,20 +487,20 @@
 	switch (lua_type(L, ud)) {
 
 	case LUA_TNUMBER:
-		smp->type = SMP_T_SINT;
-		smp->data.sint = lua_tointeger(L, ud);
+		smp->data.type = SMP_T_SINT;
+		smp->data.data.sint = lua_tointeger(L, ud);
 		break;
 
 
 	case LUA_TBOOLEAN:
-		smp->type = SMP_T_BOOL;
-		smp->data.sint = lua_toboolean(L, ud);
+		smp->data.type = SMP_T_BOOL;
+		smp->data.data.sint = lua_toboolean(L, ud);
 		break;
 
 	case LUA_TSTRING:
-		smp->type = SMP_T_STR;
+		smp->data.type = SMP_T_STR;
 		smp->flags |= SMP_F_CONST;
-		smp->data.str.str = (char *)lua_tolstring(L, ud, (size_t *)&smp->data.str.len);
+		smp->data.data.str.str = (char *)lua_tolstring(L, ud, (size_t *)&smp->data.data.str.len);
 		break;
 
 	case LUA_TUSERDATA:
@@ -509,8 +509,8 @@
 	case LUA_TFUNCTION:
 	case LUA_TTHREAD:
 	case LUA_TLIGHTUSERDATA:
-		smp->type = SMP_T_BOOL;
-		smp->data.sint = 0;
+		smp->data.type = SMP_T_BOOL;
+		smp->data.data.sint = 0;
 		break;
 	}
 	return 1;
@@ -1369,13 +1369,13 @@
 	MAY_LJMP(check_args(L, 2, "lookup"));
 	desc = MAY_LJMP(hlua_checkmap(L, 1));
 	if (desc->pat.expect_type == SMP_T_SINT) {
-		smp.type = SMP_T_SINT;
-		smp.data.sint = MAY_LJMP(luaL_checkinteger(L, 2));
+		smp.data.type = SMP_T_SINT;
+		smp.data.data.sint = MAY_LJMP(luaL_checkinteger(L, 2));
 	}
 	else {
-		smp.type = SMP_T_STR;
+		smp.data.type = SMP_T_STR;
 		smp.flags = SMP_F_CONST;
-		smp.data.str.str = (char *)MAY_LJMP(luaL_checklstring(L, 2, (size_t *)&smp.data.str.len));
+		smp.data.data.str.str = (char *)MAY_LJMP(luaL_checklstring(L, 2, (size_t *)&smp.data.data.str.len));
 	}
 
 	pat = pattern_exec_match(&desc->pat, &smp, 1);
@@ -2867,13 +2867,13 @@
 	}
 
 	/* Apply expected cast. */
-	if (!sample_casts[smp.type][conv->in_type]) {
+	if (!sample_casts[smp.data.type][conv->in_type]) {
 		hlua_pusherror(L, "invalid input argument: cannot cast '%s' to '%s'",
-		               smp_to_type[smp.type], smp_to_type[conv->in_type]);
+		               smp_to_type[smp.data.type], smp_to_type[conv->in_type]);
 		WILL_LJMP(lua_error(L));
 	}
-	if (sample_casts[smp.type][conv->in_type] != c_none &&
-	    !sample_casts[smp.type][conv->in_type](&smp)) {
+	if (sample_casts[smp.data.type][conv->in_type] != c_none &&
+	    !sample_casts[smp.data.type][conv->in_type](&smp)) {
 		hlua_pusherror(L, "error during the input argument casting");
 		WILL_LJMP(lua_error(L));
 	}
diff --git a/src/listener.c b/src/listener.c
index 254907c..a2d1890 100644
--- a/src/listener.c
+++ b/src/listener.c
@@ -593,8 +593,8 @@
 static int
 smp_fetch_dconn(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_SINT;
-	smp->data.sint = smp->sess->listener->nbconn;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = smp->sess->listener->nbconn;
 	return 1;
 }
 
@@ -602,8 +602,8 @@
 static int
 smp_fetch_so_id(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_SINT;
-	smp->data.sint = smp->sess->listener->luid;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = smp->sess->listener->luid;
 	return 1;
 }
 
diff --git a/src/log.c b/src/log.c
index f80de2e..2a2d09b 100644
--- a/src/log.c
+++ b/src/log.c
@@ -993,9 +993,9 @@
 					key = sample_fetch_as_type(be, sess, s, SMP_OPT_DIR_RES|SMP_OPT_FINAL, tmp->expr, SMP_T_STR);
 				if (tmp->options & LOG_OPT_HTTP)
 					ret = encode_chunk(tmplog, dst + maxsize,
-					                   '%', http_encode_map, key ? &key->data.str : &empty);
+					                   '%', http_encode_map, key ? &key->data.data.str : &empty);
 				else
-					ret = lf_text_len(tmplog, key ? key->data.str.str : NULL, key ? key->data.str.len : 0, dst + maxsize - tmplog, tmp);
+					ret = lf_text_len(tmplog, key ? key->data.data.str.str : NULL, key ? key->data.data.str.len : 0, dst + maxsize - tmplog, tmp);
 				if (ret == 0)
 					goto out;
 				tmplog = ret;
diff --git a/src/map.c b/src/map.c
index a03853d..2a8f95c 100644
--- a/src/map.c
+++ b/src/map.c
@@ -161,15 +161,15 @@
 	if (pat) {
 		/* Copy sample. */
 		if (pat->data) {
-			smp->type = pat->data->type;
+			smp->data.type = pat->data->type;
 			smp->flags |= SMP_F_CONST;
-			memcpy(&smp->data, &pat->data->data, sizeof(smp->data));
+			memcpy(&smp->data.data, &pat->data->data, sizeof(smp->data.data));
 			return 1;
 		}
 
 		/* Return just int sample containing 1. */
-		smp->type = SMP_T_SINT;
-		smp->data.sint = 1;
+		smp->data.type = SMP_T_SINT;
+		smp->data.data.sint = 1;
 		return 1;
 	}
 
@@ -181,24 +181,24 @@
 	switch (desc->conv->out_type) {
 
 	case SMP_T_STR:
-		smp->type = SMP_T_STR;
+		smp->data.type = SMP_T_STR;
 		smp->flags |= SMP_F_CONST;
-		smp->data.str = arg_p[1].data.str;
+		smp->data.data.str = arg_p[1].data.str;
 		break;
 
 	case SMP_T_SINT:
-		smp->type = SMP_T_SINT;
-		smp->data.sint = arg_p[1].data.sint;
+		smp->data.type = SMP_T_SINT;
+		smp->data.data.sint = arg_p[1].data.sint;
 		break;
 
 	case SMP_T_IPV4:
-		smp->type = SMP_T_IPV4;
-		smp->data.ipv4 = arg_p[1].data.ipv4;
+		smp->data.type = SMP_T_IPV4;
+		smp->data.data.ipv4 = arg_p[1].data.ipv4;
 		break;
 
 	case SMP_T_IPV6:
-		smp->type = SMP_T_IPV6;
-		smp->data.ipv6 = arg_p[1].data.ipv6;
+		smp->data.type = SMP_T_IPV6;
+		smp->data.data.ipv6 = arg_p[1].data.ipv6;
 		break;
 	}
 
diff --git a/src/pattern.c b/src/pattern.c
index 297f45f..d91286e 100644
--- a/src/pattern.c
+++ b/src/pattern.c
@@ -425,7 +425,7 @@
 /* always return false */
 struct pattern *pat_match_nothing(struct sample *smp, struct pattern_expr *expr, int fill)
 {
-	if (smp->data.sint) {
+	if (smp->data.data.sint) {
 		if (fill) {
 			static_pattern.data = NULL;
 			static_pattern.ref = NULL;
@@ -454,12 +454,12 @@
 	/* Lookup a string in the expression's pattern tree. */
 	if (!eb_is_empty(&expr->pattern_tree)) {
 		/* we may have to force a trailing zero on the test pattern */
-		prev = smp->data.str.str[smp->data.str.len];
+		prev = smp->data.data.str.str[smp->data.data.str.len];
 		if (prev)
-			smp->data.str.str[smp->data.str.len] = '\0';
-		node = ebst_lookup(&expr->pattern_tree, smp->data.str.str);
+			smp->data.data.str.str[smp->data.data.str.len] = '\0';
+		node = ebst_lookup(&expr->pattern_tree, smp->data.data.str.str);
 		if (prev)
-			smp->data.str.str[smp->data.str.len] = prev;
+			smp->data.data.str.str[smp->data.data.str.len] = prev;
 
 		if (node) {
 			if (fill) {
@@ -478,7 +478,7 @@
 	if (pat_lru_tree) {
 		unsigned long long seed = pat_lru_seed ^ (long)expr;
 
-		lru = lru64_get(XXH64(smp->data.str.str, smp->data.str.len, seed),
+		lru = lru64_get(XXH64(smp->data.data.str.str, smp->data.data.str.len, seed),
 				pat_lru_tree, expr, expr->revision);
 		if (lru && lru->domain)
 			return lru->data;
@@ -487,12 +487,12 @@
 	list_for_each_entry(lst, &expr->patterns, list) {
 		pattern = &lst->pat;
 
-		if (pattern->len != smp->data.str.len)
+		if (pattern->len != smp->data.data.str.len)
 			continue;
 
 		icase = expr->mflags & PAT_MF_IGNORE_CASE;
-		if ((icase && strncasecmp(pattern->ptr.str, smp->data.str.str, smp->data.str.len) == 0) ||
-		    (!icase && strncmp(pattern->ptr.str, smp->data.str.str, smp->data.str.len) == 0)) {
+		if ((icase && strncasecmp(pattern->ptr.str, smp->data.data.str.str, smp->data.data.str.len) == 0) ||
+		    (!icase && strncmp(pattern->ptr.str, smp->data.data.str.str, smp->data.data.str.len) == 0)) {
 			ret = pattern;
 			break;
 		}
@@ -515,7 +515,7 @@
 	if (pat_lru_tree) {
 		unsigned long long seed = pat_lru_seed ^ (long)expr;
 
-		lru = lru64_get(XXH64(smp->data.str.str, smp->data.str.len, seed),
+		lru = lru64_get(XXH64(smp->data.data.str.str, smp->data.data.str.len, seed),
 				pat_lru_tree, expr, expr->revision);
 		if (lru && lru->domain)
 			return lru->data;
@@ -524,10 +524,10 @@
 	list_for_each_entry(lst, &expr->patterns, list) {
 		pattern = &lst->pat;
 
-		if (pattern->len != smp->data.str.len)
+		if (pattern->len != smp->data.data.str.len)
 			continue;
 
-		if (memcmp(pattern->ptr.str, smp->data.str.str, smp->data.str.len) == 0) {
+		if (memcmp(pattern->ptr.str, smp->data.data.str.str, smp->data.data.str.len) == 0) {
 			ret = pattern;
 			break;
 		}
@@ -552,7 +552,7 @@
 	if (pat_lru_tree) {
 		unsigned long long seed = pat_lru_seed ^ (long)expr;
 
-		lru = lru64_get(XXH64(smp->data.str.str, smp->data.str.len, seed),
+		lru = lru64_get(XXH64(smp->data.data.str.str, smp->data.data.str.len, seed),
 				pat_lru_tree, expr, expr->revision);
 		if (lru && lru->domain)
 			return lru->data;
@@ -561,7 +561,7 @@
 	list_for_each_entry(lst, &expr->patterns, list) {
 		pattern = &lst->pat;
 
-		if (regex_exec2(pattern->ptr.reg, smp->data.str.str, smp->data.str.len)) {
+		if (regex_exec2(pattern->ptr.reg, smp->data.data.str.str, smp->data.data.str.len)) {
 			ret = pattern;
 			break;
 		}
@@ -588,12 +588,12 @@
 	/* Lookup a string in the expression's pattern tree. */
 	if (!eb_is_empty(&expr->pattern_tree)) {
 		/* we may have to force a trailing zero on the test pattern */
-		prev = smp->data.str.str[smp->data.str.len];
+		prev = smp->data.data.str.str[smp->data.data.str.len];
 		if (prev)
-			smp->data.str.str[smp->data.str.len] = '\0';
-		node = ebmb_lookup_longest(&expr->pattern_tree, smp->data.str.str);
+			smp->data.data.str.str[smp->data.data.str.len] = '\0';
+		node = ebmb_lookup_longest(&expr->pattern_tree, smp->data.data.str.str);
 		if (prev)
-			smp->data.str.str[smp->data.str.len] = prev;
+			smp->data.data.str.str[smp->data.data.str.len] = prev;
 
 		if (node) {
 			if (fill) {
@@ -612,7 +612,7 @@
 	if (pat_lru_tree) {
 		unsigned long long seed = pat_lru_seed ^ (long)expr;
 
-		lru = lru64_get(XXH64(smp->data.str.str, smp->data.str.len, seed),
+		lru = lru64_get(XXH64(smp->data.data.str.str, smp->data.data.str.len, seed),
 				pat_lru_tree, expr, expr->revision);
 		if (lru && lru->domain)
 			return lru->data;
@@ -621,12 +621,12 @@
 	list_for_each_entry(lst, &expr->patterns, list) {
 		pattern = &lst->pat;
 
-		if (pattern->len > smp->data.str.len)
+		if (pattern->len > smp->data.data.str.len)
 			continue;
 
 		icase = expr->mflags & PAT_MF_IGNORE_CASE;
-		if ((icase && strncasecmp(pattern->ptr.str, smp->data.str.str, pattern->len) != 0) ||
-		    (!icase && strncmp(pattern->ptr.str, smp->data.str.str, pattern->len) != 0))
+		if ((icase && strncasecmp(pattern->ptr.str, smp->data.data.str.str, pattern->len) != 0) ||
+		    (!icase && strncmp(pattern->ptr.str, smp->data.data.str.str, pattern->len) != 0))
 			continue;
 
 		ret = pattern;
@@ -651,7 +651,7 @@
 	if (pat_lru_tree) {
 		unsigned long long seed = pat_lru_seed ^ (long)expr;
 
-		lru = lru64_get(XXH64(smp->data.str.str, smp->data.str.len, seed),
+		lru = lru64_get(XXH64(smp->data.data.str.str, smp->data.data.str.len, seed),
 				pat_lru_tree, expr, expr->revision);
 		if (lru && lru->domain)
 			return lru->data;
@@ -660,12 +660,12 @@
 	list_for_each_entry(lst, &expr->patterns, list) {
 		pattern = &lst->pat;
 
-		if (pattern->len > smp->data.str.len)
+		if (pattern->len > smp->data.data.str.len)
 			continue;
 
 		icase = expr->mflags & PAT_MF_IGNORE_CASE;
-		if ((icase && strncasecmp(pattern->ptr.str, smp->data.str.str + smp->data.str.len - pattern->len, pattern->len) != 0) ||
-		    (!icase && strncmp(pattern->ptr.str, smp->data.str.str + smp->data.str.len - pattern->len, pattern->len) != 0))
+		if ((icase && strncasecmp(pattern->ptr.str, smp->data.data.str.str + smp->data.data.str.len - pattern->len, pattern->len) != 0) ||
+		    (!icase && strncmp(pattern->ptr.str, smp->data.data.str.str + smp->data.data.str.len - pattern->len, pattern->len) != 0))
 			continue;
 
 		ret = pattern;
@@ -694,7 +694,7 @@
 	if (pat_lru_tree) {
 		unsigned long long seed = pat_lru_seed ^ (long)expr;
 
-		lru = lru64_get(XXH64(smp->data.str.str, smp->data.str.len, seed),
+		lru = lru64_get(XXH64(smp->data.data.str.str, smp->data.data.str.len, seed),
 				pat_lru_tree, expr, expr->revision);
 		if (lru && lru->domain)
 			return lru->data;
@@ -703,13 +703,13 @@
 	list_for_each_entry(lst, &expr->patterns, list) {
 		pattern = &lst->pat;
 
-		if (pattern->len > smp->data.str.len)
+		if (pattern->len > smp->data.data.str.len)
 			continue;
 
-		end = smp->data.str.str + smp->data.str.len - pattern->len;
+		end = smp->data.data.str.str + smp->data.data.str.len - pattern->len;
 		icase = expr->mflags & PAT_MF_IGNORE_CASE;
 		if (icase) {
-			for (c = smp->data.str.str; c <= end; c++) {
+			for (c = smp->data.data.str.str; c <= end; c++) {
 				if (tolower(*c) != tolower(*pattern->ptr.str))
 					continue;
 				if (strncasecmp(pattern->ptr.str, c, pattern->len) == 0) {
@@ -718,7 +718,7 @@
 				}
 			}
 		} else {
-			for (c = smp->data.str.str; c <= end; c++) {
+			for (c = smp->data.data.str.str; c <= end; c++) {
 				if (*c != *pattern->ptr.str)
 					continue;
 				if (strncmp(pattern->ptr.str, c, pattern->len) == 0) {
@@ -759,13 +759,13 @@
 	while (pl > 0 && is_delimiter(ps[pl - 1], delimiters))
 		pl--;
 
-	if (pl > smp->data.str.len)
+	if (pl > smp->data.data.str.len)
 		return PAT_NOMATCH;
 
 	may_match = 1;
 	icase = mflags & PAT_MF_IGNORE_CASE;
-	end = smp->data.str.str + smp->data.str.len - pl;
-	for (c = smp->data.str.str; c <= end; c++) {
+	end = smp->data.data.str.str + smp->data.data.str.len - pl;
+	for (c = smp->data.data.str.str; c <= end; c++) {
 		if (is_delimiter(*c, delimiters)) {
 			may_match = 1;
 			continue;
@@ -832,8 +832,8 @@
 
 	list_for_each_entry(lst, &expr->patterns, list) {
 		pattern = &lst->pat;
-		if ((!pattern->val.range.min_set || pattern->val.range.min <= smp->data.sint) &&
-		    (!pattern->val.range.max_set || smp->data.sint <= pattern->val.range.max))
+		if ((!pattern->val.range.min_set || pattern->val.range.min <= smp->data.data.sint) &&
+		    (!pattern->val.range.max_set || smp->data.data.sint <= pattern->val.range.max))
 			return pattern;
 	}
 	return NULL;
@@ -847,8 +847,8 @@
 
 	list_for_each_entry(lst, &expr->patterns, list) {
 		pattern = &lst->pat;
-		if ((!pattern->val.range.min_set || pattern->val.range.min <= smp->data.str.len) &&
-		    (!pattern->val.range.max_set || smp->data.str.len <= pattern->val.range.max))
+		if ((!pattern->val.range.min_set || pattern->val.range.min <= smp->data.data.str.len) &&
+		    (!pattern->val.range.max_set || smp->data.data.str.len <= pattern->val.range.max))
 			return pattern;
 	}
 	return NULL;
@@ -865,11 +865,11 @@
 	struct pattern *pattern;
 
 	/* The input sample is IPv4. Try to match in the trees. */
-	if (smp->type == SMP_T_IPV4) {
+	if (smp->data.type == SMP_T_IPV4) {
 		/* Lookup an IPv4 address in the expression's pattern tree using
 		 * the longest match method.
 		 */
-		s = &smp->data.ipv4;
+		s = &smp->data.data.ipv4;
 		node = ebmb_lookup_longest(&expr->pattern_tree, &s->s_addr);
 		if (node) {
 			if (fill) {
@@ -891,7 +891,7 @@
 		 */
 		memset(&tmp6, 0, 10);
 		*(uint16_t*)&tmp6.s6_addr[10] = htons(0xffff);
-		*(uint32_t*)&tmp6.s6_addr[12] = smp->data.ipv4.s_addr;
+		*(uint32_t*)&tmp6.s6_addr[12] = smp->data.data.ipv4.s_addr;
 		node = ebmb_lookup_longest(&expr->pattern_tree_2, &tmp6);
 		if (node) {
 			if (fill) {
@@ -908,11 +908,11 @@
 	}
 
 	/* The input sample is IPv6. Try to match in the trees. */
-	if (smp->type == SMP_T_IPV6) {
+	if (smp->data.type == SMP_T_IPV6) {
 		/* Lookup an IPv6 address in the expression's pattern tree using
 		 * the longest match method.
 		 */
-		node = ebmb_lookup_longest(&expr->pattern_tree_2, &smp->data.ipv6);
+		node = ebmb_lookup_longest(&expr->pattern_tree_2, &smp->data.data.ipv6);
 		if (node) {
 			if (fill) {
 				elt = ebmb_entry(node, struct pattern_tree, node);
@@ -932,16 +932,16 @@
 		 *   - ::0000:ip:v4 (old ipv4 mapped)
 		 *   - 2002:ip:v4:: (6to4)
 		 */
-		if ((*(uint32_t*)&smp->data.ipv6.s6_addr[0] == 0 &&
-		     *(uint32_t*)&smp->data.ipv6.s6_addr[4]  == 0 &&
-		     (*(uint32_t*)&smp->data.ipv6.s6_addr[8] == 0 ||
-		      *(uint32_t*)&smp->data.ipv6.s6_addr[8] == htonl(0xFFFF))) ||
-		    *(uint16_t*)&smp->data.ipv6.s6_addr[0] == htons(0x2002)) {
-			if (*(uint32_t*)&smp->data.ipv6.s6_addr[0] == 0)
-				v4 = *(uint32_t*)&smp->data.ipv6.s6_addr[12];
+		if ((*(uint32_t*)&smp->data.data.ipv6.s6_addr[0] == 0 &&
+		     *(uint32_t*)&smp->data.data.ipv6.s6_addr[4]  == 0 &&
+		     (*(uint32_t*)&smp->data.data.ipv6.s6_addr[8] == 0 ||
+		      *(uint32_t*)&smp->data.data.ipv6.s6_addr[8] == htonl(0xFFFF))) ||
+		    *(uint16_t*)&smp->data.data.ipv6.s6_addr[0] == htons(0x2002)) {
+			if (*(uint32_t*)&smp->data.data.ipv6.s6_addr[0] == 0)
+				v4 = *(uint32_t*)&smp->data.data.ipv6.s6_addr[12];
 			else
-				v4 = htonl((ntohs(*(uint16_t*)&smp->data.ipv6.s6_addr[2]) << 16) +
-				            ntohs(*(uint16_t*)&smp->data.ipv6.s6_addr[4]));
+				v4 = htonl((ntohs(*(uint16_t*)&smp->data.data.ipv6.s6_addr[2]) << 16) +
+				            ntohs(*(uint16_t*)&smp->data.data.ipv6.s6_addr[4]));
 
 			/* Lookup an IPv4 address in the expression's pattern tree using the longest
 			 * match method.
@@ -968,25 +968,25 @@
 		pattern = &lst->pat;
 
 		/* The input sample is IPv4, use it as is. */
-		if (smp->type == SMP_T_IPV4) {
-			v4 = smp->data.ipv4.s_addr;
+		if (smp->data.type == SMP_T_IPV4) {
+			v4 = smp->data.data.ipv4.s_addr;
 		}
-		else if (smp->type == SMP_T_IPV6) {
+		else if (smp->data.type == SMP_T_IPV6) {
 			/* v4 match on a V6 sample. We want to check at least for
 			 * the following forms :
 			 *   - ::ffff:ip:v4 (ipv4 mapped)
 			 *   - ::0000:ip:v4 (old ipv4 mapped)
 			 *   - 2002:ip:v4:: (6to4)
 			 */
-			if (*(uint32_t*)&smp->data.ipv6.s6_addr[0] == 0 &&
-			    *(uint32_t*)&smp->data.ipv6.s6_addr[4]  == 0 &&
-			    (*(uint32_t*)&smp->data.ipv6.s6_addr[8] == 0 ||
-			     *(uint32_t*)&smp->data.ipv6.s6_addr[8] == htonl(0xFFFF))) {
-				v4 = *(uint32_t*)&smp->data.ipv6.s6_addr[12];
+			if (*(uint32_t*)&smp->data.data.ipv6.s6_addr[0] == 0 &&
+			    *(uint32_t*)&smp->data.data.ipv6.s6_addr[4]  == 0 &&
+			    (*(uint32_t*)&smp->data.data.ipv6.s6_addr[8] == 0 ||
+			     *(uint32_t*)&smp->data.data.ipv6.s6_addr[8] == htonl(0xFFFF))) {
+				v4 = *(uint32_t*)&smp->data.data.ipv6.s6_addr[12];
 			}
-			else if (*(uint16_t*)&smp->data.ipv6.s6_addr[0] == htons(0x2002)) {
-				v4 = htonl((ntohs(*(uint16_t*)&smp->data.ipv6.s6_addr[2]) << 16) +
-				            ntohs(*(uint16_t*)&smp->data.ipv6.s6_addr[4]));
+			else if (*(uint16_t*)&smp->data.data.ipv6.s6_addr[0] == htons(0x2002)) {
+				v4 = htonl((ntohs(*(uint16_t*)&smp->data.data.ipv6.s6_addr[2]) << 16) +
+				            ntohs(*(uint16_t*)&smp->data.data.ipv6.s6_addr[4]));
 			}
 			else
 				continue;
diff --git a/src/payload.c b/src/payload.c
index 32c530c..4c140d0 100644
--- a/src/payload.c
+++ b/src/payload.c
@@ -35,8 +35,8 @@
 		smp->flags |= SMP_F_MAY_CHANGE;
 		return 0;
 	}
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = 1;
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = 1;
 	return 1;
 }
 
@@ -50,8 +50,8 @@
 	if (!chn->buf)
 		return 0;
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = chn->buf->i;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = chn->buf->i;
 	smp->flags = SMP_F_VOLATILE | SMP_F_MAY_CHANGE;
 	return 1;
 }
@@ -159,8 +159,8 @@
 
 		/* Elliptic curves extension */
 		if (ext_type == 10) {
-			smp->type = SMP_T_BOOL;
-			smp->data.sint = 1;
+			smp->data.type = SMP_T_BOOL;
+			smp->data.data.sint = 1;
 			smp->flags = SMP_F_VOLATILE;
 			return 1;
 		}
@@ -224,8 +224,8 @@
 		goto not_ssl_hello;
 	}
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = hs_type;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = hs_type;
 	smp->flags = SMP_F_VOLATILE;
 
 	return 1;
@@ -338,8 +338,8 @@
 	/* OK that's enough. We have at least the whole message, and we have
 	 * the protocol version.
 	 */
-	smp->type = SMP_T_SINT;
-	smp->data.sint = version;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = version;
 	smp->flags = SMP_F_VOLATILE;
 	return 1;
 
@@ -492,9 +492,9 @@
 			name_len = (data[7] << 8) + data[8];
 
 			if (name_type == 0) { /* hostname */
-				smp->type = SMP_T_STR;
-				smp->data.str.str = (char *)data + 9;
-				smp->data.str.len = name_len;
+				smp->data.type = SMP_T_STR;
+				smp->data.data.str.str = (char *)data + 9;
+				smp->data.data.str.len = name_len;
 				smp->flags = SMP_F_VOLATILE | SMP_F_CONST;
 				return 1;
 			}
@@ -528,7 +528,7 @@
 		return 0;
 
 	smp->flags = SMP_F_CONST;
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 
 	bleft = s->req.buf->i;
 	if (bleft <= 11)
@@ -580,8 +580,8 @@
 	}
 
 	/* data points to cookie value */
-	smp->data.str.str = (char *)data;
-	smp->data.str.len = 0;
+	smp->data.data.str.str = (char *)data;
+	smp->data.data.str.len = 0;
 
 	while (bleft > 0 && *data != '\r') {
 		data++;
@@ -594,7 +594,7 @@
 	if (data[0] != '\r' || data[1] != '\n')
 		goto not_cookie;
 
-	smp->data.str.len = (char *)data - smp->data.str.str;
+	smp->data.data.str.len = (char *)data - smp->data.data.str.str;
 	smp->flags = SMP_F_VOLATILE | SMP_F_CONST;
 	return 1;
 
@@ -628,8 +628,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOLATILE;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = ret;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = ret;
 	return 1;
 }
 
@@ -680,9 +680,9 @@
 		goto too_short;
 
 	/* init chunk as read only */
-	smp->type = SMP_T_BIN;
+	smp->data.type = SMP_T_BIN;
 	smp->flags = SMP_F_VOLATILE | SMP_F_CONST;
-	chunk_initlen(&smp->data.str, chn->buf->p + buf_offset, 0, buf_size);
+	chunk_initlen(&smp->data.data.str, chn->buf->p + buf_offset, 0, buf_size);
 	return 1;
 
  too_short:
@@ -712,9 +712,9 @@
 		goto too_short;
 
 	/* init chunk as read only */
-	smp->type = SMP_T_BIN;
+	smp->data.type = SMP_T_BIN;
 	smp->flags = SMP_F_VOLATILE | SMP_F_CONST;
-	chunk_initlen(&smp->data.str, chn->buf->p + buf_offset, 0, buf_size ? buf_size : (chn->buf->i - buf_offset));
+	chunk_initlen(&smp->data.data.str, chn->buf->p + buf_offset, 0, buf_size ? buf_size : (chn->buf->i - buf_offset));
 	if (!buf_size && channel_may_recv(chn) && !channel_input_closed(chn))
 		smp->flags |= SMP_F_MAY_CHANGE;
 
diff --git a/src/proto_http.c b/src/proto_http.c
index 0935940..848e870 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -3682,13 +3682,13 @@
 				smp = sample_fetch_as_type(px, sess, s, SMP_OPT_DIR_REQ|SMP_OPT_FINAL, rule->arg.act.p[0], SMP_T_ADDR);
 
 				if (smp) {
-					if (smp->type == SMP_T_IPV4) {
+					if (smp->data.type == SMP_T_IPV4) {
 						((struct sockaddr_in *)&cli_conn->addr.from)->sin_family = AF_INET;
-						((struct sockaddr_in *)&cli_conn->addr.from)->sin_addr.s_addr = smp->data.ipv4.s_addr;
+						((struct sockaddr_in *)&cli_conn->addr.from)->sin_addr.s_addr = smp->data.data.ipv4.s_addr;
 						((struct sockaddr_in *)&cli_conn->addr.from)->sin_port = 0;
-					} else if (smp->type == SMP_T_IPV6) {
+					} else if (smp->data.type == SMP_T_IPV6) {
 						((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_family = AF_INET6;
-						memcpy(&((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_addr, &smp->data.ipv6, sizeof(struct in6_addr));
+						memcpy(&((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_addr, &smp->data.data.ipv6, sizeof(struct in6_addr));
 						((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_port = 0;
 					}
 				}
@@ -9945,7 +9945,7 @@
 	msg = &txn->req;
 
 	/* Check for a dependency on a request */
-	smp->type = SMP_T_BOOL;
+	smp->data.type = SMP_T_BOOL;
 
 	if ((opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ) {
 		/* If the buffer does not leave enough free space at the end,
@@ -9987,7 +9987,7 @@
 			if (unlikely(s->req.buf->i + s->req.buf->p >
 				     s->req.buf->data + s->req.buf->size - global.tune.maxrewrite)) {
 				msg->msg_state = HTTP_MSG_ERROR;
-				smp->data.sint = 1;
+				smp->data.data.sint = 1;
 				return 1;
 			}
 
@@ -10014,7 +10014,7 @@
 	}
 
 	/* everything's OK */
-	smp->data.sint = 1;
+	smp->data.data.sint = 1;
 	return 1;
 }
 
@@ -10068,15 +10068,15 @@
 	CHECK_HTTP_MESSAGE_FIRST_PERM();
 
 	meth = txn->meth;
-	smp->type = SMP_T_METH;
-	smp->data.meth.meth = meth;
+	smp->data.type = SMP_T_METH;
+	smp->data.data.meth.meth = meth;
 	if (meth == HTTP_METH_OTHER) {
 		if (txn->rsp.msg_state != HTTP_MSG_RPBEFORE)
 			/* ensure the indexes are not affected */
 			return 0;
 		smp->flags |= SMP_F_CONST;
-		smp->data.meth.str.len = txn->req.sl.rq.m_l;
-		smp->data.meth.str.str = txn->req.chn->buf->p;
+		smp->data.data.meth.str.len = txn->req.sl.rq.m_l;
+		smp->data.data.meth.str.str = txn->req.chn->buf->p;
 	}
 	smp->flags |= SMP_F_VOL_1ST;
 	return 1;
@@ -10094,19 +10094,19 @@
 
 		/* well-known method */
 		if (pattern->val.i != HTTP_METH_OTHER) {
-			if (smp->data.meth.meth == pattern->val.i)
+			if (smp->data.data.meth.meth == pattern->val.i)
 				return pattern;
 			else
 				continue;
 		}
 
 		/* Other method, we must compare the strings */
-		if (pattern->len != smp->data.meth.str.len)
+		if (pattern->len != smp->data.data.meth.str.len)
 			continue;
 
 		icase = expr->mflags & PAT_MF_IGNORE_CASE;
-		if ((icase && strncasecmp(pattern->ptr.str, smp->data.meth.str.str, smp->data.meth.str.len) == 0) ||
-		    (!icase && strncmp(pattern->ptr.str, smp->data.meth.str.str, smp->data.meth.str.len) == 0))
+		if ((icase && strncasecmp(pattern->ptr.str, smp->data.data.meth.str.str, smp->data.data.meth.str.len) == 0) ||
+		    (!icase && strncmp(pattern->ptr.str, smp->data.data.meth.str.str, smp->data.data.meth.str.len) == 0))
 			return pattern;
 	}
 	return NULL;
@@ -10128,9 +10128,9 @@
 	if (len <= 0)
 		return 0;
 
-	smp->type = SMP_T_STR;
-	smp->data.str.str = ptr;
-	smp->data.str.len = len;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str.str = ptr;
+	smp->data.data.str.len = len;
 
 	smp->flags = SMP_F_VOL_1ST | SMP_F_CONST;
 	return 1;
@@ -10156,9 +10156,9 @@
 	if (len <= 0)
 		return 0;
 
-	smp->type = SMP_T_STR;
-	smp->data.str.str = ptr;
-	smp->data.str.len = len;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str.str = ptr;
+	smp->data.data.str.len = len;
 
 	smp->flags = SMP_F_VOL_1ST | SMP_F_CONST;
 	return 1;
@@ -10181,8 +10181,8 @@
 	len = txn->rsp.sl.st.c_l;
 	ptr = txn->rsp.chn->buf->p + txn->rsp.sl.st.c;
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = __strl2ui(ptr, len);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = __strl2ui(ptr, len);
 	smp->flags = SMP_F_VOL_1ST;
 	return 1;
 }
@@ -10216,9 +10216,9 @@
 
 	if (block1 == len) {
 		/* buffer is not wrapped (or empty) */
-		smp->type = SMP_T_BIN;
-		smp->data.str.str = body;
-		smp->data.str.len = len;
+		smp->data.type = SMP_T_BIN;
+		smp->data.data.str.str = body;
+		smp->data.data.str.len = len;
 		smp->flags = SMP_F_VOL_TEST | SMP_F_CONST;
 	}
 	else {
@@ -10226,9 +10226,9 @@
 		temp = get_trash_chunk();
 		memcpy(temp->str, body, block1);
 		memcpy(temp->str + block1, msg->chn->buf->data, len - block1);
-		smp->type = SMP_T_BIN;
-		smp->data.str.str = temp->str;
-		smp->data.str.len = len;
+		smp->data.type = SMP_T_BIN;
+		smp->data.data.str.str = temp->str;
+		smp->data.data.str.len = len;
 		smp->flags = SMP_F_VOL_TEST;
 	}
 	return 1;
@@ -10251,8 +10251,8 @@
 	else
 		msg = &txn->rsp;
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = http_body_bytes(msg);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = http_body_bytes(msg);
 
 	smp->flags = SMP_F_VOL_TEST;
 	return 1;
@@ -10276,8 +10276,8 @@
 	else
 		msg = &txn->rsp;
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = msg->body_len;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = msg->body_len;
 
 	smp->flags = SMP_F_VOL_TEST;
 	return 1;
@@ -10293,9 +10293,9 @@
 	CHECK_HTTP_MESSAGE_FIRST();
 
 	txn = smp->strm->txn;
-	smp->type = SMP_T_STR;
-	smp->data.str.len = txn->req.sl.rq.u_l;
-	smp->data.str.str = txn->req.chn->buf->p + txn->req.sl.rq.u;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str.len = txn->req.sl.rq.u_l;
+	smp->data.data.str.str = txn->req.chn->buf->p + txn->req.sl.rq.u;
 	smp->flags = SMP_F_VOL_1ST | SMP_F_CONST;
 	return 1;
 }
@@ -10313,8 +10313,8 @@
 	if (((struct sockaddr_in *)&addr)->sin_family != AF_INET)
 		return 0;
 
-	smp->type = SMP_T_IPV4;
-	smp->data.ipv4 = ((struct sockaddr_in *)&addr)->sin_addr;
+	smp->data.type = SMP_T_IPV4;
+	smp->data.data.ipv4 = ((struct sockaddr_in *)&addr)->sin_addr;
 	smp->flags = 0;
 	return 1;
 }
@@ -10332,8 +10332,8 @@
 	if (((struct sockaddr_in *)&addr)->sin_family != AF_INET)
 		return 0;
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = ntohs(((struct sockaddr_in *)&addr)->sin_port);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = ntohs(((struct sockaddr_in *)&addr)->sin_port);
 	smp->flags = 0;
 	return 1;
 }
@@ -10389,9 +10389,9 @@
 		/* prepare to report multiple occurrences for ACL fetches */
 		smp->flags |= SMP_F_NOT_LAST;
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags |= SMP_F_VOL_HDR | SMP_F_CONST;
-	if (http_get_fhdr(msg, name_str, name_len, idx, occ, ctx, &smp->data.str.str, &smp->data.str.len))
+	if (http_get_fhdr(msg, name_str, name_len, idx, occ, ctx, &smp->data.data.str.str, &smp->data.data.str.len))
 		return 1;
 
 	smp->flags &= ~SMP_F_NOT_LAST;
@@ -10427,8 +10427,8 @@
 	while (http_find_full_header2(name, len, msg->chn->buf->p, idx, &ctx))
 		cnt++;
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = cnt;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = cnt;
 	smp->flags = SMP_F_VOL_HDR;
 	return 1;
 }
@@ -10460,9 +10460,9 @@
 		temp->len += ctx.del;
 	}
 
-	smp->type = SMP_T_STR;
-	smp->data.str.str = temp->str;
-	smp->data.str.len = temp->len;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str.str = temp->str;
+	smp->data.data.str.len = temp->len;
 	smp->flags = SMP_F_VOL_HDR;
 	return 1;
 }
@@ -10517,9 +10517,9 @@
 		/* prepare to report multiple occurrences for ACL fetches */
 		smp->flags |= SMP_F_NOT_LAST;
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags |= SMP_F_VOL_HDR | SMP_F_CONST;
-	if (http_get_hdr(msg, name_str, name_len, idx, occ, ctx, &smp->data.str.str, &smp->data.str.len))
+	if (http_get_hdr(msg, name_str, name_len, idx, occ, ctx, &smp->data.data.str.str, &smp->data.data.str.len))
 		return 1;
 
 	smp->flags &= ~SMP_F_NOT_LAST;
@@ -10554,8 +10554,8 @@
 	while (http_find_header2(name, len, msg->chn->buf->p, idx, &ctx))
 		cnt++;
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = cnt;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = cnt;
 	smp->flags = SMP_F_VOL_HDR;
 	return 1;
 }
@@ -10571,8 +10571,8 @@
 	int ret = smp_fetch_hdr(args, smp, kw, private);
 
 	if (ret > 0) {
-		smp->type = SMP_T_SINT;
-		smp->data.sint = strl2ic(smp->data.str.str, smp->data.str.len);
+		smp->data.type = SMP_T_SINT;
+		smp->data.data.sint = strl2ic(smp->data.data.str.str, smp->data.data.str.len);
 	}
 
 	return ret;
@@ -10588,16 +10588,16 @@
 	int ret;
 
 	while ((ret = smp_fetch_hdr(args, smp, kw, private)) > 0) {
-		if (url2ipv4((char *)smp->data.str.str, &smp->data.ipv4)) {
-			smp->type = SMP_T_IPV4;
+		if (url2ipv4((char *)smp->data.data.str.str, &smp->data.data.ipv4)) {
+			smp->data.type = SMP_T_IPV4;
 			break;
 		} else {
 			struct chunk *temp = get_trash_chunk();
-			if (smp->data.str.len < temp->size - 1) {
-				memcpy(temp->str, smp->data.str.str, smp->data.str.len);
-				temp->str[smp->data.str.len] = '\0';
-				if (inet_pton(AF_INET6, temp->str, &smp->data.ipv6)) {
-					smp->type = SMP_T_IPV6;
+			if (smp->data.data.str.len < temp->size - 1) {
+				memcpy(temp->str, smp->data.data.str.str, smp->data.data.str.len);
+				temp->str[smp->data.data.str.len] = '\0';
+				if (inet_pton(AF_INET6, temp->str, &smp->data.data.ipv6)) {
+					smp->data.type = SMP_T_IPV6;
 					break;
 				}
 			}
@@ -10628,13 +10628,13 @@
 		return 0;
 
 	/* OK, we got the '/' ! */
-	smp->type = SMP_T_STR;
-	smp->data.str.str = ptr;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str.str = ptr;
 
 	while (ptr < end && *ptr != '?')
 		ptr++;
 
-	smp->data.str.len = ptr - smp->data.str.str;
+	smp->data.data.str.len = ptr - smp->data.data.str.str;
 	smp->flags = SMP_F_VOL_1ST | SMP_F_CONST;
 	return 1;
 }
@@ -10664,9 +10664,9 @@
 	/* OK we have the header value in ctx.line+ctx.val for ctx.vlen bytes */
 	temp = get_trash_chunk();
 	memcpy(temp->str, ctx.line + ctx.val, ctx.vlen);
-	smp->type = SMP_T_STR;
-	smp->data.str.str = temp->str;
-	smp->data.str.len = ctx.vlen;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str.str = temp->str;
+	smp->data.data.str.len = ctx.vlen;
 
 	/* now retrieve the path */
 	end = txn->req.chn->buf->p + txn->req.sl.rq.u + txn->req.sl.rq.u_l;
@@ -10677,8 +10677,8 @@
 	for (ptr = beg; ptr < end && *ptr != '?'; ptr++);
 
 	if (beg < ptr && *beg == '/') {
-		memcpy(smp->data.str.str + smp->data.str.len, beg, ptr - beg);
-		smp->data.str.len += ptr - beg;
+		memcpy(smp->data.data.str.str + smp->data.data.str.len, beg, ptr - beg);
+		smp->data.data.str.len += ptr - beg;
 	}
 
 	smp->flags = SMP_F_VOL_1ST;
@@ -10728,8 +10728,8 @@
 	}
 	hash = full_hash(hash);
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = hash;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = hash;
 	smp->flags = SMP_F_VOL_1ST;
 	return 1;
 }
@@ -10754,7 +10754,7 @@
 		return 0;
 
 	temp = get_trash_chunk();
-	*(unsigned int *)temp->str = htonl(smp->data.sint);
+	*(unsigned int *)temp->str = htonl(smp->data.data.sint);
 	temp->len += sizeof(unsigned int);
 
 	switch (cli_conn->addr.from.ss_family) {
@@ -10770,8 +10770,8 @@
 		return 0;
 	}
 
-	smp->data.str = *temp;
-	smp->type = SMP_T_BIN;
+	smp->data.data.str = *temp;
+	smp->data.type = SMP_T_BIN;
 	return 1;
 }
 
@@ -10797,9 +10797,9 @@
 			return 0;
 	} while (*ptr++ != '?');
 
-	smp->type = SMP_T_STR;
-	smp->data.str.str = ptr;
-	smp->data.str.len = end - ptr;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str.str = ptr;
+	smp->data.data.str.len = end - ptr;
 	smp->flags = SMP_F_VOL_1ST | SMP_F_CONST;
 	return 1;
 }
@@ -10813,8 +10813,8 @@
 
 	CHECK_HTTP_MESSAGE_FIRST_PERM();
 
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = 1;
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = 1;
 	return 1;
 }
 
@@ -10822,8 +10822,8 @@
 static int
 smp_fetch_http_first_req(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = !(smp->strm->txn->flags & TX_NOT_FIRST);
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = !(smp->strm->txn->flags & TX_NOT_FIRST);
 	return 1;
 }
 
@@ -10840,8 +10840,8 @@
 	if (!get_http_auth(smp->strm))
 		return 0;
 
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = check_user(args->data.usr, smp->strm->txn->auth.user,
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = check_user(args->data.usr, smp->strm->txn->auth.user,
 	                            smp->strm->txn->auth.pass);
 	return 1;
 }
@@ -10869,10 +10869,10 @@
 	/* pat_match_auth() will need the user list */
 	smp->ctx.a[0] = args->data.usr;
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
-	smp->data.str.str = smp->strm->txn->auth.user;
-	smp->data.str.len = strlen(smp->strm->txn->auth.user);
+	smp->data.data.str.str = smp->strm->txn->auth.user;
+	smp->data.data.str.len = strlen(smp->strm->txn->auth.user);
 
 	return 1;
 }
@@ -10989,10 +10989,10 @@
 	if (idx > (fe->nb_req_cap - 1) || smp->strm->req_cap == NULL || smp->strm->req_cap[idx] == NULL)
 		return 0;
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags |= SMP_F_CONST;
-	smp->data.str.str = smp->strm->req_cap[idx];
-	smp->data.str.len = strlen(smp->strm->req_cap[idx]);
+	smp->data.data.str.str = smp->strm->req_cap[idx];
+	smp->data.data.str.len = strlen(smp->strm->req_cap[idx]);
 
 	return 1;
 }
@@ -11014,10 +11014,10 @@
 	if (idx > (fe->nb_rsp_cap - 1) || smp->strm->res_cap == NULL || smp->strm->res_cap[idx] == NULL)
 		return 0;
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags |= SMP_F_CONST;
-	smp->data.str.str = smp->strm->res_cap[idx];
-	smp->data.str.len = strlen(smp->strm->res_cap[idx]);
+	smp->data.data.str.str = smp->strm->res_cap[idx];
+	smp->data.data.str.len = strlen(smp->strm->res_cap[idx]);
 
 	return 1;
 }
@@ -11041,8 +11041,8 @@
 	temp = get_trash_chunk();
 	temp->str = txn->uri;
 	temp->len = ptr - txn->uri;
-	smp->data.str = *temp;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *temp;
+	smp->data.type = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
 
 	return 1;
@@ -11077,9 +11077,9 @@
 	while (*ptr != ' ' && *ptr != '\0')  /* find space after URI */
 		ptr++;
 
-	smp->data.str = *temp;
-	smp->data.str.len = ptr - temp->str;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *temp;
+	smp->data.data.str.len = ptr - temp->str;
+	smp->data.type = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
 
 	return 1;
@@ -11097,12 +11097,12 @@
 		return 0;
 
 	if (txn->req.flags & HTTP_MSGF_VER_11)
-		smp->data.str.str = "HTTP/1.1";
+		smp->data.data.str.str = "HTTP/1.1";
 	else
-		smp->data.str.str = "HTTP/1.0";
+		smp->data.data.str.str = "HTTP/1.0";
 
-	smp->data.str.len = 8;
-	smp->type  = SMP_T_STR;
+	smp->data.data.str.len = 8;
+	smp->data.type  = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
 	return 1;
 
@@ -11120,12 +11120,12 @@
 		return 0;
 
 	if (txn->rsp.flags & HTTP_MSGF_VER_11)
-		smp->data.str.str = "HTTP/1.1";
+		smp->data.data.str.str = "HTTP/1.1";
 	else
-		smp->data.str.str = "HTTP/1.0";
+		smp->data.data.str.str = "HTTP/1.0";
 
-	smp->data.str.len = 8;
-	smp->type  = SMP_T_STR;
+	smp->data.data.str.len = 8;
+	smp->data.type  = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
 	return 1;
 
@@ -11212,17 +11212,17 @@
 			smp->ctx.a[1] = smp->ctx.a[0] + ctx->vlen;
 		}
 
-		smp->type = SMP_T_STR;
+		smp->data.type = SMP_T_STR;
 		smp->flags |= SMP_F_CONST;
 		smp->ctx.a[0] = extract_cookie_value(smp->ctx.a[0], smp->ctx.a[1],
 						 args->data.str.str, args->data.str.len,
 						 (smp->opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ,
-						 &smp->data.str.str,
-						 &smp->data.str.len);
+						 &smp->data.data.str.str,
+						 &smp->data.data.str.len);
 		if (smp->ctx.a[0]) {
 			found = 1;
 			if (occ >= 0) {
-				/* one value was returned into smp->data.str.{str,len} */
+				/* one value was returned into smp->data.data.str.{str,len} */
 				smp->flags |= SMP_F_NOT_LAST;
 				return 1;
 			}
@@ -11291,19 +11291,19 @@
 			val_end = val_beg + ctx.vlen;
 		}
 
-		smp->type = SMP_T_STR;
+		smp->data.type = SMP_T_STR;
 		smp->flags |= SMP_F_CONST;
 		while ((val_beg = extract_cookie_value(val_beg, val_end,
 						       args->data.str.str, args->data.str.len,
 						       (smp->opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ,
-						       &smp->data.str.str,
-						       &smp->data.str.len))) {
+						       &smp->data.data.str.str,
+						       &smp->data.data.str.len))) {
 			cnt++;
 		}
 	}
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = cnt;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = cnt;
 	smp->flags |= SMP_F_VOL_HDR;
 	return 1;
 }
@@ -11317,8 +11317,8 @@
 	int ret = smp_fetch_cookie(args, smp, kw, private);
 
 	if (ret > 0) {
-		smp->type = SMP_T_SINT;
-		smp->data.sint = strl2ic(smp->data.str.str, smp->data.str.len);
+		smp->data.type = SMP_T_SINT;
+		smp->data.data.sint = strl2ic(smp->data.data.str.str, smp->data.data.str.len);
 	}
 
 	return ret;
@@ -11563,7 +11563,7 @@
 	/* Create sample. If the value is contiguous, return the pointer as CONST,
 	 * if the value is wrapped, copy-it in a buffer.
 	 */
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	if (chunks[2] &&
 	    vstart >= chunks[0] && vstart <= chunks[1] &&
 	    vend >= chunks[2] && vend <= chunks[3]) {
@@ -11571,12 +11571,12 @@
 		temp = get_trash_chunk();
 		memcpy(temp->str, vstart, chunks[1] - vstart);
 		memcpy(temp->str + ( chunks[1] - vstart ), chunks[2], vend - chunks[2]);
-		smp->data.str.str = temp->str;
-		smp->data.str.len = ( chunks[1] - vstart ) + ( vend - chunks[2] );
+		smp->data.data.str.str = temp->str;
+		smp->data.data.str.len = ( chunks[1] - vstart ) + ( vend - chunks[2] );
 	} else {
 		/* Contiguous case. */
-		smp->data.str.str = (char *)vstart;
-		smp->data.str.len = vend - vstart;
+		smp->data.data.str.str = (char *)vstart;
+		smp->data.data.str.len = vend - vstart;
 		smp->flags = SMP_F_VOL_1ST | SMP_F_CONST;
 	}
 
@@ -11719,8 +11719,8 @@
 	int ret = smp_fetch_url_param(args, smp, kw, private);
 
 	if (ret > 0) {
-		smp->type = SMP_T_SINT;
-		smp->data.sint = strl2ic(smp->data.str.str, smp->data.str.len);
+		smp->data.type = SMP_T_SINT;
+		smp->data.data.sint = strl2ic(smp->data.data.str.str, smp->data.data.str.len);
 	}
 
 	return ret;
@@ -11771,8 +11771,8 @@
 	}
 	hash = full_hash(hash);
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = hash;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = hash;
 	smp->flags = SMP_F_VOL_1ST;
 	return 1;
 }
@@ -11795,7 +11795,7 @@
 		return 0;
 
 	/* The returned hash is a 32 bytes integer. */
-	hash = smp->data.sint;
+	hash = smp->data.data.sint;
 
 	temp = get_trash_chunk();
 	memcpy(temp->str + temp->len, &hash, sizeof(hash));
@@ -11814,8 +11814,8 @@
 		return 0;
 	}
 
-	smp->data.str = *temp;
-	smp->type = SMP_T_BIN;
+	smp->data.data.str = *temp;
+	smp->data.type = SMP_T_BIN;
 	return 1;
 }
 
@@ -11847,7 +11847,7 @@
 	struct chunk *temp;
 	struct tm *tm;
 	/* With high numbers, the date returned can be negative, the 55 bits mask prevent this. */
-	time_t curr_date = smp->data.sint & 0x007fffffffffffffLL;
+	time_t curr_date = smp->data.data.sint & 0x007fffffffffffffLL;
 
 	/* add offset */
 	if (args && (args[0].type == ARGT_SINT))
@@ -11863,8 +11863,8 @@
 			     day[tm->tm_wday], tm->tm_mday, mon[tm->tm_mon], 1900+tm->tm_year,
 			     tm->tm_hour, tm->tm_min, tm->tm_sec);
 
-	smp->data.str = *temp;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *temp;
+	smp->data.type = SMP_T_STR;
 	return 1;
 }
 
@@ -11896,8 +11896,8 @@
 /* Arguments: The list of expected value, the number of parts returned and the separator */
 static int sample_conv_q_prefered(const struct arg *args, struct sample *smp, void *private)
 {
-	const char *al = smp->data.str.str;
-	const char *end = al + smp->data.str.len;
+	const char *al = smp->data.data.str.str;
+	const char *end = al + smp->data.data.str.len;
 	const char *token;
 	int toklen;
 	int qvalue;
@@ -11909,9 +11909,9 @@
 	 * function will be peek in the constant configuration string.
 	 */
 	smp->flags |= SMP_F_CONST;
-	smp->data.str.size = 0;
-	smp->data.str.str = "";
-	smp->data.str.len = 0;
+	smp->data.data.str.size = 0;
+	smp->data.data.str.str = "";
+	smp->data.data.str.len = 0;
 
 	/* Parse the accept language */
 	while (1) {
@@ -12011,8 +12011,8 @@
 		 * break the process.
 		 */
 		if (qvalue > best_q) {
-			smp->data.str.str = (char *)w;
-			smp->data.str.len = str - w;
+			smp->data.data.str.str = (char *)w;
+			smp->data.data.str.len = str - w;
 			if (qvalue >= 1000)
 				break;
 			best_q = qvalue;
@@ -12031,13 +12031,13 @@
 	}
 
 	/* Set default value if required. */
-	if (smp->data.str.len == 0 && args[1].type == ARGT_STR) {
-		smp->data.str.str = args[1].data.str.str;
-		smp->data.str.len = args[1].data.str.len;
+	if (smp->data.data.str.len == 0 && args[1].type == ARGT_STR) {
+		smp->data.data.str.str = args[1].data.str.str;
+		smp->data.data.str.len = args[1].data.str.len;
 	}
 
 	/* Return true only if a matching language was found. */
-	return smp->data.str.len != 0;
+	return smp->data.data.str.len != 0;
 }
 
 /* This fetch url-decode any input string. */
@@ -12047,17 +12047,17 @@
 	 * the end of the buffer, copy the string in other buffer
 	  * before decoding.
 	 */
-	if (smp->flags & SMP_F_CONST || smp->data.str.size <= smp->data.str.len) {
+	if (smp->flags & SMP_F_CONST || smp->data.data.str.size <= smp->data.data.str.len) {
 		struct chunk *str = get_trash_chunk();
-		memcpy(str->str, smp->data.str.str, smp->data.str.len);
-		smp->data.str.str = str->str;
-		smp->data.str.size = str->size;
+		memcpy(str->str, smp->data.data.str.str, smp->data.data.str.len);
+		smp->data.data.str.str = str->str;
+		smp->data.data.str.size = str->size;
 		smp->flags &= ~SMP_F_CONST;
 	}
 
 	/* Add final \0 required by url_decode(), and convert the input string. */
-	smp->data.str.str[smp->data.str.len] = '\0';
-	smp->data.str.len = url_decode(smp->data.str.str);
+	smp->data.data.str.str[smp->data.data.str.len] = '\0';
+	smp->data.data.str.len = url_decode(smp->data.data.str.str);
 	return 1;
 }
 
@@ -12091,12 +12091,12 @@
 		return 0;
 
 	/* Check length. */
-	len = smp->data.str.len;
+	len = smp->data.data.str.len;
 	if (len > hdr->len)
 		len = hdr->len;
 
 	/* Capture input data. */
-	memcpy(smp->strm->req_cap[idx], smp->data.str.str, len);
+	memcpy(smp->strm->req_cap[idx], smp->data.data.str.str, len);
 	smp->strm->req_cap[idx][len] = '\0';
 
 	return 1;
@@ -12132,12 +12132,12 @@
 		return 0;
 
 	/* Check length. */
-	len = smp->data.str.len;
+	len = smp->data.data.str.len;
 	if (len > hdr->len)
 		len = hdr->len;
 
 	/* Capture input data. */
-	memcpy(smp->strm->res_cap[idx], smp->data.str.str, len);
+	memcpy(smp->strm->res_cap[idx], smp->data.data.str.str, len);
 	smp->strm->res_cap[idx][len] = '\0';
 
 	return 1;
@@ -12334,11 +12334,11 @@
 	if (cap[h->index] == NULL) /* no more capture memory */
 		return 1;
 
-	len = key->data.str.len;
+	len = key->data.data.str.len;
 	if (len > h->len)
 		len = h->len;
 
-	memcpy(cap[h->index], key->data.str.str, len);
+	memcpy(cap[h->index], key->data.data.str.str, len);
 	cap[h->index][len] = 0;
 	return 1;
 }
@@ -12377,11 +12377,11 @@
 	if (cap[h->index] == NULL) /* no more capture memory */
 		return 1;
 
-	len = key->data.str.len;
+	len = key->data.data.str.len;
 	if (len > h->len)
 		len = h->len;
 
-	memcpy(cap[h->index], key->data.str.str, len);
+	memcpy(cap[h->index], key->data.data.str.str, len);
 	cap[h->index][len] = 0;
 	return 1;
 }
@@ -12546,11 +12546,11 @@
 	if (cap[h->index] == NULL) /* no more capture memory */
 		return 1;
 
-	len = key->data.str.len;
+	len = key->data.data.str.len;
 	if (len > h->len)
 		len = h->len;
 
-	memcpy(cap[h->index], key->data.str.str, len);
+	memcpy(cap[h->index], key->data.data.str.str, len);
 	cap[h->index][len] = 0;
 	return 1;
 }
diff --git a/src/proto_tcp.c b/src/proto_tcp.c
index 077bc13..29d68c3 100644
--- a/src/proto_tcp.c
+++ b/src/proto_tcp.c
@@ -1222,11 +1222,11 @@
 				if (cap[h->index] == NULL) /* no more capture memory */
 					continue;
 
-				len = key->data.str.len;
+				len = key->data.data.str.len;
 				if (len > h->len)
 					len = h->len;
 
-				memcpy(cap[h->index], key->data.str.str, len);
+				memcpy(cap[h->index], key->data.data.str.str, len);
 				cap[h->index][len] = 0;
 			}
 			else {
@@ -1999,12 +1999,12 @@
 
 	switch (cli_conn->addr.from.ss_family) {
 	case AF_INET:
-		smp->data.ipv4 = ((struct sockaddr_in *)&cli_conn->addr.from)->sin_addr;
-		smp->type = SMP_T_IPV4;
+		smp->data.data.ipv4 = ((struct sockaddr_in *)&cli_conn->addr.from)->sin_addr;
+		smp->data.type = SMP_T_IPV4;
 		break;
 	case AF_INET6:
-		smp->data.ipv6 = ((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_addr;
-		smp->type = SMP_T_IPV6;
+		smp->data.data.ipv6 = ((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_addr;
+		smp->data.type = SMP_T_IPV6;
 		break;
 	default:
 		return 0;
@@ -2023,8 +2023,8 @@
 	if (!cli_conn)
 		return 0;
 
-	smp->type = SMP_T_SINT;
-	if (!(smp->data.sint = get_host_port(&cli_conn->addr.from)))
+	smp->data.type = SMP_T_SINT;
+	if (!(smp->data.data.sint = get_host_port(&cli_conn->addr.from)))
 		return 0;
 
 	smp->flags = 0;
@@ -2044,12 +2044,12 @@
 
 	switch (cli_conn->addr.to.ss_family) {
 	case AF_INET:
-		smp->data.ipv4 = ((struct sockaddr_in *)&cli_conn->addr.to)->sin_addr;
-		smp->type = SMP_T_IPV4;
+		smp->data.data.ipv4 = ((struct sockaddr_in *)&cli_conn->addr.to)->sin_addr;
+		smp->data.type = SMP_T_IPV4;
 		break;
 	case AF_INET6:
-		smp->data.ipv6 = ((struct sockaddr_in6 *)&cli_conn->addr.to)->sin6_addr;
-		smp->type = SMP_T_IPV6;
+		smp->data.data.ipv6 = ((struct sockaddr_in6 *)&cli_conn->addr.to)->sin6_addr;
+		smp->data.type = SMP_T_IPV6;
 		break;
 	default:
 		return 0;
@@ -2070,8 +2070,8 @@
 
 	conn_get_to_addr(cli_conn);
 
-	smp->type = SMP_T_SINT;
-	if (!(smp->data.sint = get_host_port(&cli_conn->addr.to)))
+	smp->data.type = SMP_T_SINT;
+	if (!(smp->data.data.sint = get_host_port(&cli_conn->addr.to)))
 		return 0;
 
 	smp->flags = 0;
diff --git a/src/sample.c b/src/sample.c
index 6bb2dfd..9a57376 100644
--- a/src/sample.c
+++ b/src/sample.c
@@ -499,8 +499,8 @@
 
 static int c_ip2int(struct sample *smp)
 {
-	smp->data.sint = ntohl(smp->data.ipv4.s_addr);
-	smp->type = SMP_T_SINT;
+	smp->data.data.sint = ntohl(smp->data.data.ipv4.s_addr);
+	smp->data.type = SMP_T_SINT;
 	return 1;
 }
 
@@ -508,12 +508,12 @@
 {
 	struct chunk *trash = get_trash_chunk();
 
-	if (!inet_ntop(AF_INET, (void *)&smp->data.ipv4, trash->str, trash->size))
+	if (!inet_ntop(AF_INET, (void *)&smp->data.data.ipv4, trash->str, trash->size))
 		return 0;
 
 	trash->len = strlen(trash->str);
-	smp->data.str = *trash;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *trash;
+	smp->data.type = SMP_T_STR;
 	smp->flags &= ~SMP_F_CONST;
 
 	return 1;
@@ -521,16 +521,16 @@
 
 static int c_ip2ipv6(struct sample *smp)
 {
-	v4tov6(&smp->data.ipv6, &smp->data.ipv4);
-	smp->type = SMP_T_IPV6;
+	v4tov6(&smp->data.data.ipv6, &smp->data.data.ipv4);
+	smp->data.type = SMP_T_IPV6;
 	return 1;
 }
 
 static int c_ipv62ip(struct sample *smp)
 {
-	if (!v6tov4(&smp->data.ipv4, &smp->data.ipv6))
+	if (!v6tov4(&smp->data.data.ipv4, &smp->data.data.ipv6))
 		return 0;
-	smp->type = SMP_T_IPV6;
+	smp->data.type = SMP_T_IPV6;
 	return 1;
 }
 
@@ -538,12 +538,12 @@
 {
 	struct chunk *trash = get_trash_chunk();
 
-	if (!inet_ntop(AF_INET6, (void *)&smp->data.ipv6, trash->str, trash->size))
+	if (!inet_ntop(AF_INET6, (void *)&smp->data.data.ipv6, trash->str, trash->size))
 		return 0;
 
 	trash->len = strlen(trash->str);
-	smp->data.str = *trash;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *trash;
+	smp->data.type = SMP_T_STR;
 	smp->flags &= ~SMP_F_CONST;
 	return 1;
 }
@@ -551,53 +551,53 @@
 /*
 static int c_ipv62ip(struct sample *smp)
 {
-	return v6tov4(&smp->data.ipv4, &smp->data.ipv6);
+	return v6tov4(&smp->data.data.ipv4, &smp->data.data.ipv6);
 }
 */
 
 static int c_int2ip(struct sample *smp)
 {
-	smp->data.ipv4.s_addr = htonl((unsigned int)smp->data.sint);
-	smp->type = SMP_T_IPV4;
+	smp->data.data.ipv4.s_addr = htonl((unsigned int)smp->data.data.sint);
+	smp->data.type = SMP_T_IPV4;
 	return 1;
 }
 
 static int c_int2ipv6(struct sample *smp)
 {
-	smp->data.ipv4.s_addr = htonl((unsigned int)smp->data.sint);
-	v4tov6(&smp->data.ipv6, &smp->data.ipv4);
-	smp->type = SMP_T_IPV6;
+	smp->data.data.ipv4.s_addr = htonl((unsigned int)smp->data.data.sint);
+	v4tov6(&smp->data.data.ipv6, &smp->data.data.ipv4);
+	smp->data.type = SMP_T_IPV6;
 	return 1;
 }
 
 static int c_str2addr(struct sample *smp)
 {
-	if (!buf2ip(smp->data.str.str, smp->data.str.len, &smp->data.ipv4)) {
-		if (!buf2ip6(smp->data.str.str, smp->data.str.len, &smp->data.ipv6))
+	if (!buf2ip(smp->data.data.str.str, smp->data.data.str.len, &smp->data.data.ipv4)) {
+		if (!buf2ip6(smp->data.data.str.str, smp->data.data.str.len, &smp->data.data.ipv6))
 			return 0;
-		smp->type = SMP_T_IPV6;
+		smp->data.type = SMP_T_IPV6;
 		smp->flags &= ~SMP_F_CONST;
 		return 1;
 	}
-	smp->type = SMP_T_IPV4;
+	smp->data.type = SMP_T_IPV4;
 	smp->flags &= ~SMP_F_CONST;
 	return 1;
 }
 
 static int c_str2ip(struct sample *smp)
 {
-	if (!buf2ip(smp->data.str.str, smp->data.str.len, &smp->data.ipv4))
+	if (!buf2ip(smp->data.data.str.str, smp->data.data.str.len, &smp->data.data.ipv4))
 		return 0;
-	smp->type = SMP_T_IPV4;
+	smp->data.type = SMP_T_IPV4;
 	smp->flags &= ~SMP_F_CONST;
 	return 1;
 }
 
 static int c_str2ipv6(struct sample *smp)
 {
-	if (!buf2ip6(smp->data.str.str, smp->data.str.len, &smp->data.ipv6))
+	if (!buf2ip6(smp->data.data.str.str, smp->data.data.str.len, &smp->data.data.ipv6))
 		return 0;
-	smp->type = SMP_T_IPV6;
+	smp->data.type = SMP_T_IPV6;
 	smp->flags &= ~SMP_F_CONST;
 	return 1;
 }
@@ -610,9 +610,9 @@
 {
 	int i;
 
-	for (i = 0; i < smp->data.str.len; i++) {
-		if (!smp->data.str.str[i]) {
-			smp->data.str.len = i;
+	for (i = 0; i < smp->data.data.str.len; i++) {
+		if (!smp->data.data.str.str[i]) {
+			smp->data.data.str.len = i;
 			break;
 		}
 	}
@@ -624,15 +624,15 @@
 	struct chunk *trash = get_trash_chunk();
 	char *pos;
 
-	pos = lltoa_r(smp->data.sint, trash->str, trash->size);
+	pos = lltoa_r(smp->data.data.sint, trash->str, trash->size);
 	if (!pos)
 		return 0;
 
 	trash->size = trash->size - (pos - trash->str);
 	trash->str = pos;
 	trash->len = strlen(pos);
-	smp->data.str = *trash;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *trash;
+	smp->data.type = SMP_T_STR;
 	smp->flags &= ~SMP_F_CONST;
 	return 1;
 }
@@ -648,7 +648,7 @@
 	if (!(smp->flags & SMP_F_CONST))
 		return 1;
 
-	switch (smp->type) {
+	switch (smp->data.type) {
 	case SMP_T_BOOL:
 	case SMP_T_SINT:
 	case SMP_T_ADDR:
@@ -660,9 +660,9 @@
 	case SMP_T_BIN:
 		/* Duplicate data. */
 		trash = get_trash_chunk();
-		trash->len = smp->data.str.len < trash->size ? smp->data.str.len : trash->size;
-		memcpy(trash->str, smp->data.str.str, trash->len);
-		smp->data.str = *trash;
+		trash->len = smp->data.data.str.len < trash->size ? smp->data.data.str.len : trash->size;
+		memcpy(trash->str, smp->data.data.str.str, trash->len);
+		smp->data.data.str = *trash;
 		break;
 	default:
 		/* Other cases are unexpected. */
@@ -684,14 +684,14 @@
 	const char *str;
 	const char *end;
 
-	if (smp->data.str.len == 0)
+	if (smp->data.data.str.len == 0)
 		return 0;
 
-	str = smp->data.str.str;
-	end = smp->data.str.str + smp->data.str.len;
+	str = smp->data.data.str.str;
+	end = smp->data.data.str.str + smp->data.data.str.len;
 
-	smp->data.sint = read_int64(&str, end);
-	smp->type = SMP_T_SINT;
+	smp->data.data.sint = read_int64(&str, end);
+	smp->data.type = SMP_T_SINT;
 	smp->flags &= ~SMP_F_CONST;
 	return 1;
 }
@@ -701,16 +701,16 @@
 	enum http_meth_t meth;
 	int len;
 
-	meth = find_http_meth(smp->data.str.str, smp->data.str.len);
+	meth = find_http_meth(smp->data.data.str.str, smp->data.data.str.len);
 	if (meth == HTTP_METH_OTHER) {
-		len = smp->data.str.len;
-		smp->data.meth.str.str = smp->data.str.str;
-		smp->data.meth.str.len = len;
+		len = smp->data.data.str.len;
+		smp->data.data.meth.str.str = smp->data.data.str.str;
+		smp->data.data.meth.str.len = len;
 	}
 	else
 		smp->flags &= ~SMP_F_CONST;
-	smp->data.meth.meth = meth;
-	smp->type = SMP_T_METH;
+	smp->data.data.meth.meth = meth;
+	smp->data.type = SMP_T_METH;
 	return 1;
 }
 
@@ -719,20 +719,20 @@
 	int len;
 	enum http_meth_t meth;
 
-	if (smp->data.meth.meth == HTTP_METH_OTHER) {
+	if (smp->data.data.meth.meth == HTTP_METH_OTHER) {
 		/* The method is unknown. Copy the original pointer. */
-		len = smp->data.meth.str.len;
-		smp->data.str.str = smp->data.meth.str.str;
-		smp->data.str.len = len;
-		smp->type = SMP_T_STR;
+		len = smp->data.data.meth.str.len;
+		smp->data.data.str.str = smp->data.data.meth.str.str;
+		smp->data.data.str.len = len;
+		smp->data.type = SMP_T_STR;
 	}
-	else if (smp->data.meth.meth < HTTP_METH_OTHER) {
+	else if (smp->data.data.meth.meth < HTTP_METH_OTHER) {
 		/* The method is known, copy the pointer containing the string. */
-		meth = smp->data.meth.meth;
-		smp->data.str.str = http_known_methods[meth].name;
-		smp->data.str.len = http_known_methods[meth].len;
+		meth = smp->data.data.meth.meth;
+		smp->data.data.str.str = http_known_methods[meth].name;
+		smp->data.data.str.len = http_known_methods[meth].len;
 		smp->flags |= SMP_F_CONST;
-		smp->type = SMP_T_STR;
+		smp->data.type = SMP_T_STR;
 	}
 	else {
 		/* Unknown method */
@@ -745,19 +745,19 @@
 {
 	struct chunk *chk = get_trash_chunk();
 
-	if (smp->type == SMP_T_IPV4) {
+	if (smp->data.type == SMP_T_IPV4) {
 		chk->len = 4;
-		memcpy(chk->str, &smp->data.ipv4, chk->len);
+		memcpy(chk->str, &smp->data.data.ipv4, chk->len);
 	}
-	else if (smp->type == SMP_T_IPV6) {
+	else if (smp->data.type == SMP_T_IPV6) {
 		chk->len = 16;
-		memcpy(chk->str, &smp->data.ipv6, chk->len);
+		memcpy(chk->str, &smp->data.data.ipv6, chk->len);
 	}
 	else
 		return 0;
 
-	smp->data.str = *chk;
-	smp->type = SMP_T_BIN;
+	smp->data.data.str = *chk;
+	smp->data.type = SMP_T_BIN;
 	return 1;
 }
 
@@ -765,11 +765,11 @@
 {
 	struct chunk *chk = get_trash_chunk();
 
-	*(unsigned long long int *)chk->str = htonll(smp->data.sint);
+	*(unsigned long long int *)chk->str = htonll(smp->data.data.sint);
 	chk->len = 8;
 
-	smp->data.str = *chk;
-	smp->type = SMP_T_BIN;
+	smp->data.data.str = *chk;
+	smp->data.type = SMP_T_BIN;
 	return 1;
 }
 
@@ -1054,11 +1054,11 @@
 		 *  - c_none => nothing to do (let's optimize it)
 		 *  - other  => apply cast and prepare to fail
 		 */
-		if (!sample_casts[p->type][conv_expr->conv->in_type])
+		if (!sample_casts[p->data.type][conv_expr->conv->in_type])
 			return NULL;
 
-		if (sample_casts[p->type][conv_expr->conv->in_type] != c_none &&
-		    !sample_casts[p->type][conv_expr->conv->in_type](p))
+		if (sample_casts[p->data.type][conv_expr->conv->in_type] != c_none &&
+		    !sample_casts[p->data.type][conv_expr->conv->in_type](p))
 			return NULL;
 
 		/* OK cast succeeded */
@@ -1358,10 +1358,10 @@
 		return NULL;
 	}
 
-	if (!sample_casts[smp->type][smp_type])
+	if (!sample_casts[smp->data.type][smp_type])
 		return NULL;
 
-	if (!sample_casts[smp->type][smp_type](smp))
+	if (!sample_casts[smp->data.type][smp_type](smp))
 		return NULL;
 
 	smp->flags &= ~SMP_F_MAY_CHANGE;
@@ -1380,8 +1380,8 @@
 	struct sample tmp;
 
 	if (!(global.mode & MODE_QUIET) || (global.mode & (MODE_VERBOSE | MODE_STARTING))) {
-		fprintf(stderr, "[debug converter] type: %s ", smp_to_type[smp->type]);
-		if (!sample_casts[smp->type][SMP_T_STR]) {
+		fprintf(stderr, "[debug converter] type: %s ", smp_to_type[smp->data.type]);
+		if (!sample_casts[smp->data.type][SMP_T_STR]) {
 			fprintf(stderr, "(undisplayable)");
 		} else {
 
@@ -1391,15 +1391,15 @@
 			memcpy(&tmp, smp, sizeof(struct sample));
 			tmp.flags = SMP_F_CONST;
 
-			if (!sample_casts[smp->type][SMP_T_STR](&tmp))
+			if (!sample_casts[smp->data.type][SMP_T_STR](&tmp))
 				fprintf(stderr, "(undisplayable)");
 
 			else {
 				/* Display the displayable chars*. */
 				fprintf(stderr, "<");
-				for (i = 0; i < tmp.data.str.len; i++) {
-					if (isprint(tmp.data.str.str[i]))
-						fputc(tmp.data.str.str[i], stderr);
+				for (i = 0; i < tmp.data.data.str.len; i++) {
+					if (isprint(tmp.data.data.str.str[i]))
+						fputc(tmp.data.data.str.str[i], stderr);
 					else
 						fputc('.', stderr);
 				}
@@ -1417,13 +1417,13 @@
 	int b64_len;
 
 	trash->len = 0;
-	b64_len = a2base64(smp->data.str.str, smp->data.str.len, trash->str, trash->size);
+	b64_len = a2base64(smp->data.data.str.str, smp->data.data.str.len, trash->str, trash->size);
 	if (b64_len < 0)
 		return 0;
 
 	trash->len = b64_len;
-	smp->data.str = *trash;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *trash;
+	smp->data.type = SMP_T_STR;
 	smp->flags &= ~SMP_F_CONST;
 	return 1;
 }
@@ -1435,13 +1435,13 @@
 	int ptr = 0;
 
 	trash->len = 0;
-	while (ptr < smp->data.str.len && trash->len <= trash->size - 2) {
-		c = smp->data.str.str[ptr++];
+	while (ptr < smp->data.data.str.len && trash->len <= trash->size - 2) {
+		c = smp->data.data.str.str[ptr++];
 		trash->str[trash->len++] = hextab[(c >> 4) & 0xF];
 		trash->str[trash->len++] = hextab[c & 0xF];
 	}
-	smp->data.str = *trash;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *trash;
+	smp->data.type = SMP_T_STR;
 	smp->flags &= ~SMP_F_CONST;
 	return 1;
 }
@@ -1449,10 +1449,10 @@
 /* hashes the binary input into a 32-bit unsigned int */
 static int sample_conv_djb2(const struct arg *arg_p, struct sample *smp, void *private)
 {
-	smp->data.sint = hash_djb2(smp->data.str.str, smp->data.str.len);
+	smp->data.data.sint = hash_djb2(smp->data.data.str.str, smp->data.data.str.len);
 	if (arg_p && arg_p->data.sint)
-		smp->data.sint = full_hash(smp->data.sint);
-	smp->type = SMP_T_SINT;
+		smp->data.data.sint = full_hash(smp->data.data.sint);
+	smp->data.type = SMP_T_SINT;
 	return 1;
 }
 
@@ -1463,12 +1463,12 @@
 	if (!smp_dup(smp))
 		return 0;
 
-	if (!smp->data.str.size)
+	if (!smp->data.data.str.size)
 		return 0;
 
-	for (i = 0; i < smp->data.str.len; i++) {
-		if ((smp->data.str.str[i] >= 'A') && (smp->data.str.str[i] <= 'Z'))
-			smp->data.str.str[i] += 'a' - 'A';
+	for (i = 0; i < smp->data.data.str.len; i++) {
+		if ((smp->data.data.str.str[i] >= 'A') && (smp->data.data.str.str[i] <= 'Z'))
+			smp->data.data.str.str[i] += 'a' - 'A';
 	}
 	return 1;
 }
@@ -1480,12 +1480,12 @@
 	if (!smp_dup(smp))
 		return 0;
 
-	if (!smp->data.str.size)
+	if (!smp->data.data.str.size)
 		return 0;
 
-	for (i = 0; i < smp->data.str.len; i++) {
-		if ((smp->data.str.str[i] >= 'a') && (smp->data.str.str[i] <= 'z'))
-			smp->data.str.str[i] += 'A' - 'a';
+	for (i = 0; i < smp->data.data.str.len; i++) {
+		if ((smp->data.data.str.str[i] >= 'a') && (smp->data.data.str.str[i] <= 'z'))
+			smp->data.data.str.str[i] += 'A' - 'a';
 	}
 	return 1;
 }
@@ -1493,8 +1493,8 @@
 /* takes the netmask in arg_p */
 static int sample_conv_ipmask(const struct arg *arg_p, struct sample *smp, void *private)
 {
-	smp->data.ipv4.s_addr &= arg_p->data.ipv4.s_addr;
-	smp->type = SMP_T_IPV4;
+	smp->data.data.ipv4.s_addr &= arg_p->data.ipv4.s_addr;
+	smp->data.type = SMP_T_IPV4;
 	return 1;
 }
 
@@ -1506,7 +1506,7 @@
 {
 	struct chunk *temp;
 	/* With high numbers, the date returned can be negative, the 55 bits mask prevent this. */
-	time_t curr_date = smp->data.sint & 0x007fffffffffffffLL;
+	time_t curr_date = smp->data.data.sint & 0x007fffffffffffffLL;
 	struct tm *tm;
 
 	/* add offset */
@@ -1518,18 +1518,18 @@
 		return 0;
 	temp = get_trash_chunk();
 	temp->len = strftime(temp->str, temp->size, args[0].data.str.str, tm);
-	smp->data.str = *temp;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *temp;
+	smp->data.type = SMP_T_STR;
 	return 1;
 }
 
 /* hashes the binary input into a 32-bit unsigned int */
 static int sample_conv_sdbm(const struct arg *arg_p, struct sample *smp, void *private)
 {
-	smp->data.sint = hash_sdbm(smp->data.str.str, smp->data.str.len);
+	smp->data.data.sint = hash_sdbm(smp->data.data.str.str, smp->data.data.str.len);
 	if (arg_p && arg_p->data.sint)
-		smp->data.sint = full_hash(smp->data.sint);
-	smp->type = SMP_T_SINT;
+		smp->data.data.sint = full_hash(smp->data.data.sint);
+	smp->data.type = SMP_T_SINT;
 	return 1;
 }
 
@@ -1541,7 +1541,7 @@
 {
 	struct chunk *temp;
 	/* With high numbers, the date returned can be negative, the 55 bits mask prevent this. */
-	time_t curr_date = smp->data.sint & 0x007fffffffffffffLL;
+	time_t curr_date = smp->data.data.sint & 0x007fffffffffffffLL;
 	struct tm *tm;
 
 	/* add offset */
@@ -1553,28 +1553,28 @@
 		return 0;
 	temp = get_trash_chunk();
 	temp->len = strftime(temp->str, temp->size, args[0].data.str.str, tm);
-	smp->data.str = *temp;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *temp;
+	smp->data.type = SMP_T_STR;
 	return 1;
 }
 
 /* hashes the binary input into a 32-bit unsigned int */
 static int sample_conv_wt6(const struct arg *arg_p, struct sample *smp, void *private)
 {
-	smp->data.sint = hash_wt6(smp->data.str.str, smp->data.str.len);
+	smp->data.data.sint = hash_wt6(smp->data.data.str.str, smp->data.data.str.len);
 	if (arg_p && arg_p->data.sint)
-		smp->data.sint = full_hash(smp->data.sint);
-	smp->type = SMP_T_SINT;
+		smp->data.data.sint = full_hash(smp->data.data.sint);
+	smp->data.type = SMP_T_SINT;
 	return 1;
 }
 
 /* hashes the binary input into a 32-bit unsigned int */
 static int sample_conv_crc32(const struct arg *arg_p, struct sample *smp, void *private)
 {
-	smp->data.sint = hash_crc32(smp->data.str.str, smp->data.str.len);
+	smp->data.data.sint = hash_crc32(smp->data.data.str.str, smp->data.data.str.len);
 	if (arg_p && arg_p->data.sint)
-		smp->data.sint = full_hash(smp->data.sint);
-	smp->type = SMP_T_SINT;
+		smp->data.data.sint = full_hash(smp->data.data.sint);
+	smp->data.type = SMP_T_SINT;
 	return 1;
 }
 
@@ -1666,8 +1666,8 @@
 	temp = get_trash_chunk();
 	temp->len = 0;
 
-	p = smp->data.str.str;
-	while (p < smp->data.str.str + smp->data.str.len) {
+	p = smp->data.data.str.str;
+	while (p < smp->data.data.str.str + smp->data.data.str.len) {
 
 		if (input_type == IT_ASCII) {
 			/* Read input as ASCII. */
@@ -1676,7 +1676,7 @@
 		}
 		else {
 			/* Read input as UTF8. */
-			ret = utf8_next(p, smp->data.str.len - ( p - smp->data.str.str ), &c);
+			ret = utf8_next(p, smp->data.data.str.len - ( p - smp->data.data.str.str ), &c);
 			p += utf8_return_length(ret);
 
 			if (input_type == IT_UTF8 && utf8_return_code(ret) != UTF8_CODE_OK)
@@ -1754,8 +1754,8 @@
 	}
 
 	smp->flags &= ~SMP_F_CONST;
-	smp->data.str = *temp;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *temp;
+	smp->data.type = SMP_T_STR;
 
 	return 1;
 }
@@ -1765,18 +1765,18 @@
  * Optional second arg is the length to truncate */
 static int sample_conv_bytes(const struct arg *arg_p, struct sample *smp, void *private)
 {
-	if (smp->data.str.len <= arg_p[0].data.sint) {
-		smp->data.str.len = 0;
+	if (smp->data.data.str.len <= arg_p[0].data.sint) {
+		smp->data.data.str.len = 0;
 		return 1;
 	}
 
-	if (smp->data.str.size)
-			smp->data.str.size -= arg_p[0].data.sint;
-	smp->data.str.len -= arg_p[0].data.sint;
-	smp->data.str.str += arg_p[0].data.sint;
+	if (smp->data.data.str.size)
+			smp->data.data.str.size -= arg_p[0].data.sint;
+	smp->data.data.str.len -= arg_p[0].data.sint;
+	smp->data.data.str.str += arg_p[0].data.sint;
 
-	if ((arg_p[1].type == ARGT_SINT) && (arg_p[1].data.sint < smp->data.str.len))
-		smp->data.str.len = arg_p[1].data.sint;
+	if ((arg_p[1].type == ARGT_SINT) && (arg_p[1].data.sint < smp->data.data.str.len))
+		smp->data.data.str.len = arg_p[1].data.sint;
 
 	return 1;
 }
@@ -1830,8 +1830,8 @@
 		return 0;
 
 	field = 1;
-	end = start = smp->data.str.str;
-	while (end - smp->data.str.str < smp->data.str.len) {
+	end = start = smp->data.data.str.str;
+	while (end - smp->data.data.str.str < smp->data.data.str.len) {
 
 		for (i = 0 ; i < arg_p[1].data.str.len ; i++) {
 			if (*end == arg_p[1].data.str.str[i]) {
@@ -1847,22 +1847,22 @@
 
 	/* Field not found */
 	if (field != arg_p[0].data.sint) {
-		smp->data.str.len = 0;
+		smp->data.data.str.len = 0;
 		return 1;
 	}
 found:
-	smp->data.str.len = end - start;
+	smp->data.data.str.len = end - start;
 	/* If ret string is len 0, no need to
            change pointers or to update size */
-	if (!smp->data.str.len)
+	if (!smp->data.data.str.len)
 		return 1;
 
-	smp->data.str.str = start;
+	smp->data.data.str.str = start;
 
 	/* Compute remaining size if needed
-           Note: smp->data.str.size cannot be set to 0 */
-	if (smp->data.str.size)
-		smp->data.str.size -= start - smp->data.str.str;
+           Note: smp->data.data.str.size cannot be set to 0 */
+	if (smp->data.data.str.size)
+		smp->data.data.str.size -= start - smp->data.data.str.str;
 
 	return 1;
 }
@@ -1882,8 +1882,8 @@
 
 	word = 0;
 	inword = 0;
-	end = start = smp->data.str.str;
-	while (end - smp->data.str.str < smp->data.str.len) {
+	end = start = smp->data.data.str.str;
+	while (end - smp->data.data.str.str < smp->data.data.str.len) {
 		issep = 0;
 		for (i = 0 ; i < arg_p[1].data.str.len ; i++) {
 			if (*end == arg_p[1].data.str.str[i]) {
@@ -1908,22 +1908,22 @@
 
 	/* Field not found */
 	if (word != arg_p[0].data.sint) {
-		smp->data.str.len = 0;
+		smp->data.data.str.len = 0;
 		return 1;
 	}
 found:
-	smp->data.str.len = end - start;
+	smp->data.data.str.len = end - start;
 	/* If ret string is len 0, no need to
            change pointers or to update size */
-	if (!smp->data.str.len)
+	if (!smp->data.data.str.len)
 		return 1;
 
-	smp->data.str.str = start;
+	smp->data.data.str.str = start;
 
 	/* Compute remaining size if needed
-           Note: smp->data.str.size cannot be set to 0 */
-	if (smp->data.str.size)
-		smp->data.str.size -= start - smp->data.str.str;
+           Note: smp->data.data.str.size cannot be set to 0 */
+	if (smp->data.data.str.size)
+		smp->data.data.str.size -= start - smp->data.data.str.str;
 
 	return 1;
 }
@@ -1974,8 +1974,8 @@
 	int flag, max;
 	int found;
 
-	start = smp->data.str.str;
-	end = start + smp->data.str.len;
+	start = smp->data.data.str.str;
+	end = start + smp->data.data.str.len;
 
 	flag = 0;
 	while (1) {
@@ -2030,7 +2030,7 @@
 		flag |= REG_NOTBOL;
 	}
 
-	smp->data.str = *trash;
+	smp->data.data.str = *trash;
 	return 1;
 }
 
@@ -2070,15 +2070,15 @@
 {
 	switch (arg->type) {
 	case ARGT_SINT:
-		smp->type = SMP_T_SINT;
-		smp->data.sint = arg->data.sint;
+		smp->data.type = SMP_T_SINT;
+		smp->data.data.sint = arg->data.sint;
 		return 1;
 	case ARGT_VAR:
 		if (!vars_get_by_desc(&arg->data.var, strm, smp))
 			return 0;
-		if (!sample_casts[smp->type][SMP_T_SINT])
+		if (!sample_casts[smp->data.type][SMP_T_SINT])
 			return 0;
-		if (!sample_casts[smp->type][SMP_T_SINT](smp))
+		if (!sample_casts[smp->data.type][SMP_T_SINT](smp))
 			return 0;
 		return 1;
 	default:
@@ -2091,7 +2091,7 @@
  */
 static int sample_conv_binary_cpl(const struct arg *arg_p, struct sample *smp, void *private)
 {
-	smp->data.sint = ~smp->data.sint;
+	smp->data.data.sint = ~smp->data.data.sint;
 	return 1;
 }
 
@@ -2104,7 +2104,7 @@
 
 	if (!sample_conv_var2smp(arg_p, smp->strm, &tmp))
 		return 0;
-	smp->data.sint &= tmp.data.sint;
+	smp->data.data.sint &= tmp.data.data.sint;
 	return 1;
 }
 
@@ -2117,7 +2117,7 @@
 
 	if (!sample_conv_var2smp(arg_p, smp->strm, &tmp))
 		return 0;
-	smp->data.sint |= tmp.data.sint;
+	smp->data.data.sint |= tmp.data.data.sint;
 	return 1;
 }
 
@@ -2130,7 +2130,7 @@
 
 	if (!sample_conv_var2smp(arg_p, smp->strm, &tmp))
 		return 0;
-	smp->data.sint ^= tmp.data.sint;
+	smp->data.data.sint ^= tmp.data.data.sint;
 	return 1;
 }
 
@@ -2169,7 +2169,7 @@
 
 	if (!sample_conv_var2smp(arg_p, smp->strm, &tmp))
 		return 0;
-	smp->data.sint = arith_add(smp->data.sint, tmp.data.sint);
+	smp->data.data.sint = arith_add(smp->data.data.sint, tmp.data.data.sint);
 	return 1;
 }
 
@@ -2188,17 +2188,17 @@
 	 * than abs(LLONG_MAX). So, the following code use LLONG_MAX in place
 	 * of -LLONG_MIN and correct the result.
 	 */
-	if (tmp.data.sint == LLONG_MIN) {
-		smp->data.sint = arith_add(smp->data.sint, LLONG_MAX);
-		if (smp->data.sint < LLONG_MAX)
-			smp->data.sint++;
+	if (tmp.data.data.sint == LLONG_MIN) {
+		smp->data.data.sint = arith_add(smp->data.data.sint, LLONG_MAX);
+		if (smp->data.data.sint < LLONG_MAX)
+			smp->data.data.sint++;
 		return 1;
 	}
 
 	/* standard substraction: we use the "add" function and negate
 	 * the second operand.
 	 */
-	smp->data.sint = arith_add(smp->data.sint, -tmp.data.sint);
+	smp->data.data.sint = arith_add(smp->data.data.sint, -tmp.data.data.sint);
 	return 1;
 }
 
@@ -2217,32 +2217,32 @@
 		return 0;
 
 	/* prevent divide by 0 during the check */
-	if (!smp->data.sint || !tmp.data.sint) {
-		smp->data.sint = 0;
+	if (!smp->data.data.sint || !tmp.data.data.sint) {
+		smp->data.data.sint = 0;
 		return 1;
 	}
 
 	/* The multiply between LLONG_MIN and -1 returns a
 	 * "floting point exception".
 	 */
-	if (smp->data.sint == LLONG_MIN && tmp.data.sint == -1) {
-		smp->data.sint = LLONG_MAX;
+	if (smp->data.data.sint == LLONG_MIN && tmp.data.data.sint == -1) {
+		smp->data.data.sint = LLONG_MAX;
 		return 1;
 	}
 
 	/* execute standard multiplication. */
-	c = smp->data.sint * tmp.data.sint;
+	c = smp->data.data.sint * tmp.data.data.sint;
 
 	/* check for overflow and makes capped multiply. */
-	if (smp->data.sint != c / tmp.data.sint) {
-		if ((smp->data.sint < 0) == (tmp.data.sint < 0)) {
-			smp->data.sint = LLONG_MAX;
+	if (smp->data.data.sint != c / tmp.data.data.sint) {
+		if ((smp->data.data.sint < 0) == (tmp.data.data.sint < 0)) {
+			smp->data.data.sint = LLONG_MAX;
 			return 1;
 		}
-		smp->data.sint = LLONG_MIN;
+		smp->data.data.sint = LLONG_MIN;
 		return 1;
 	}
-	smp->data.sint = c;
+	smp->data.data.sint = c;
 	return 1;
 }
 
@@ -2259,18 +2259,18 @@
 	if (!sample_conv_var2smp(arg_p, smp->strm, &tmp))
 		return 0;
 
-	if (tmp.data.sint) {
+	if (tmp.data.data.sint) {
 		/* The divide between LLONG_MIN and -1 returns a
 		 * "floting point exception".
 		 */
-		if (smp->data.sint == LLONG_MIN && tmp.data.sint == -1) {
-			smp->data.sint = LLONG_MAX;
+		if (smp->data.data.sint == LLONG_MIN && tmp.data.data.sint == -1) {
+			smp->data.data.sint = LLONG_MAX;
 			return 1;
 		}
-		smp->data.sint /= tmp.data.sint;
+		smp->data.data.sint /= tmp.data.data.sint;
 		return 1;
 	}
-	smp->data.sint = LLONG_MAX;
+	smp->data.data.sint = LLONG_MAX;
 	return 1;
 }
 
@@ -2286,18 +2286,18 @@
 	if (!sample_conv_var2smp(arg_p, smp->strm, &tmp))
 		return 0;
 
-	if (tmp.data.sint) {
+	if (tmp.data.data.sint) {
 		/* The divide between LLONG_MIN and -1 returns a
 		 * "floting point exception".
 		 */
-		if (smp->data.sint == LLONG_MIN && tmp.data.sint == -1) {
-			smp->data.sint = 0;
+		if (smp->data.data.sint == LLONG_MIN && tmp.data.data.sint == -1) {
+			smp->data.data.sint = 0;
 			return 1;
 		}
-		smp->data.sint %= tmp.data.sint;
+		smp->data.data.sint %= tmp.data.data.sint;
 		return 1;
 	}
-	smp->data.sint = 0;
+	smp->data.data.sint = 0;
 	return 1;
 }
 
@@ -2307,10 +2307,10 @@
 static int sample_conv_arith_neg(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
-	if (smp->data.sint == LLONG_MIN)
-		smp->data.sint = LLONG_MAX;
+	if (smp->data.data.sint == LLONG_MIN)
+		smp->data.data.sint = LLONG_MAX;
 	else
-		smp->data.sint = -smp->data.sint;
+		smp->data.data.sint = -smp->data.data.sint;
 	return 1;
 }
 
@@ -2320,8 +2320,8 @@
 static int sample_conv_arith_bool(const struct arg *arg_p,
                                   struct sample *smp, void *private)
 {
-	smp->data.sint = !!smp->data.sint;
-	smp->type = SMP_T_BOOL;
+	smp->data.data.sint = !!smp->data.data.sint;
+	smp->data.type = SMP_T_BOOL;
 	return 1;
 }
 
@@ -2331,8 +2331,8 @@
 static int sample_conv_arith_not(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
-	smp->data.sint = !smp->data.sint;
-	smp->type = SMP_T_BOOL;
+	smp->data.data.sint = !smp->data.data.sint;
+	smp->data.type = SMP_T_BOOL;
 	return 1;
 }
 
@@ -2342,8 +2342,8 @@
 static int sample_conv_arith_odd(const struct arg *arg_p,
                                  struct sample *smp, void *private)
 {
-	smp->data.sint = smp->data.sint & 1;
-	smp->type = SMP_T_BOOL;
+	smp->data.data.sint = smp->data.data.sint & 1;
+	smp->data.type = SMP_T_BOOL;
 	return 1;
 }
 
@@ -2353,8 +2353,8 @@
 static int sample_conv_arith_even(const struct arg *arg_p,
                                   struct sample *smp, void *private)
 {
-	smp->data.sint = !(smp->data.sint & 1);
-	smp->type = SMP_T_BOOL;
+	smp->data.data.sint = !(smp->data.data.sint & 1);
+	smp->data.type = SMP_T_BOOL;
 	return 1;
 }
 
@@ -2366,8 +2366,8 @@
 static int
 smp_fetch_true(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = 1;
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = 1;
 	return 1;
 }
 
@@ -2375,8 +2375,8 @@
 static int
 smp_fetch_false(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = 0;
 	return 1;
 }
 
@@ -2393,10 +2393,10 @@
 	if (!env)
 		return 0;
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
-	smp->data.str.str = env;
-	smp->data.str.len = strlen(env);
+	smp->data.data.str.str = env;
+	smp->data.data.str.len = strlen(env);
 	return 1;
 }
 
@@ -2406,13 +2406,13 @@
 static int
 smp_fetch_date(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->data.sint = date.tv_sec;
+	smp->data.data.sint = date.tv_sec;
 
 	/* add offset */
 	if (args && args[0].type == ARGT_SINT)
-		smp->data.sint += args[0].data.sint;
+		smp->data.data.sint += args[0].data.sint;
 
-	smp->type = SMP_T_SINT;
+	smp->data.type = SMP_T_SINT;
 	smp->flags |= SMP_F_VOL_TEST | SMP_F_MAY_CHANGE;
 	return 1;
 }
@@ -2421,8 +2421,8 @@
 static int
 smp_fetch_nbproc(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_SINT;
-	smp->data.sint = global.nbproc;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = global.nbproc;
 	return 1;
 }
 
@@ -2430,8 +2430,8 @@
 static int
 smp_fetch_proc(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_SINT;
-	smp->data.sint = relative_pid;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = relative_pid;
 	return 1;
 }
 
@@ -2441,13 +2441,13 @@
 static int
 smp_fetch_rand(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->data.sint = random();
+	smp->data.data.sint = random();
 
 	/* reduce if needed. Don't do a modulo, use all bits! */
 	if (args && args[0].type == ARGT_SINT)
-		smp->data.sint = (smp->data.sint * args[0].data.sint) / ((u64)RAND_MAX+1);
+		smp->data.data.sint = (smp->data.data.sint * args[0].data.sint) / ((u64)RAND_MAX+1);
 
-	smp->type = SMP_T_SINT;
+	smp->data.type = SMP_T_SINT;
 	smp->flags |= SMP_F_VOL_TEST | SMP_F_MAY_CHANGE;
 	return 1;
 }
@@ -2456,17 +2456,17 @@
 static int
 smp_fetch_stopping(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = stopping;
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = stopping;
 	return 1;
 }
 
 static int smp_fetch_const_str(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags |= SMP_F_CONST;
-	smp->type = SMP_T_STR;
-	smp->data.str.str = args[0].data.str.str;
-	smp->data.str.len = args[0].data.str.len;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str.str = args[0].data.str.str;
+	smp->data.data.str.len = args[0].data.str.len;
 	return 1;
 }
 
@@ -2490,29 +2490,29 @@
 
 static int smp_fetch_const_bool(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = args[0].data.sint;
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = args[0].data.sint;
 	return 1;
 }
 
 static int smp_fetch_const_int(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_SINT;
-	smp->data.sint = args[0].data.sint;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = args[0].data.sint;
 	return 1;
 }
 
 static int smp_fetch_const_ipv4(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_IPV4;
-	smp->data.ipv4 = args[0].data.ipv4;
+	smp->data.type = SMP_T_IPV4;
+	smp->data.data.ipv4 = args[0].data.ipv4;
 	return 1;
 }
 
 static int smp_fetch_const_ipv6(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_IPV6;
-	smp->data.ipv6 = args[0].data.ipv6;
+	smp->data.type = SMP_T_IPV6;
+	smp->data.data.ipv6 = args[0].data.ipv6;
 	return 1;
 }
 
@@ -2532,9 +2532,9 @@
 static int smp_fetch_const_bin(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags |= SMP_F_CONST;
-	smp->type = SMP_T_BIN;
-	smp->data.str.str = args[0].data.str.str;
-	smp->data.str.len = args[0].data.str.len;
+	smp->data.type = SMP_T_BIN;
+	smp->data.data.str.str = args[0].data.str.str;
+	smp->data.data.str.len = args[0].data.str.len;
 	return 1;
 }
 
@@ -2565,17 +2565,17 @@
 
 static int smp_fetch_const_meth(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-	smp->type = SMP_T_METH;
+	smp->data.type = SMP_T_METH;
 	if (args[0].type == ARGT_SINT) {
 		smp->flags &= ~SMP_F_CONST;
-		smp->data.meth.meth = args[0].data.sint;
-		smp->data.meth.str.str = "";
-		smp->data.meth.str.len = 0;
+		smp->data.data.meth.meth = args[0].data.sint;
+		smp->data.data.meth.str.str = "";
+		smp->data.data.meth.str.len = 0;
 	} else {
 		smp->flags |= SMP_F_CONST;
-		smp->data.meth.meth = HTTP_METH_OTHER;
-		smp->data.meth.str.str = args[0].data.str.str;
-		smp->data.meth.str.len = args[0].data.str.len;
+		smp->data.data.meth.meth = HTTP_METH_OTHER;
+		smp->data.data.meth.str.str = args[0].data.str.str;
+		smp->data.data.meth.str.len = args[0].data.str.len;
 	}
 	return 1;
 }
diff --git a/src/ssl_sock.c b/src/ssl_sock.c
index 85ffd5f..120ea3d 100644
--- a/src/ssl_sock.c
+++ b/src/ssl_sock.c
@@ -3404,8 +3404,8 @@
 	}
 
 	smp->flags = 0;
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = SSL_SOCK_ST_FL_VERIFY_DONE & conn->xprt_st ? 1 : 0;
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = SSL_SOCK_ST_FL_VERIFY_DONE & conn->xprt_st ? 1 : 0;
 
 	return 1;
 }
@@ -3444,8 +3444,8 @@
 	if (ssl_sock_crt2der(crt, smp_trash) <= 0)
 		goto out;
 
-	smp->data.str = *smp_trash;
-	smp->type = SMP_T_BIN;
+	smp->data.data.str = *smp_trash;
+	smp->data.type = SMP_T_BIN;
 	ret = 1;
 out:
 	/* SSL_get_peer_certificate, it increase X509 * ref count */
@@ -3488,8 +3488,8 @@
 	if (ssl_sock_get_serial(crt, smp_trash) <= 0)
 		goto out;
 
-	smp->data.str = *smp_trash;
-	smp->type = SMP_T_BIN;
+	smp->data.data.str = *smp_trash;
+	smp->data.type = SMP_T_BIN;
 	ret = 1;
 out:
 	/* SSL_get_peer_certificate, it increase X509 * ref count */
@@ -3532,8 +3532,8 @@
 	digest = EVP_sha1();
 	X509_digest(crt, digest, (unsigned char *)smp_trash->str, (unsigned int *)&smp_trash->len);
 
-	smp->data.str = *smp_trash;
-	smp->type = SMP_T_BIN;
+	smp->data.data.str = *smp_trash;
+	smp->data.type = SMP_T_BIN;
 	ret = 1;
 out:
 	/* SSL_get_peer_certificate, it increase X509 * ref count */
@@ -3575,8 +3575,8 @@
 	if (ssl_sock_get_time(X509_get_notAfter(crt), smp_trash) <= 0)
 		goto out;
 
-	smp->data.str = *smp_trash;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *smp_trash;
+	smp->data.type = SMP_T_STR;
 	ret = 1;
 out:
 	/* SSL_get_peer_certificate, it increase X509 * ref count */
@@ -3632,8 +3632,8 @@
 	else if (ssl_sock_get_dn_oneline(name, smp_trash) <= 0)
 		goto out;
 
-	smp->type = SMP_T_STR;
-	smp->data.str = *smp_trash;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str = *smp_trash;
 	ret = 1;
 out:
 	/* SSL_get_peer_certificate, it increase X509 * ref count */
@@ -3675,8 +3675,8 @@
 	if (ssl_sock_get_time(X509_get_notBefore(crt), smp_trash) <= 0)
 		goto out;
 
-	smp->data.str = *smp_trash;
-	smp->type = SMP_T_STR;
+	smp->data.data.str = *smp_trash;
+	smp->data.type = SMP_T_STR;
 	ret = 1;
 out:
 	/* SSL_get_peer_certificate, it increase X509 * ref count */
@@ -3732,8 +3732,8 @@
 	else if (ssl_sock_get_dn_oneline(name, smp_trash) <= 0)
 		goto out;
 
-	smp->type = SMP_T_STR;
-	smp->data.str = *smp_trash;
+	smp->data.type = SMP_T_STR;
+	smp->data.data.str = *smp_trash;
 	ret = 1;
 out:
 	/* SSL_get_peer_certificate, it increase X509 * ref count */
@@ -3764,8 +3764,8 @@
 		X509_free(crt);
 	}
 
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = (crt != NULL);
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = (crt != NULL);
 	return 1;
 }
 
@@ -3796,11 +3796,11 @@
 	if (!crt)
 		return 0;
 
-	smp->data.sint = (unsigned int)(1 + X509_get_version(crt));
+	smp->data.data.sint = (unsigned int)(1 + X509_get_version(crt));
 	/* SSL_get_peer_certificate increase X509 * ref count  */
 	if (cert_peer)
 		X509_free(crt);
-	smp->type = SMP_T_SINT;
+	smp->data.type = SMP_T_SINT;
 
 	return 1;
 }
@@ -3835,17 +3835,17 @@
 
 	nid = OBJ_obj2nid((ASN1_OBJECT *)(crt->cert_info->signature->algorithm));
 
-	smp->data.str.str = (char *)OBJ_nid2sn(nid);
-	if (!smp->data.str.str) {
+	smp->data.data.str.str = (char *)OBJ_nid2sn(nid);
+	if (!smp->data.data.str.str) {
 		/* SSL_get_peer_certificate increase X509 * ref count  */
 		if (cert_peer)
 			X509_free(crt);
 		return 0;
 	}
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags |= SMP_F_CONST;
-	smp->data.str.len = strlen(smp->data.str.str);
+	smp->data.data.str.len = strlen(smp->data.data.str.str);
 	/* SSL_get_peer_certificate increase X509 * ref count  */
 	if (cert_peer)
 		X509_free(crt);
@@ -3883,17 +3883,17 @@
 
 	nid = OBJ_obj2nid((ASN1_OBJECT *)(crt->cert_info->key->algor->algorithm));
 
-	smp->data.str.str = (char *)OBJ_nid2sn(nid);
-	if (!smp->data.str.str) {
+	smp->data.data.str.str = (char *)OBJ_nid2sn(nid);
+	if (!smp->data.data.str.str) {
 		/* SSL_get_peer_certificate increase X509 * ref count  */
 		if (cert_peer)
 			X509_free(crt);
 		return 0;
 	}
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags |= SMP_F_CONST;
-	smp->data.str.len = strlen(smp->data.str.str);
+	smp->data.data.str.len = strlen(smp->data.data.str.str);
 	if (cert_peer)
 		X509_free(crt);
 
@@ -3910,8 +3910,8 @@
 	int back_conn = (kw[4] == 'b') ? 1 : 0;
 	struct connection *conn = objt_conn(smp->strm->si[back_conn].end);
 
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = (conn && conn->xprt == &ssl_sock);
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = (conn && conn->xprt == &ssl_sock);
 	return 1;
 }
 
@@ -3922,8 +3922,8 @@
 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
 	struct connection *conn = objt_conn(smp->sess->origin);
 
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = (conn && conn->xprt == &ssl_sock) &&
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = (conn && conn->xprt == &ssl_sock) &&
 		conn->xprt_ctx &&
 		SSL_get_servername(conn->xprt_ctx, TLSEXT_NAMETYPE_host_name) != NULL;
 	return 1;
@@ -3938,8 +3938,8 @@
 {
 	struct connection *conn = objt_conn(smp->sess->origin);
 
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = (conn && conn->xprt == &ssl_sock) &&
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = (conn && conn->xprt == &ssl_sock) &&
 		conn->xprt_ctx &&
 		SSL_session_reused(conn->xprt_ctx);
 	return 1;
@@ -3961,13 +3961,13 @@
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
-	smp->data.str.str = (char *)SSL_get_cipher_name(conn->xprt_ctx);
-	if (!smp->data.str.str)
+	smp->data.data.str.str = (char *)SSL_get_cipher_name(conn->xprt_ctx);
+	if (!smp->data.data.str.str)
 		return 0;
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags |= SMP_F_CONST;
-	smp->data.str.len = strlen(smp->data.str.str);
+	smp->data.data.str.len = strlen(smp->data.data.str.str);
 
 	return 1;
 }
@@ -3993,8 +3993,8 @@
 	if (!SSL_get_cipher_bits(conn->xprt_ctx, &sint))
 		return 0;
 
-	smp->data.sint = sint;
-	smp->type = SMP_T_SINT;
+	smp->data.data.sint = sint;
+	smp->data.type = SMP_T_SINT;
 
 	return 1;
 }
@@ -4015,11 +4015,11 @@
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
-	smp->data.sint = (unsigned int)SSL_get_cipher_bits(conn->xprt_ctx, NULL);
-	if (!smp->data.sint)
+	smp->data.data.sint = (unsigned int)SSL_get_cipher_bits(conn->xprt_ctx, NULL);
+	if (!smp->data.data.sint)
 		return 0;
 
-	smp->type = SMP_T_SINT;
+	smp->data.type = SMP_T_SINT;
 
 	return 1;
 }
@@ -4031,17 +4031,17 @@
 	struct connection *conn;
 
 	smp->flags = SMP_F_CONST;
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 
 	conn = objt_conn(smp->sess->origin);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
-	smp->data.str.str = NULL;
+	smp->data.data.str.str = NULL;
 	SSL_get0_next_proto_negotiated(conn->xprt_ctx,
-	                                (const unsigned char **)&smp->data.str.str, (unsigned *)&smp->data.str.len);
+	                                (const unsigned char **)&smp->data.data.str.str, (unsigned *)&smp->data.data.str.len);
 
-	if (!smp->data.str.str)
+	if (!smp->data.data.str.str)
 		return 0;
 
 	return 1;
@@ -4055,17 +4055,17 @@
 	struct connection *conn;
 
 	smp->flags = SMP_F_CONST;
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 
 	conn = objt_conn(smp->sess->origin);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
-	smp->data.str.str = NULL;
+	smp->data.data.str.str = NULL;
 	SSL_get0_alpn_selected(conn->xprt_ctx,
-	                         (const unsigned char **)&smp->data.str.str, (unsigned *)&smp->data.str.len);
+	                         (const unsigned char **)&smp->data.data.str.str, (unsigned *)&smp->data.data.str.len);
 
-	if (!smp->data.str.str)
+	if (!smp->data.data.str.str)
 		return 0;
 
 	return 1;
@@ -4088,13 +4088,13 @@
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
-	smp->data.str.str = (char *)SSL_get_version(conn->xprt_ctx);
-	if (!smp->data.str.str)
+	smp->data.data.str.str = (char *)SSL_get_version(conn->xprt_ctx);
+	if (!smp->data.data.str.str)
 		return 0;
 
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 	smp->flags = SMP_F_CONST;
-	smp->data.str.len = strlen(smp->data.str.str);
+	smp->data.data.str.len = strlen(smp->data.data.str.str);
 
 	return 1;
 }
@@ -4112,7 +4112,7 @@
 	struct connection *conn;
 
 	smp->flags = SMP_F_CONST;
-	smp->type = SMP_T_BIN;
+	smp->data.type = SMP_T_BIN;
 
 	conn = objt_conn(smp->strm->si[back_conn].end);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
@@ -4122,8 +4122,8 @@
 	if (!ssl_sess)
 		return 0;
 
-	smp->data.str.str = (char *)SSL_SESSION_get_id(ssl_sess, (unsigned int *)&smp->data.str.len);
-	if (!smp->data.str.str || !smp->data.str.len)
+	smp->data.data.str.str = (char *)SSL_SESSION_get_id(ssl_sess, (unsigned int *)&smp->data.data.str.len);
+	if (!smp->data.data.str.str || !smp->data.data.str.len)
 		return 0;
 
 	return 1;
@@ -4139,17 +4139,17 @@
 	struct connection *conn;
 
 	smp->flags = SMP_F_CONST;
-	smp->type = SMP_T_STR;
+	smp->data.type = SMP_T_STR;
 
 	conn = objt_conn(smp->sess->origin);
 	if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
 		return 0;
 
-	smp->data.str.str = (char *)SSL_get_servername(conn->xprt_ctx, TLSEXT_NAMETYPE_host_name);
-	if (!smp->data.str.str)
+	smp->data.data.str.str = (char *)SSL_get_servername(conn->xprt_ctx, TLSEXT_NAMETYPE_host_name);
+	if (!smp->data.data.str.str)
 		return 0;
 
-	smp->data.str.len = strlen(smp->data.str.str);
+	smp->data.data.str.len = strlen(smp->data.data.str.str);
 	return 1;
 #else
 	return 0;
@@ -4186,8 +4186,8 @@
 		return 0;
 
 	finished_trash->len = finished_len;
-	smp->data.str = *finished_trash;
-	smp->type = SMP_T_BIN;
+	smp->data.data.str = *finished_trash;
+	smp->data.type = SMP_T_BIN;
 
 	return 1;
 #else
@@ -4210,8 +4210,8 @@
 		return 0;
 	}
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = (unsigned long long int)SSL_SOCK_ST_TO_CA_ERROR(conn->xprt_st);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = (unsigned long long int)SSL_SOCK_ST_TO_CA_ERROR(conn->xprt_st);
 	smp->flags = 0;
 
 	return 1;
@@ -4232,8 +4232,8 @@
 		return 0;
 	}
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = (long long int)SSL_SOCK_ST_TO_CAEDEPTH(conn->xprt_st);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = (long long int)SSL_SOCK_ST_TO_CAEDEPTH(conn->xprt_st);
 	smp->flags = 0;
 
 	return 1;
@@ -4254,8 +4254,8 @@
 		return 0;
 	}
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = (long long int)SSL_SOCK_ST_TO_CRTERROR(conn->xprt_st);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = (long long int)SSL_SOCK_ST_TO_CRTERROR(conn->xprt_st);
 	smp->flags = 0;
 
 	return 1;
@@ -4279,8 +4279,8 @@
 	if (!conn->xprt_ctx)
 		return 0;
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = (long long int)SSL_get_verify_result(conn->xprt_ctx);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = (long long int)SSL_get_verify_result(conn->xprt_ctx);
 	smp->flags = 0;
 
 	return 1;
diff --git a/src/stick_table.c b/src/stick_table.c
index 243066e..7559bc6 100644
--- a/src/stick_table.c
+++ b/src/stick_table.c
@@ -458,65 +458,65 @@
 
 static void *k_int2int(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	kdata->integer = smp->data.sint;
+	kdata->integer = smp->data.data.sint;
 	return (void *)&kdata->integer;
 }
 
 static void *k_ip2ip(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	if (smp->type == SMP_T_IPV6) {
-		v6tov4(&kdata->ip, &smp->data.ipv6);
+	if (smp->data.type == SMP_T_IPV6) {
+		v6tov4(&kdata->ip, &smp->data.data.ipv6);
 		return (void *)&kdata->ip.s_addr;
 	}
 	else {
-		return (void *)&smp->data.ipv4.s_addr;
+		return (void *)&smp->data.data.ipv4.s_addr;
 	}
 }
 
 static void *k_ip2ipv6(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	if (smp->type == SMP_T_IPV6) {
-		return (void *)&smp->data.ipv6.s6_addr;
+	if (smp->data.type == SMP_T_IPV6) {
+		return (void *)&smp->data.data.ipv6.s6_addr;
 	}
 	else {
-		v4tov6(&kdata->ipv6, &smp->data.ipv4);
+		v4tov6(&kdata->ipv6, &smp->data.data.ipv4);
 		return (void *)&kdata->ipv6.s6_addr;
 	}
 }
 
 static void *k_ip2int(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	if (smp->type == SMP_T_IPV6) {
-		if (!v6tov4(&kdata->ip, &smp->data.ipv6))
+	if (smp->data.type == SMP_T_IPV6) {
+		if (!v6tov4(&kdata->ip, &smp->data.data.ipv6))
 			return NULL;
 		kdata->integer = ntohl(kdata->ip.s_addr);
 	}
 	else {
-		kdata->integer = ntohl(smp->data.ipv4.s_addr);
+		kdata->integer = ntohl(smp->data.data.ipv4.s_addr);
 	}
 	return (void *)&kdata->integer;
 }
 
 static void *k_int2ip(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	kdata->ip.s_addr = htonl((unsigned int)smp->data.sint);
+	kdata->ip.s_addr = htonl((unsigned int)smp->data.data.sint);
 	return (void *)&kdata->ip.s_addr;
 }
 
 static void *k_str2str(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	*len = smp->data.str.len;
-	return (void *)smp->data.str.str;
+	*len = smp->data.data.str.len;
+	return (void *)smp->data.data.str.str;
 }
 
 static void *k_ip2str(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	if (smp->type == SMP_T_IPV6) {
-		if (!inet_ntop(AF_INET6, &smp->data.ipv6, kdata->buf, *len))
+	if (smp->data.type == SMP_T_IPV6) {
+		if (!inet_ntop(AF_INET6, &smp->data.data.ipv6, kdata->buf, *len))
 			return NULL;
 	}
 	else {
-		if (!inet_ntop(AF_INET, &smp->data.ipv4, kdata->buf, *len))
+		if (!inet_ntop(AF_INET, &smp->data.data.ipv4, kdata->buf, *len))
 			return NULL;
 	}
 
@@ -526,15 +526,15 @@
 
 static void *k_ip2bin(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	if (smp->type == SMP_T_IPV4) {
+	if (smp->data.type == SMP_T_IPV4) {
 		if (*len > 4)
 			*len = 4;
-		memcpy(kdata->buf, &smp->data.ipv4, *len);
+		memcpy(kdata->buf, &smp->data.data.ipv4, *len);
 	}
-	else if (smp->type == SMP_T_IPV6) {
+	else if (smp->data.type == SMP_T_IPV6) {
 		if (*len > 16)
 			*len = 16;
-		memcpy(kdata->buf, &smp->data.ipv6, *len);
+		memcpy(kdata->buf, &smp->data.data.ipv6, *len);
 	}
 	else
 		*len = 0;
@@ -548,8 +548,8 @@
 	int max = *len;
 	int size = 0;
 
-	while (ptr < smp->data.str.len && size <= max - 2) {
-		c = smp->data.str.str[ptr++];
+	while (ptr < smp->data.data.str.len && size <= max - 2) {
+		c = smp->data.data.str.str[ptr++];
 		kdata->buf[size++] = hextab[(c >> 4) & 0xF];
 		kdata->buf[size++] = hextab[c & 0xF];
 	}
@@ -561,7 +561,7 @@
 {
 	void *key;
 
-	key = (void *)lltoa_r(smp->data.sint, kdata->buf, *len);
+	key = (void *)lltoa_r(smp->data.data.sint, kdata->buf, *len);
 	if (!key)
 		return NULL;
 
@@ -571,7 +571,7 @@
 
 static void *k_str2ip(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	if (!buf2ip(smp->data.str.str, smp->data.str.len, &kdata->ip))
+	if (!buf2ip(smp->data.data.str.str, smp->data.data.str.len, &kdata->ip))
 		return NULL;
 
 	return (void *)&kdata->ip.s_addr;
@@ -579,7 +579,7 @@
 
 static void *k_str2ipv6(struct sample *smp, union stktable_key_data *kdata, size_t *len)
 {
-	if (!inet_pton(AF_INET6, smp->data.str.str, &kdata->ipv6))
+	if (!inet_pton(AF_INET6, smp->data.data.str.str, &kdata->ipv6))
 		return NULL;
 
 	return (void *)&kdata->ipv6.s6_addr;
@@ -590,8 +590,8 @@
 	int i;
 
 	kdata->integer = 0;
-	for (i = 0; i < smp->data.str.len; i++) {
-		uint32_t val = smp->data.str.str[i] - '0';
+	for (i = 0; i < smp->data.data.str.len; i++) {
+		uint32_t val = smp->data.data.str.str[i] - '0';
 
 		if (val > 9)
 			break;
@@ -628,11 +628,11 @@
  */
 struct stktable_key *smp_to_stkey(struct sample *smp, struct stktable *t)
 {
-	if (!sample_to_key[smp->type][t->type])
+	if (!sample_to_key[smp->data.type][t->type])
 		return NULL;
 
 	static_table_key->key_len = t->key_size;
-	static_table_key->key = sample_to_key[smp->type][t->type](smp, &static_table_key->data, &static_table_key->key_len);
+	static_table_key->key = sample_to_key[smp->data.type][t->type](smp, &static_table_key->data, &static_table_key->key_len);
 
 	if (!static_table_key->key)
 		return NULL;
@@ -643,7 +643,7 @@
 	if ((static_table_key->key_len < t->key_size) && (t->type != STKTABLE_TYPE_STRING)) {
 		/* need padding with null */
 
-		/* assume static_table_key.key_len is less than sizeof(static_table_key.data.buf)
+		/* assume static_table_key.key_len is less than sizeof(static_table_key.data.data.buf)
 		cause t->key_size is necessary less than sizeof(static_table_key.data) */
 
 		if ((char *)static_table_key->key > (char *)&static_table_key->data &&
@@ -811,8 +811,8 @@
 
 	ts = stktable_lookup_key(t, key);
 
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = !!ts;
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = !!ts;
 	smp->flags = SMP_F_VOL_TEST;
 	return 1;
 }
@@ -837,8 +837,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -848,7 +848,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_in_rate),
+	smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_in_rate),
 					       t->data_arg[STKTABLE_DT_BYTES_IN_RATE].u);
 	return 1;
 }
@@ -873,8 +873,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -884,7 +884,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = stktable_data_cast(ptr, conn_cnt);
+	smp->data.data.sint = stktable_data_cast(ptr, conn_cnt);
 	return 1;
 }
 
@@ -908,8 +908,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -919,7 +919,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = stktable_data_cast(ptr, conn_cur);
+	smp->data.data.sint = stktable_data_cast(ptr, conn_cur);
 	return 1;
 }
 
@@ -943,8 +943,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -954,7 +954,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, conn_rate),
+	smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, conn_rate),
 					       t->data_arg[STKTABLE_DT_CONN_RATE].u);
 	return 1;
 }
@@ -979,8 +979,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -990,7 +990,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_out_rate),
+	smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_out_rate),
 					       t->data_arg[STKTABLE_DT_BYTES_OUT_RATE].u);
 	return 1;
 }
@@ -1015,8 +1015,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1026,7 +1026,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = stktable_data_cast(ptr, gpc0);
+	smp->data.data.sint = stktable_data_cast(ptr, gpc0);
 	return 1;
 }
 
@@ -1050,8 +1050,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1061,7 +1061,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, gpc0_rate),
+	smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, gpc0_rate),
 	                                      t->data_arg[STKTABLE_DT_GPC0_RATE].u);
 	return 1;
 }
@@ -1086,8 +1086,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1097,7 +1097,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = stktable_data_cast(ptr, http_err_cnt);
+	smp->data.data.sint = stktable_data_cast(ptr, http_err_cnt);
 	return 1;
 }
 
@@ -1121,8 +1121,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1132,7 +1132,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, http_err_rate),
+	smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, http_err_rate),
 					       t->data_arg[STKTABLE_DT_HTTP_ERR_RATE].u);
 	return 1;
 }
@@ -1157,8 +1157,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1168,7 +1168,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = stktable_data_cast(ptr, http_req_cnt);
+	smp->data.data.sint = stktable_data_cast(ptr, http_req_cnt);
 	return 1;
 }
 
@@ -1192,8 +1192,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1203,7 +1203,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, http_req_rate),
+	smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, http_req_rate),
 					       t->data_arg[STKTABLE_DT_HTTP_REQ_RATE].u);
 	return 1;
 }
@@ -1228,8 +1228,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1239,7 +1239,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = stktable_data_cast(ptr, bytes_in_cnt) >> 10;
+	smp->data.data.sint = stktable_data_cast(ptr, bytes_in_cnt) >> 10;
 	return 1;
 }
 
@@ -1263,8 +1263,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1274,7 +1274,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = stktable_data_cast(ptr, bytes_out_cnt) >> 10;
+	smp->data.data.sint = stktable_data_cast(ptr, bytes_out_cnt) >> 10;
 	return 1;
 }
 
@@ -1298,8 +1298,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1309,7 +1309,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = stktable_data_cast(ptr, server_id);
+	smp->data.data.sint = stktable_data_cast(ptr, server_id);
 	return 1;
 }
 
@@ -1333,8 +1333,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1344,7 +1344,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = stktable_data_cast(ptr, sess_cnt);
+	smp->data.data.sint = stktable_data_cast(ptr, sess_cnt);
 	return 1;
 }
 
@@ -1368,8 +1368,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (!ts) /* key not present */
@@ -1379,7 +1379,7 @@
 	if (!ptr)
 		return 0; /* parameter not stored */
 
-	smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, sess_rate),
+	smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, sess_rate),
 					       t->data_arg[STKTABLE_DT_SESS_RATE].u);
 	return 1;
 }
@@ -1403,12 +1403,12 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	ts = stktable_lookup_key(t, key);
 	if (ts)
-		smp->data.sint = ts->ref_cnt;
+		smp->data.data.sint = ts->ref_cnt;
 
 	return 1;
 }
diff --git a/src/stream.c b/src/stream.c
index 82b0743..acb602a 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -2671,8 +2671,8 @@
 smp_fetch_sc_tracked(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_BOOL;
-	smp->data.sint = !!smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
+	smp->data.type = SMP_T_BOOL;
+	smp->data.data.sint = !!smp_fetch_sc_stkctr(smp->sess, smp->strm, args, kw);
 	return 1;
 }
 
@@ -2690,14 +2690,14 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_GPC0);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = stktable_data_cast(ptr, gpc0);
+		smp->data.data.sint = stktable_data_cast(ptr, gpc0);
 	}
 	return 1;
 }
@@ -2716,13 +2716,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_GPC0_RATE);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, gpc0_rate),
+		smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, gpc0_rate),
 		                  stkctr->table->data_arg[STKTABLE_DT_GPC0_RATE].u);
 	}
 	return 1;
@@ -2741,8 +2741,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	if (stkctr_entry(stkctr) == NULL)
 		stkctr = smp_create_src_stkctr(smp->sess, smp->strm, args, kw);
@@ -2757,12 +2757,12 @@
 		if (ptr1) {
 			update_freq_ctr_period(&stktable_data_cast(ptr1, gpc0_rate),
 					       stkctr->table->data_arg[STKTABLE_DT_GPC0_RATE].u, 1);
-			smp->data.sint = (&stktable_data_cast(ptr1, gpc0_rate))->curr_ctr;
+			smp->data.data.sint = (&stktable_data_cast(ptr1, gpc0_rate))->curr_ctr;
 		}
 
 		ptr2 = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_GPC0);
 		if (ptr2)
-			smp->data.sint = ++stktable_data_cast(ptr2, gpc0);
+			smp->data.data.sint = ++stktable_data_cast(ptr2, gpc0);
 
 		/* If data was modified, we need to touch to re-schedule sync */
 		if (ptr1 || ptr2)
@@ -2784,8 +2784,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 
 	if (stkctr_entry(stkctr) == NULL)
 		stkctr = smp_create_src_stkctr(smp->sess, smp->strm, args, kw);
@@ -2794,7 +2794,7 @@
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_GPC0);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = stktable_data_cast(ptr, gpc0);
+		smp->data.data.sint = stktable_data_cast(ptr, gpc0);
 		stktable_data_cast(ptr, gpc0) = 0;
 		/* If data was modified, we need to touch to re-schedule sync */
 		stktable_touch(stkctr->table, stkctr_entry(stkctr), 1);
@@ -2815,13 +2815,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_CONN_CNT);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = stktable_data_cast(ptr, conn_cnt);
+		smp->data.data.sint = stktable_data_cast(ptr, conn_cnt);
 	}
 	return 1;
 }
@@ -2839,13 +2839,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_CONN_RATE);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, conn_rate),
+		smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, conn_rate),
 					       stkctr->table->data_arg[STKTABLE_DT_CONN_RATE].u);
 	}
 	return 1;
@@ -2881,8 +2881,8 @@
 	if (!ptr)
 		return 0; /* parameter not stored in this table */
 
-	smp->type = SMP_T_SINT;
-	smp->data.sint = ++stktable_data_cast(ptr, conn_cnt);
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = ++stktable_data_cast(ptr, conn_cnt);
 	/* Touch was previously performed by stktable_update_key */
 	smp->flags = SMP_F_VOL_TEST;
 	return 1;
@@ -2901,13 +2901,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_CONN_CUR);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = stktable_data_cast(ptr, conn_cur);
+		smp->data.data.sint = stktable_data_cast(ptr, conn_cur);
 	}
 	return 1;
 }
@@ -2925,13 +2925,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_SESS_CNT);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = stktable_data_cast(ptr, sess_cnt);
+		smp->data.data.sint = stktable_data_cast(ptr, sess_cnt);
 	}
 	return 1;
 }
@@ -2948,13 +2948,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_SESS_RATE);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, sess_rate),
+		smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, sess_rate),
 					       stkctr->table->data_arg[STKTABLE_DT_SESS_RATE].u);
 	}
 	return 1;
@@ -2973,13 +2973,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_HTTP_REQ_CNT);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = stktable_data_cast(ptr, http_req_cnt);
+		smp->data.data.sint = stktable_data_cast(ptr, http_req_cnt);
 	}
 	return 1;
 }
@@ -2997,13 +2997,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_HTTP_REQ_RATE);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, http_req_rate),
+		smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, http_req_rate),
 					       stkctr->table->data_arg[STKTABLE_DT_HTTP_REQ_RATE].u);
 	}
 	return 1;
@@ -3022,13 +3022,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_HTTP_ERR_CNT);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = stktable_data_cast(ptr, http_err_cnt);
+		smp->data.data.sint = stktable_data_cast(ptr, http_err_cnt);
 	}
 	return 1;
 }
@@ -3046,13 +3046,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_HTTP_ERR_RATE);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, http_err_rate),
+		smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, http_err_rate),
 					       stkctr->table->data_arg[STKTABLE_DT_HTTP_ERR_RATE].u);
 	}
 	return 1;
@@ -3071,13 +3071,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_IN_CNT);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = stktable_data_cast(ptr, bytes_in_cnt) >> 10;
+		smp->data.data.sint = stktable_data_cast(ptr, bytes_in_cnt) >> 10;
 	}
 	return 1;
 }
@@ -3095,13 +3095,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_IN_RATE);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_in_rate),
+		smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_in_rate),
 					       stkctr->table->data_arg[STKTABLE_DT_BYTES_IN_RATE].u);
 	}
 	return 1;
@@ -3120,13 +3120,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_OUT_CNT);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = stktable_data_cast(ptr, bytes_out_cnt) >> 10;
+		smp->data.data.sint = stktable_data_cast(ptr, bytes_out_cnt) >> 10;
 	}
 	return 1;
 }
@@ -3144,13 +3144,13 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = 0;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = 0;
 	if (stkctr_entry(stkctr) != NULL) {
 		void *ptr = stktable_data_ptr(stkctr->table, stkctr_entry(stkctr), STKTABLE_DT_BYTES_OUT_RATE);
 		if (!ptr)
 			return 0; /* parameter not stored */
-		smp->data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_out_rate),
+		smp->data.data.sint = read_freq_ctr_period(&stktable_data_cast(ptr, bytes_out_rate),
 					       stkctr->table->data_arg[STKTABLE_DT_BYTES_OUT_RATE].u);
 	}
 	return 1;
@@ -3168,8 +3168,8 @@
 		return 0;
 
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = stkctr_entry(stkctr)->ref_cnt;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = stkctr_entry(stkctr)->ref_cnt;
 	return 1;
 }
 
@@ -3180,8 +3180,8 @@
 smp_fetch_table_cnt(const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = args->data.prx->table.current;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = args->data.prx->table.current;
 	return 1;
 }
 
@@ -3195,8 +3195,8 @@
 
 	px = args->data.prx;
 	smp->flags = SMP_F_VOL_TEST;
-	smp->type = SMP_T_SINT;
-	smp->data.sint = px->table.size - px->table.current;
+	smp->data.type = SMP_T_SINT;
+	smp->data.data.sint = px->table.size - px->table.current;
 	return 1;
 }
 
diff --git a/src/vars.c b/src/vars.c
index adacd2f..a09de37 100644
--- a/src/vars.c
+++ b/src/vars.c
@@ -249,9 +249,9 @@
 		return 0;
 
 	/* Copy sample. */
-	smp->type = var->data.type;
+	smp->data.type = var->data.type;
 	smp->flags |= SMP_F_CONST;
-	memcpy(&smp->data, &var->data.data, sizeof(smp->data));
+	memcpy(&smp->data.data, &var->data.data, sizeof(smp->data.data));
 	return 1;
 }
 
@@ -293,50 +293,50 @@
 	}
 
 	/* Set type. */
-	var->data.type = smp->type;
+	var->data.type = smp->data.type;
 
 	/* Copy data. If the data needs memory, the function can fail. */
 	switch (var->data.type) {
 	case SMP_T_BOOL:
 	case SMP_T_SINT:
-		var->data.data.sint = smp->data.sint;
+		var->data.data.sint = smp->data.data.sint;
 		break;
 	case SMP_T_IPV4:
-		var->data.data.ipv4 = smp->data.ipv4;
+		var->data.data.ipv4 = smp->data.data.ipv4;
 		break;
 	case SMP_T_IPV6:
-		var->data.data.ipv6 = smp->data.ipv6;
+		var->data.data.ipv6 = smp->data.data.ipv6;
 		break;
 	case SMP_T_STR:
 	case SMP_T_BIN:
-		if (!var_accounting_add(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, smp->data.str.len)) {
+		if (!var_accounting_add(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, smp->data.data.str.len)) {
 			var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */
 			return 0;
 		}
-		var->data.data.str.str = malloc(smp->data.str.len);
+		var->data.data.str.str = malloc(smp->data.data.str.len);
 		if (!var->data.data.str.str) {
-			var_accounting_diff(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, -smp->data.str.len);
+			var_accounting_diff(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, -smp->data.data.str.len);
 			var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */
 			return 0;
 		}
-		var->data.data.str.len = smp->data.str.len;
-		memcpy(var->data.data.str.str, smp->data.str.str, var->data.data.str.len);
+		var->data.data.str.len = smp->data.data.str.len;
+		memcpy(var->data.data.str.str, smp->data.data.str.str, var->data.data.str.len);
 		break;
 	case SMP_T_METH:
-		if (!var_accounting_add(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, smp->data.meth.str.len)) {
+		if (!var_accounting_add(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, smp->data.data.meth.str.len)) {
 			var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */
 			return 0;
 		}
-		var->data.data.meth.str.str = malloc(smp->data.meth.str.len);
+		var->data.data.meth.str.str = malloc(smp->data.data.meth.str.len);
 		if (!var->data.data.meth.str.str) {
-			var_accounting_diff(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, -smp->data.meth.str.len);
+			var_accounting_diff(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, -smp->data.data.meth.str.len);
 			var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */
 			return 0;
 		}
-		var->data.data.meth.meth = smp->data.meth.meth;
-		var->data.data.meth.str.len = smp->data.meth.str.len;
-		var->data.data.meth.str.size = smp->data.meth.str.len;
-		memcpy(var->data.data.meth.str.str, smp->data.meth.str.str, var->data.data.meth.str.len);
+		var->data.data.meth.meth = smp->data.data.meth.meth;
+		var->data.data.meth.str.len = smp->data.data.meth.str.len;
+		var->data.data.meth.str.size = smp->data.data.meth.str.len;
+		memcpy(var->data.data.meth.str.str, smp->data.data.meth.str.str, var->data.data.meth.str.len);
 		break;
 	}
 	return 1;
@@ -442,9 +442,9 @@
 		return 0;
 
 	/* Copy sample. */
-	smp->type = var->data.type;
+	smp->data.type = var->data.type;
 	smp->flags = SMP_F_CONST;
-	memcpy(&smp->data, &var->data.data, sizeof(smp->data));
+	memcpy(&smp->data.data, &var->data.data, sizeof(smp->data.data));
 	return 1;
 }
 
@@ -476,9 +476,9 @@
 		return 0;
 
 	/* Copy sample. */
-	smp->type = var->data.type;
+	smp->data.type = var->data.type;
 	smp->flags = SMP_F_CONST;
-	memcpy(&smp->data, &var->data.data, sizeof(smp->data));
+	memcpy(&smp->data.data, &var->data.data, sizeof(smp->data.data));
 	return 1;
 }
 
