It seems GetLayout() implementation in dbusmenu-glib is buggy: it ignores the parentId parameter. Getting first level of items for gedit: # dbus-send --print-reply --dest=:1.442 /com/canonical/menu/7C000A3 com.canonical.dbusmenu.GetLayout int32:0 int32:1 'array:string:' method return sender=:1.442 -> dest=:1.455 reply_serial=2 uint32 2 struct { int32 0 array [ dict entry( string "children-display" variant string "submenu" ) ] array [ variant struct { int32 2 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "File" ) ] array [ ] } variant struct { int32 3 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Edit" ) ] array [ ] } variant struct { int32 4 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "View" ) ] array [ ] } variant struct { int32 5 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Search" ) ] array [ ] } variant struct { int32 6 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Tools" ) ] array [ ] } variant struct { int32 7 array [ dict entry( string "enabled" variant boolean true ) dict entry( string "type" variant string "separator" ) dict entry( string "visible" variant boolean false ) ] array [ ] } variant struct { int32 8 array [ dict entry( string "enabled" variant boolean true ) dict entry( string "type" variant string "separator" ) dict entry( string "visible" variant boolean false ) ] array [ ] } variant struct { int32 9 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Documents" ) ] array [ ] } variant struct { int32 10 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Help" ) ] array [ ] } ] } Getting content of the "File" submenu (id=2): # dbus-send --print-reply --dest=:1.442 /com/canonical/menu/7C000A3 com.canonical.dbusmenu.GetLayout int32:2 int32:1 'array:string:' Returns exactly the same tree.