diff --git a/tests/43-recursion-OK.asn1 b/tests/43-recursion-OK.asn1
index f2ee3eb..782f6c3 100644
--- a/tests/43-recursion-OK.asn1
+++ b/tests/43-recursion-OK.asn1
@@ -25,4 +25,7 @@
 		other [4] INTEGER
 	}
 
+	Test-structure-2 ::= SET { m1 Test-structure-3 OPTIONAL }
+	Test-structure-3 ::= SET { m1 Test-structure-2 OPTIONAL }
+
 END
diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P
index 58fd39a..885e635 100644
--- a/tests/43-recursion-OK.asn1.-P
+++ b/tests/43-recursion-OK.asn1.-P
@@ -11,7 +11,9 @@
 
 /*** <<< DEPS [Test-structure-1] >>> ***/
 
-extern asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1;
+
+struct Test_structure_1;	/* Forward declaration */
+extern asn_TYPE_descriptor_t asn_DEF_Test_structure_1;
 
 /*** <<< TYPE-DECLS [Test-structure-1] >>> ***/
 
@@ -21,42 +23,42 @@
 		A_SET_OF(struct Test_structure_1) list;
 		
 		/* Context for parsing across buffer boundaries */
-		ber_dec_ctx_t _ber_dec_ctx;
+		asn_struct_ctx_t _asn_ctx;
 	} t_member1;
 	struct t_member2 {
 		A_SEQUENCE_OF(struct Test_structure_1) list;
 		
 		/* Context for parsing across buffer boundaries */
-		ber_dec_ctx_t _ber_dec_ctx;
+		asn_struct_ctx_t _asn_ctx;
 	} t_member2;
 	struct Test_structure_1	*t_member3	/* OPTIONAL */;
 	INTEGER_t	 t_member4;
 	
 	/* Context for parsing across buffer boundaries */
-	ber_dec_ctx_t _ber_dec_ctx;
+	asn_struct_ctx_t _asn_ctx;
 } Test_structure_1_t;
 
 /*** <<< STAT-DEFS [Test-structure-1] >>> ***/
 
-static asn1_TYPE_member_t asn1_MBR_t_member1[] = {
+static asn_TYPE_member_t asn_MBR_t_member1[] = {
 	{ ATF_NOFLAGS, 0, 0,
 		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
 		.tag_mode = 0,
-		.type = (void *)&asn1_DEF_Test_structure_1,
+		.type = (void *)&asn_DEF_Test_structure_1,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = ""
 		},
 };
-static ber_tlv_tag_t asn1_DEF_t_member1_tags[] = {
+static ber_tlv_tag_t asn_DEF_t_member1_tags[] = {
 	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
 };
-static asn1_SET_OF_specifics_t asn1_DEF_t_member1_specs = {
+static asn_SET_OF_specifics_t asn_DEF_t_member1_specs = {
 	sizeof(struct t_member1),
-	offsetof(struct t_member1, _ber_dec_ctx),
+	offsetof(struct t_member1, _asn_ctx),
 	0,	/* XER encoding is XMLDelimitedItemList */
 };
 static /* Use -fall-defs-global to expose */
-asn1_TYPE_descriptor_t asn1_DEF_t_member1 = {
+asn_TYPE_descriptor_t asn_DEF_t_member1 = {
 	"t-member1",
 	SET_OF_free,
 	SET_OF_print,
@@ -66,36 +68,36 @@
 	0,				/* Not implemented yet */
 	SET_OF_encode_xer,
 	0,	/* Use generic outmost tag fetcher */
-	asn1_DEF_t_member1_tags,
-	sizeof(asn1_DEF_t_member1_tags)
-		/sizeof(asn1_DEF_t_member1_tags[0]), /* 1 */
-	asn1_DEF_t_member1_tags,	/* Same as above */
-	sizeof(asn1_DEF_t_member1_tags)
-		/sizeof(asn1_DEF_t_member1_tags[0]), /* 1 */
-	asn1_MBR_t_member1,
+	asn_DEF_t_member1_tags,
+	sizeof(asn_DEF_t_member1_tags)
+		/sizeof(asn_DEF_t_member1_tags[0]), /* 1 */
+	asn_DEF_t_member1_tags,	/* Same as above */
+	sizeof(asn_DEF_t_member1_tags)
+		/sizeof(asn_DEF_t_member1_tags[0]), /* 1 */
+	asn_MBR_t_member1,
 	1,	/* Single element */
-	&asn1_DEF_t_member1_specs	/* Additional specs */
+	&asn_DEF_t_member1_specs	/* Additional specs */
 };
 
-static asn1_TYPE_member_t asn1_MBR_t_member2[] = {
+static asn_TYPE_member_t asn_MBR_t_member2[] = {
 	{ ATF_NOFLAGS, 0, 0,
 		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
 		.tag_mode = 0,
-		.type = (void *)&asn1_DEF_Test_structure_1,
+		.type = (void *)&asn_DEF_Test_structure_1,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = ""
 		},
 };
-static ber_tlv_tag_t asn1_DEF_t_member2_tags[] = {
+static ber_tlv_tag_t asn_DEF_t_member2_tags[] = {
 	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
 };
-static asn1_SET_OF_specifics_t asn1_DEF_t_member2_specs = {
+static asn_SET_OF_specifics_t asn_DEF_t_member2_specs = {
 	sizeof(struct t_member2),
-	offsetof(struct t_member2, _ber_dec_ctx),
+	offsetof(struct t_member2, _asn_ctx),
 	0,	/* XER encoding is XMLDelimitedItemList */
 };
 static /* Use -fall-defs-global to expose */
-asn1_TYPE_descriptor_t asn1_DEF_t_member2 = {
+asn_TYPE_descriptor_t asn_DEF_t_member2 = {
 	"t-member2",
 	SEQUENCE_OF_free,
 	SEQUENCE_OF_print,
@@ -105,65 +107,65 @@
 	0,				/* Not implemented yet */
 	SEQUENCE_OF_encode_xer,
 	0,	/* Use generic outmost tag fetcher */
-	asn1_DEF_t_member2_tags,
-	sizeof(asn1_DEF_t_member2_tags)
-		/sizeof(asn1_DEF_t_member2_tags[0]), /* 1 */
-	asn1_DEF_t_member2_tags,	/* Same as above */
-	sizeof(asn1_DEF_t_member2_tags)
-		/sizeof(asn1_DEF_t_member2_tags[0]), /* 1 */
-	asn1_MBR_t_member2,
+	asn_DEF_t_member2_tags,
+	sizeof(asn_DEF_t_member2_tags)
+		/sizeof(asn_DEF_t_member2_tags[0]), /* 1 */
+	asn_DEF_t_member2_tags,	/* Same as above */
+	sizeof(asn_DEF_t_member2_tags)
+		/sizeof(asn_DEF_t_member2_tags[0]), /* 1 */
+	asn_MBR_t_member2,
 	1,	/* Single element */
-	&asn1_DEF_t_member2_specs	/* Additional specs */
+	&asn_DEF_t_member2_specs	/* Additional specs */
 };
 
-static asn1_TYPE_member_t asn1_MBR_Test_structure_1[] = {
+static asn_TYPE_member_t asn_MBR_Test_structure_1[] = {
 	{ ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member1),
 		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
 		.tag_mode = 0,
-		.type = (void *)&asn1_DEF_t_member1,
+		.type = (void *)&asn_DEF_t_member1,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = "t-member1"
 		},
 	{ ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member2),
 		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
 		.tag_mode = 0,
-		.type = (void *)&asn1_DEF_t_member2,
+		.type = (void *)&asn_DEF_t_member2,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = "t-member2"
 		},
 	{ ATF_POINTER, 1, offsetof(struct Test_structure_1, t_member3),
 		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
 		.tag_mode = 0,
-		.type = (void *)&asn1_DEF_Test_structure_1,
+		.type = (void *)&asn_DEF_Test_structure_1,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = "t-member3"
 		},
 	{ ATF_NOFLAGS, 0, offsetof(struct Test_structure_1, t_member4),
 		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
 		.tag_mode = 0,
-		.type = (void *)&asn1_DEF_INTEGER,
+		.type = (void *)&asn_DEF_INTEGER,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = "t-member4"
 		},
 };
-static ber_tlv_tag_t asn1_DEF_Test_structure_1_tags[] = {
+static ber_tlv_tag_t asn_DEF_Test_structure_1_tags[] = {
 	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
 };
-static asn1_TYPE_tag2member_t asn1_DEF_Test_structure_1_tag2el[] = {
+static asn_TYPE_tag2member_t asn_DEF_Test_structure_1_tag2el[] = {
     { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, 0, 0 }, /* t-member4 at 19 */
     { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 1 }, /* t-member2 at 16 */
     { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 }, /* t-member3 at 17 */
     { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* t-member1 at 15 */
 };
-static asn1_SEQUENCE_specifics_t asn1_DEF_Test_structure_1_specs = {
+static asn_SEQUENCE_specifics_t asn_DEF_Test_structure_1_specs = {
 	sizeof(struct Test_structure_1),
-	offsetof(struct Test_structure_1, _ber_dec_ctx),
-	asn1_DEF_Test_structure_1_tag2el,
+	offsetof(struct Test_structure_1, _asn_ctx),
+	asn_DEF_Test_structure_1_tag2el,
 	4,	/* Count of tags in the map */
 	-1,	/* Start extensions */
 	-1	/* Stop extensions */
 };
-asn1_TYPE_descriptor_t asn1_DEF_Test_structure_1 = {
+asn_TYPE_descriptor_t asn_DEF_Test_structure_1 = {
 	"Test-structure-1",
 	SEQUENCE_free,
 	SEQUENCE_print,
@@ -173,15 +175,15 @@
 	0,				/* Not implemented yet */
 	SEQUENCE_encode_xer,
 	0,	/* Use generic outmost tag fetcher */
-	asn1_DEF_Test_structure_1_tags,
-	sizeof(asn1_DEF_Test_structure_1_tags)
-		/sizeof(asn1_DEF_Test_structure_1_tags[0]), /* 1 */
-	asn1_DEF_Test_structure_1_tags,	/* Same as above */
-	sizeof(asn1_DEF_Test_structure_1_tags)
-		/sizeof(asn1_DEF_Test_structure_1_tags[0]), /* 1 */
-	asn1_MBR_Test_structure_1,
+	asn_DEF_Test_structure_1_tags,
+	sizeof(asn_DEF_Test_structure_1_tags)
+		/sizeof(asn_DEF_Test_structure_1_tags[0]), /* 1 */
+	asn_DEF_Test_structure_1_tags,	/* Same as above */
+	sizeof(asn_DEF_Test_structure_1_tags)
+		/sizeof(asn_DEF_Test_structure_1_tags[0]), /* 1 */
+	asn_MBR_Test_structure_1,
 	4,	/* Elements count */
-	&asn1_DEF_Test_structure_1_specs	/* Additional specs */
+	&asn_DEF_Test_structure_1_specs	/* Additional specs */
 };
 
 
@@ -202,7 +204,11 @@
 	Choice_1_PR_not,
 	Choice_1_PR_other,
 } Choice_1_PR;
-extern asn1_TYPE_descriptor_t asn1_DEF_Choice_1;
+
+struct Choice_1;	/* Forward declaration */
+
+struct Choice_1;	/* Forward declaration */
+extern asn_TYPE_descriptor_t asn_DEF_Choice_1;
 
 /*** <<< TYPE-DECLS [Choice-1] >>> ***/
 
@@ -215,38 +221,38 @@
 			A_SET_OF(struct Choice_1) list;
 			
 			/* Context for parsing across buffer boundaries */
-			ber_dec_ctx_t _ber_dec_ctx;
+			asn_struct_ctx_t _asn_ctx;
 		} or;
 		struct Choice_1	*not;
 		INTEGER_t	 other;
 	} choice;
 	
 	/* Context for parsing across buffer boundaries */
-	ber_dec_ctx_t _ber_dec_ctx;
+	asn_struct_ctx_t _asn_ctx;
 } Choice_1_t;
 
 /*** <<< STAT-DEFS [Choice-1] >>> ***/
 
-static asn1_TYPE_member_t asn1_MBR_or[] = {
+static asn_TYPE_member_t asn_MBR_or[] = {
 	{ ATF_NOFLAGS, 0, 0,
 		.tag = -1 /* Ambiguous tag (CHOICE?) */,
 		.tag_mode = 0,
-		.type = (void *)&asn1_DEF_Choice_1,
+		.type = (void *)&asn_DEF_Choice_1,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = ""
 		},
 };
-static ber_tlv_tag_t asn1_DEF_or_tags[] = {
+static ber_tlv_tag_t asn_DEF_or_tags[] = {
 	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
 	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
 };
-static asn1_SET_OF_specifics_t asn1_DEF_or_specs = {
+static asn_SET_OF_specifics_t asn_DEF_or_specs = {
 	sizeof(struct or),
-	offsetof(struct or, _ber_dec_ctx),
+	offsetof(struct or, _asn_ctx),
 	1,	/* XER encoding is XMLValueList */
 };
 static /* Use -fall-defs-global to expose */
-asn1_TYPE_descriptor_t asn1_DEF_or = {
+asn_TYPE_descriptor_t asn_DEF_or = {
 	"or",
 	SET_OF_free,
 	SET_OF_print,
@@ -256,63 +262,63 @@
 	0,				/* Not implemented yet */
 	SET_OF_encode_xer,
 	0,	/* Use generic outmost tag fetcher */
-	asn1_DEF_or_tags,
-	sizeof(asn1_DEF_or_tags)
-		/sizeof(asn1_DEF_or_tags[0]) - 1, /* 1 */
-	asn1_DEF_or_tags,	/* Same as above */
-	sizeof(asn1_DEF_or_tags)
-		/sizeof(asn1_DEF_or_tags[0]), /* 2 */
-	asn1_MBR_or,
+	asn_DEF_or_tags,
+	sizeof(asn_DEF_or_tags)
+		/sizeof(asn_DEF_or_tags[0]) - 1, /* 1 */
+	asn_DEF_or_tags,	/* Same as above */
+	sizeof(asn_DEF_or_tags)
+		/sizeof(asn_DEF_or_tags[0]), /* 2 */
+	asn_MBR_or,
 	1,	/* Single element */
-	&asn1_DEF_or_specs	/* Additional specs */
+	&asn_DEF_or_specs	/* Additional specs */
 };
 
-static asn1_TYPE_member_t asn1_MBR_Choice_1[] = {
+static asn_TYPE_member_t asn_MBR_Choice_1[] = {
 	{ ATF_POINTER, 0, offsetof(struct Choice_1, choice.and),
 		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
 		.tag_mode = +1,	/* EXPLICIT tag at current level */
-		.type = (void *)&asn1_DEF_Choice_1,
+		.type = (void *)&asn_DEF_Choice_1,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = "and"
 		},
 	{ ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.or),
 		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
 		.tag_mode = -1,	/* IMPLICIT tag at current level */
-		.type = (void *)&asn1_DEF_or,
+		.type = (void *)&asn_DEF_or,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = "or"
 		},
 	{ ATF_POINTER, 0, offsetof(struct Choice_1, choice.not),
 		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
 		.tag_mode = +1,	/* EXPLICIT tag at current level */
-		.type = (void *)&asn1_DEF_Choice_1,
+		.type = (void *)&asn_DEF_Choice_1,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = "not"
 		},
 	{ ATF_NOFLAGS, 0, offsetof(struct Choice_1, choice.other),
 		.tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)),
 		.tag_mode = +1,	/* EXPLICIT tag at current level */
-		.type = (void *)&asn1_DEF_INTEGER,
+		.type = (void *)&asn_DEF_INTEGER,
 		.memb_constraints = 0,	/* Defer to actual type */
 		.name = "other"
 		},
 };
-static asn1_TYPE_tag2member_t asn1_DEF_Choice_1_tag2el[] = {
+static asn_TYPE_tag2member_t asn_DEF_Choice_1_tag2el[] = {
     { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* and at 22 */
     { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* or at 23 */
     { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* not at 24 */
     { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 }, /* other at 26 */
 };
-static asn1_CHOICE_specifics_t asn1_DEF_Choice_1_specs = {
+static asn_CHOICE_specifics_t asn_DEF_Choice_1_specs = {
 	sizeof(struct Choice_1),
-	offsetof(struct Choice_1, _ber_dec_ctx),
+	offsetof(struct Choice_1, _asn_ctx),
 	offsetof(struct Choice_1, present),
 	sizeof(((struct Choice_1 *)0)->present),
-	asn1_DEF_Choice_1_tag2el,
+	asn_DEF_Choice_1_tag2el,
 	4,	/* Count of tags in the map */
 	0	/* Whether extensible */
 };
-asn1_TYPE_descriptor_t asn1_DEF_Choice_1 = {
+asn_TYPE_descriptor_t asn_DEF_Choice_1 = {
 	"Choice-1",
 	CHOICE_free,
 	CHOICE_print,
@@ -326,8 +332,174 @@
 	0,	/* No effective tags (count) */
 	0,	/* No tags (pointer) */
 	0,	/* No tags (count) */
-	asn1_MBR_Choice_1,
+	asn_MBR_Choice_1,
 	4,	/* Elements count */
-	&asn1_DEF_Choice_1_specs	/* Additional specs */
+	&asn_DEF_Choice_1_specs	/* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Test-structure-2] >>> ***/
+
+#include <Test-structure-3.h>
+#include <constr_SET.h>
+
+/*** <<< DEPS [Test-structure-2] >>> ***/
+
+
+/*
+ * Method of determining the components presence
+ */
+typedef enum Test_structure_2_PR {
+	Test_structure_2_PR_m1,	/* Member m1 is present */
+} Test_structure_2_PR;
+
+struct Test_structure_3;	/* Forward declaration */
+extern asn_TYPE_descriptor_t asn_DEF_Test_structure_2;
+
+/*** <<< TYPE-DECLS [Test-structure-2] >>> ***/
+
+
+typedef struct Test_structure_2 {
+	struct Test_structure_3	*m1	/* OPTIONAL */;
+	
+	/* Presence bitmask: ASN_SET_ISPRESENT(pTest_structure_2, Test_structure_2_PR_x) */
+	unsigned int _presence_map
+		[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Test_structure_2_t;
+
+/*** <<< STAT-DEFS [Test-structure-2] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Test_structure_2[] = {
+	{ ATF_POINTER, 1, offsetof(struct Test_structure_2, m1),
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_Test_structure_3,
+		.memb_constraints = 0,	/* Defer to actual type */
+		.name = "m1"
+		},
+};
+static ber_tlv_tag_t asn_DEF_Test_structure_2_tags[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
+};
+static asn_TYPE_tag2member_t asn_DEF_Test_structure_2_tag2el[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* m1 at 28 */
+};
+static uint8_t asn_DEF_Test_structure_2_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
+	(0 << 7)
+};
+static asn_SET_specifics_t asn_DEF_Test_structure_2_specs = {
+	sizeof(struct Test_structure_2),
+	offsetof(struct Test_structure_2, _asn_ctx),
+	offsetof(struct Test_structure_2, _presence_map),
+	asn_DEF_Test_structure_2_tag2el,
+	1,	/* Count of tags in the map */
+	0,	/* Whether extensible */
+	(unsigned int *)asn_DEF_Test_structure_2_mmap	/* Mandatory elements map */
+};
+asn_TYPE_descriptor_t asn_DEF_Test_structure_2 = {
+	"Test-structure-2",
+	SET_free,
+	SET_print,
+	SET_constraint,
+	SET_decode_ber,
+	SET_encode_der,
+	0,				/* Not implemented yet */
+	SET_encode_xer,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Test_structure_2_tags,
+	sizeof(asn_DEF_Test_structure_2_tags)
+		/sizeof(asn_DEF_Test_structure_2_tags[0]), /* 1 */
+	asn_DEF_Test_structure_2_tags,	/* Same as above */
+	sizeof(asn_DEF_Test_structure_2_tags)
+		/sizeof(asn_DEF_Test_structure_2_tags[0]), /* 1 */
+	asn_MBR_Test_structure_2,
+	1,	/* Elements count */
+	&asn_DEF_Test_structure_2_specs	/* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Test-structure-3] >>> ***/
+
+#include <Test-structure-2.h>
+#include <constr_SET.h>
+
+/*** <<< DEPS [Test-structure-3] >>> ***/
+
+
+/*
+ * Method of determining the components presence
+ */
+typedef enum Test_structure_3_PR {
+	Test_structure_3_PR_m1,	/* Member m1 is present */
+} Test_structure_3_PR;
+
+struct Test_structure_2;	/* Forward declaration */
+extern asn_TYPE_descriptor_t asn_DEF_Test_structure_3;
+
+/*** <<< TYPE-DECLS [Test-structure-3] >>> ***/
+
+
+typedef struct Test_structure_3 {
+	struct Test_structure_2	*m1	/* OPTIONAL */;
+	
+	/* Presence bitmask: ASN_SET_ISPRESENT(pTest_structure_3, Test_structure_3_PR_x) */
+	unsigned int _presence_map
+		[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Test_structure_3_t;
+
+/*** <<< STAT-DEFS [Test-structure-3] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Test_structure_3[] = {
+	{ ATF_POINTER, 1, offsetof(struct Test_structure_3, m1),
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_Test_structure_2,
+		.memb_constraints = 0,	/* Defer to actual type */
+		.name = "m1"
+		},
+};
+static ber_tlv_tag_t asn_DEF_Test_structure_3_tags[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
+};
+static asn_TYPE_tag2member_t asn_DEF_Test_structure_3_tag2el[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 0 }, /* m1 at 29 */
+};
+static uint8_t asn_DEF_Test_structure_3_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
+	(0 << 7)
+};
+static asn_SET_specifics_t asn_DEF_Test_structure_3_specs = {
+	sizeof(struct Test_structure_3),
+	offsetof(struct Test_structure_3, _asn_ctx),
+	offsetof(struct Test_structure_3, _presence_map),
+	asn_DEF_Test_structure_3_tag2el,
+	1,	/* Count of tags in the map */
+	0,	/* Whether extensible */
+	(unsigned int *)asn_DEF_Test_structure_3_mmap	/* Mandatory elements map */
+};
+asn_TYPE_descriptor_t asn_DEF_Test_structure_3 = {
+	"Test-structure-3",
+	SET_free,
+	SET_print,
+	SET_constraint,
+	SET_decode_ber,
+	SET_encode_der,
+	0,				/* Not implemented yet */
+	SET_encode_xer,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Test_structure_3_tags,
+	sizeof(asn_DEF_Test_structure_3_tags)
+		/sizeof(asn_DEF_Test_structure_3_tags[0]), /* 1 */
+	asn_DEF_Test_structure_3_tags,	/* Same as above */
+	sizeof(asn_DEF_Test_structure_3_tags)
+		/sizeof(asn_DEF_Test_structure_3_tags[0]), /* 1 */
+	asn_MBR_Test_structure_3,
+	1,	/* Elements count */
+	&asn_DEF_Test_structure_3_specs	/* Additional specs */
 };
 
