def groups(self):
        groups = OrderedDict()

        for compo in self.components:
            if getattr(compo, 'menu_group', None):
                groups.setdefault(compo.menu_group, {}).setdefault('components', []).append(compo)
                groups[compo.menu_group]['icon'] = getattr(compo, 'icon', None)
                groups[compo.menu_group]['type'] = 'group'
                group_name = compo.menu_group
                if type(compo.menu_group) is tuple:
                    group_name, groups[compo.menu_group]['selection'] = group_name

                groups[compo.menu_group]['name'] = group_name
            else:
                groups.setdefault(compo.cid, {}).setdefault('components', []).append(compo)
                groups[compo.cid]['type'] = 'entry'

        return groups.values()