diff --git a/example.c b/example.c
index fb8a0e3ab5efcefb43c8afedfe1ae017e63eac82..62d6c51dc194c1b5a687820da58231ed3758798f 100644
--- a/example.c
+++ b/example.c
@@ -5,6 +5,12 @@
 
 static struct tray tray;
 
+static void toggle_cb(struct tray_menu *item) {
+  printf("toggle cb\n");
+  item->checked = !item->checked;
+  tray_update(&tray);
+}
+
 static void hello_cb(struct tray_menu *item) {
   printf("hello cb\n");
   if (strcmp(tray.icon, "indicator-messages") == 0) {
@@ -21,9 +27,12 @@ static void quit_cb(struct tray_menu *item) {
 }
 
 static struct tray tray = {
-    .menu = (struct tray_menu[]){{NULL, "Hello", 0, hello_cb, NULL},
-                                 {NULL, "Quit", 0, quit_cb, NULL},
-                                 {NULL, NULL, 0, NULL, NULL}},
+    .menu = (struct tray_menu[]){{"Hello", 0, 0, hello_cb, NULL},
+                                 {"Checked", 0, 1, toggle_cb, NULL},
+                                 {"Disabled", 1, 0, NULL, NULL},
+                                 {"-", 0, 0, NULL, NULL},
+                                 {"Quit", 0, 0, quit_cb, NULL},
+                                 {NULL, 0, 0, NULL, NULL}},
 };
 
 int main(int argc, char *argv[]) {
diff --git a/tray.h b/tray.h
index d5f0b534a935b7379558b86698268fe33034b71c..6d83a49931b7a2d083e2a1ed57fc19c56569a3be 100644
--- a/tray.h
+++ b/tray.h
@@ -10,9 +10,9 @@ struct tray {
 };
 
 struct tray_menu {
-  char *icon;
-  char *text; /* label */
-  int flags;
+  char *text;
+  int disabled;
+  int checked;
 
   void (*cb)(struct tray_menu *);
   void *context;
@@ -52,12 +52,15 @@ static int tray_loop(int blocking) {
 }
 
 static void tray_update(struct tray *tray) {
-  struct tray_menu *m;
-
   app_indicator_set_icon(indicator, tray->icon);
   GtkMenuShell *gtk_menu = (GtkMenuShell *)gtk_menu_new();
   for (struct tray_menu *m = tray->menu; m != NULL && m->text != NULL; m++) {
-    GtkWidget *item = gtk_menu_item_new_with_label(m->text);
+    GtkWidget *item;
+    if (strcmp(m->text, "-") == 0) {
+      item = gtk_separator_menu_item_new();
+    } else {
+      item = gtk_menu_item_new_with_label(m->text);
+    }
     gtk_widget_show(item);
     gtk_menu_shell_append(GTK_MENU_SHELL(gtk_menu), item);
     if (m->cb != NULL) {
@@ -127,17 +130,19 @@ static void tray_update(struct tray *tray) {
   [menu autorelease];
   [menu setAutoenablesItems:NO];
   for (struct tray_menu *m = tray->menu; m != NULL && m->text != NULL; m++) {
-    NSMenuItem *menuItem = [NSMenuItem alloc];
-    [menuItem autorelease];
-    [menuItem initWithTitle:[NSString stringWithUTF8String:m->text]
-                     action:@selector(menuCallback:)
-              keyEquivalent:@""];
-    [menuItem setEnabled:YES];
-    [menuItem setRepresentedObject:[NSValue valueWithPointer:m]];
-
-    [menu addItem:menuItem];
-
-    //[menu addItem:[NSMenuItem separatorItem]];
+    if (strcmp(m->text, "-") == 0) {
+      [menu addItem:[NSMenuItem separatorItem]];
+    } else {
+      NSMenuItem *menuItem = [NSMenuItem alloc];
+      [menuItem autorelease];
+      [menuItem initWithTitle:[NSString stringWithUTF8String:m->text]
+                       action:@selector(menuCallback:)
+                keyEquivalent:@""];
+      [menuItem setEnabled:YES];
+      [menuItem setRepresentedObject:[NSValue valueWithPointer:m]];
+
+      [menu addItem:menuItem];
+    }
   }
 
   [statusItem setMenu:menu];
@@ -146,9 +151,10 @@ static void tray_update(struct tray *tray) {
 static void tray_exit() { [NSApp terminate:NSApp]; }
 
 #elif defined(TRAY_WINAPI)
-#include <shellapi.h>
 #include <windows.h>
 
+#include <shellapi.h>
+
 #define WM_TRAY_CALLBACK_MESSAGE (WM_USER + 1)
 #define WC_TRAY_CLASS_NAME "TRAY"
 #define ID_TRAY_FIRST 1000
@@ -234,18 +240,22 @@ static int tray_loop(int blocking) {
 static void tray_update(struct tray *tray) {
   int i = 0;
   hmenu = CreatePopupMenu();
-  for (struct tray_menu *m = tray->menu; m != NULL && m->text != NULL; m++) {
-    MENUITEMINFO *item = (MENUITEMINFO *)malloc(sizeof(MENUITEMINFO));
-    item->cbSize = sizeof(MENUITEMINFO);
-    item->fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA;
-    item->fType = 0;
-    item->fState = 0;
-    item->wID = i + ID_TRAY_FIRST;
-    item->dwTypeData = m->text;
-    item->dwItemData = (ULONG_PTR)m;
-
-    InsertMenuItem(hmenu, i, TRUE, item);
-    i++;
+  for (struct tray_menu *m = tray->menu; m != NULL && m->text != NULL;
+       m++, i++) {
+    if (strcmp(m->text, "-") == 0) {
+      InsertMenu(hmenu, i, MF_SEPARATOR, TRUE, "");
+    } else {
+      MENUITEMINFO *item = (MENUITEMINFO *)malloc(sizeof(MENUITEMINFO));
+      item->cbSize = sizeof(MENUITEMINFO);
+      item->fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA;
+      item->fType = 0;
+      item->fState = 0;
+      item->wID = i + ID_TRAY_FIRST;
+      item->dwTypeData = m->text;
+      item->dwItemData = (ULONG_PTR)m;
+
+      InsertMenuItem(hmenu, i, TRUE, item);
+    }
   }
   SendMessage(hwnd, WM_INITMENUPOPUP, (WPARAM)hmenu, 0);
   ExtractIconEx(tray->icon, 0, NULL, &(nid.hIcon), 1);