diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index 43ced79..9e8f2e2 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -16,11 +16,11 @@
 };
 asn1_TYPE_descriptor_t asn1_DEF_OBJECT_IDENTIFIER = {
 	"OBJECT IDENTIFIER",
-	INTEGER_free,
+	ASN__PRIMITIVE_TYPE_free,
 	OBJECT_IDENTIFIER_print,
 	OBJECT_IDENTIFIER_constraint,
-	INTEGER_decode_ber,	/* Implemented in terms of INTEGER type */
-	OBJECT_IDENTIFIER_encode_der,
+	ber_decode_primitive,
+	der_encode_primitive,
 	0,				/* Not implemented yet */
 	OBJECT_IDENTIFIER_encode_xer,
 	0, /* Use generic outmost tag fetcher */
@@ -30,52 +30,11 @@
 	asn1_DEF_OBJECT_IDENTIFIER_tags,	/* Same as above */
 	sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags)
 	    / sizeof(asn1_DEF_OBJECT_IDENTIFIER_tags[0]),
-	0,	/* Always in primitive form */
 	0, 0,	/* No members */
 	0	/* No specifics */
 };
 
 
-/*
- * Encode OBJECT IDENTIFIER type using DER.
- */
-asn_enc_rval_t
-OBJECT_IDENTIFIER_encode_der(asn1_TYPE_descriptor_t *sd, void *ptr,
-	int tag_mode, ber_tlv_tag_t tag,
-	asn_app_consume_bytes_f *cb, void *app_key) {
-	asn_enc_rval_t erval;
-	OBJECT_IDENTIFIER_t *st = (OBJECT_IDENTIFIER_t *)ptr;
-
-	ASN_DEBUG("%s %s as OBJECT IDENTIFIER (tm=%d)",
-		cb?"Encoding":"Estimating", sd->name, tag_mode);
-
-	erval.encoded = der_write_tags(sd, st->size, tag_mode, tag,
-		cb, app_key);
-	ASN_DEBUG("OBJECT IDENTIFIER %s wrote tags %d",
-		sd->name, (int)erval.encoded);
-	if(erval.encoded == -1) {
-		erval.failed_type = sd;
-		erval.structure_ptr = ptr;
-		return erval;
-	}
-
-	if(cb && st->buf) {
-		int ret = cb(st->buf, st->size, app_key);
-		if(ret < 0) {
-			erval.encoded = -1;
-			erval.failed_type = sd;
-			erval.structure_ptr = ptr;
-			return erval;
-		}
-	} else {
-		assert(st->buf || st->size == 0);
-	}
-
-	erval.encoded += st->size;
-
-	return erval;
-}
-
 int
 OBJECT_IDENTIFIER_constraint(asn1_TYPE_descriptor_t *td, const void *sptr,
 		asn_app_consume_bytes_f *app_errlog, void *app_key) {
@@ -101,11 +60,12 @@
 
 
 int
-OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbuf, unsigned int rvsize) {
+OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbufp, unsigned int rvsize) {
 	unsigned LE __attribute__ ((unused)) = 1; /* Little endian (x86) */
 	uint8_t *arcend = arcbuf + arclen;	/* End of arc */
-	void *rvstart = rvbuf;	/* Original start of the value buffer */
 	unsigned int cache = 0;	/* No more than 14 significant bits */
+	unsigned char *rvbuf = (unsigned char *)rvbufp;
+	unsigned char *rvstart = rvbuf;	/* Original start of the value buffer */
 	int inc;	/* Return value growth direction */
 
 	rvsize *= CHAR_BIT;	/* bytes to bits */
@@ -155,15 +115,15 @@
 			errno = ERANGE;	/* Overflow */
 			return -1;
 		}
-		*(unsigned long *)rvbuf = accum + add;
+		*(unsigned long *)rvbuf = accum + add;	/* alignment OK! */
 		return 0;
 	}
 
 #ifndef	WORDS_BIGENDIAN
 	if(*(unsigned char *)&LE) {	/* Little endian (x86) */
 		/* "Convert" to big endian */
-		(unsigned char *)rvbuf += rvsize / CHAR_BIT - 1;
-		((unsigned char *)rvstart)--;
+		rvbuf += rvsize / CHAR_BIT - 1;
+		rvstart--;
 		inc = -1;	/* Descending */
 	} else
 #endif	/* !WORDS_BIGENDIAN */
@@ -175,8 +135,8 @@
 		/* Clear the high unused bits */
 		for(bits = rvsize - arclen;
 			bits > CHAR_BIT;
-				(unsigned char *)rvbuf += inc, bits -= CHAR_BIT)
-				*(unsigned char *)rvbuf = 0;
+				rvbuf += inc, bits -= CHAR_BIT)
+				*rvbuf = 0;
 
 		/* Fill the body of a value */
 		for(; arcbuf < arcend; arcbuf++) {
@@ -184,25 +144,24 @@
 			bits += 7;
 			if(bits >= CHAR_BIT) {
 				bits -= CHAR_BIT;
-				*(unsigned char *)rvbuf = (cache >> bits);
-				(unsigned char *)rvbuf += inc;
+				*rvbuf = (cache >> bits);
+				rvbuf += inc;
 			}
 		}
 		if(bits) {
-			*(unsigned char *)rvbuf = cache;
-			(unsigned char *)rvbuf += inc;
+			*rvbuf = cache;
+			rvbuf += inc;
 		}
 	}
 
 	if(add) {
-		for((unsigned char *)rvbuf -= inc; rvbuf != rvstart; (unsigned char *)rvbuf -= inc) {
-			int v = add + *(unsigned char *)rvbuf;
+		for(rvbuf -= inc; rvbuf != rvstart; rvbuf -= inc) {
+			int v = add + *rvbuf;
 			if(v & (-1 << CHAR_BIT)) {
-				*(unsigned char *)rvbuf
-					= (unsigned char)(v + (1 << CHAR_BIT));
+				*rvbuf = (unsigned char)(v + (1 << CHAR_BIT));
 				add = -1;
 			} else {
-				*(unsigned char *)rvbuf = v;
+				*rvbuf = v;
 				break;
 			}
 		}
@@ -331,16 +290,16 @@
 	(void)ilevel;	/* Unused argument */
 
 	if(!st || !st->buf)
-		return cb("<absent>", 8, app_key);
+		return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
 
 	/* Dump preamble */
-	if(cb("{ ", 2, app_key))
+	if(cb("{ ", 2, app_key) < 0)
 		return -1;
 
 	if(OBJECT_IDENTIFIER__dump_body(st, cb, app_key) < 0)
 		return -1;
 
-	return cb(" }", 2, app_key);
+	return (cb(" }", 2, app_key) < 0) ? -1 : 0;
 }
 
 int
