diff --git a/asn1c/tests/data-70/data-70-55.in b/asn1c/tests/data-70/data-70-55.in
new file mode 100644
index 0000000000000000000000000000000000000000..7be4ca5b9902732370715d8a8ab4142a65039a70
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-55.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112</roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-56.in b/asn1c/tests/data-70/data-70-56.in
new file mode 100644
index 0000000000000000000000000000000000000000..7a7ba071f6ff915e3be9826c40d36780f55488a5
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-56.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid> 123.456.789.101112 </roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-57-D.in b/asn1c/tests/data-70/data-70-57-D.in
new file mode 100644
index 0000000000000000000000000000000000000000..74da9b90a8bf2ae167c380361dea6e80c848749c
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-57-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid> <!--/--> 123.456.789.101112</roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-58-D.in b/asn1c/tests/data-70/data-70-58-D.in
new file mode 100644
index 0000000000000000000000000000000000000000..252345d21a3963567c342b6e9e22b0c2220f143d
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-58-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112<!--/--></roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-59-D.in b/asn1c/tests/data-70/data-70-59-D.in
new file mode 100644
index 0000000000000000000000000000000000000000..2d989d24ec4cdf90478fc07e6ca4e29ef1176e32
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-59-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112<!--/--> </roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-60-D.in b/asn1c/tests/data-70/data-70-60-D.in
new file mode 100644
index 0000000000000000000000000000000000000000..11be5d7393589c3f48d086416fe0ceb8f4d172e9
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-60-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112 <!--/--></roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-61-D.in b/asn1c/tests/data-70/data-70-61-D.in
new file mode 100644
index 0000000000000000000000000000000000000000..5c47c9fcfe9efe8330a95341912b18a43d97356b
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-61-D.in
@@ -0,0 +1,5 @@
+<PDU>
+	<set>
+		<roid>123.456.789.101112 <!--/--> </roid>
+	</set>
+</PDU>
diff --git a/asn1c/tests/data-70/data-70-62-D.in b/asn1c/tests/data-70/data-70-62-D.in
new file mode 100644
index 0000000000000000000000000000000000000000..cb790d28c720a4eee2c070862432a4e6f7ee055f
--- /dev/null
+++ b/asn1c/tests/data-70/data-70-62-D.in
@@ -0,0 +1,9 @@
+<PDU>
+	<set>
+		<roid>
+			<!-- This is a special comment -->
+			123.456.789.101112
+			<!-- This is a special comment too -->
+		</roid>
+	</set>
+</PDU>
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index c1f58843b56311e440e93a322729d9560b28cbf3..2939f25aafc6c8fa3cb0873f2619ded4ca516570 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -282,15 +282,13 @@ OBJECT_IDENTIFIER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const
 	arcs_count = OBJECT_IDENTIFIER_parse_arcs(
 		(const char *)chunk_buf, chunk_size, arcs,
 			sizeof(s_arcs)/sizeof(s_arcs[0]), &endptr);
-	if(arcs_count <= 0) {
+	if(arcs_count < 0) {
 		/* Expecting more than zero arcs */
 		return XPBD_BROKEN_ENCODING;
+	} else if(arcs_count == 0) {
+		return XPBD_NOT_BODY_IGNORE;
 	}
-	if(endptr < chunk_end) {
-		/* We have a tail of unrecognized data. Check its safety. */
-		if(!xer_is_whitespace(endptr, chunk_end - endptr))
-			return XPBD_BROKEN_ENCODING;
-	}
+	assert(endptr == chunk_end);
 
 	if((size_t)arcs_count > sizeof(s_arcs)/sizeof(s_arcs[0])) {
 		arcs = (long *)MALLOC(arcs_count * sizeof(long));
@@ -745,16 +743,19 @@ OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length,
 	/* Finalize last arc */
 	switch(state) {
 	case ST_LEADSPACE:
-	case ST_WAITDIGITS:
-		errno = EINVAL;
-		return -1;
+		return 0; /* No OID found in input data */
 	case ST_DIGITS:
 		_OID_CAPTURE_ARC(value_start, oid_text);
-		/* Fall through */
+		return arcs_count;
+	case ST_WAITDIGITS:
+		errno = EINVAL;	/* Broken OID */
+		return -1;
 	case ST_TAILSPACE:
-	default:
 		return arcs_count;
 	}
+
+	errno = EINVAL;	/* Broken OID */
+	return -1;
 }
 
 
diff --git a/skeletons/RELATIVE-OID.c b/skeletons/RELATIVE-OID.c
index 983fc094d4fdcc6404df566ec22fb1e1934f35c4..4275c0ab0ded491e54db868d91fdec7ed0625d78 100644
--- a/skeletons/RELATIVE-OID.c
+++ b/skeletons/RELATIVE-OID.c
@@ -106,14 +106,12 @@ RELATIVE_OID__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void
 		(const char *)chunk_buf, chunk_size,
 		arcs, sizeof(s_arcs)/sizeof(s_arcs[0]), &endptr);
 	if(arcs_count < 0) {
-		/* Expecting at least zero arcs */
+		/* Expecting at least one arc arcs */
 		return XPBD_BROKEN_ENCODING;
+	} else if(arcs_count == 0) {
+		return XPBD_NOT_BODY_IGNORE;
 	}
-	if(endptr < chunk_end) {
-		/* We have a tail of unrecognized data. Check its safety. */
-		if(!xer_is_whitespace(endptr, chunk_end - endptr))
-			return XPBD_BROKEN_ENCODING;
-	}
+	assert(endptr == chunk_end);
 
 	if((size_t)arcs_count > sizeof(s_arcs)/sizeof(s_arcs[0])) {
 		arcs = (long *)MALLOC(arcs_count * sizeof(long));