diff --git a/pdf.c b/pdf.c
index 7a033ca4b1ad424b1e8f07495e513bf01e81487b..1ee027cb47672cda40b6a19b92da119ab8e6eedf 100644
--- a/pdf.c
+++ b/pdf.c
@@ -612,40 +612,51 @@ lookup_xref(struct Env *aux, size_t nr, size_t gen)
 }
 
 const HParsedToken *
-parse_obj(struct Env *aux, Ref r, size_t offset)
+parse_obj(struct Env *aux, size_t nr, size_t gen, size_t offset)
 {
 	HParseResult *res;
-	size_t nr, gen;
+	size_t def_nr, def_gen;
 
 	if (offset >= aux->sz) {
-		fprintf(stderr, "%s: obj %zu %zu: position %zu (0x%zx) out of "
-		    "bounds\n", aux->infile, r.nr, r.gen, offset, offset);
+		fprintf(stderr, "%s: position %zu (%#zx) for object %zu %zu is "
+		    "out of bounds\n", aux->infile, offset, offset, nr, gen);
 		return NULL;
 	}
 
 	res = h_parse(p_objdef, aux->input + offset, aux->sz - offset);
 	if (res == NULL) {
 		fprintf(stderr, "%s: error parsing object %zu %zu at position "
-		    "%zu (0x%zx)\n", aux->infile, r.nr, r.gen, offset, offset);
+		    "%zu (%#zx)\n", aux->infile, nr, gen, offset, offset);
 		return NULL;
 	}
+	assert(res->ast != NULL && res->ast->token_type == TT_SEQUENCE);
 
-	nr = H_INDEX_UINT(res->ast, 0);
-	gen = H_INDEX_UINT(res->ast, 1);
-	if (nr != r.nr || gen != r.gen) {
+	def_nr = H_INDEX_UINT(res->ast, 0);
+	def_gen = H_INDEX_UINT(res->ast, 1);
+	if (def_nr != nr || def_gen != gen) {
 		fprintf(stderr, "%s: object ID mismatch at position %zu "
 		    "(%#zx): sought %zu %zu, found %zu %zu.\n", aux->infile,
-		    offset, offset, r.nr, r.gen, nr, gen);
+		    offset, offset, nr, gen, def_nr, def_gen);
 		return NULL;
 	}
 
 	return H_INDEX_TOKEN(res->ast, 2);
 }
 
+const HParsedToken *
+parse_obj_stm(struct Env *aux, size_t nr, size_t stm_nr, size_t idx)
+{
+	//const HParsedToken *stm;
+
+	// XXX find the stream object, decode it, parse the offset at idx,
+	// and parse the target object at it
+	return NULL;
+}
+
 const HParsedToken *
 resolve(struct Env *aux, const HParsedToken *v)
 {
-	XREntry *entry = NULL;
+	XREntry *ent = NULL;
 	Ref *r;
 
 	/* direct objects pass through */
@@ -656,32 +667,31 @@ resolve(struct Env *aux, const HParsedToken *v)
 	r = v->user;
 
 	/* find the xref entry for this reference */
-	entry = lookup_xref(aux, r->nr, r->gen);
-	if (entry == NULL)
+	ent = lookup_xref(aux, r->nr, r->gen);
+	if (ent == NULL)
 		return NULL;			/* obj not found */
-	if (entry->obj != NULL)
-		return resolve(aux, entry->obj);
+	if (ent->obj != NULL)
+		return resolve(aux, ent->obj);
 
 	/* parse the object and memoize */
-	entry->obj = v;				/* break loops */
-	switch (entry->type)
+	ent->obj = v;				/* break loops */
+	switch (ent->type)
 	{
 	case XR_FREE:
 		return NULL;			/* obj deleted */
 	case XR_INUSE:
-		if (entry->n.gen != r->gen)
+		if (ent->n.gen != r->gen)
 			return NULL;		/* obj nr reused */
-		entry->obj = parse_obj(aux, *r, entry->n.offs);
+		ent->obj = parse_obj(aux, r->nr, r->gen, ent->n.offs);
 		break;
 	case XR_OBJSTM:
 		if (r->gen != 0)
 			return NULL;		/* invalid entry! */
-		//XXX entry->obj = parse_obj_stm(aux, entry->o.stm, entry->o.idx);
-		//XXX break;
-		return NULL;
+		ent->obj = parse_obj_stm(aux, r->nr, ent->o.stm, ent->o.idx);
+		break;
 	}
 
-	return resolve(aux, entry->obj);
+	return resolve(aux, ent->obj);
 }
 
 /*
@@ -1254,7 +1264,7 @@ parse_xrefs(const char *input, size_t sz, size_t *nxrefs)
 		res = h_parse(p, input, sz);
 		if (res == NULL) {
 			fprintf(stderr, "%s: error parsing xref section at "
-			    "position %zu (0x%zx)\n", infile, offset, offset);
+			    "position %zu (%#zx)\n", infile, offset, offset);
 			break;
 		}
 
@@ -1284,7 +1294,7 @@ parse_xrefs(const char *input, size_t sz, size_t *nxrefs)
 		 */
 		if (n > 1 && tok->sint >= offset) {
 			fprintf(stderr, "%s: /Prev pointer of xref section at "
-			    "%zu (0x%zx) points forward\n", infile, offset,
+			    "%zu (%#zx) points forward\n", infile, offset,
 			    offset);
 			break;
 		}
@@ -1345,7 +1355,7 @@ main(int argc, char *argv[])
 		if (res) {
 			int64_t pos = res->bit_length / 8;
 			fprintf(stderr, "%s: error after position"
-			    " %" PRId64 " (0x%" PRIx64 ")\n",
+			    " %" PRId64 " (%#" PRIx64 ")\n",
 			    infile, pos, pos);
 			//h_pprintln(stderr, res->ast);	// XXX debug
 		}