diff --git a/combinatorial_LR_parser.py b/combinatorial_LR_parser.py
index c3dac47f4e79e97159a85a3a7c07ff4b484a86a2..2db84209e671973596658e9076dcede5808e5487 100644
--- a/combinatorial_LR_parser.py
+++ b/combinatorial_LR_parser.py
@@ -70,7 +70,7 @@ class StacksInSync(Elaboratable):
 
         self.occupancy_bitmap = Signal(self.depth)
 
-        self.fault = Signal(1)
+        self.internal_fault = Signal(1)
 
 
         # read-only access to the top K entries, connected to the
@@ -111,7 +111,7 @@ class StacksInSync(Elaboratable):
 
         m.d.comb += self.occupancy_bitmap.eq(bigstack.occupancy_bitmap)
 
-        m.d.comb += self.fault.eq(bigstack.fault | sidestack.fault)
+        m.d.comb += self.internal_fault.eq(bigstack.fault | sidestack.fault)
 
         return m
 
@@ -544,6 +544,7 @@ class TreeSerializer(Elaboratable):
         self.serialized_tree_length = serialized_tree_length
         self.mem_address_width = indices_width
         self.serializing_ruleset = serializing_ruleset
+        self.serialized_tree_length = serialized_tree_length
 
         # inputs
 
@@ -563,6 +564,7 @@ class TreeSerializer(Elaboratable):
         # outputs
         # output to state machine
         self.ready_out                   = Signal(1)
+        self.internal_fault              = Signal(1)
 
         self.serialized_index            = Signal(indices_width)    # push *this* onto side stack for the
                                                                     # newly created item
@@ -571,6 +573,7 @@ class TreeSerializer(Elaboratable):
         self.memory_address_port         = Signal(self.mem_address_width)
         self.memory_write_enable         = Signal(1)
 
+
         self.mem = Memory(width=(self.item_width + 1), depth=serialized_tree_length)
 
     def elaborate(self, platform):
@@ -600,12 +603,9 @@ class TreeSerializer(Elaboratable):
 
 
         with m.FSM() as fsm:
-
-
             with m.State("INITIALIZE"):
-
                 m.d.comb += self.ready_out.eq(0)
-
+                m.d.comb += self.internal_fault.eq(0)
 
                 m.d.sync += start_of_record.eq(0)
                 m.d.sync += number_written.eq(0)
@@ -613,9 +613,9 @@ class TreeSerializer(Elaboratable):
                 m.next="NODE"
 
 
-
             with m.State("NODE"):
                 m.d.comb += self.ready_out.eq(1)
+                m.d.comb += self.internal_fault.eq(0)
 
                 #m.d.sync += reduce_rule_number.eq(self.reduce_rule_number)
                 m.d.sync += item_created_by_reduce_rule.eq(self.item_created_by_reduce_rule)
@@ -630,11 +630,16 @@ class TreeSerializer(Elaboratable):
 
                     m.d.sync += number_of_children.eq(self.number_to_pop)
                     m.d.sync += number_written.eq(1)
+
                     m.next = "SUBNODES"
 
+                with m.If(self.memory_address_port > (self.serialized_tree_length - 1)):
+                    m.next = "ABORT"
 
             with m.State("SUBNODES"):
                 m.d.comb += self.ready_out.eq(0)
+                m.d.comb += self.internal_fault.eq(0)
+
                 with m.If(self.destroyed_item_valid_in == 1):
                     with m.If(self.destroyed_item_index_in == 0):
                         m.d.comb += self.memory_write_port.eq(self.destroyed_item_in)
@@ -649,20 +654,32 @@ class TreeSerializer(Elaboratable):
                 with m.If(number_written == number_of_children):
                     m.d.comb += self.memory_write_port.eq(item_created_by_reduce_rule)
                     m.d.comb += self.memory_address_port.eq(start_of_record)
-
                     m.d.comb += self.memory_write_enable.eq(1)
 
                     m.next = "FIXUP"
 
+                with m.If(self.memory_address_port > (self.serialized_tree_length - 1)):
+                    m.next = "ABORT"
+
             with m.State("FIXUP"):
                     m.d.comb += self.ready_out.eq(0)
+                    m.d.comb += self.internal_fault.eq(0)
 
                     m.d.comb += self.memory_write_port.eq(number_of_children)
                     m.d.comb += self.memory_address_port.eq(start_of_record + 1)
                     m.d.comb += self.memory_write_enable.eq(1)
                     m.d.sync += start_of_record.eq(start_of_record + 2 + number_of_children)
+
                     m.next = "NODE"
 
+                    with m.If(self.memory_address_port > (self.serialized_tree_length - 1)):
+                        m.next = "ABORT"
+
+            with m.State("ABORT"):
+                m.d.comb += self.ready_out.eq(0)
+                m.d.comb += self.internal_fault.eq(1)
+
+
 
 
         return m
@@ -779,7 +796,7 @@ class MasterStateMachine(Elaboratable):
                 m.d.comb += doublestacks.side_push_port.eq(0x0) # XXX FIXME
                 m.d.comb += doublestacks.command_in.eq(2)
 
-                with m.If(doublestacks.fault == 1):
+                with m.If(doublestacks.internal_fault | serializer.internal_fault == 1):
                     m.next="ABORT"
 
 
@@ -790,7 +807,7 @@ class MasterStateMachine(Elaboratable):
                         m.d.comb += fsm_ready.eq(0)
                         m.d.comb += doublestacks.command_in_strobe.eq(0)
 
-                    with m.If(doublestacks.fault == 1):
+                    with m.If(doublestacks.internal_fault | serializer.internal_fault == 1):
                         m.next="ABORT"
 
                     with m.If(rule_matcher.invalid_item   == 1):
@@ -847,7 +864,7 @@ class MasterStateMachine(Elaboratable):
                 m.d.comb += self.parse_success_out.eq(1)
                 m.d.comb += self.parse_complete_out.eq(1)
 
-                with m.If(doublestacks.fault == 1):
+                with m.If(doublestacks.internal_fault | serializer.internal_fault == 1):
                     m.next="ABORT"
 
 
@@ -875,7 +892,7 @@ class MasterStateMachine(Elaboratable):
                     
                     m.next = "SHIFTREDUCE"
 
-                with m.If(doublestacks.fault == 1):
+                with m.If(doublestacks.internal_fault | serializer.internal_fault == 1):
                     m.next="ABORT"