diff --git a/src/html/elements.zig b/src/html/elements.zig
index 2357e9d4..ed6f6e76 100644
--- a/src/html/elements.zig
+++ b/src/html/elements.zig
@@ -495,7 +495,7 @@ pub fn toInterface(comptime T: type, e: *parser.Element) !T {
const elem: *align(@alignOf(*parser.Element)) parser.Element = @alignCast(e);
const tag = try parser.elementHTMLGetTagType(@as(*parser.ElementHTML, @ptrCast(elem)));
return switch (tag) {
- .abbr, .acronym, .address, .article, .aside, .b, .bdi, .bdo, .bgsound, .big, .center, .cite, .code, .dd, .details, .dfn, .dt, .em, .figcaption, .figure, .footer, .header, .hgroup, .i, .isindex, .kbd, .main, .mark, .marquee, .nav, .nobr, .noframes, .noscript, .rp, .rt, .ruby, .s, .samp, .section, .small, .spacer, .strike, .strong, .sub, .summary, .sup, .tt, .u, .wbr, ._var => .{ .HTMLElement = @as(*parser.ElementHTML, @ptrCast(elem)) },
+ .abbr, .acronym, .address, .article, .aside, .b, .bdi, .bdo, .bgsound, .big, .center, .cite, .code, .dd, .details, .dfn, .dt, .em, .figcaption, .figure, .footer, .header, .hgroup, .i, .isindex, .kbd, .main, .mark, .marquee, .menu, .menuitem, .nav, .nobr, .noframes, .noscript, .rp, .rt, .ruby, .s, .samp, .section, .small, .spacer, .strike, .strong, .sub, .summary, .sup, .tt, .u, .wbr, ._var => .{ .HTMLElement = @as(*parser.ElementHTML, @ptrCast(elem)) },
.a => .{ .HTMLAnchorElement = @as(*parser.Anchor, @ptrCast(elem)) },
.area => .{ .HTMLAreaElement = @as(*parser.Area, @ptrCast(elem)) },
.audio => .{ .HTMLAudioElement = @as(*parser.Audio, @ptrCast(elem)) },
diff --git a/src/netsurf.zig b/src/netsurf.zig
index a8a590d3..176db389 100644
--- a/src/netsurf.zig
+++ b/src/netsurf.zig
@@ -154,6 +154,8 @@ pub const Tag = enum(u8) {
main = c.DOM_HTML_ELEMENT_TYPE_MAIN,
map = c.DOM_HTML_ELEMENT_TYPE_MAP,
mark = c.DOM_HTML_ELEMENT_TYPE_MARK,
+ menu = c.DOM_HTML_ELEMENT_TYPE_MENU,
+ menuitem = c.DOM_HTML_ELEMENT_TYPE_MENUITEM,
meta = c.DOM_HTML_ELEMENT_TYPE_META,
meter = c.DOM_HTML_ELEMENT_TYPE_METER,
nav = c.DOM_HTML_ELEMENT_TYPE_NAV,