-fall-defs-global

diff --git a/asn1c/asn1c.1 b/asn1c/asn1c.1
index f8553d0..f2c3677 100644
--- a/asn1c/asn1c.1
+++ b/asn1c/asn1c.1
@@ -27,7 +27,7 @@
 .TP
 \fILanguage Options\fR
 .br
-\fB\-fbless-SIZE \-fnative-integers \-funnamed-unions \-ftypes88\fR
+\fB\-fall-defs-global \-fbless-SIZE \-fnative-integers \-funnamed-unions \-ftypes88\fR
 .TP
 \fIOutput Options\fR
 .br
@@ -74,6 +74,14 @@
 Enable debugging during the actual compile time.
 .SH LANGUAGE OPTIONS
 .TP
+.B \-fall-defs-global
+Normally the compiler hides the definitions (asn1_DEF_xxx) of the inner
+structure elements (members of SEQUENCE, SET and other types). This option
+makes all such definitions global.
+Enabling this option may pollute the namespace by making lots of asn1_DEF_xxx
+structures globally visible, but will allow you to manipulate
+(encode and decode) the individual members of any complex ASN.1 structure.
+.TP
 .B \-fbless-SIZE
 Allow SIZE() constraint for INTEGER, ENUMERATED, and other types for which this
 constraint is normally prohibited by the standard. This is a violation of
diff --git a/asn1c/asn1c.c b/asn1c/asn1c.c
index db00688..d84d864 100644
--- a/asn1c/asn1c.c
+++ b/asn1c/asn1c.c
@@ -54,20 +54,20 @@
 		print_arg__fix_n_print = 1;
 		break;
 	case 'f':
-		if(strcmp(optarg, "types88") == 0) {
-			asn1_parser_flags |= A1P_TYPES_RESTRICT_TO_1988;
-		} else if(strcmp(optarg, "constr90") == 0) {
-			asn1_parser_flags |= A1P_CONSTRUCTS_RESTRICT_TO_1990;
-		} else if(strcmp(optarg, "native-integers") == 0) {
-			asn1_compiler_flags |= A1C_USE_NATIVE_INTEGERS;
-		} else if(strcmp(optarg, "unnamed-unions") == 0) {
-			asn1_compiler_flags |= A1C_UNNAMED_UNIONS;
+		if(strcmp(optarg, "all-defs-global") == 0) {
+			asn1_compiler_flags |= A1C_ALL_DEFS_GLOBAL;
+		} else if(strcmp(optarg, "bless-SIZE") == 0) {
+			asn1_fixer_flags |= A1F_EXTENDED_SizeConstraint;
 		} else if(strncmp(optarg, "known-extern-type=", 18) == 0) {
 			char *known_type = optarg + 18;
 			ret = asn1f_make_known_external_type(known_type);
 			assert(ret == 0 || errno == EEXIST);
-		} else if(strcmp(optarg, "bless-SIZE") == 0) {
-			asn1_fixer_flags |= A1F_EXTENDED_SizeConstraint;
+		} else if(strcmp(optarg, "native-integers") == 0) {
+			asn1_compiler_flags |= A1C_USE_NATIVE_INTEGERS;
+		} else if(strcmp(optarg, "unnamed-unions") == 0) {
+			asn1_compiler_flags |= A1C_UNNAMED_UNIONS;
+		} else if(strcmp(optarg, "types88") == 0) {
+			asn1_parser_flags |= A1P_TYPES_RESTRICT_TO_1988;
 		} else {
 			fprintf(stderr, "-f%s: Invalid argument\n", optarg);
 			exit(EX_USAGE);
@@ -286,10 +286,8 @@
 "  -Wdebug-compiler      --//-- compiler\n"
 "\n"
 
+"  -fall-defs-global     Don't make the asn1_DEF_'s of structure members \"static\"\n"
 "  -fbless-SIZE          Allow SIZE() constraint for INTEGER etc (non-std.)\n"
-/*
-"  -fconstr90            Use only ASN.1:1990 constructs (not available)\n"
-*/
 "  -fknown-extern-type=<name>    Pretend this type is known\n"
 "  -fnative-integers     Use int instead of INTEGER_t whenever possible\n"
 "  -funnamed-unions      Enable unnamed unions in structures\n"
diff --git a/doc/asn1c-usage.lyx b/doc/asn1c-usage.lyx
index 27736a2..8cd9e30 100644
--- a/doc/asn1c-usage.lyx
+++ b/doc/asn1c-usage.lyx
@@ -1309,13 +1309,13 @@
 
 \begin_inset Float table
 wide false
-collapsed true
+collapsed false
 
 \layout Standard
 
 
 \begin_inset  Tabular
-<lyxtabular version="3" rows="20" columns="2">
+<lyxtabular version="3" rows="21" columns="2">
 <features>
 <column alignment="left" valignment="top" leftline="true" width="0">
 <column alignment="block" valignment="top" leftline="true" rightline="true" width="3in">
@@ -1602,6 +1602,29 @@
 
 \layout Standard
 
+-fall-defs-global
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+Normally the compiler hides the definitions (asn1_DEF_xxx) of the inner
+ structure elements (members of SEQUENCE, SET and other types).
+ This option makes all such definitions global.
+ Enabling this option may pollute the namespace by making lots of asn1_DEF_xxx
+ structures globally visible, but will allow you to manipulate (encode and
+ decode) the individual members of any complex ASN.1 structure.
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
 -fbless-SIZE
 \end_inset 
 </cell>
diff --git a/doc/asn1c-usage.pdf b/doc/asn1c-usage.pdf
index 215d99d..0a3313f 100644
--- a/doc/asn1c-usage.pdf
+++ b/doc/asn1c-usage.pdf
Binary files differ
diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c
index 10142ca..a9aa23b 100644
--- a/libasn1compiler/asn1c_C.c
+++ b/libasn1compiler/asn1c_C.c
@@ -45,6 +45,7 @@
 
 #define	C99_MODE	(!(arg->flags & A1C_NO_C99))
 #define	UNNAMED_UNIONS	(arg->flags & A1C_UNNAMED_UNIONS)
+#define	HIDE_INNER_DEFS	(arg->embed && !(arg->flags & A1C_ALL_DEFS_GLOBAL))
 
 #define	PCTX_DEF INDENTED(		\
 	OUT("\n");			\
@@ -867,7 +868,10 @@
 	REDIR(OT_FUNC_DECLS);
 
 	p = MKID(expr->Identifier);
-	OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;\n", p);
+	if(HIDE_INNER_DEFS) OUT("/* ");
+	OUT("extern asn1_TYPE_descriptor_t asn1_DEF_%s;", p);
+	if(HIDE_INNER_DEFS) OUT(" // (Use -fall-defs-global to expose) */");
+	OUT("\n");
 	OUT("asn_constr_check_f %s_constraint;\n", p);
 	OUT("ber_type_decoder_f %s_decode_ber;\n", p);
 	OUT("der_type_encoder_f %s_encode_der;\n", p);
@@ -1297,6 +1301,8 @@
 	char *p;
 
 	p = MKID(expr->Identifier);
+	if(HIDE_INNER_DEFS)
+		OUT("static /* Use -fall-defs-global to expose */\n");
 	OUT("asn1_TYPE_descriptor_t asn1_DEF_%s = {\n", p);
 	INDENTED(
 		OUT("\"%s\",\n", expr->_anonymous_type?"":expr->Identifier);
diff --git a/libasn1compiler/asn1compiler.h b/libasn1compiler/asn1compiler.h
index d104dc9..6b9219a 100644
--- a/libasn1compiler/asn1compiler.h
+++ b/libasn1compiler/asn1compiler.h
@@ -31,6 +31,10 @@
 	 * Enable use of unnamed unions (non-portable feature).
 	 */
 	A1C_UNNAMED_UNIONS	= 0x0020,
+	/*
+	 * Don't make the asn1_DEF_'s of structure members "static".
+	 */
+	A1C_ALL_DEFS_GLOBAL	= 0x0040,
 };
 
 /*