diff --git a/gdb-port/ast.py b/gdb-port/ast.py
index 3232e25e93d8a4c11afae50a4a30f4a120db1450..b594c9382f7e3a26882f4f26d0e2cbafa6a579f6 100644
--- a/gdb-port/ast.py
+++ b/gdb-port/ast.py
@@ -260,7 +260,7 @@ class ASTManager:
 		self.parser = parser
 
 	# Alternatively, instead of constructing one giant map, TopLevelParse could walk the AST
-	def token_map(self, parse_state_indices):
+	def token_map(self, parse_state_indices): # TODO: remove
 		res = {}
 		#print("token map:")
 		if self.top_node.has_ast:
@@ -287,78 +287,3 @@ class ASTManager:
 
 ast_manager = ASTManager()
 
-# In the case of Packrat, the AST is built bottom-up. By saving the "root" of the AST fragment of interest, we can walk the entire subtree and
-# print every token. However, during parsing, where a token begins is known from state->input_stream.index at the time of call, and the end of a token is
-# known from the same upon return. So to keep track of token boundaries, we need to keep track of token starting points as we descend to the first parser
-# that actually advances state->input_stream.index
-class IndexTreeNode:
-	def __init__(self, parent):
-		self.indices = None
-		self.children = []
-		if isinstance(parent, IndexTreeNode) or parent is None:
-			self.parent = parent
-		else:
-			print(parent)
-			raise ValueError("Parent must also be an IndexTreeNode")
-
-	def __getitem__(self, key):
-		return self.children[key]
-
-	def begin_token(self, index):
-		if self.indices is not None:
-			raise ValueError("Attempt to overwrite token starting point:", self.indices, index)
-		else:
-			self.indices = (index, None)
-
-	def finish_token(self, index):
-		if self.indices[1] is not None:
-			raise ValueError("Attempt to overwrite token ending point", self.indices, index)
-		else:
-			oldindices = self.indices
-			self.indices = (oldindices[0], index)
-
-	def select_by_path(self, node_list):
-		return reduce(operator.getitem, node_list, self)
-
-	def add_child_node(self, indices=None):
-		new_node = IndexTreeNode(self)
-		if indices:
-			new_node.begin_token(indices[0]) # TODO: should we be able to assign indices generally, or should going through .begin_token() be enforced like this?
-		self.children.append(new_node)
-
-	def delete_last_child(self):
-		node = self.children.pop()
-		node.parent = None
-
-	def delete_all_children(self):
-		for child in self.children:
-			child.parent = None
-		self.children = []
-
-	def __str__(self):
-		if len(self.children):
-			return "(" + str(self.indices) + "; [" + ",".join([str(child) for child in self.children]) + "])"
-		else:
-			return "(" + str(self.indices) + "; [])"
-
-class IndexTree:
-	def __init__(self):
-		self.root = IndexTreeNode(None)
-
-	# support chaining the subscript operator, e. g. sometree[0][1][3]. returning the root here regardless of key makes it more convenient to use
-	# path selectors derived from TopLevelParse's call stack. (the first item corresponds to the topmost parser, and will always be 0) : sometree.select_by_path([0,1,3]) corresponding to sometree.root[1][3]
-	def __getitem__(self, key):
-		return self.root
-
-	def select_by_path(self, node_list):
-		return reduce(operator.getitem, node_list, self)
-
-	def __str__(self):
-		return str(self.root)
-
-	#TODO: something better for when parser stack is empty
-	def add_child_node(self, indices=None):
-		new_node = IndexTreeNode(None)
-		if indices:
-			new_node.begin_token(indices[0])
-		self.root = new_node
diff --git a/gdb-port/hammer-breakpoints.py b/gdb-port/hammer-breakpoints.py
index a09f3978e2159d6382604c46d1a25e33f4184c07..982def22e70a6e51eacff7c44f1aa9c2c969bcc9 100644
--- a/gdb-port/hammer-breakpoints.py
+++ b/gdb-port/hammer-breakpoints.py
@@ -113,8 +113,6 @@ class HDoParseRetBreakpoint(gdb.Breakpoint):
 			ast_manager.set_top_node(ret_val, parser_obj)
 			ast_manager.print_ast()
 			#print(top_level_parse.peek_parserstack().p_stack) #TODO:sometimes the hammer-parser-backtrace gets messed up
-			indices = top_level_parse.get_top_stack_indices()
-			token_map = ast_manager.token_map(indices)
 			top_level_parse.input_ptr = parse_state['input_stream']['input']
 			top_level_parse.print_input_map(ast_manager.top_node.ast)
 			#print(top_level_parse.peek_parserstack().p_stack)
diff --git a/gdb-port/parser.py b/gdb-port/parser.py
index eb786b7e13e37dc2642eac1240c23058f9d2c570..f459bf37b2fc839defcf2d5838c6bfa89eb37069 100644
--- a/gdb-port/parser.py
+++ b/gdb-port/parser.py
@@ -49,7 +49,6 @@ class ParserStack:
 		self.parse_state = parse_state
 		self.arena = arena
 		self.p_stack = []
-		self.parse_state_stack = [] # Would it be better to store (Parser, parse_state) tuples?
 		self.unclaimed_mem_use = 0
 
 	def push(self, parser):
@@ -65,10 +64,6 @@ class ParserStack:
 			retval = None
 		return retval
 
-	# TODO: if this approach works out, unify it with the push() API
-	def push_parse_state(self, parse_state):
-		self.parse_state_stack.append(parse_state)
-
 	def peek_parse_state(self):
 		try:
 			retval = self.parse_state_stack[-1]
@@ -76,9 +71,6 @@ class ParserStack:
 			retval = None
 		return retval
 
-	def pop_parse_state(self):
-		return self.parse_state_stack.pop()
-
 	def set_state(self, state):
 		self.parse_state = state
 	# Shortcut for setting the name property of the parser on the top of stack
diff --git a/gdb-port/top-level-parse.py b/gdb-port/top-level-parse.py
index 1134504bfd9c910bbd3f5b846c96c615a4721e25..eaeff8200896f60b5f3cf00a8e04051a9d510315 100644
--- a/gdb-port/top-level-parse.py
+++ b/gdb-port/top-level-parse.py
@@ -4,9 +4,6 @@ class TopLevelParse:
 	def __init__(self):
 		self.parser_stacks = []
 		self.parser_objs = {}
-		self.input_stream_indices = IndexTree()
-		self.input_index_tree_path = [0]
-		self.input_index_tree_path_stack = [] # TODO: put index_tree_path code in IndexTree()
 		self.index_tree_stack = []
 		self.current_parse_depth = 0 # Used by the AST handling code.
 		self.starting_input_index = []
@@ -46,11 +43,6 @@ class TopLevelParse:
 		parser_stack = ParserStack(None, None)
 		self.parser_stacks.append(parser_stack)
 		self.current_parse_depth = -1 # entering h_do_parse increments this by 1. To have it 0-indexed, it needs to be initialized to -1
-		if self.input_stream_indices:
-			self.index_tree_stack.append(self.input_stream_indices)
-			self.input_stream_indices = IndexTree()
-			self.input_index_tree_path_stack.append(self.input_index_tree_path)
-			self.input_index_tree_path = [0]
 		return 0
 
 	# TODO: arena parameter is useless
@@ -99,9 +91,6 @@ class TopLevelParse:
 		if old_stack.depth() > 0:
 			print("Warning: parser stack not empty but parse is successful?")
 
-		self.input_stream_indices = self.index_tree_stack.pop()
-		self.input_index_tree_path = self.input_index_tree_path_stack.pop()
-
 		if not self.parser_stacks: # if self.parser_stacks is now empty, we've returned from h_packrat_parse() called by the "outermost" h_parse()
 			self.current_parse_depth = -1 # Restore parse depth
 		else:
@@ -120,9 +109,6 @@ class TopLevelParse:
 
 		parser_stack = self.peek_parserstack()
 		parser_stack.push(parser_obj)
-		#TODO
-		parse_state = []
-		parser_stack.push_parse_state(parse_state)
 		if self.parser_decombinator:
 			p_env = self.parser_decombinator.decompose_parser(parser_obj, self)
 			self.set_parser_env(type(p_env).__name__ + " - " + str(p_env)) # TODO: pass this as data structure to frontend
@@ -131,7 +117,6 @@ class TopLevelParse:
 	def return_from_perform_lowlevel_parse(self):
 		parser_stack = self.peek_parserstack()
 		parser_obj = parser_stack.pop()
-		parse_state = parser_stack.pop_parse_state()
 		# debug print here
 
 	def enter_h_arena_malloc_raw(self, alloc_size):
@@ -468,8 +453,4 @@ class TopLevelParse:
 	def get_current_stack_depth(self):
 		return self.current_parse_depth # TODO: what's the difference between this and ast_stack_index?
 
-	# TODO: better name pending
-	def get_top_stack_indices(self):
-		return self.input_stream_indices[self.current_parse_depth:]
-
 top_level_parse = TopLevelParse()