support for a class of circular references

diff --git a/ChangeLog b/ChangeLog
index 6fd8a44..fc03b75 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,8 @@
 	* X.693:8.3.4 prohibits anything but SignedNumber; fixed XER codec.
 	* Fixed ENUMERATED identifier to value conversion in XER.
 	  Reported by <jacque.celaire@caramail.com>.
+	* Compiler is taught to produce compilable code for yet another class
+	  of circular ASN.1 type references.
 	* If the compiled file contents are the same as in already existing
 	  file (left from previous compilation), the old file is retained.
 	  This prevents thrashing `make` dependencies if amount of changes in
diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c
index 41ad21e..b8a7428 100644
--- a/libasn1compiler/asn1c_C.c
+++ b/libasn1compiler/asn1c_C.c
@@ -35,6 +35,7 @@
 static int expr_elements_count(arg_t *arg, asn1p_expr_t *expr);
 static int emit_member_table(arg_t *arg, asn1p_expr_t *expr);
 static int emit_tag2member_map(arg_t *arg, tag2el_t *tag2el, int tag2el_count, const char *opt_modifier);
+static int emit_include_dependencies(arg_t *arg);
 static int out_name_chain(arg_t *arg, int check_reserved_keywords);
 
 enum tvm_compat {
@@ -59,16 +60,9 @@
 	OUT("/* Context for parsing across buffer boundaries */\n");	\
 	OUT("asn_struct_ctx_t _asn_ctx;\n"));
 
+
 #define	DEPENDENCIES	do {						\
-	asn1p_expr_t *__m;						\
-	TQ_FOR(__m, &(expr->members), next) {				\
-		if((!(__m->expr_type & ASN_CONSTR_MASK)			\
-		&& __m->expr_type > ASN_CONSTR_MASK)			\
-		|| __m->meta_type == AMT_TYPEREF) {			\
-			GEN_INCLUDE(asn1c_type_name(arg,		\
-				__m, TNF_INCLUDE));	\
-		}							\
-	}								\
+	emit_include_dependencies(arg);					\
 	if(expr->expr_type == ASN_CONSTR_SET_OF)			\
 		GEN_INCLUDE("asn_SET_OF");				\
 	if(expr->expr_type == ASN_CONSTR_SEQUENCE_OF)			\
@@ -81,7 +75,6 @@
 
 int
 asn1c_lang_C_type_REAL(arg_t *arg) {
-	REDIR(OT_DEPS);
 	return asn1c_lang_C_type_SIMPLE_TYPE(arg);
 }
 
@@ -245,7 +238,7 @@
 	}
 
 	PCTX_DEF;
-	OUT("} %s%s%s", expr->marker.flags?"*":"",
+	OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"",
 		expr->_anonymous_type ? "" : MKID(expr->Identifier),
 		arg->embed ? "" : "_t");
 
@@ -406,7 +399,7 @@
 	);
 
 	PCTX_DEF;
-	OUT("} %s%s%s", expr->marker.flags?"*":"",
+	OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"",
 		expr->_anonymous_type ? "" : MKID(expr->Identifier),
 		arg->embed ? "" : "_t");
 
@@ -567,7 +560,7 @@
 int
 asn1c_lang_C_type_SEx_OF(arg_t *arg) {
 	asn1p_expr_t *expr = arg->expr;
-	asn1p_expr_t *memb;
+	asn1p_expr_t *memb = TQ_FIRST(&expr->members);
 
 	DEPENDENCIES;
 
@@ -579,8 +572,6 @@
 		OUT("typedef struct %s {\n", MKID(expr->Identifier));
 	}
 
-	memb = TQ_FIRST(&expr->members);
-
 	INDENT(+1);
 	OUT("A_%s_OF(",
 		(arg->expr->expr_type == ASN_CONSTR_SET_OF)
@@ -611,13 +602,13 @@
 		arg->embed--;
 		assert(arg->target->target == OT_TYPE_DECLS);
 	} else {
-		OUT("%s", asn1c_type_name(arg, memb, TNF_CTYPE | TNF_CHECK));
+		OUT("%s", asn1c_type_name(arg, memb, TNF_RSAFE));
 	}
 	OUT(") list;\n");
 	INDENT(-1);
 
 	PCTX_DEF;
-	OUT("} %s%s%s", expr->marker.flags?"*":"",
+	OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"",
 		expr->_anonymous_type ? "" : MKID(expr->Identifier),
 		arg->embed ? "" : "_t");
 
@@ -752,7 +743,7 @@
 	);
 
 	PCTX_DEF;
-	OUT("} %s%s%s", expr->marker.flags?"*":"",
+	OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"",
 		expr->_anonymous_type ? "" : MKID(expr->Identifier),
 		arg->embed ? "" : "_t");
 
@@ -918,24 +909,23 @@
 		 * refer it using "struct X" convention,
 		 * as it may recursively include the current structure.
 		 */
-		if(expr->marker.flags) {
+		if(expr->marker.flags & (EM_INDIRECT | EM_UNRECURSE)) {
 			asn1p_expr_t *terminal;
 			terminal = asn1f_find_terminal_type_ex(arg->asn, expr);
 			if(terminal
 			&& (terminal->expr_type & ASN_CONSTR_MASK)) {
-				REDIR(OT_DEPS);
-			 	tnfmt = TNF_RSAFE;
-				OUT("\n");
+				tnfmt = TNF_RSAFE;
+				REDIR(OT_FWD_DECLS);
 				OUT("%s;\t/* Forward declaration */\n",
-					asn1c_type_name(arg, arg->expr, tnfmt | TNF_CHECK));
+					asn1c_type_name(arg, arg->expr, tnfmt));
 			}
 		}
 
 		REDIR(OT_TYPE_DECLS);
 
-		OUT("%s", asn1c_type_name(arg, arg->expr, tnfmt | TNF_CHECK));
+		OUT("%s", asn1c_type_name(arg, arg->expr, tnfmt));
 		if(!expr->_anonymous_type) {
-			OUT("%s", expr->marker.flags?"\t*":"\t ");
+			OUT("%s", (expr->marker.flags&EM_INDIRECT)?"\t*":"\t ");
 			OUT("%s", MKID(expr->Identifier));
 			if((expr->marker.flags & EM_DEFAULT) == EM_DEFAULT)
 				OUT("\t/* DEFAULT %s */",
@@ -951,11 +941,10 @@
 		REDIR(OT_TYPE_DECLS);
 
 		OUT("typedef %s\t",
-			asn1c_type_name(arg, arg->expr, TNF_CTYPE | TNF_CHECK));
+			asn1c_type_name(arg, arg->expr, TNF_CTYPE));
 		OUT("%s%s_t",
-			expr->marker.flags?"*":" ",
-			MKID(expr->Identifier));
-		OUT_DEBUG("\t/* %s:%d */", __FILE__, __LINE__);
+			(expr->marker.flags & EM_INDIRECT)?"*":" ",
+			MKID_nc(expr->Identifier));
 	}
 
 	if((expr->expr_type == ASN_BASIC_ENUMERATED)
@@ -1557,6 +1546,47 @@
 }
 
 static int
+emit_include_dependencies(arg_t *arg) {
+	asn1p_expr_t *expr = arg->expr;
+	asn1p_expr_t *memb;
+
+	TQ_FOR(memb, &(expr->members), next) {
+
+		if((memb->meta_type == AMT_TYPEREF
+		&& (memb->marker.flags & EM_INDIRECT))
+		|| expr->expr_type == ASN_CONSTR_SET_OF
+		|| expr->expr_type == ASN_CONSTR_SEQUENCE_OF
+		) {
+			asn1p_expr_t *terminal;
+			terminal = asn1f_find_terminal_type_ex(arg->asn, memb);
+			if(terminal && !terminal->parent_expr
+				&& (terminal->expr_type & ASN_CONSTR_MASK)) {
+				int saved_target = arg->target->target;
+				REDIR(OT_FWD_DECLS);
+				OUT("%s;\t/* Forward declaration */\n",
+					asn1c_type_name(arg, memb, TNF_RSAFE));
+				REDIR(saved_target);
+				memb->marker.flags |= EM_UNRECURSE;
+			}
+		}
+
+		if((!(memb->expr_type & ASN_CONSTR_MASK)
+			&& memb->expr_type > ASN_CONSTR_MASK)
+		|| memb->meta_type == AMT_TYPEREF) {
+			if(memb->marker.flags & EM_UNRECURSE) {
+				GEN_POSTINCLUDE(asn1c_type_name(arg,
+					memb, TNF_INCLUDE));
+			} else {
+				GEN_INCLUDE(asn1c_type_name(arg,
+					memb, TNF_INCLUDE));
+			}
+		}
+	}
+
+	return 0;
+}
+
+static int
 emit_member_table(arg_t *arg, asn1p_expr_t *expr) {
 	int save_target;
 	arg_t tmp_arg;
@@ -1576,7 +1606,8 @@
 
 	if(outmost_tag && outmost_tag->tag_value == -1)
 		OUT("ATF_OPEN_TYPE | ");
-	OUT("%s, ", expr->marker.flags?"ATF_POINTER":"ATF_NOFLAGS");
+	OUT("%s, ",
+		(expr->marker.flags & EM_INDIRECT)?"ATF_POINTER":"ATF_NOFLAGS");
 	if((expr->marker.flags & EM_OPTIONAL) == EM_OPTIONAL) {
 		asn1p_expr_t *tv;
 		int opts = 0;
diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c
index 94e4a63..8c5bb62 100644
--- a/libasn1compiler/asn1c_misc.c
+++ b/libasn1compiler/asn1c_misc.c
@@ -124,9 +124,6 @@
 asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) {
 	asn1p_expr_t *top_parent;
 	char *typename;
-	enum ami_flags_e ami_flags = (_format & TNF_CHECK)
-		? AMI_CHECK_RESERVED : 0;
-	_format &= ~TNF_CHECK;
 
 	/* Rewind to the topmost parent expression */
 	if((top_parent = expr->parent_expr))
@@ -152,10 +149,18 @@
 			return asn1c_type_name(&tmp, tmp.expr, _format);
 		}
 
+		if(_format == TNF_RSAFE) {
+			asn1p_expr_t *terminal;
+			terminal = asn1f_find_terminal_type_ex(arg->asn, expr);
+			if(terminal && terminal->expr_type & ASN_CONSTR_MASK) {
+				typename = terminal->Identifier;
+			}
+		}
+
 		if(_format == TNF_CTYPE) {
 			/*
 			 * If the component references the type itself,
-			 * switch to a recursion safe type representation
+			 * switch to a recursion-safe type naming
 			 * ("struct foo" instead of "foo_t").
 			 */
 			asn1p_expr_t *terminal;
@@ -220,19 +225,14 @@
 	switch(_format) {
 	case TNF_UNMODIFIED:
 	case TNF_INCLUDE:
-		assert(ami_flags == 0);	/* (TNF_INCLUDE | TNF_CHECK)?! */
-		ami_flags |= AMI_MASK_ONLY_SPACES;
-		return asn1c_make_identifier(ami_flags, typename, 0);
+		return asn1c_make_identifier(AMI_MASK_ONLY_SPACES, typename, 0);
 	case TNF_SAFE:
-		return asn1c_make_identifier(ami_flags, typename, 0);
-	case TNF_CTYPE:
-		return asn1c_make_identifier(ami_flags, typename, "t", 0);
-	case TNF_RSAFE:
-		return asn1c_make_identifier(ami_flags, "struct", " ", typename, 0);
-	case TNF_NORCHECK:
-	case TNF_CHECK:
-		assert(_format != TNF_NORCHECK);
-		assert(_format != TNF_CHECK);
+		return asn1c_make_identifier(0, typename, 0);
+	case TNF_CTYPE:	/* C type */
+		return asn1c_make_identifier(0, typename, "t", 0);
+	case TNF_RSAFE:	/* Recursion-safe type */
+		return asn1c_make_identifier(AMI_CHECK_RESERVED,
+			"struct", " ", typename, 0);
 	}
 
 	assert(!"unreachable");
diff --git a/libasn1compiler/asn1c_misc.h b/libasn1compiler/asn1c_misc.h
index c653fa8..eab7567 100644
--- a/libasn1compiler/asn1c_misc.h
+++ b/libasn1compiler/asn1c_misc.h
@@ -16,8 +16,6 @@
  * Return the type name of the specified expression.
  */
 enum tnfmt {
-	TNF_NORCHECK	= 0x00,
-	TNF_CHECK	= 0x01,
 	TNF_UNMODIFIED	= 0x10,	/* Return unmodified type name */
 	TNF_INCLUDE	= 0x20,	/* Format for #include <> */
 	TNF_CTYPE	= 0x30,	/* Format as normal C-ish type (append "_t") */
diff --git a/libasn1compiler/asn1c_out.c b/libasn1compiler/asn1c_out.c
index 14b1f18..46029f7 100644
--- a/libasn1compiler/asn1c_out.c
+++ b/libasn1compiler/asn1c_out.c
@@ -72,7 +72,9 @@
 
 	m->len = ret;
 
-	if(arg->target->target == OT_INCLUDES) {
+	if(arg->target->target == OT_INCLUDES
+	|| arg->target->target == OT_FWD_DECLS
+	|| arg->target->target == OT_POST_INCLUDE) {
 		out_chunk_t *v;
 		TQ_FOR(v, &dst->chunks, next) {
 			if(m->len == v->len
diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h
index 5a0a1f2..e500a54 100644
--- a/libasn1compiler/asn1c_out.h
+++ b/libasn1compiler/asn1c_out.h
@@ -16,8 +16,10 @@
 		OT_IGNORE,	/* Ignore this output */
 		OT_INCLUDES,	/* #include files */
 		OT_DEPS,	/* Dependencies (other than #includes) */
+		OT_FWD_DECLS,	/* Forward declarations */
 		OT_TYPE_DECLS,	/* Type declarations */
 		OT_FUNC_DECLS,	/* Function declarations */
+		OT_POST_INCLUDE,/* #include after type definition */
 		OT_CTABLES,	/* Constraint tables */
 		OT_CODE,	/* Some code */
 		OT_STAT_DEFS,	/* Static definitions */
@@ -32,7 +34,7 @@
 } compiler_streams_t;
 
 static char *_compiler_stream2str[] __attribute__ ((unused))
-    = { "IGNORE", "INCLUDES", "DEPS", "TYPE-DECLS", "FUNC-DECLS", "CTABLES", "CODE", "STAT-DEFS" };
+    = { "IGNORE", "INCLUDES", "DEPS", "FWD-DECLS", "TYPE-DECLS", "FUNC-DECLS", "POST-INCLUDE", "CTABLES", "CODE", "STAT-DEFS" };
 
 int asn1c_compiled_output(arg_t *arg, const char *fmt, ...);
 
@@ -86,14 +88,20 @@
 	OUT_NOINDENT("#include <%s.h>\n", filename);		\
 	REDIR(saved_target);					\
 } while(0)
+#define	GEN_POSTINCLUDE(filename)	do {			\
+	int saved_target = arg->target->target;			\
+	REDIR(OT_POST_INCLUDE);					\
+	OUT_NOINDENT("#include <%s.h>\n", filename);		\
+	REDIR(saved_target);					\
+} while(0)
 
 /* Generate ASN.1 type declaration */
 #define	GEN_DECLARE(expr)	do {				\
 	int saved_target = arg->target->target;			\
-	REDIR(OT_DEPS);						\
+	REDIR(OT_FUNC_DECLS);					\
 	OUT_NOINDENT("extern asn_TYPE_descriptor_t "		\
 			"asn_DEF_%s;\n",			\
-			MKID(expr->Identifier));		\
+			MKID_nc(expr->Identifier));		\
 	REDIR(saved_target);					\
 } while(0)
 
diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c
index 2d0410f..0f3ed04 100644
--- a/libasn1compiler/asn1c_save.c
+++ b/libasn1compiler/asn1c_save.c
@@ -222,21 +222,23 @@
 
 	fprintf(fp_h, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n");
 
-	fprintf(fp_h, "#include <asn_application.h>\n\n");
+	fprintf(fp_h, "#include <asn_application.h>\n");
 
-	TQ_FOR(ot, &(cs->destination[OT_INCLUDES].chunks), next) {
-		asn1c_activate_dependency(deps, 0, ot->buf);
-		fwrite(ot->buf, ot->len, 1, fp_h);
-	}
-	fprintf(fp_h, "\n");
-	TQ_FOR(ot, &(cs->destination[OT_DEPS].chunks), next)
-		fwrite(ot->buf, ot->len, 1, fp_h);
-	fprintf(fp_h, "\n");
-	TQ_FOR(ot, &(cs->destination[OT_TYPE_DECLS].chunks), next)
-		fwrite(ot->buf, ot->len, 1, fp_h);
-	fprintf(fp_h, "\n");
-	TQ_FOR(ot, &(cs->destination[OT_FUNC_DECLS].chunks), next)
-		fwrite(ot->buf, ot->len, 1, fp_h);
+#define	SAVE_STREAM(idx, msg, actdep)	do {				\
+	if(TQ_FIRST(&(cs->destination[idx].chunks)))			\
+		fprintf(fp_h, "\n/* %s */\n", msg);			\
+	TQ_FOR(ot, &(cs->destination[idx].chunks), next) {		\
+		if(actdep) asn1c_activate_dependency(deps, 0, ot->buf);	\
+		fwrite(ot->buf, ot->len, 1, fp_h);			\
+	}								\
+} while(0)
+
+	SAVE_STREAM(OT_INCLUDES, "Including external dependencies", 1);
+	SAVE_STREAM(OT_DEPS, "Dependencies", 0);
+	SAVE_STREAM(OT_FWD_DECLS, "Forward declarations", 0);
+	SAVE_STREAM(OT_TYPE_DECLS, expr->Identifier, 0);
+	SAVE_STREAM(OT_FUNC_DECLS, "Implementation", 0);
+	SAVE_STREAM(OT_POST_INCLUDE, "Referred external types", 1);
 
 	fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n\n"
 			"#endif\t/* _%s_H_ */\n",
@@ -251,7 +253,7 @@
 	TQ_FOR(ot, &(cs->destination[OT_STAT_DEFS].chunks), next)
 		fwrite(ot->buf, ot->len, 1, fp_c);
 
-	assert(OT_MAX == 8);
+	assert(OT_MAX == 10);	/* Protection from reckless changes */
 
 	fclose(fp_c);
 	fclose(fp_h);
diff --git a/libasn1compiler/asn1compiler.c b/libasn1compiler/asn1compiler.c
index 0159da1..107303d 100644
--- a/libasn1compiler/asn1compiler.c
+++ b/libasn1compiler/asn1compiler.c
@@ -76,9 +76,6 @@
 	type_cb = asn1_lang_map[expr->meta_type][expr->expr_type].type_cb;
 	if(type_cb) {
 
-		if(arg->target->destination[OT_TYPE_DECLS].indent_level == 0)
-			OUT("\n");
-
 		DEBUG("Compiling %s at line %d",
 			expr->Identifier,
 			expr->_lineno);
diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h
index cc39dfc..c215c3f 100644
--- a/libasn1parser/asn1p_expr.h
+++ b/libasn1parser/asn1p_expr.h
@@ -178,6 +178,7 @@
 			EM_INDIRECT	= 0x01,	/* 0001: Represent as pointer */
 			EM_OPTIONAL	= 0x03,	/* 0011: Optional member */
 			EM_DEFAULT	= 0x07,	/* 0111: default_value */
+			EM_UNRECURSE	= 0x08, /* 1000: Use safe naming */
 		} flags;
 		asn1p_value_t *default_value;	/* For EM_DEFAULT case */
 	} marker;
diff --git a/tests/19-param-OK.asn1.-P b/tests/19-param-OK.asn1.-P
index 6103812..868d595 100644
--- a/tests/19-param-OK.asn1.-P
+++ b/tests/19-param-OK.asn1.-P
@@ -7,13 +7,8 @@
 #include <Name.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [Certificate] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_Certificate;
-
 /*** <<< TYPE-DECLS [Certificate] >>> ***/
 
-
 typedef struct Certificate {
 	struct toBeSigned {
 		INTEGER_t	 version;
@@ -30,6 +25,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Certificate_t;
 
+/*** <<< FUNC-DECLS [Certificate] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Certificate;
+
 /*** <<< CODE [Certificate] >>> ***/
 
 static int
@@ -192,24 +191,30 @@
 
 /*** <<< INCLUDES [Name] >>> ***/
 
-#include <RelativeDistinguishedName.h>
 #include <asn_SEQUENCE_OF.h>
 #include <constr_SEQUENCE_OF.h>
 
-/*** <<< DEPS [Name] >>> ***/
+/*** <<< FWD-DECLS [Name] >>> ***/
 
-extern asn_TYPE_descriptor_t asn_DEF_Name;
+struct RelativeDistinguishedName;	/* Forward declaration */
 
 /*** <<< TYPE-DECLS [Name] >>> ***/
 
-
 typedef struct Name {
-	A_SEQUENCE_OF(RelativeDistinguishedName_t) list;
+	A_SEQUENCE_OF(struct RelativeDistinguishedName) list;
 	
 	/* Context for parsing across buffer boundaries */
 	asn_struct_ctx_t _asn_ctx;
 } Name_t;
 
+/*** <<< FUNC-DECLS [Name] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Name;
+
+/*** <<< POST-INCLUDE [Name] >>> ***/
+
+#include <RelativeDistinguishedName.h>
+
 /*** <<< STAT-DEFS [Name] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Name_1[] = {
@@ -258,13 +263,8 @@
 #include <asn_SET_OF.h>
 #include <constr_SET_OF.h>
 
-/*** <<< DEPS [RelativeDistinguishedName] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_RelativeDistinguishedName;
-
 /*** <<< TYPE-DECLS [RelativeDistinguishedName] >>> ***/
 
-
 typedef struct RelativeDistinguishedName {
 	A_SET_OF(IA5String_t) list;
 	
@@ -272,6 +272,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } RelativeDistinguishedName_t;
 
+/*** <<< FUNC-DECLS [RelativeDistinguishedName] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_RelativeDistinguishedName;
+
 /*** <<< CTABLES [RelativeDistinguishedName] >>> ***/
 
 static int permitted_alphabet_table_1[256] = {
diff --git a/tests/30-set-OK.asn1.-P b/tests/30-set-OK.asn1.-P
index 849e9a9..129ef3d 100644
--- a/tests/30-set-OK.asn1.-P
+++ b/tests/30-set-OK.asn1.-P
@@ -17,11 +17,9 @@
 	T_PR_s,	/* Member s is present */
 	T_PR_b,	/* Member b is present */
 } T_PR;
-extern asn_TYPE_descriptor_t asn_DEF_T;
 
 /*** <<< TYPE-DECLS [T] >>> ***/
 
-
 typedef struct T {
 	INTEGER_t	 i;
 	IA5String_t	 s;
@@ -39,6 +37,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T_t;
 
+/*** <<< FUNC-DECLS [T] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T;
+
 /*** <<< STAT-DEFS [T] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_T_1[] = {
diff --git a/tests/31-set-of-OK.asn1.-P b/tests/31-set-of-OK.asn1.-P
index 2bd3b12..b1bdd78 100644
--- a/tests/31-set-of-OK.asn1.-P
+++ b/tests/31-set-of-OK.asn1.-P
@@ -1,24 +1,30 @@
 
 /*** <<< INCLUDES [Forest] >>> ***/
 
-#include <Tree.h>
 #include <asn_SET_OF.h>
 #include <constr_SET_OF.h>
 
-/*** <<< DEPS [Forest] >>> ***/
+/*** <<< FWD-DECLS [Forest] >>> ***/
 
-extern asn_TYPE_descriptor_t asn_DEF_Forest;
+struct Tree;	/* Forward declaration */
 
 /*** <<< TYPE-DECLS [Forest] >>> ***/
 
-
 typedef struct Forest {
-	A_SET_OF(Tree_t) list;
+	A_SET_OF(struct Tree) list;
 	
 	/* Context for parsing across buffer boundaries */
 	asn_struct_ctx_t _asn_ctx;
 } Forest_t;
 
+/*** <<< FUNC-DECLS [Forest] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Forest;
+
+/*** <<< POST-INCLUDE [Forest] >>> ***/
+
+#include <Tree.h>
+
 /*** <<< STAT-DEFS [Forest] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Forest_1[] = {
@@ -66,13 +72,8 @@
 #include <INTEGER.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [Tree] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_Tree;
-
 /*** <<< TYPE-DECLS [Tree] >>> ***/
 
-
 typedef struct Tree {
 	INTEGER_t	 height;
 	INTEGER_t	 width;
@@ -81,6 +82,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Tree_t;
 
+/*** <<< FUNC-DECLS [Tree] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Tree;
+
 /*** <<< STAT-DEFS [Tree] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Tree_1[] = {
@@ -139,7 +144,6 @@
 
 /*** <<< INCLUDES [Stuff] >>> ***/
 
-#include <Forest.h>
 #include <asn_SET_OF.h>
 #include <constr_SET_OF.h>
 #include <BIT_STRING.h>
@@ -164,14 +168,16 @@
 	other_PR_a,
 	other_PR_b,
 } other_PR;
-extern asn_TYPE_descriptor_t asn_DEF_Stuff;
+
+/*** <<< FWD-DECLS [Stuff] >>> ***/
+
+struct Forest;	/* Forward declaration */
 
 /*** <<< TYPE-DECLS [Stuff] >>> ***/
 
-
 typedef struct Stuff {
 	struct trees {
-		A_SET_OF(Forest_t) list;
+		A_SET_OF(struct Forest) list;
 		
 		/* Context for parsing across buffer boundaries */
 		asn_struct_ctx_t _asn_ctx;
@@ -214,6 +220,14 @@
 	asn_struct_ctx_t _asn_ctx;
 } Stuff_t;
 
+/*** <<< FUNC-DECLS [Stuff] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Stuff;
+
+/*** <<< POST-INCLUDE [Stuff] >>> ***/
+
+#include <Forest.h>
+
 /*** <<< STAT-DEFS [Stuff] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_trees_2[] = {
diff --git a/tests/32-sequence-of-OK.asn1.-P b/tests/32-sequence-of-OK.asn1.-P
index 1a579de..0c77d8b 100644
--- a/tests/32-sequence-of-OK.asn1.-P
+++ b/tests/32-sequence-of-OK.asn1.-P
@@ -1,24 +1,30 @@
 
 /*** <<< INCLUDES [Programming] >>> ***/
 
-#include <Fault.h>
 #include <asn_SEQUENCE_OF.h>
 #include <constr_SEQUENCE_OF.h>
 
-/*** <<< DEPS [Programming] >>> ***/
+/*** <<< FWD-DECLS [Programming] >>> ***/
 
-extern asn_TYPE_descriptor_t asn_DEF_Programming;
+struct Fault;	/* Forward declaration */
 
 /*** <<< TYPE-DECLS [Programming] >>> ***/
 
-
 typedef struct Programming {
-	A_SEQUENCE_OF(Fault_t) list;
+	A_SEQUENCE_OF(struct Fault) list;
 	
 	/* Context for parsing across buffer boundaries */
 	asn_struct_ctx_t _asn_ctx;
 } Programming_t;
 
+/*** <<< FUNC-DECLS [Programming] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Programming;
+
+/*** <<< POST-INCLUDE [Programming] >>> ***/
+
+#include <Fault.h>
+
 /*** <<< STAT-DEFS [Programming] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Programming_1[] = {
@@ -63,24 +69,30 @@
 
 /*** <<< INCLUDES [Fault] >>> ***/
 
-#include <Error.h>
 #include <asn_SET_OF.h>
 #include <constr_SET_OF.h>
 
-/*** <<< DEPS [Fault] >>> ***/
+/*** <<< FWD-DECLS [Fault] >>> ***/
 
-extern asn_TYPE_descriptor_t asn_DEF_Fault;
+struct Error;	/* Forward declaration */
 
 /*** <<< TYPE-DECLS [Fault] >>> ***/
 
-
 typedef struct Fault {
-	A_SET_OF(Error_t) list;
+	A_SET_OF(struct Error) list;
 	
 	/* Context for parsing across buffer boundaries */
 	asn_struct_ctx_t _asn_ctx;
 } Fault_t;
 
+/*** <<< FUNC-DECLS [Fault] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Fault;
+
+/*** <<< POST-INCLUDE [Fault] >>> ***/
+
+#include <Error.h>
+
 /*** <<< STAT-DEFS [Fault] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Fault_1[] = {
@@ -127,13 +139,8 @@
 
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [Error] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_Error;
-
 /*** <<< TYPE-DECLS [Error] >>> ***/
 
-
 typedef struct Error {
 	/*
 	 * This type is extensible,
@@ -144,6 +151,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Error_t;
 
+/*** <<< FUNC-DECLS [Error] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Error;
+
 /*** <<< STAT-DEFS [Error] >>> ***/
 
 static ber_tlv_tag_t asn_DEF_Error_1_tags[] = {
diff --git a/tests/39-sequence-of-OK.asn1.-P b/tests/39-sequence-of-OK.asn1.-P
index 351e01b..f564b2e 100644
--- a/tests/39-sequence-of-OK.asn1.-P
+++ b/tests/39-sequence-of-OK.asn1.-P
@@ -2,22 +2,20 @@
 /*** <<< INCLUDES [T] >>> ***/
 
 #include <INTEGER.h>
-#include <T2.h>
 #include <asn_SEQUENCE_OF.h>
 #include <constr_SEQUENCE_OF.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [T] >>> ***/
+/*** <<< FWD-DECLS [T] >>> ***/
 
-extern asn_TYPE_descriptor_t asn_DEF_T;
+struct T2;	/* Forward declaration */
 
 /*** <<< TYPE-DECLS [T] >>> ***/
 
-
 typedef struct T {
 	INTEGER_t	 Int;
 	struct collection {
-		A_SEQUENCE_OF(T2_t) list;
+		A_SEQUENCE_OF(struct T2) list;
 		
 		/* Context for parsing across buffer boundaries */
 		asn_struct_ctx_t _asn_ctx;
@@ -27,6 +25,14 @@
 	asn_struct_ctx_t _asn_ctx;
 } T_t;
 
+/*** <<< FUNC-DECLS [T] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T;
+
+/*** <<< POST-INCLUDE [T] >>> ***/
+
+#include <T2.h>
+
 /*** <<< STAT-DEFS [T] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_collection_2[] = {
@@ -129,13 +135,8 @@
 #include <UTF8String.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [T2] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_T2;
-
 /*** <<< TYPE-DECLS [T2] >>> ***/
 
-
 typedef struct T2 {
 	BOOLEAN_t	 flag;
 	UTF8String_t	 str;
@@ -144,6 +145,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T2_t;
 
+/*** <<< FUNC-DECLS [T2] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T2;
+
 /*** <<< STAT-DEFS [T2] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_T2_1[] = {
diff --git a/tests/42-real-life-OK.asn1.-PR b/tests/42-real-life-OK.asn1.-PR
index 6394912..7dfb845 100644
--- a/tests/42-real-life-OK.asn1.-PR
+++ b/tests/42-real-life-OK.asn1.-PR
@@ -2,22 +2,20 @@
 /*** <<< INCLUDES [LogLine] >>> ***/
 
 #include <IA5String.h>
-#include <VariablePartSet.h>
 #include <asn_SEQUENCE_OF.h>
 #include <constr_SEQUENCE_OF.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [LogLine] >>> ***/
+/*** <<< FWD-DECLS [LogLine] >>> ***/
 
-extern asn_TYPE_descriptor_t asn_DEF_LogLine;
+struct VariablePartSet;	/* Forward declaration */
 
 /*** <<< TYPE-DECLS [LogLine] >>> ***/
 
-
 typedef struct LogLine {
 	IA5String_t	 line_digest;
 	struct varsets {
-		A_SEQUENCE_OF(VariablePartSet_t) list;
+		A_SEQUENCE_OF(struct VariablePartSet) list;
 		
 		/* Context for parsing across buffer boundaries */
 		asn_struct_ctx_t _asn_ctx;
@@ -31,6 +29,14 @@
 	asn_struct_ctx_t _asn_ctx;
 } LogLine_t;
 
+/*** <<< FUNC-DECLS [LogLine] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_LogLine;
+
+/*** <<< POST-INCLUDE [LogLine] >>> ***/
+
+#include <VariablePartSet.h>
+
 /*** <<< CODE [LogLine] >>> ***/
 
 static int
@@ -162,21 +168,19 @@
 /*** <<< INCLUDES [VariablePartSet] >>> ***/
 
 #include <ActionItem.h>
-#include <VariablePart.h>
 #include <asn_SEQUENCE_OF.h>
 #include <constr_SEQUENCE_OF.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [VariablePartSet] >>> ***/
+/*** <<< FWD-DECLS [VariablePartSet] >>> ***/
 
-extern asn_TYPE_descriptor_t asn_DEF_VariablePartSet;
+struct VariablePart;	/* Forward declaration */
 
 /*** <<< TYPE-DECLS [VariablePartSet] >>> ***/
 
-
 typedef struct VariablePartSet {
 	struct vparts {
-		A_SEQUENCE_OF(VariablePart_t) list;
+		A_SEQUENCE_OF(struct VariablePart) list;
 		
 		/* Context for parsing across buffer boundaries */
 		asn_struct_ctx_t _asn_ctx;
@@ -191,6 +195,14 @@
 	asn_struct_ctx_t _asn_ctx;
 } VariablePartSet_t;
 
+/*** <<< FUNC-DECLS [VariablePartSet] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_VariablePartSet;
+
+/*** <<< POST-INCLUDE [VariablePartSet] >>> ***/
+
+#include <VariablePart.h>
+
 /*** <<< CODE [VariablePartSet] >>> ***/
 
 static int
@@ -325,11 +337,9 @@
 	VariablePart_PR_vrange,
 	/* Extensions may appear below */
 } VariablePart_PR;
-extern asn_TYPE_descriptor_t asn_DEF_VariablePart;
 
 /*** <<< TYPE-DECLS [VariablePart] >>> ***/
 
-
 typedef struct VariablePart {
 	VariablePart_PR present;
 	union {
@@ -360,6 +370,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } VariablePart_t;
 
+/*** <<< FUNC-DECLS [VariablePart] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_VariablePart;
+
 /*** <<< CODE [VariablePart] >>> ***/
 
 static int
@@ -557,11 +571,9 @@
 	 * Enumeration is extensible
 	 */
 } accept_as_e;
-extern asn_TYPE_descriptor_t asn_DEF_ActionItem;
 
 /*** <<< TYPE-DECLS [ActionItem] >>> ***/
 
-
 typedef struct ActionItem {
 	ENUMERATED_t	 accept_as;
 	struct notify {
@@ -592,6 +604,7 @@
 /*** <<< FUNC-DECLS [ActionItem] >>> ***/
 
 /* extern asn_TYPE_descriptor_t asn_DEF_accept_as_2;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_ActionItem;
 
 /*** <<< CODE [ActionItem] >>> ***/
 
diff --git a/tests/43-recursion-OK.asn1.-P b/tests/43-recursion-OK.asn1.-P
index de35638..747d962 100644
--- a/tests/43-recursion-OK.asn1.-P
+++ b/tests/43-recursion-OK.asn1.-P
@@ -1,7 +1,6 @@
 
 /*** <<< INCLUDES [Test-structure-1] >>> ***/
 
-#include <Test-structure-1.h>
 #include <INTEGER.h>
 #include <asn_SET_OF.h>
 #include <constr_SET_OF.h>
@@ -9,15 +8,12 @@
 #include <constr_SEQUENCE_OF.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [Test-structure-1] >>> ***/
-
+/*** <<< FWD-DECLS [Test-structure-1] >>> ***/
 
 struct Test_structure_1;	/* Forward declaration */
-extern asn_TYPE_descriptor_t asn_DEF_Test_structure_1;
 
 /*** <<< TYPE-DECLS [Test-structure-1] >>> ***/
 
-
 typedef struct Test_structure_1 {
 	struct t_member1 {
 		A_SET_OF(struct Test_structure_1) list;
@@ -38,6 +34,14 @@
 	asn_struct_ctx_t _asn_ctx;
 } Test_structure_1_t;
 
+/*** <<< FUNC-DECLS [Test-structure-1] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Test_structure_1;
+
+/*** <<< POST-INCLUDE [Test-structure-1] >>> ***/
+
+#include <Test-structure-1.h>
+
 /*** <<< STAT-DEFS [Test-structure-1] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_t_member1_2[] = {
@@ -208,14 +212,12 @@
 	Choice_1_PR_other,
 } Choice_1_PR;
 
-struct Choice_1;	/* Forward declaration */
+/*** <<< FWD-DECLS [Choice-1] >>> ***/
 
 struct Choice_1;	/* Forward declaration */
-extern asn_TYPE_descriptor_t asn_DEF_Choice_1;
 
 /*** <<< TYPE-DECLS [Choice-1] >>> ***/
 
-
 typedef struct Choice_1 {
 	Choice_1_PR present;
 	union {
@@ -234,6 +236,14 @@
 	asn_struct_ctx_t _asn_ctx;
 } Choice_1_t;
 
+/*** <<< FUNC-DECLS [Choice-1] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Choice_1;
+
+/*** <<< POST-INCLUDE [Choice-1] >>> ***/
+
+#include <Choice-1.h>
+
 /*** <<< STAT-DEFS [Choice-1] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_or_2[] = {
@@ -345,7 +355,6 @@
 
 /*** <<< INCLUDES [Test-structure-2] >>> ***/
 
-#include <Test-structure-3.h>
 #include <constr_SET.h>
 
 /*** <<< DEPS [Test-structure-2] >>> ***/
@@ -358,12 +367,12 @@
 	Test_structure_2_PR_m1,	/* Member m1 is present */
 } Test_structure_2_PR;
 
+/*** <<< FWD-DECLS [Test-structure-2] >>> ***/
+
 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 */;
 	
@@ -375,6 +384,14 @@
 	asn_struct_ctx_t _asn_ctx;
 } Test_structure_2_t;
 
+/*** <<< FUNC-DECLS [Test-structure-2] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Test_structure_2;
+
+/*** <<< POST-INCLUDE [Test-structure-2] >>> ***/
+
+#include <Test-structure-3.h>
+
 /*** <<< STAT-DEFS [Test-structure-2] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Test_structure_2_1[] = {
@@ -431,7 +448,6 @@
 
 /*** <<< INCLUDES [Test-structure-3] >>> ***/
 
-#include <Test-structure-2.h>
 #include <constr_SET.h>
 
 /*** <<< DEPS [Test-structure-3] >>> ***/
@@ -444,12 +460,12 @@
 	Test_structure_3_PR_m1,	/* Member m1 is present */
 } Test_structure_3_PR;
 
+/*** <<< FWD-DECLS [Test-structure-3] >>> ***/
+
 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 */;
 	
@@ -461,6 +477,14 @@
 	asn_struct_ctx_t _asn_ctx;
 } Test_structure_3_t;
 
+/*** <<< FUNC-DECLS [Test-structure-3] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Test_structure_3;
+
+/*** <<< POST-INCLUDE [Test-structure-3] >>> ***/
+
+#include <Test-structure-2.h>
+
 /*** <<< STAT-DEFS [Test-structure-3] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Test_structure_3_1[] = {
diff --git a/tests/44-choice-in-sequence-OK.asn1.-P b/tests/44-choice-in-sequence-OK.asn1.-P
index 7deb2df..e8559c8 100644
--- a/tests/44-choice-in-sequence-OK.asn1.-P
+++ b/tests/44-choice-in-sequence-OK.asn1.-P
@@ -24,11 +24,9 @@
 	h_PR_i,
 	h_PR_j,
 } h_PR;
-extern asn_TYPE_descriptor_t asn_DEF_T;
 
 /*** <<< TYPE-DECLS [T] >>> ***/
 
-
 typedef struct T {
 	NULL_t	 a;
 	struct b {
@@ -66,6 +64,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T_t;
 
+/*** <<< FUNC-DECLS [T] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T;
+
 /*** <<< STAT-DEFS [T] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_e_3[] = {
diff --git a/tests/46-redefine-OK.asn1.-PR b/tests/46-redefine-OK.asn1.-PR
index 7a2b69b..139fd6a 100644
--- a/tests/46-redefine-OK.asn1.-PR
+++ b/tests/46-redefine-OK.asn1.-PR
@@ -5,7 +5,6 @@
 
 /*** <<< TYPE-DECLS [PrimitiveType] >>> ***/
 
-
 typedef OCTET_STRING_t	 PrimitiveType_t;
 
 /*** <<< FUNC-DECLS [PrimitiveType] >>> ***/
@@ -23,13 +22,8 @@
 #include <PrimitiveType.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [ConstructedType] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_ConstructedType;
-
 /*** <<< TYPE-DECLS [ConstructedType] >>> ***/
 
-
 typedef struct ConstructedType {
 	PrimitiveType_t	 field;
 	
@@ -37,6 +31,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } ConstructedType_t;
 
+/*** <<< FUNC-DECLS [ConstructedType] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_ConstructedType;
+
 /*** <<< STAT-DEFS [ConstructedType] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_ConstructedType_1[] = {
@@ -91,7 +89,6 @@
 
 /*** <<< TYPE-DECLS [T] >>> ***/
 
-
 typedef ConstructedType_t	 T_t;
 
 /*** <<< FUNC-DECLS [T] >>> ***/
diff --git a/tests/47-set-ext-OK.asn1.-P b/tests/47-set-ext-OK.asn1.-P
index e91110d..660048b 100644
--- a/tests/47-set-ext-OK.asn1.-P
+++ b/tests/47-set-ext-OK.asn1.-P
@@ -13,11 +13,9 @@
 typedef enum T1_PR {
 	T1_PR_i,	/* Member i is present */
 } T1_PR;
-extern asn_TYPE_descriptor_t asn_DEF_T1;
 
 /*** <<< TYPE-DECLS [T1] >>> ***/
 
-
 typedef struct T1 {
 	INTEGER_t	 i;
 	/*
@@ -33,6 +31,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T1_t;
 
+/*** <<< FUNC-DECLS [T1] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T1;
+
 /*** <<< STAT-DEFS [T1] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_T1_1[] = {
@@ -101,11 +103,9 @@
 typedef enum T2_PR {
 	T2_PR_i,	/* Member i is present */
 } T2_PR;
-extern asn_TYPE_descriptor_t asn_DEF_T2;
 
 /*** <<< TYPE-DECLS [T2] >>> ***/
 
-
 typedef struct T2 {
 	INTEGER_t	 i;
 	/*
@@ -121,6 +121,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T2_t;
 
+/*** <<< FUNC-DECLS [T2] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T2;
+
 /*** <<< STAT-DEFS [T2] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_T2_1[] = {
@@ -187,11 +191,9 @@
 	T3_PR_i,
 	/* Extensions may appear below */
 } T3_PR;
-extern asn_TYPE_descriptor_t asn_DEF_T3;
 
 /*** <<< TYPE-DECLS [T3] >>> ***/
 
-
 typedef struct T3 {
 	T3_PR present;
 	union {
@@ -206,6 +208,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T3_t;
 
+/*** <<< FUNC-DECLS [T3] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T3;
+
 /*** <<< STAT-DEFS [T3] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_T3_1[] = {
@@ -262,11 +268,9 @@
 	T4_PR_i,
 	/* Extensions may appear below */
 } T4_PR;
-extern asn_TYPE_descriptor_t asn_DEF_T4;
 
 /*** <<< TYPE-DECLS [T4] >>> ***/
 
-
 typedef struct T4 {
 	T4_PR present;
 	union {
@@ -281,6 +285,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T4_t;
 
+/*** <<< FUNC-DECLS [T4] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T4;
+
 /*** <<< STAT-DEFS [T4] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_T4_1[] = {
diff --git a/tests/50-constraint-OK.asn1.-P b/tests/50-constraint-OK.asn1.-P
index 01131bf..47d84e6 100644
--- a/tests/50-constraint-OK.asn1.-P
+++ b/tests/50-constraint-OK.asn1.-P
@@ -5,7 +5,6 @@
 
 /*** <<< TYPE-DECLS [Int1] >>> ***/
 
-
 typedef INTEGER_t	 Int1_t;
 
 /*** <<< FUNC-DECLS [Int1] >>> ***/
@@ -24,7 +23,6 @@
 
 /*** <<< TYPE-DECLS [Int2] >>> ***/
 
-
 typedef Int1_t	 Int2_t;
 
 /*** <<< FUNC-DECLS [Int2] >>> ***/
@@ -162,7 +160,6 @@
 
 /*** <<< TYPE-DECLS [Int3] >>> ***/
 
-
 typedef Int2_t	 Int3_t;
 
 /*** <<< FUNC-DECLS [Int3] >>> ***/
@@ -304,7 +301,6 @@
 
 /*** <<< TYPE-DECLS [Int4] >>> ***/
 
-
 typedef Int3_t	 Int4_t;
 
 /*** <<< FUNC-DECLS [Int4] >>> ***/
@@ -446,7 +442,6 @@
 
 /*** <<< TYPE-DECLS [Int5] >>> ***/
 
-
 typedef Int4_t	 Int5_t;
 
 /*** <<< FUNC-DECLS [Int5] >>> ***/
@@ -588,7 +583,6 @@
 
 /*** <<< TYPE-DECLS [ExtensibleExtensions] >>> ***/
 
-
 typedef INTEGER_t	 ExtensibleExtensions_t;
 
 /*** <<< FUNC-DECLS [ExtensibleExtensions] >>> ***/
@@ -730,7 +724,6 @@
 
 /*** <<< TYPE-DECLS [Str1] >>> ***/
 
-
 typedef IA5String_t	 Str1_t;
 
 /*** <<< FUNC-DECLS [Str1] >>> ***/
@@ -749,7 +742,6 @@
 
 /*** <<< TYPE-DECLS [Str2] >>> ***/
 
-
 typedef Str1_t	 Str2_t;
 
 /*** <<< FUNC-DECLS [Str2] >>> ***/
@@ -903,7 +895,6 @@
 
 /*** <<< TYPE-DECLS [Str3] >>> ***/
 
-
 typedef Str2_t	 Str3_t;
 
 /*** <<< FUNC-DECLS [Str3] >>> ***/
@@ -1068,7 +1059,6 @@
 
 /*** <<< TYPE-DECLS [Str4] >>> ***/
 
-
 typedef IA5String_t	 Str4_t;
 
 /*** <<< FUNC-DECLS [Str4] >>> ***/
@@ -1219,7 +1209,6 @@
 
 /*** <<< TYPE-DECLS [PER-Visible] >>> ***/
 
-
 typedef IA5String_t	 PER_Visible_t;
 
 /*** <<< FUNC-DECLS [PER-Visible] >>> ***/
@@ -1370,7 +1359,6 @@
 
 /*** <<< TYPE-DECLS [PER-Visible-2] >>> ***/
 
-
 typedef PER_Visible_t	 PER_Visible_2_t;
 
 /*** <<< FUNC-DECLS [PER-Visible-2] >>> ***/
@@ -1521,7 +1509,6 @@
 
 /*** <<< TYPE-DECLS [Not-PER-Visible-1] >>> ***/
 
-
 typedef PER_Visible_t	 Not_PER_Visible_1_t;
 
 /*** <<< FUNC-DECLS [Not-PER-Visible-1] >>> ***/
@@ -1672,7 +1659,6 @@
 
 /*** <<< TYPE-DECLS [Not-PER-Visible-2] >>> ***/
 
-
 typedef PER_Visible_t	 Not_PER_Visible_2_t;
 
 /*** <<< FUNC-DECLS [Not-PER-Visible-2] >>> ***/
@@ -1823,7 +1809,6 @@
 
 /*** <<< TYPE-DECLS [Not-PER-Visible-3] >>> ***/
 
-
 typedef PER_Visible_t	 Not_PER_Visible_3_t;
 
 /*** <<< FUNC-DECLS [Not-PER-Visible-3] >>> ***/
@@ -1974,7 +1959,6 @@
 
 /*** <<< TYPE-DECLS [SIZE-but-not-FROM] >>> ***/
 
-
 typedef PER_Visible_t	 SIZE_but_not_FROM_t;
 
 /*** <<< FUNC-DECLS [SIZE-but-not-FROM] >>> ***/
@@ -2128,7 +2112,6 @@
 
 /*** <<< TYPE-DECLS [SIZE-and-FROM] >>> ***/
 
-
 typedef PER_Visible_t	 SIZE_and_FROM_t;
 
 /*** <<< FUNC-DECLS [SIZE-and-FROM] >>> ***/
@@ -2282,7 +2265,6 @@
 
 /*** <<< TYPE-DECLS [Neither-SIZE-nor-FROM] >>> ***/
 
-
 typedef PER_Visible_t	 Neither_SIZE_nor_FROM_t;
 
 /*** <<< FUNC-DECLS [Neither-SIZE-nor-FROM] >>> ***/
@@ -2433,7 +2415,6 @@
 
 /*** <<< TYPE-DECLS [Utf8-4] >>> ***/
 
-
 typedef UTF8String_t	 Utf8_4_t;
 
 /*** <<< FUNC-DECLS [Utf8-4] >>> ***/
@@ -2578,7 +2559,6 @@
 
 /*** <<< TYPE-DECLS [Utf8-3] >>> ***/
 
-
 typedef Utf8_2_t	 Utf8_3_t;
 
 /*** <<< FUNC-DECLS [Utf8-3] >>> ***/
@@ -2751,7 +2731,6 @@
 
 /*** <<< TYPE-DECLS [Utf8-2] >>> ***/
 
-
 typedef Utf8_1_t	 Utf8_2_t;
 
 /*** <<< FUNC-DECLS [Utf8-2] >>> ***/
@@ -2894,7 +2873,6 @@
 
 /*** <<< TYPE-DECLS [Utf8-1] >>> ***/
 
-
 typedef UTF8String_t	 Utf8_1_t;
 
 /*** <<< FUNC-DECLS [Utf8-1] >>> ***/
@@ -2913,7 +2891,6 @@
 
 /*** <<< TYPE-DECLS [VisibleIdentifier] >>> ***/
 
-
 typedef Identifier_t	 VisibleIdentifier_t;
 
 /*** <<< FUNC-DECLS [VisibleIdentifier] >>> ***/
@@ -2932,7 +2909,6 @@
 
 /*** <<< TYPE-DECLS [Identifier] >>> ***/
 
-
 typedef VisibleString_t	 Identifier_t;
 
 /*** <<< FUNC-DECLS [Identifier] >>> ***/
diff --git a/tests/59-choice-extended-OK.asn1.-P b/tests/59-choice-extended-OK.asn1.-P
index 5de4095..12f7be4 100644
--- a/tests/59-choice-extended-OK.asn1.-P
+++ b/tests/59-choice-extended-OK.asn1.-P
@@ -15,12 +15,12 @@
 	Choice_PR_c,
 } Choice_PR;
 
+/*** <<< FWD-DECLS [Choice] >>> ***/
+
 struct Choice;	/* Forward declaration */
-extern asn_TYPE_descriptor_t asn_DEF_Choice;
 
 /*** <<< TYPE-DECLS [Choice] >>> ***/
 
-
 typedef struct Choice {
 	Choice_PR present;
 	union {
@@ -37,6 +37,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Choice_t;
 
+/*** <<< FUNC-DECLS [Choice] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Choice;
+
 /*** <<< STAT-DEFS [Choice] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Choice_1[] = {
diff --git a/tests/60-any-OK.asn1.-P b/tests/60-any-OK.asn1.-P
index f52ad81..ed23340 100644
--- a/tests/60-any-OK.asn1.-P
+++ b/tests/60-any-OK.asn1.-P
@@ -5,13 +5,8 @@
 #include <ANY.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [T1] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_T1;
-
 /*** <<< TYPE-DECLS [T1] >>> ***/
 
-
 typedef struct T1 {
 	INTEGER_t	 i;
 	ANY_t	 any;
@@ -20,6 +15,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T1_t;
 
+/*** <<< FUNC-DECLS [T1] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T1;
+
 /*** <<< STAT-DEFS [T1] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_T1_1[] = {
@@ -81,13 +80,8 @@
 #include <ANY.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [T2] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_T2;
-
 /*** <<< TYPE-DECLS [T2] >>> ***/
 
-
 typedef struct T2 {
 	INTEGER_t	 i;
 	ANY_t	*any	/* OPTIONAL */;
@@ -96,6 +90,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T2_t;
 
+/*** <<< FUNC-DECLS [T2] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T2;
+
 /*** <<< STAT-DEFS [T2] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_T2_1[] = {
diff --git a/tests/65-multi-tag-OK.asn1.-P b/tests/65-multi-tag-OK.asn1.-P
index 39a145b..a85fc18 100644
--- a/tests/65-multi-tag-OK.asn1.-P
+++ b/tests/65-multi-tag-OK.asn1.-P
@@ -5,7 +5,6 @@
 
 /*** <<< TYPE-DECLS [T1] >>> ***/
 
-
 typedef T2_t	 T1_t;
 
 /*** <<< FUNC-DECLS [T1] >>> ***/
@@ -135,7 +134,6 @@
 
 /*** <<< TYPE-DECLS [T2] >>> ***/
 
-
 typedef T3_t	 T2_t;
 
 /*** <<< FUNC-DECLS [T2] >>> ***/
@@ -263,7 +261,6 @@
 
 /*** <<< TYPE-DECLS [T3] >>> ***/
 
-
 typedef T4_t	 T3_t;
 
 /*** <<< FUNC-DECLS [T3] >>> ***/
@@ -389,7 +386,6 @@
 
 /*** <<< TYPE-DECLS [T4] >>> ***/
 
-
 typedef T5_t	 T4_t;
 
 /*** <<< FUNC-DECLS [T4] >>> ***/
@@ -510,7 +506,6 @@
 
 /*** <<< TYPE-DECLS [T5] >>> ***/
 
-
 typedef T6_t	 T5_t;
 
 /*** <<< FUNC-DECLS [T5] >>> ***/
@@ -630,7 +625,6 @@
 
 /*** <<< TYPE-DECLS [T6] >>> ***/
 
-
 typedef REAL_t	 T6_t;
 
 /*** <<< FUNC-DECLS [T6] >>> ***/
@@ -649,7 +643,6 @@
 
 /*** <<< TYPE-DECLS [T] >>> ***/
 
-
 typedef Ts_t	 T_t;
 
 /*** <<< FUNC-DECLS [T] >>> ***/
@@ -770,13 +763,8 @@
 #include <T3.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [Ts] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_Ts;
-
 /*** <<< TYPE-DECLS [Ts] >>> ***/
 
-
 typedef struct Ts {
 	T2_t	 m1;
 	T3_t	*m2	/* OPTIONAL */;
@@ -786,6 +774,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Ts_t;
 
+/*** <<< FUNC-DECLS [Ts] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Ts;
+
 /*** <<< STAT-DEFS [Ts] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Ts_1[] = {
diff --git a/tests/65-multi-tag-OK.asn1.-Pfnative-types b/tests/65-multi-tag-OK.asn1.-Pfnative-types
index 30e0173..6a35789 100644
--- a/tests/65-multi-tag-OK.asn1.-Pfnative-types
+++ b/tests/65-multi-tag-OK.asn1.-Pfnative-types
@@ -5,7 +5,6 @@
 
 /*** <<< TYPE-DECLS [T1] >>> ***/
 
-
 typedef T2_t	 T1_t;
 
 /*** <<< FUNC-DECLS [T1] >>> ***/
@@ -135,7 +134,6 @@
 
 /*** <<< TYPE-DECLS [T2] >>> ***/
 
-
 typedef T3_t	 T2_t;
 
 /*** <<< FUNC-DECLS [T2] >>> ***/
@@ -263,7 +261,6 @@
 
 /*** <<< TYPE-DECLS [T3] >>> ***/
 
-
 typedef T4_t	 T3_t;
 
 /*** <<< FUNC-DECLS [T3] >>> ***/
@@ -389,7 +386,6 @@
 
 /*** <<< TYPE-DECLS [T4] >>> ***/
 
-
 typedef T5_t	 T4_t;
 
 /*** <<< FUNC-DECLS [T4] >>> ***/
@@ -510,7 +506,6 @@
 
 /*** <<< TYPE-DECLS [T5] >>> ***/
 
-
 typedef T6_t	 T5_t;
 
 /*** <<< FUNC-DECLS [T5] >>> ***/
@@ -630,7 +625,6 @@
 
 /*** <<< TYPE-DECLS [T6] >>> ***/
 
-
 typedef double	 T6_t;
 
 /*** <<< FUNC-DECLS [T6] >>> ***/
@@ -649,7 +643,6 @@
 
 /*** <<< TYPE-DECLS [T] >>> ***/
 
-
 typedef Ts_t	 T_t;
 
 /*** <<< FUNC-DECLS [T] >>> ***/
@@ -770,13 +763,8 @@
 #include <T3.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [Ts] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_Ts;
-
 /*** <<< TYPE-DECLS [Ts] >>> ***/
 
-
 typedef struct Ts {
 	T2_t	 m1;
 	T3_t	*m2	/* OPTIONAL */;
@@ -786,6 +774,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Ts_t;
 
+/*** <<< FUNC-DECLS [Ts] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Ts;
+
 /*** <<< STAT-DEFS [Ts] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Ts_1[] = {
diff --git a/tests/66-ref-simple-OK.asn1.-P b/tests/66-ref-simple-OK.asn1.-P
index 5112e53..2479536 100644
--- a/tests/66-ref-simple-OK.asn1.-P
+++ b/tests/66-ref-simple-OK.asn1.-P
@@ -5,20 +5,19 @@
 #include <asn_SET_OF.h>
 #include <constr_SET_OF.h>
 
-/*** <<< DEPS [T] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_T;
-
 /*** <<< TYPE-DECLS [T] >>> ***/
 
-
 typedef struct T {
-	A_SET_OF(SimpleType_t) list;
+	A_SET_OF(struct SimpleType) list;
 	
 	/* Context for parsing across buffer boundaries */
 	asn_struct_ctx_t _asn_ctx;
 } T_t;
 
+/*** <<< FUNC-DECLS [T] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T;
+
 /*** <<< STAT-DEFS [T] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_T_1[] = {
@@ -75,7 +74,6 @@
 
 /*** <<< TYPE-DECLS [SimpleType] >>> ***/
 
-
 typedef ENUMERATED_t	 SimpleType_t;
 
 /*** <<< FUNC-DECLS [SimpleType] >>> ***/
diff --git a/tests/69-reserved-words-OK.asn1.-P b/tests/69-reserved-words-OK.asn1.-P
index 78d035b..9f222eb 100644
--- a/tests/69-reserved-words-OK.asn1.-P
+++ b/tests/69-reserved-words-OK.asn1.-P
@@ -15,11 +15,9 @@
  */
 typedef enum class_PR {
 } class_PR;
-extern asn_TYPE_descriptor_t asn_DEF_T;
 
 /*** <<< TYPE-DECLS [T] >>> ***/
 
-
 typedef struct T {
 	INTEGER_t	 Int;
 	OCTET_STRING_t	 Char;
@@ -42,6 +40,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } T_t;
 
+/*** <<< FUNC-DECLS [T] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_T;
+
 /*** <<< CODE [T] >>> ***/
 
 static int
diff --git a/tests/70-xer-test-OK.asn1.-P b/tests/70-xer-test-OK.asn1.-P
index 2c356b9..e84e9f7 100644
--- a/tests/70-xer-test-OK.asn1.-P
+++ b/tests/70-xer-test-OK.asn1.-P
@@ -27,11 +27,9 @@
 	PDU_PR_seqOfZuka,
 	/* Extensions may appear below */
 } PDU_PR;
-extern asn_TYPE_descriptor_t asn_DEF_PDU;
 
 /*** <<< TYPE-DECLS [PDU] >>> ***/
 
-
 typedef struct PDU {
 	PDU_PR present;
 	union {
@@ -54,6 +52,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } PDU_t;
 
+/*** <<< FUNC-DECLS [PDU] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_PDU;
+
 /*** <<< STAT-DEFS [PDU] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_PDU_1[] = {
@@ -165,20 +167,16 @@
 /*** <<< INCLUDES [Sequence] >>> ***/
 
 #include <INTEGER.h>
-#include <Sequence.h>
 #include <BIT_STRING.h>
 #include <UTF8String.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [Sequence] >>> ***/
-
+/*** <<< FWD-DECLS [Sequence] >>> ***/
 
 struct Sequence;	/* Forward declaration */
-extern asn_TYPE_descriptor_t asn_DEF_Sequence;
 
 /*** <<< TYPE-DECLS [Sequence] >>> ***/
 
-
 typedef struct Sequence {
 	INTEGER_t	 integer;
 	struct Sequence	*sequence	/* OPTIONAL */;
@@ -189,6 +187,14 @@
 	asn_struct_ctx_t _asn_ctx;
 } Sequence_t;
 
+/*** <<< FUNC-DECLS [Sequence] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Sequence;
+
+/*** <<< POST-INCLUDE [Sequence] >>> ***/
+
+#include <Sequence.h>
+
 /*** <<< STAT-DEFS [Sequence] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Sequence_1[] = {
@@ -277,11 +283,9 @@
 	Set_PR_roid,	/* Member roid is present */
 	Set_PR_opaque,	/* Member opaque is present */
 } Set_PR;
-extern asn_TYPE_descriptor_t asn_DEF_Set;
 
 /*** <<< TYPE-DECLS [Set] >>> ***/
 
-
 typedef struct Set {
 	RELATIVE_OID_t	 roid;
 	OCTET_STRING_t	*opaque	/* OPTIONAL */;
@@ -294,6 +298,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Set_t;
 
+/*** <<< FUNC-DECLS [Set] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Set;
+
 /*** <<< STAT-DEFS [Set] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Set_1[] = {
@@ -370,11 +378,9 @@
 typedef enum ExtensibleSet_PR {
 	ExtensibleSet_PR_string,	/* Member string is present */
 } ExtensibleSet_PR;
-extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSet;
 
 /*** <<< TYPE-DECLS [ExtensibleSet] >>> ***/
 
-
 typedef struct ExtensibleSet {
 	UTF8String_t	*string	/* OPTIONAL */;
 	/*
@@ -390,6 +396,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } ExtensibleSet_t;
 
+/*** <<< FUNC-DECLS [ExtensibleSet] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSet;
+
 /*** <<< STAT-DEFS [ExtensibleSet] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_ExtensibleSet_1[] = {
@@ -450,13 +460,8 @@
 #include <INTEGER.h>
 #include <constr_SEQUENCE.h>
 
-/*** <<< DEPS [ExtensibleSequence] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence;
-
 /*** <<< TYPE-DECLS [ExtensibleSequence] >>> ***/
 
-
 typedef struct ExtensibleSequence {
 	UTF8String_t	*string	/* OPTIONAL */;
 	/*
@@ -469,6 +474,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } ExtensibleSequence_t;
 
+/*** <<< FUNC-DECLS [ExtensibleSequence] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence;
+
 /*** <<< STAT-DEFS [ExtensibleSequence] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_ExtensibleSequence_1[] = {
@@ -531,13 +540,8 @@
 #include <asn_SET_OF.h>
 #include <constr_SET_OF.h>
 
-/*** <<< DEPS [SetOf] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_SetOf;
-
 /*** <<< TYPE-DECLS [SetOf] >>> ***/
 
-
 typedef struct SetOf {
 	A_SET_OF(REAL_t) list;
 	
@@ -545,6 +549,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } SetOf_t;
 
+/*** <<< FUNC-DECLS [SetOf] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_SetOf;
+
 /*** <<< STAT-DEFS [SetOf] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_SetOf_1[] = {
@@ -593,13 +601,8 @@
 #include <asn_SET_OF.h>
 #include <constr_SET_OF.h>
 
-/*** <<< DEPS [SetOfNULL] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_SetOfNULL;
-
 /*** <<< TYPE-DECLS [SetOfNULL] >>> ***/
 
-
 typedef struct SetOfNULL {
 	A_SET_OF(NULL_t) list;
 	
@@ -607,6 +610,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } SetOfNULL_t;
 
+/*** <<< FUNC-DECLS [SetOfNULL] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_SetOfNULL;
+
 /*** <<< STAT-DEFS [SetOfNULL] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_SetOfNULL_1[] = {
@@ -661,11 +668,9 @@
 	Member_one	= 0,
 	Member_oneMore	= 1
 } Member_e;
-extern asn_TYPE_descriptor_t asn_DEF_SetOfEnums;
 
 /*** <<< TYPE-DECLS [SetOfEnums] >>> ***/
 
-
 typedef struct SetOfEnums {
 	A_SET_OF(ENUMERATED_t) list;
 	
@@ -676,6 +681,7 @@
 /*** <<< FUNC-DECLS [SetOfEnums] >>> ***/
 
 /* extern asn_TYPE_descriptor_t asn_DEF_Member_2;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_SetOfEnums;
 
 /*** <<< CODE [SetOfEnums] >>> ***/
 
@@ -837,13 +843,8 @@
 #include <asn_SEQUENCE_OF.h>
 #include <constr_SEQUENCE_OF.h>
 
-/*** <<< DEPS [SequenceOf] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_SequenceOf;
-
 /*** <<< TYPE-DECLS [SequenceOf] >>> ***/
 
-
 typedef struct SequenceOf {
 	A_SEQUENCE_OF(INTEGER_t) list;
 	
@@ -851,6 +852,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } SequenceOf_t;
 
+/*** <<< FUNC-DECLS [SequenceOf] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_SequenceOf;
+
 /*** <<< STAT-DEFS [SequenceOf] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_SequenceOf_1[] = {
@@ -899,13 +904,8 @@
 #include <asn_SEQUENCE_OF.h>
 #include <constr_SEQUENCE_OF.h>
 
-/*** <<< DEPS [SeqOfZuka] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_SeqOfZuka;
-
 /*** <<< TYPE-DECLS [SeqOfZuka] >>> ***/
 
-
 typedef struct SeqOfZuka {
 	A_SEQUENCE_OF(NULL_t) list;
 	
@@ -913,6 +913,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } SeqOfZuka_t;
 
+/*** <<< FUNC-DECLS [SeqOfZuka] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_SeqOfZuka;
+
 /*** <<< STAT-DEFS [SeqOfZuka] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_SeqOfZuka_1[] = {
diff --git a/tests/72-same-names-OK.asn1.-P b/tests/72-same-names-OK.asn1.-P
index 3dc4418..a359a74 100644
--- a/tests/72-same-names-OK.asn1.-P
+++ b/tests/72-same-names-OK.asn1.-P
@@ -7,13 +7,8 @@
 #include <constr_SEQUENCE.h>
 #include <constr_SET_OF.h>
 
-/*** <<< DEPS [Type] >>> ***/
-
-extern asn_TYPE_descriptor_t asn_DEF_Type;
-
 /*** <<< TYPE-DECLS [Type] >>> ***/
 
-
 typedef struct Type {
 	A_SET_OF(struct Member {
 		Type1_t	 t1;
@@ -27,6 +22,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Type_t;
 
+/*** <<< FUNC-DECLS [Type] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Type;
+
 /*** <<< STAT-DEFS [Type] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_Member_2[] = {
@@ -136,11 +135,9 @@
 	one_name_PR_NOTHING,	/* No components present */
 	one_name_PR_another_name,
 } one_name_PR;
-extern asn_TYPE_descriptor_t asn_DEF_Type1;
 
 /*** <<< TYPE-DECLS [Type1] >>> ***/
 
-
 typedef struct Type1 {
 	struct one_name {
 		one_name_PR present;
@@ -162,6 +159,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Type1_t;
 
+/*** <<< FUNC-DECLS [Type1] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Type1;
+
 /*** <<< STAT-DEFS [Type1] >>> ***/
 
 static asn_TYPE_member_t asn_MBR_another_name_3[] = {
@@ -328,11 +329,9 @@
 typedef enum two_name_PR {
 	two_name_PR_another_name,	/* Member another_name is present */
 } two_name_PR;
-extern asn_TYPE_descriptor_t asn_DEF_Type2;
 
 /*** <<< TYPE-DECLS [Type2] >>> ***/
 
-
 typedef struct Type2 {
 	Type2_PR present;
 	union {
@@ -370,6 +369,10 @@
 	asn_struct_ctx_t _asn_ctx;
 } Type2_t;
 
+/*** <<< FUNC-DECLS [Type2] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Type2;
+
 /*** <<< CODE [Type2] >>> ***/
 
 static int
diff --git a/tests/73-circular-OK.asn1 b/tests/73-circular-OK.asn1
new file mode 100644
index 0000000..33ed04b
--- /dev/null
+++ b/tests/73-circular-OK.asn1
@@ -0,0 +1,31 @@
+
+-- OK: Everything is Fine
+
+-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
+-- .spelio.software.asn1c.test (9363.1.5.1)
+-- .73
+
+ModuleTestCircularReferences
+	{ iso org(3) dod(6) internet(1) private(4) enterprise(1)
+		spelio(9363) software(1) asn1c(5) test(1) 73 }
+	DEFINITIONS ::=
+BEGIN
+
+	Type ::= SEQUENCE {
+		data SEQUENCE OF Epyt
+	}
+
+	-- EpytRef ::= Epyt
+
+	Epyt ::= SEQUENCE {
+		stype	SET OF Type,
+		type	Type OPTIONAL,
+		ypet	Ypet OPTIONAL
+	}
+
+	Ypet ::= SET {
+		epyt	Epyt,
+		plain	INTEGER DEFAULT 7
+	}
+
+END
diff --git a/tests/73-circular-OK.asn1.-P b/tests/73-circular-OK.asn1.-P
new file mode 100644
index 0000000..6298a94
--- /dev/null
+++ b/tests/73-circular-OK.asn1.-P
@@ -0,0 +1,357 @@
+
+/*** <<< INCLUDES [Type] >>> ***/
+
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+/*** <<< FWD-DECLS [Type] >>> ***/
+
+struct Epyt;	/* Forward declaration */
+
+/*** <<< TYPE-DECLS [Type] >>> ***/
+
+typedef struct Type {
+	struct data {
+		A_SEQUENCE_OF(struct Epyt) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} data;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Type_t;
+
+/*** <<< FUNC-DECLS [Type] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Type;
+
+/*** <<< POST-INCLUDE [Type] >>> ***/
+
+#include <Epyt.h>
+
+/*** <<< STAT-DEFS [Type] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_data_2[] = {
+	{ ATF_NOFLAGS, 0, 0,
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_Epyt,
+		.memb_constraints = 0,	/* Defer constraints checking to the member type */
+		.name = ""
+		},
+};
+static ber_tlv_tag_t asn_DEF_data_2_tags[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_data_2_specs = {
+	sizeof(struct data),
+	offsetof(struct data, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_data_2 = {
+	"data",
+	"data",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_data_2_tags,
+	sizeof(asn_DEF_data_2_tags)
+		/sizeof(asn_DEF_data_2_tags[0]), /* 1 */
+	asn_DEF_data_2_tags,	/* Same as above */
+	sizeof(asn_DEF_data_2_tags)
+		/sizeof(asn_DEF_data_2_tags[0]), /* 1 */
+	asn_MBR_data_2,
+	1,	/* Single element */
+	&asn_SPC_data_2_specs	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_Type_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Type, data),
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_data_2,
+		.memb_constraints = 0,	/* Defer constraints checking to the member type */
+		.name = "data"
+		},
+};
+static ber_tlv_tag_t asn_DEF_Type_1_tags[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Type_1_tag2el[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* data at 16 */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Type_1_specs = {
+	sizeof(struct Type),
+	offsetof(struct Type, _asn_ctx),
+	asn_MAP_Type_1_tag2el,
+	1,	/* Count of tags in the map */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_Type = {
+	"Type",
+	"Type",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Type_1_tags,
+	sizeof(asn_DEF_Type_1_tags)
+		/sizeof(asn_DEF_Type_1_tags[0]), /* 1 */
+	asn_DEF_Type_1_tags,	/* Same as above */
+	sizeof(asn_DEF_Type_1_tags)
+		/sizeof(asn_DEF_Type_1_tags[0]), /* 1 */
+	asn_MBR_Type_1,
+	1,	/* Elements count */
+	&asn_SPC_Type_1_specs	/* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Epyt] >>> ***/
+
+#include <asn_SET_OF.h>
+#include <constr_SET_OF.h>
+#include <constr_SEQUENCE.h>
+
+/*** <<< FWD-DECLS [Epyt] >>> ***/
+
+struct Type;	/* Forward declaration */
+struct Ypet;	/* Forward declaration */
+
+/*** <<< TYPE-DECLS [Epyt] >>> ***/
+
+typedef struct Epyt {
+	struct stype {
+		A_SET_OF(struct Type) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} stype;
+	struct Type	*type	/* OPTIONAL */;
+	struct Ypet	*ypet	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Epyt_t;
+
+/*** <<< FUNC-DECLS [Epyt] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Epyt;
+
+/*** <<< POST-INCLUDE [Epyt] >>> ***/
+
+#include <Type.h>
+#include <Ypet.h>
+
+/*** <<< STAT-DEFS [Epyt] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_stype_2[] = {
+	{ ATF_NOFLAGS, 0, 0,
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_Type,
+		.memb_constraints = 0,	/* Defer constraints checking to the member type */
+		.name = ""
+		},
+};
+static ber_tlv_tag_t asn_DEF_stype_2_tags[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_stype_2_specs = {
+	sizeof(struct stype),
+	offsetof(struct stype, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_stype_2 = {
+	"stype",
+	"stype",
+	SET_OF_free,
+	SET_OF_print,
+	SET_OF_constraint,
+	SET_OF_decode_ber,
+	SET_OF_encode_der,
+	SET_OF_decode_xer,
+	SET_OF_encode_xer,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_stype_2_tags,
+	sizeof(asn_DEF_stype_2_tags)
+		/sizeof(asn_DEF_stype_2_tags[0]), /* 1 */
+	asn_DEF_stype_2_tags,	/* Same as above */
+	sizeof(asn_DEF_stype_2_tags)
+		/sizeof(asn_DEF_stype_2_tags[0]), /* 1 */
+	asn_MBR_stype_2,
+	1,	/* Single element */
+	&asn_SPC_stype_2_specs	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_Epyt_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Epyt, stype),
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_stype_2,
+		.memb_constraints = 0,	/* Defer constraints checking to the member type */
+		.name = "stype"
+		},
+	{ ATF_POINTER, 2, offsetof(struct Epyt, type),
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_Type,
+		.memb_constraints = 0,	/* Defer constraints checking to the member type */
+		.name = "type"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Epyt, ypet),
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_Ypet,
+		.memb_constraints = 0,	/* Defer constraints checking to the member type */
+		.name = "ypet"
+		},
+};
+static ber_tlv_tag_t asn_DEF_Epyt_1_tags[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Epyt_1_tag2el[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* type at 22 */
+    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 0, 0, 1 }, /* stype at 21 */
+    { (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)), 2, -1, 0 } /* ypet at 23 */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Epyt_1_specs = {
+	sizeof(struct Epyt),
+	offsetof(struct Epyt, _asn_ctx),
+	asn_MAP_Epyt_1_tag2el,
+	3,	/* Count of tags in the map */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_Epyt = {
+	"Epyt",
+	"Epyt",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Epyt_1_tags,
+	sizeof(asn_DEF_Epyt_1_tags)
+		/sizeof(asn_DEF_Epyt_1_tags[0]), /* 1 */
+	asn_DEF_Epyt_1_tags,	/* Same as above */
+	sizeof(asn_DEF_Epyt_1_tags)
+		/sizeof(asn_DEF_Epyt_1_tags[0]), /* 1 */
+	asn_MBR_Epyt_1,
+	3,	/* Elements count */
+	&asn_SPC_Epyt_1_specs	/* Additional specs */
+};
+
+
+/*** <<< INCLUDES [Ypet] >>> ***/
+
+#include <Epyt.h>
+#include <INTEGER.h>
+#include <constr_SET.h>
+
+/*** <<< DEPS [Ypet] >>> ***/
+
+
+/*
+ * Method of determining the components presence
+ */
+typedef enum Ypet_PR {
+	Ypet_PR_epyt,	/* Member epyt is present */
+	Ypet_PR_plain,	/* Member plain is present */
+} Ypet_PR;
+
+/*** <<< TYPE-DECLS [Ypet] >>> ***/
+
+typedef struct Ypet {
+	Epyt_t	 epyt;
+	INTEGER_t	*plain	/* DEFAULT 7 */;
+	
+	/* Presence bitmask: ASN_SET_ISPRESENT(pYpet, Ypet_PR_x) */
+	unsigned int _presence_map
+		[((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Ypet_t;
+
+/*** <<< FUNC-DECLS [Ypet] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Ypet;
+
+/*** <<< STAT-DEFS [Ypet] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Ypet_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Ypet, epyt),
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_Epyt,
+		.memb_constraints = 0,	/* Defer constraints checking to the member type */
+		.name = "epyt"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Ypet, plain),
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		.tag_mode = 0,
+		.type = (void *)&asn_DEF_INTEGER,
+		.memb_constraints = 0,	/* Defer constraints checking to the member type */
+		.name = "plain"
+		},
+};
+static ber_tlv_tag_t asn_DEF_Ypet_1_tags[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Ypet_1_tag2el[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* plain at 28 */
+    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* epyt at 27 */
+};
+static uint8_t asn_MAP_Ypet_1_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = {
+	(1 << 7) | (0 << 6)
+};
+static asn_SET_specifics_t asn_SPC_Ypet_1_specs = {
+	sizeof(struct Ypet),
+	offsetof(struct Ypet, _asn_ctx),
+	offsetof(struct Ypet, _presence_map),
+	asn_MAP_Ypet_1_tag2el,
+	2,	/* Count of tags in the map */
+	asn_MAP_Ypet_1_tag2el,	/* Same as above */
+	2,	/* Count of tags in the CXER map */
+	0,	/* Whether extensible */
+	(unsigned int *)asn_MAP_Ypet_1_mmap	/* Mandatory elements map */
+};
+asn_TYPE_descriptor_t asn_DEF_Ypet = {
+	"Ypet",
+	"Ypet",
+	SET_free,
+	SET_print,
+	SET_constraint,
+	SET_decode_ber,
+	SET_encode_der,
+	SET_decode_xer,
+	SET_encode_xer,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Ypet_1_tags,
+	sizeof(asn_DEF_Ypet_1_tags)
+		/sizeof(asn_DEF_Ypet_1_tags[0]), /* 1 */
+	asn_DEF_Ypet_1_tags,	/* Same as above */
+	sizeof(asn_DEF_Ypet_1_tags)
+		/sizeof(asn_DEF_Ypet_1_tags[0]), /* 1 */
+	asn_MBR_Ypet_1,
+	2,	/* Elements count */
+	&asn_SPC_Ypet_1_specs	/* Additional specs */
+};
+