diff --git a/gdb-port/parser-name-instrumentation-gdb.py b/gdb-port/parser-name-instrumentation-gdb.py
index 6141369499608480f026c8d26080c1ebd5f74c9e..85d53e1fce25f0de6a6085e7c61dbd45f5973b12 100644
--- a/gdb-port/parser-name-instrumentation-gdb.py
+++ b/gdb-port/parser-name-instrumentation-gdb.py
@@ -5,11 +5,9 @@
 # TODO: possible enhancement, caching the vtable type in Parser objects (allows searching by type)
 # TODO: The parameter given to h_do_parse is not shown in the backtrace, which is confusing
 
-# quick way to get locals from frame.block()
-# {local.name : local for local in block}
 
 # Tuples of symbol name, length in bytes
-h_rule_functions = [ ("init_runlengthdecode_parser", 314), ("init_LZW_parser", 1221) ]
+H_RULE_FUNCTIONS = [ ("init_runlengthdecode_parser", 314), ("init_LZW_parser", 1221) ]
 
 class Parser:
 	def __init__(self, name, address):
@@ -429,7 +427,6 @@ class HArenaMallocRawBreakpoint(gdb.Breakpoint):
 
 		return False
 
-# TODO: PDFMain.hammer_retq_breakpoints property instead
 hammer_retq_breakpoints = []
 
 class PDFMainBreakpoint(gdb.Breakpoint):
@@ -449,6 +446,54 @@ class PDFMainBreakpoint(gdb.Breakpoint):
 		breakpoints.append(h_packrat_parse_ret)
 		return breakpoints
 
+class BreakpointManager():
+	def __init__(self):
+		self.hammer_retq_breakpoints = []
+		self.h_rule_breakpoints = []
+
+		self.h_do_parse = None
+		self.h_packrat_parse = None
+		self.perform_lowlevel_parse = None
+		self.h_arena_malloc_raw = None
+
+		self.parse_action = None
+		self.parse_choice = None
+		self.parse_sequence = None
+		self.parse_difference = None
+		self.parse_many = None
+		self.parse_and = None
+		self.parse_attr_bool = None
+		self.parse_bind = None
+		self.parse_bits = None
+		self.parse_butnot = None
+		self.parse_charset = None
+		self.parse_ch = None
+		self.parse_end = None
+		self.parse_endianness = None
+		self.parse_epsilon = None
+		self.parse_ignore = None
+		self.parse_ignoreseq = None
+		self.parse_indirect = None
+		self.parse_int_range = None
+		self.parse_not = None
+		self.parse_nothing = None
+		self.parse_optional = None
+		self.parse_permutation = None
+		self.parse_skip = None
+		self.parse_seek = None
+		self.parse_tell = None
+		self.parse_token = None
+		self.parse_unimplemented = None
+		self.parse_put = None
+		self.parse_get = None
+		self.parse_whitespace = None
+		self.parse_xor = None
+
+	def set_h_rule_breakpoints()
+		for func in H_RULE_FUNCTIONS:
+		func_retq = locate_retq(func[0], func[1])
+		self.h_rule_breakpoints[func] = HRuleBreakpoint("*" + hex(func_retq))
+
 # GDB parameters
 # TODO: hammer parameter prefix
 
@@ -601,6 +646,7 @@ class HammerParserCurrentEnv(gdb.Command):
 
 HammerParserCurrentEnv()
 
+#TODO: move all this to BreakpointManager?
 # Call when execution stopped at breakpoint in main
 def locate_perform_lowlevel_parse_retq():
 	arch = gdb.selected_frame().architecture()
@@ -719,7 +765,7 @@ init_parser = InitParserBreakpoint("*" + hex(i_p_retq))
 
 h_rule_breakpoints = {}
 
-for func in h_rule_functions:
+for func in H_RULE_FUNCTIONS:
 	func_retq = locate_retq(func[0], func[1])
 	h_rule_breakpoints[func] = HRuleBreakpoint("*" + hex(func_retq))