diff --git a/tests/106-param-constr-OK.asn1.-P b/tests/106-param-constr-OK.asn1.-P
new file mode 100644
index 0000000..4904620
--- /dev/null
+++ b/tests/106-param-constr-OK.asn1.-P
@@ -0,0 +1,222 @@
+
+/*** <<< INCLUDES [Narrow] >>> ***/
+
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+/*** <<< TYPE-DECLS [Narrow] >>> ***/
+
+typedef struct Narrow_16P0 {
+	long	 narrower;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} Narrow_16P0_t;
+
+/*** <<< FUNC-DECLS [Narrow] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_Narrow_16P0;
+
+/*** <<< CODE [Narrow] >>> ***/
+
+static int
+memb_narrower_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_consume_bytes_f *app_errlog, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_ERRLOG(app_errlog, app_key,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 2 && value <= 5)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_ERRLOG(app_errlog, app_key,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+
+/*** <<< STAT-DEFS [Narrow] >>> ***/
+
+static asn_TYPE_member_t asn_MBR_Narrow_16P0_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Narrow_16P0, narrower),
+		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
+		.tag_mode = 0,
+		.type = &asn_DEF_NativeInteger,
+		.memb_constraints = memb_narrower_constraint_1,
+		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
+		.default_value = 0,
+		.name = "narrower"
+		},
+};
+static ber_tlv_tag_t asn_DEF_Narrow_16P0_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_TYPE_tag2member_t asn_MAP_Narrow_16P0_tag2el_1[] = {
+    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 } /* narrower at 18 */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Narrow_16P0_specs_1 = {
+	sizeof(struct Narrow_16P0),
+	offsetof(struct Narrow_16P0, _asn_ctx),
+	asn_MAP_Narrow_16P0_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_Narrow_16P0 = {
+	"Narrow",
+	"Narrow",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	0,	/* No PER decoder, -gen-PER to enable */
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Narrow_16P0_tags_1,
+	sizeof(asn_DEF_Narrow_16P0_tags_1)
+		/sizeof(asn_DEF_Narrow_16P0_tags_1[0]), /* 1 */
+	asn_DEF_Narrow_16P0_tags_1,	/* Same as above */
+	sizeof(asn_DEF_Narrow_16P0_tags_1)
+		/sizeof(asn_DEF_Narrow_16P0_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Narrow_16P0_1,
+	1,	/* Elements count */
+	&asn_SPC_Narrow_16P0_specs_1	/* Additional specs */
+};
+
+
+/*** <<< INCLUDES [NarrowInteger] >>> ***/
+
+#include <Narrow.h>
+
+/*** <<< TYPE-DECLS [NarrowInteger] >>> ***/
+
+typedef Narrow_16P0_t	 NarrowInteger_t;
+
+/*** <<< FUNC-DECLS [NarrowInteger] >>> ***/
+
+extern asn_TYPE_descriptor_t asn_DEF_NarrowInteger;
+asn_struct_free_f NarrowInteger_free;
+asn_struct_print_f NarrowInteger_print;
+asn_constr_check_f NarrowInteger_constraint;
+ber_type_decoder_f NarrowInteger_decode_ber;
+der_type_encoder_f NarrowInteger_encode_der;
+xer_type_decoder_f NarrowInteger_decode_xer;
+xer_type_encoder_f NarrowInteger_encode_xer;
+
+/*** <<< CODE [NarrowInteger] >>> ***/
+
+int
+NarrowInteger_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_consume_bytes_f *app_errlog, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_Narrow_16P0.check_constraints;
+	return td->check_constraints(td, sptr, app_errlog, app_key);
+}
+
+/*
+ * This type is implemented using Narrow_16P0,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+NarrowInteger_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_Narrow_16P0.free_struct;
+	td->print_struct   = asn_DEF_Narrow_16P0.print_struct;
+	td->ber_decoder    = asn_DEF_Narrow_16P0.ber_decoder;
+	td->der_encoder    = asn_DEF_Narrow_16P0.der_encoder;
+	td->xer_decoder    = asn_DEF_Narrow_16P0.xer_decoder;
+	td->xer_encoder    = asn_DEF_Narrow_16P0.xer_encoder;
+	td->uper_decoder   = asn_DEF_Narrow_16P0.uper_decoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_Narrow_16P0.per_constraints;
+	td->elements       = asn_DEF_Narrow_16P0.elements;
+	td->elements_count = asn_DEF_Narrow_16P0.elements_count;
+	td->specifics      = asn_DEF_Narrow_16P0.specifics;
+}
+
+void
+NarrowInteger_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	NarrowInteger_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+NarrowInteger_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	NarrowInteger_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+NarrowInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	NarrowInteger_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+NarrowInteger_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	NarrowInteger_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+NarrowInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	NarrowInteger_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+NarrowInteger_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	NarrowInteger_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+
+/*** <<< STAT-DEFS [NarrowInteger] >>> ***/
+
+static ber_tlv_tag_t asn_DEF_NarrowInteger_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_NarrowInteger = {
+	"NarrowInteger",
+	"NarrowInteger",
+	NarrowInteger_free,
+	NarrowInteger_print,
+	NarrowInteger_constraint,
+	NarrowInteger_decode_ber,
+	NarrowInteger_encode_der,
+	NarrowInteger_decode_xer,
+	NarrowInteger_encode_xer,
+	0,	/* No PER decoder, -gen-PER to enable */
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_NarrowInteger_tags_1,
+	sizeof(asn_DEF_NarrowInteger_tags_1)
+		/sizeof(asn_DEF_NarrowInteger_tags_1[0]), /* 1 */
+	asn_DEF_NarrowInteger_tags_1,	/* Same as above */
+	sizeof(asn_DEF_NarrowInteger_tags_1)
+		/sizeof(asn_DEF_NarrowInteger_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
