diff --git a/gtk/gtkapplicationwindow.c b/gtk/gtkapplicationwindow.c
index cb4ed3d..a94b610 100644
--- a/gtk/gtkapplicationwindow.c
+++ b/gtk/gtkapplicationwindow.c
@@ -98,6 +98,7 @@ struct _GtkApplicationWindowPrivate
   GMenu *app_menu_section;
   GMenu *menubar_section;
   gboolean show_menubar;
+  gchar *variant;
 };
 
 static void
@@ -185,9 +186,11 @@ gtk_application_window_update_shell_shows_menubar (GtkApplicationWindow *window,
       /* the shell does not show it, so make sure we show it */
       if (g_menu_model_get_n_items (G_MENU_MODEL (window->priv->menubar_section)) == 0)
         {
+          const gchar *id;
           GMenuModel *menubar;
 
-          menubar = g_application_get_menubar (G_APPLICATION (gtk_window_get_application (GTK_WINDOW (window))));
+          id = window->priv->variant ? window->priv->variant : "MenuBar";
+          menubar = g_application_get_menu (G_APPLICATION (gtk_window_get_application (GTK_WINDOW (window))), id);
 
           if (menubar != NULL)
             g_menu_append_section (window->priv->menubar_section, NULL, menubar);
@@ -195,6 +198,24 @@ gtk_application_window_update_shell_shows_menubar (GtkApplicationWindow *window,
     }
 }
 
+static void
+gtk_application_window_update_variant (GtkApplicationWindow *window)
+{
+  if (g_menu_model_get_n_items (G_MENU_MODEL (window->priv->menubar_section)) != 0)
+    {
+      const gchar *id;
+      GMenuModel *menubar;
+
+      g_menu_remove (window->priv->menubar_section, 0);
+
+      id = window->priv->variant ? window->priv->variant : "MenuBar";
+      menubar = g_application_get_menu (G_APPLICATION (gtk_window_get_application (GTK_WINDOW (window))), id);
+
+      if (menubar != NULL)
+        g_menu_append_section (window->priv->menubar_section, NULL, menubar);
+    }
+}
+
 typedef struct {
   GClosure closure;
   gchar *action_name;
@@ -435,6 +456,7 @@ G_DEFINE_TYPE_WITH_CODE (GtkApplicationWindow, gtk_application_window, GTK_TYPE_
 enum {
   PROP_0,
   PROP_SHOW_MENUBAR,
+  PROP_VARIANT,
   N_PROPS
 };
 static GParamSpec *gtk_application_window_properties[N_PROPS];
@@ -653,6 +675,10 @@ gtk_application_window_get_property (GObject    *object,
       g_value_set_boolean (value, window->priv->show_menubar);
       break;
 
+    case PROP_VARIANT:
+      g_value_set_string (value, window->priv->variant);
+      break;
+
     default:
       g_assert_not_reached ();
     }
@@ -672,6 +698,10 @@ gtk_application_window_set_property (GObject      *object,
       gtk_application_window_set_show_menubar (window, g_value_get_boolean (value));
       break;
 
+    case PROP_VARIANT:
+      gtk_application_window_set_variant (window, g_value_get_string (value));
+      break;
+
     default:
       g_assert_not_reached ();
     }
@@ -696,6 +726,9 @@ gtk_application_window_dispose (GObject *object)
   g_clear_object (&window->priv->accels);
   g_clear_object (&window->priv->muxer);
 
+  g_free (window->priv->variant);
+  window->priv->variant = NULL;
+
   G_OBJECT_CLASS (gtk_application_window_parent_class)
     ->dispose (object);
 }
@@ -761,6 +794,11 @@ gtk_application_window_class_init (GtkApplicationWindowClass *class)
                           P_("TRUE if the window should show a "
                              "menubar at the top of the window"),
                           TRUE, G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
+  gtk_application_window_properties[PROP_VARIANT] =
+    g_param_spec_string ("variant",
+                         P_("Window variant"),
+                         P_("Window variant"),
+                         NULL, G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
   g_object_class_install_properties (object_class, N_PROPS, gtk_application_window_properties);
   g_type_class_add_private (class, sizeof (GtkApplicationWindowPrivate));
 }
@@ -829,3 +867,25 @@ gtk_application_window_set_show_menubar (GtkApplicationWindow *window,
       g_object_notify_by_pspec (G_OBJECT (window), gtk_application_window_properties[PROP_SHOW_MENUBAR]);
     }
 }
+
+void
+gtk_application_window_set_variant (GtkApplicationWindow *window,
+                                    const gchar          *variant)
+{
+  g_return_if_fail (GTK_IS_APPLICATION_WINDOW (window));
+
+  g_free (window->priv->variant);
+  window->priv->variant = g_strdup (variant);
+
+  gtk_application_window_update_variant (window);
+
+  g_object_notify_by_pspec (G_OBJECT (window), gtk_application_window_properties[PROP_VARIANT]);
+}
+
+const gchar *
+gtk_application_window_get_variant (GtkApplicationWindow *window)
+{
+  g_return_val_if_fail (GTK_IS_APPLICATION_WINDOW (window), NULL);
+
+  return window->priv->variant;
+}
diff --git a/gtk/gtkapplicationwindow.h b/gtk/gtkapplicationwindow.h
index 4210a18..3de073c 100644
--- a/gtk/gtkapplicationwindow.h
+++ b/gtk/gtkapplicationwindow.h
@@ -64,6 +64,9 @@ GtkWidget * gtk_application_window_new               (GtkApplication      *appli
 void        gtk_application_window_set_show_menubar (GtkApplicationWindow *window,
                                                      gboolean              show_menubar);
 gboolean    gtk_application_window_get_show_menubar (GtkApplicationWindow *window);
+void        gtk_application_window_set_variant      (GtkApplicationWindow *window,
+                                                     const gchar          *variant);
+const gchar *gtk_application_window_get_variant     (GtkApplicationWindow *window);
 
 G_END_DECLS
 
