#include "util/annotate.h"
 #include "util/annotate-data.h"
 #include "util/evsel.h"
+#include "util/evlist.h"
 #include "util/sort.h"
 
 struct annotated_data_browser {
        struct ui_browser b;
        struct list_head entries;
+       int nr_events;
 };
 
 struct browser_entry {
        struct list_head node;
        struct annotated_member *data;
-       struct type_hist_entry hists;
+       struct type_hist_entry *hists;
        int indent;
 };
 
+static struct annotated_data_browser *get_browser(struct ui_browser *uib)
+{
+       return container_of(uib, struct annotated_data_browser, b);
+}
+
 static void update_hist_entry(struct type_hist_entry *dst,
                              struct type_hist_entry *src)
 {
 
 static int get_member_overhead(struct annotated_data_type *adt,
                               struct browser_entry *entry,
-                              struct evsel *evsel)
+                              struct evsel *leader)
 {
        struct annotated_member *member = entry->data;
-       int i;
+       int i, k;
 
        for (i = 0; i < member->size; i++) {
                struct type_hist *h;
+               struct evsel *evsel;
                int offset = member->offset + i;
 
-               h = adt->histograms[evsel->core.idx];
-               update_hist_entry(&entry->hists, &h->addr[offset]);
+               for_each_group_evsel(evsel, leader) {
+                       h = adt->histograms[evsel->core.idx];
+                       k = evsel__group_idx(evsel);
+                       update_hist_entry(&entry->hists[k], &h->addr[offset]);
+               }
        }
        return 0;
 }
        if (entry == NULL)
                return -1;
 
+       entry->hists = calloc(browser->nr_events, sizeof(*entry->hists));
+       if (entry->hists == NULL) {
+               free(entry);
+               return -1;
+       }
+
        entry->data = member;
        entry->indent = indent;
        if (get_member_overhead(adt, entry, evsel) < 0) {
 
        list_for_each_entry_safe(pos, tmp, &browser->entries, node) {
                list_del_init(&pos->node);
+               free(pos->hists);
                free(pos);
        }
 }
 {
        struct hist_entry *he = uib->priv;
        struct annotated_data_type *adt = he->mem_type;
+       struct annotated_data_browser *browser = get_browser(uib);
        const char *help = "Press 'h' for help on key bindings";
        char title[256];
 
        else
                strcpy(title, "Percent");
 
-       ui_browser__printf(uib, " %10s %10s %10s  %s",
+       ui_browser__printf(uib, "%*s %10s %10s %10s  %s",
+                          11 * (browser->nr_events - 1), "",
                           title, "Offset", "Size", "Field");
        ui_browser__write_nstring(uib, "", uib->width);
        return 0;
 
 static void browser__write(struct ui_browser *uib, void *entry, int row)
 {
+       struct annotated_data_browser *browser = get_browser(uib);
        struct browser_entry *be = entry;
        struct annotated_member *member = be->data;
        struct hist_entry *he = uib->priv;
        struct annotated_data_type *adt = he->mem_type;
-       struct evsel *evsel = hists_to_evsel(he->hists);
+       struct evsel *leader = hists_to_evsel(he->hists);
+       struct evsel *evsel;
 
        if (member == NULL) {
                bool current = ui_browser__is_current_entry(uib, row);
 
                /* print the closing bracket */
                ui_browser__set_percent_color(uib, 0, current);
-               ui_browser__write_nstring(uib, "", 11);
+               ui_browser__write_nstring(uib, "", 11 * browser->nr_events);
                ui_browser__printf(uib, " %10s %10s  %*s};",
                                   "", "", be->indent * 4, "");
                ui_browser__write_nstring(uib, "", uib->width);
        }
 
        /* print the number */
-       browser__write_overhead(uib, adt->histograms[evsel->core.idx],
-                               &be->hists, row);
+       for_each_group_evsel(evsel, leader) {
+               struct type_hist *h = adt->histograms[evsel->core.idx];
+               int idx = evsel__group_idx(evsel);
+
+               browser__write_overhead(uib, h, &be->hists[idx], row);
+       }
 
        /* print type info */
        if (be->indent == 0 && !member->var_name) {
                        .priv    = he,
                        .extra_title_lines = 1,
                },
+               .nr_events = 1,
        };
        int ret;
 
        ui_helpline__push("Press ESC to exit");
 
+       if (evsel__is_group_event(evsel))
+               browser.nr_events = evsel->core.nr_members;
+
        ret = annotated_data_browser__collect_entries(&browser);
        if (ret == 0)
                ret = annotated_data_browser__run(&browser, evsel, hbt);