diff --git a/src/hammer.c b/src/hammer.c
index b1ef1257cbe5157d813c55dea3f5a8f848cf6e89..94a39980e1c75712d9307ffab0ba06e3683ebbb0 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -58,7 +58,7 @@ parse_result_t* do_parse(const parser_t* parser, parse_state_t *state) {
     // It doesn't exist, so create a dummy result to cache
     LR_t *base = a_new(LR_t, 1);
     base->seed = NULL; base->rule = parser; base->head = NULL;
-    g_queue_push_head(state->input_stream.lr_stack, base);
+    g_queue_push_head(state->lr_stack, base);
     // cache it
     parser_cache_value_t *dummy = a_new(parser_cache_value_t, 1);
     dummy->value_type = PC_LEFT; dummy->left = base;
@@ -79,7 +79,7 @@ parse_result_t* do_parse(const parser_t* parser, parse_state_t *state) {
     }
 #endif
     // the base variable has passed equality tests with the cache
-    g_queue_pop_head(state->input_stream.lr_stack);
+    g_queue_pop_head(state->lr_stack);
     // setupLR, used below, mutates the LR to have a head if appropriate, so we check to see if we have one
     if (NULL == base->head) {
       parser_cache_value_t *right = a_new(parser_cache_value_t, 1);
@@ -95,7 +95,7 @@ parse_result_t* do_parse(const parser_t* parser, parse_state_t *state) {
     // it exists!
     parser_cache_value_t *value = g_hash_table_lookup(state->cache, key);
     if (PC_LEFT == value->value_type) {
-      setupLR(parser, state->input_stream.lr_stack, value->left);
+      setupLR(parser, state->lr_stack, value->left);
       return value->left->seed; // BUG: this might not be correct
     } else {
       return value->right;
@@ -685,7 +685,7 @@ parse_result_t* parse(const parser_t* parser, const uint8_t* input, size_t lengt
   parse_state->input_stream.overrun = 0;
   parse_state->input_stream.endianness = BIT_BIG_ENDIAN | BYTE_BIG_ENDIAN;
   parse_state->input_stream.length = length;
-  g_queue_init(parse_state->input_stream.lr_stack);
+  parse_state->lr_stack = g_queue_new();
   parse_state->arena = arena;
   parse_result_t *res = do_parse(parser, parse_state);
   // tear down the parse state. For now, leak like a sieve.
diff --git a/src/hammer.h b/src/hammer.h
index 596f39108fe0960f123765f20e343418d608d406..8eb901c9c769d8d92347b75035f42d0602a6b7ab 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -43,13 +43,13 @@ typedef struct input_stream {
   char bit_offset;
   char endianness;
   char overrun;
-  GQueue *lr_stack;
 } input_stream_t;
   
 typedef struct parse_state {
   GHashTable *cache; 
   input_stream_t input_stream;
   arena_t arena;
+  GQueue *lr_stack;
 } parse_state_t;
 
 typedef enum token_type {