diff --git a/scripts/buildcommands.py b/scripts/buildcommands.py
index 3935fa636..cb19c4757 100644
--- a/scripts/buildcommands.py
+++ b/scripts/buildcommands.py
@@ -151,37 +151,31 @@ def build_param_types(all_param_types):
 def build_commands(cmd_by_id, messages_by_name, all_param_types):
     max_cmd_msgid = max(cmd_by_id.keys())
     index = []
-    parsers = []
     externs = {}
     for msgid in range(max_cmd_msgid+1):
         if msgid not in cmd_by_id:
-            index.append("    0,")
+            index.append(" {\n},")
             continue
         funcname, flags, msgname = cmd_by_id[msgid]
         msg = messages_by_name[msgname]
         externs[funcname] = 1
-        parsername = 'parser_%s' % (funcname,)
-        index.append("    &%s," % (parsername,))
         parser = msgproto.MessageFormat(msgid, msg)
         parsercode = build_parser(parser, 1, all_param_types)
-        parsers.append("const struct command_parser %s PROGMEM = {"
-                       "    %s\n    .flags=%s,\n    .func=%s\n};" % (
-                           parsername, parsercode, flags, funcname))
-    index = "\n".join(index)
+        index.append(" {%s\n    .flags=%s,\n    .func=%s\n}," % (
+            parsercode, flags, funcname))
+    index = "".join(index).strip()
     externs = "\n".join(["extern void "+funcname+"(uint32_t*);"
                          for funcname in sorted(externs)])
     fmt = """
 %s
 
-%s
-
-const struct command_parser * const command_index[] PROGMEM = {
+const struct command_parser command_index[] PROGMEM = {
 %s
 };
 
 const uint8_t command_index_size PROGMEM = ARRAY_SIZE(command_index);
 """
-    return fmt % (externs, '\n'.join(parsers), index)
+    return fmt % (externs, index)
 
 
 ######################################################################
diff --git a/scripts/checkstack.py b/scripts/checkstack.py
index 343142183..e4cf45cc6 100755
--- a/scripts/checkstack.py
+++ b/scripts/checkstack.py
@@ -135,8 +135,7 @@ def main():
             continue
         m = re_asm.match(line)
         if m is None:
-            if funcaddr not in datalines:
-                datalines[funcaddr] = line.split()
+            datalines.setdefault(funcaddr, []).append(line)
             #print("other", repr(line))
             continue
         insn = m.group('insn')
@@ -192,14 +191,24 @@ def main():
         funcnameroot = info.funcname.split('.')[0]
         funcsbyname[funcnameroot] = info
     cmdfunc = funcsbyname.get('sched_main')
+    command_index = funcsbyname.get('command_index')
+    if command_index is not None and cmdfunc is not None:
+        for line in datalines[command_index.funcaddr]:
+            parts = line.split()
+            if len(parts) < 9:
+                continue
+            calladdr = int(parts[8]+parts[7], 16) * 2
+            numparams = int(parts[2], 16)
+            stackusage = cmdfunc.basic_stack_usage + 2 + numparams * 4
+            cmdfunc.noteCall(0, calladdr, stackusage)
+            if len(parts) < 17:
+                continue
+            calladdr = int(parts[16]+parts[15], 16) * 2
+            numparams = int(parts[10], 16)
+            stackusage = cmdfunc.basic_stack_usage + 2 + numparams * 4
+            cmdfunc.noteCall(0, calladdr, stackusage)
     eventfunc = funcsbyname.get('__vector_13', funcsbyname.get('__vector_17'))
     for funcnameroot, info in funcsbyname.items():
-        if funcnameroot.startswith('parser_'):
-            f = funcsbyname.get(funcnameroot[7:])
-            if f is not None:
-                numparams = int(datalines[info.funcaddr][2], 16)
-                stackusage = cmdfunc.basic_stack_usage + 2 + numparams * 4
-                cmdfunc.noteCall(0, f.funcaddr, stackusage)
         if funcnameroot.endswith('_event') and eventfunc is not None:
             eventfunc.noteCall(0, info.funcaddr, eventfunc.basic_stack_usage + 2)
 
diff --git a/src/command.c b/src/command.c
index 2a248f16e..ae2b10fe6 100644
--- a/src/command.c
+++ b/src/command.c
@@ -213,14 +213,9 @@ DECL_SHUTDOWN(sendf_shutdown);
 static const struct command_parser *
 command_get_handler(uint8_t cmdid)
 {
-    if (cmdid >= READP(command_index_size))
-        goto error;
-    const struct command_parser *cp = READP(command_index[cmdid]);
-    if (!cp)
-        goto error;
-    return cp;
-error:
-    shutdown("Invalid command");
+    if (!cmdid || cmdid >= READP(command_index_size))
+        shutdown("Invalid command");
+    return &command_index[cmdid];
 }
 
 enum { CF_NEED_SYNC=1<<0, CF_NEED_VALID=1<<1 };
diff --git a/src/command.h b/src/command.h
index 609becd99..5bd6faf4b 100644
--- a/src/command.h
+++ b/src/command.h
@@ -50,7 +50,7 @@ enum {
     PT_uint32, PT_int32, PT_uint16, PT_int16, PT_byte,
     PT_string, PT_progmem_buffer, PT_buffer,
 };
-extern const struct command_parser * const command_index[];
+extern const struct command_parser command_index[];
 extern const uint8_t command_index_size;
 extern const uint8_t command_identify_data[];
 extern const uint32_t command_identify_size;