Another STACK bites the dust.
diff --git a/crypto/asn1/asn1_mac.h b/crypto/asn1/asn1_mac.h
index 3aeedc1..b7a90f8 100644
--- a/crypto/asn1/asn1_mac.h
+++ b/crypto/asn1/asn1_mac.h
@@ -193,6 +193,10 @@
 		M_ASN1_D2I_get_imp_set(r,func,free_func,\
 			V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
 
+#define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \
+		M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
+					    V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
+
 #define M_ASN1_D2I_get_seq_opt(r,func,free_func) \
 	if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
 		V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
@@ -211,8 +215,8 @@
 
 #define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \
 	c.q=c.p; \
-	if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,free_func,a,b) \
-	    == NULL) \
+	if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\
+				   free_func,a,b) == NULL) \
 		{ c.line=__LINE__; goto err; } \
 	c.slen-=(c.p-c.q);
 
@@ -309,6 +313,10 @@
 		ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
 				  IS_SEQUENCE);
 
+#define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \
+		ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \
+					    V_ASN1_UNIVERSAL,IS_SEQUENCE)
+
 #define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \
 		if ((a != NULL) && (sk_num(a) != 0)) \
 			M_ASN1_I2D_len_SEQUENCE(a,f);
@@ -379,6 +387,10 @@
 #define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\
 					     V_ASN1_UNIVERSAL,IS_SEQUENCE)
 
+#define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \
+     i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
+			    IS_SEQUENCE)
+
 #define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
 		if ((a != NULL) && (sk_num(a) != 0)) \
 			M_ASN1_I2D_put_SEQUENCE(a,f);
diff --git a/crypto/evp/evp.h b/crypto/evp/evp.h
index 31ed479..1188c35 100644
--- a/crypto/evp/evp.h
+++ b/crypto/evp/evp.h
@@ -164,11 +164,7 @@
 		struct dh_st *dh;	/* DH */
 		} pkey;
 	int save_parameters;
-#ifdef HEADER_STACK_H
-	STACK /* X509_ATTRIBUTE */ *attributes; /* [ 0 ] */
-#else
-	char /* X509_ATTRIBUTE */ *attributes; /* [ 0 ] */
-#endif
+	STACK /*X509_ATTRIBUTE*/ *attributes; /* [ 0 ] */
 	} EVP_PKEY;
 
 #define EVP_PKEY_MO_SIGN	0x0001
diff --git a/crypto/x509/x509.h b/crypto/x509/x509.h
index 6486d20..4d7b996 100644
--- a/crypto/x509/x509.h
+++ b/crypto/x509/x509.h
@@ -126,7 +126,7 @@
 	{
 	X509_ALGOR *algor;
 	ASN1_BIT_STRING *public_key;
-	struct evp_pkey_st /* EVP_PKEY*/ *pkey;
+	EVP_PKEY *pkey;
 	} X509_PUBKEY;
 
 typedef struct X509_sig_st
@@ -256,6 +256,8 @@
 		} value;
 	} X509_ATTRIBUTE;
 
+DECLARE_STACK_OF(X509_ATTRIBUTE);
+
 typedef struct private_key_st
 	{
 	int version;
diff --git a/crypto/x509v3/v3_sxnet.c b/crypto/x509v3/v3_sxnet.c
index 443a574..ac7aa76 100644
--- a/crypto/x509v3/v3_sxnet.c
+++ b/crypto/x509v3/v3_sxnet.c
@@ -109,12 +109,12 @@
 	M_ASN1_I2D_vars(a);
 
 	M_ASN1_I2D_len (a->version, i2d_ASN1_INTEGER);
-	M_ASN1_I2D_len_SEQUENCE (a->ids, i2d_SXNETID);
+	M_ASN1_I2D_len_SEQUENCE_type (SXNETID, a->ids, i2d_SXNETID);
 
 	M_ASN1_I2D_seq_total();
 
 	M_ASN1_I2D_put (a->version, i2d_ASN1_INTEGER);
-	M_ASN1_I2D_put_SEQUENCE (a->ids, i2d_SXNETID);
+	M_ASN1_I2D_put_SEQUENCE_type (SXNETID, a->ids, i2d_SXNETID);
 
 	M_ASN1_I2D_finish();
 }
@@ -125,7 +125,7 @@
 	ASN1_CTX c;
 	M_ASN1_New_Malloc(ret, SXNET);
 	M_ASN1_New(ret->version,ASN1_INTEGER_new);
-	M_ASN1_New(ret->ids,sk_new_null);
+	M_ASN1_New(ret->ids,sk_SXNETID_new_null);
 	return (ret);
 	M_ASN1_New_Error(ASN1_F_SXNET_NEW);
 }
@@ -139,7 +139,7 @@
 	M_ASN1_D2I_Init();
 	M_ASN1_D2I_start_sequence();
 	M_ASN1_D2I_get (ret->version, d2i_ASN1_INTEGER);
-	M_ASN1_D2I_get_seq (ret->ids, d2i_SXNETID, SXNETID_free);
+	M_ASN1_D2I_get_seq_type (SXNETID, ret->ids, d2i_SXNETID, SXNETID_free);
 	M_ASN1_D2I_Finish(a, SXNET_free, ASN1_F_D2I_SXNET);
 }
 
@@ -148,8 +148,8 @@
 {
 	if (a == NULL) return;
 	ASN1_INTEGER_free(a->version);
-	sk_pop_free(a->ids, SXNETID_free);
-	Free ((char *)a);
+	sk_SXNETID_pop_free(a->ids, SXNETID_free);
+	Free (a);
 }
 
 int i2d_SXNETID(a,pp)
@@ -199,7 +199,7 @@
 	if (a == NULL) return;
 	ASN1_INTEGER_free(a->zone);
 	ASN1_OCTET_STRING_free(a->user);
-	Free ((char *)a);
+	Free (a);
 }
 
 static int sxnet_i2r(method, sx, out, indent)
@@ -214,8 +214,8 @@
 	int i;
 	v = ASN1_INTEGER_get(sx->version);
 	BIO_printf(out, "%*sVersion: %d (0x%X)", indent, "", v + 1, v);
-	for(i = 0; i < sk_num(sx->ids); i++) {
-		id = (SXNETID *)sk_value(sx->ids, i);
+	for(i = 0; i < sk_SXNETID_num(sx->ids); i++) {
+		id = sk_SXNETID_value(sx->ids, i);
 		tmp = i2s_ASN1_INTEGER(NULL, id->zone);
 		BIO_printf(out, "\n%*sZone: %s, User: ", indent, "", tmp);
 		Free(tmp);
@@ -323,7 +323,7 @@
 	if(userlen == -1) userlen = strlen(user);
 		
 	if(!ASN1_OCTET_STRING_set(id->user, user, userlen)) goto err;
-	if(!sk_push(sx->ids, (char *)id)) goto err;
+	if(!sk_SXNETID_push(sx->ids, id)) goto err;
 	id->zone = zone;
 	return 1;
 	
@@ -372,9 +372,12 @@
 {
 	SXNETID *id;
 	int i;
-	for(i = 0; i < sk_num(sx->ids); i++) {
-		id = (SXNETID *)sk_value(sx->ids, i);
+	for(i = 0; i < sk_SXNETID_num(sx->ids); i++) {
+		id = sk_SXNETID_value(sx->ids, i);
 		if(!ASN1_INTEGER_cmp(id->zone, zone)) return id->user;
 	}
 	return NULL;
 }
+
+IMPLEMENT_STACK_OF(SXNETID)
+IMPLEMENT_ASN1_SET_OF(SXNETID)
diff --git a/crypto/x509v3/x509v3.h b/crypto/x509v3/x509v3.h
index 5143a1e..52037ec 100644
--- a/crypto/x509v3/x509v3.h
+++ b/crypto/x509v3/x509v3.h
@@ -184,16 +184,19 @@
 
 /* Strong extranet structures */
 
-typedef struct SXNET_st {
-	ASN1_INTEGER *version;
-	STACK /* SXNETID */ *ids;
-} SXNET;
-
 typedef struct SXNET_ID_st {
 	ASN1_INTEGER *zone;
 	ASN1_OCTET_STRING *user;
 } SXNETID;
 
+DECLARE_STACK_OF(SXNETID)
+DECLARE_ASN1_SET_OF(SXNETID)
+
+typedef struct SXNET_st {
+	ASN1_INTEGER *version;
+	STACK_OF(SXNETID) *ids;
+} SXNET;
+
 #define X509V3_conf_err(val) ERR_add_error_data(6, "section:", val->section, \
 ",name:", val->name, ",value:", val->value);