counting overhead
diff --git a/skeletons/constr_SEQUENCE.c b/skeletons/constr_SEQUENCE.c
index a0d81a1..bcdf2ca 100644
--- a/skeletons/constr_SEQUENCE.c
+++ b/skeletons/constr_SEQUENCE.c
@@ -1069,9 +1069,10 @@
 
 	asn_per_data_t *oldpd = &arg->oldpd;
 
-	ASN_DEBUG("REFILLING [from %d (%d->%d)] now [%d (%d->%d)] uncl %d",
-		oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits,
-		pd->nbits - pd->nboff, pd->nboff, pd->nbits, arg->unclaimed);
+	ASN_DEBUG("REFILLING (%+db) [from %d (%d->%d)_%d] now [%d (%d->%d)_%d] uncl %d",
+		pd->buffer - oldpd->buffer,
+		oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, oldpd->moved,
+		pd->nbits - pd->nboff, pd->nboff, pd->nbits, pd->moved, arg->unclaimed);
 
 	/* Advance our position to where pd is */
 	oldpd->buffer = pd->buffer;
@@ -1101,30 +1102,25 @@
 	}
 
 	next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat);
-	ASN_DEBUG("Open type LENGTH %d bytes, old %d (%d->%d) repeat %d",
-		next_chunk_bytes, oldpd->nbits - oldpd->nboff, oldpd->nboff, oldpd->nbits, arg->repeat);
+	ASN_DEBUG("Open type LENGTH %d bytes at off %d, repeat %d",
+		next_chunk_bytes, oldpd->moved, arg->repeat);
 	if(next_chunk_bytes < 0) return -1;
 	if(next_chunk_bytes == 0) {
 		pd->refill = 0;	/* No more refills, naturally */
 		assert(!arg->repeat);	/* Implementation guarantee */
 	}
-	pd->buffer = oldpd->buffer;
-	pd->nboff = oldpd->nboff;
-	pd->nbits = oldpd->nbits;
 	next_chunk_bits = next_chunk_bytes << 3;
-	avail = pd->nbits - pd->nboff;
-	ASN_DEBUG("now at %d bits, want %d, avail %d",
-		((((int)pd->buffer ) & 0x7) << 3) + pd->nboff,
-		next_chunk_bits, avail);
+	avail = oldpd->nbits - oldpd->nboff;
 	if(avail >= next_chunk_bits) {
-		pd->nbits = pd->nboff + next_chunk_bits;
+		pd->nbits = oldpd->nboff + next_chunk_bits;
 		arg->unclaimed = 0;
 	} else {
+		pd->nbits = oldpd->nbits;
 		arg->unclaimed = next_chunk_bits - avail;
 		ASN_DEBUG("Parent has %d, require %d, will claim %d", avail, next_chunk_bits, arg->unclaimed);
 	}
-	ASN_DEBUG("now at %d bits",
-		((((int)pd->buffer ) & 0x7) << 3) + pd->nboff);
+	pd->buffer = oldpd->buffer;
+	pd->nboff = oldpd->nboff;
 	return 0;
 }
 
@@ -1144,36 +1140,48 @@
 	arg.repeat = 1;
 	pd->refill = uper_ugot_refill;
 	pd->refill_key = &arg;
-	pd->nbits = pd->nboff;	/* 0 bits at this point, wait for refill */
+	pd->nbits = pd->nboff;	/* 0 good bits at this point, will refill */
+	pd->moved = 0;	/* This now counts the open type size in bits */
 
 	rv = td->uper_decoder(opt_codec_ctx, td, constraints, sptr, pd);
 
-	ASN_DEBUG("Open type unconsumed unclaimed=%d, repeat=%d, nbdiff=%d (%d->%d, old=%d (%d->%d))",
-		arg.unclaimed, arg.repeat,
+	ASN_DEBUG("Open type %s consumed %d off of %d unclaimed=%d, repeat=%d, nbdiff=%d (%d->%d, old=%d (%d->%d))",
+		td->name, pd->moved, arg.oldpd.moved, arg.unclaimed, arg.repeat,
 		pd->nbits - pd->nboff, pd->nboff, pd->nbits,
 		arg.oldpd.nbits - arg.oldpd.nboff, arg.oldpd.nboff, arg.oldpd.nbits);
-	ASN_DEBUG("now at %d bits",
-		((((int)pd->buffer ) & 0x7) << 3) + pd->nboff);
 
-	padding = pd->nbits - pd->nboff;
-	if(padding > 7) {
-		ASN_DEBUG("Too large padding in open type %p (%d->%d) %d",
-			pd->buffer, pd->nboff, pd->nbits, padding);
-		rv.code = RC_FAIL;
-		return rv;
+	padding = pd->moved % 8;
+	if(padding) {
+		if(padding > 7) {
+			ASN_DEBUG("Too large padding %d in open type",
+				padding);
+			rv.code = RC_FAIL;
+			return rv;
+		}
+		ASN_DEBUG("Getting padding of %d bits", padding);
+		switch(per_get_few_bits(pd, padding)) {
+		case -1:
+			ASN_DEBUG("Padding skip failed");
+			_ASN_DECODE_FAILED;
+		case 0: break;
+		default:
+			ASN_DEBUG("Non-blank padding");
+			_ASN_DECODE_FAILED;
+		}
 	}
-
-	ASN_DEBUG("nboff = %d, nbits %d, padding = %d, plus %d/%p", pd->nboff, pd->nbits, padding, pd->buffer - arg.oldpd.buffer, arg.oldpd.buffer);
-	ASN_DEBUG("Getting padding of %d bits", padding);
-	switch(per_get_few_bits(pd, padding)) {
-	case -1:
-		ASN_DEBUG("Padding skip failed");
-		_ASN_DECODE_FAILED;
-	case 0: break;
-	default:
-		ASN_DEBUG("Non-blank padding");
-		_ASN_DECODE_FAILED;
+	if(pd->nbits != pd->nboff) {
+		ASN_DEBUG("Open type container overhead of %d off %d bits!", pd->nbits - pd->nboff, arg.oldpd.moved + pd->moved);
+		if(0) _ASN_DECODE_FAILED;
+		/* Ignore unwanted overheads */
+		arg.oldpd.moved += pd->nbits - pd->nboff;
+		//pd->moved += pd->nbits - pd->nboff;
+		pd->nboff = pd->nbits;
 	}
+	arg.oldpd.nbits -= pd->moved - arg.ot_moved;
+	arg.oldpd.moved += pd->moved - arg.ot_moved;
+	pd->nboff = arg.oldpd.nboff;
+	pd->nbits = arg.oldpd.nbits;
+	pd->moved = arg.oldpd.moved;
 	pd->refill = arg.oldpd.refill;
 	pd->refill_key = arg.oldpd.refill_key;
 
@@ -1197,9 +1205,6 @@
 		}
 	}
 
-	ASN_DEBUG("now at %d bits",
-		((((int)pd->buffer ) & 0x7) << 3) + pd->nboff);
-
 	if(arg.repeat) {
 		ASN_DEBUG("Not consumed the whole thing");
 		rv.code = RC_FAIL;
diff --git a/skeletons/per_decoder.c b/skeletons/per_decoder.c
index 4e120a4..de9dc55 100644
--- a/skeletons/per_decoder.c
+++ b/skeletons/per_decoder.c
@@ -47,6 +47,8 @@
 		/* Return the number of consumed bits */
 		rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3)
 					+ pd.nboff - skip_bits;
+		ASN_DEBUG("PER decoding consumed %d, counted %d",
+			rval.consumed, pd.moved);
 		assert(rval.consumed == pd.moved);
 	} else {
 		/* PER codec is not a restartable */