diff --git a/pdf.c b/pdf.c
index 0101ca29f9b291931a426edf8ef4c562e12d3287..6ea78eb8fef497e24448ba51fd8d32bacc012233 100644
--- a/pdf.c
+++ b/pdf.c
@@ -1254,12 +1254,23 @@ struct predictor {
 	uint8_t	*buf;		/* previous row of input */
 	uint8_t	 c;		/* byte 'c' (upper left) */
 	int	 x;		/* current position */
+
+#ifndef ITERATIVE // XXX
+	uint8_t	*out;
+	size_t	 nout;
+#endif
 };
 
 int
 depred_none(struct predictor *pred, uint8_t *inp, size_t sz)
 {
+#ifdef ITERATIVE // XXX
 	return h_parse_chunk(pred->sp, inp, sz);
+#else
+	pred->out = inp;
+	pred->nout = sz;
+	return false;
+#endif
 }
 
 uint8_t pp_none(int a, int b, int c)	{ return 0; }
@@ -1326,7 +1337,14 @@ depred_png(struct predictor *pred, uint8_t *inp, size_t sz)
 
 		/* when row complete, pass it to parser and start a new row */
 		if (x == pred->rowsz) {
+#ifdef ITERATIVE // XXX
 			done = h_parse_chunk(pred->sp, pred->buf, pred->rowsz);
+#else
+			pred->out = realloc(pred->out, pred->nout + pred->rowsz);
+			assert(pred->out != NULL);
+			memcpy(pred->out + pred->nout, pred->buf, pred->rowsz);
+			pred->nout += pred->rowsz;
+#endif
 			pred->c = pred->x = 0;
 			if (pred->num != 2)	/* support for 8-bpc TIFF */
 				pred->predfun = NULL;
@@ -1341,7 +1359,9 @@ FlateDecode(const Dict *parms, HBytes b, HParser *p)
 {
 	size_t const BUFSIZE = 8 * 1024;
 	uint8_t *buf;
+#ifdef ITERATIVE // XXX
 	HSuspendedParser *sp;
+#endif
 	HParseResult *res;
 	const HParsedToken *v;
 	size_t sz;
@@ -1407,10 +1427,12 @@ FlateDecode(const Dict *parms, HBytes b, HParser *p)
 	if (buf == NULL)
 		err(1, "FlateDecode");
 
+#ifdef ITERATIVE // XXX
 	/* initialize target parser */
 	sp = h_parse_start(p);
 	assert(sp != NULL);
 	pred.sp = sp;
+#endif
 
 	done = 0;
 	strm.avail_in = b.len;
@@ -1429,8 +1451,12 @@ FlateDecode(const Dict *parms, HBytes b, HParser *p)
 		done = depredict(&pred, buf, sz);
 	} while (done == 0 && ret == Z_OK);
 
+#ifdef ITERATIVE // XXX
 	res = h_parse_finish(sp);
 		// XXX always return NULL on error?
+#else
+	res = h_parse(p, pred.out, pred.nout);
+#endif
 	inflateEnd(&strm);
 	free(pred.buf);
 	free(buf);
@@ -1517,9 +1543,11 @@ decode_stream(const Dict *d, HBytes b, HParser *p)
 	if (v == NULL)
 		return h_parse(p, b.token, b.len);
 
+#ifdef ITERATIVE // XXX
 	/* compile to a CF backend to enable incremental parsing */
 	if (h_compile(p, PB_LLk, NULL) == -1)
 		errx(1, "stream data parser: LL(1) compile failed");
+#endif
 
 	if (v->token_type == TT_SEQUENCE)
 		return NULL;	// XXX filter chains not supported, yet