diff --git a/data/interface.ui b/data/interface.ui
index 1198f849d21520ab482cf9a47a62d4e03b820b0e..a0cd5def83b511f921f450e056a338f7d837f8a4 100644
--- a/data/interface.ui
+++ b/data/interface.ui
@@ -1,45 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.20.2 -->
 <interface>
-  <requires lib="gtk+" version="3.10"/>
-  <object class="GtkAboutDialog" id="about">
-    <property name="can_focus">False</property>
-    <property name="type_hint">dialog</property>
-    <property name="program_name">Rugby</property>
-    <property name="copyright" translatable="yes">Copyright © 2012-2017 Bruce Cowan</property>
-    <property name="logo_icon_name">image-missing</property>
-    <property name="license_type">lgpl-3-0</property>
-    <child internal-child="vbox">
-      <object class="GtkBox">
-        <property name="can_focus">False</property>
-        <property name="orientation">vertical</property>
-        <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox">
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <placeholder/>
-        </child>
-      </object>
-    </child>
-    <child>
-      <placeholder/>
-    </child>
-  </object>
+  <requires lib="gtk+" version="3.16"/>
   <object class="GtkAdjustment" id="adjustment1">
     <property name="upper">200</property>
     <property name="step_increment">1</property>
diff --git a/data/menu.ui b/data/menu.ui
new file mode 100644
index 0000000000000000000000000000000000000000..63db880ab1cb507604b2116da2e656d05ced8b40
--- /dev/null
+++ b/data/menu.ui
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<interface>
+  <menu id="appmenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_About</attribute>
+        <attribute name="action">app.about</attribute>
+        <attribute name="accel">&lt;Primary&gt;a</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Quit</attribute>
+        <attribute name="action">app.quit</attribute>
+        <attribute name="accel">&lt;Primary&gt;q</attribute>
+     </item>
+    </section>
+  </menu>
+</interface>
diff --git a/data/rugby.gresource.xml b/data/rugby.gresource.xml
index 1c7c2f84953154abd8f5135f4c2967dde43b4e5d..a32d207dfd12092da5eee2d43420f32eddca92ae 100644
--- a/data/rugby.gresource.xml
+++ b/data/rugby.gresource.xml
@@ -2,6 +2,7 @@
 <gresources>
   <gresource prefix="/uk/me/bcowan/rugby">
     <file preprocess="xml-stripblanks">interface.ui</file>
+    <file preprocess="xml-stripblanks">menu.ui</file>
     <file compressed="true">rugby.css</file>
   </gresource>
 </gresources>
diff --git a/src/rugby-app-window.c b/src/rugby-app-window.c
index 18f4e30d11e54be291ef0aeab99d4dcb762f77be..457cc2c05ffc4ec56080fcff21f524617bc58406 100644
--- a/src/rugby-app-window.c
+++ b/src/rugby-app-window.c
@@ -112,13 +112,6 @@ rugby_app_window_init (RugbyAppWindow *self)
     gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (self->filter),
                                             filter_visible_func, self, NULL);
     gtk_tree_view_set_model (GTK_TREE_VIEW (self->treeview), self->filter);
-
-    GtkCssProvider *provider = gtk_css_provider_new ();
-    gtk_css_provider_load_from_resource (provider, "/uk/me/bcowan/rugby/rugby.css");
-
-    gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
-                                               GTK_STYLE_PROVIDER (provider),
-                                               GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
 }
 
 static void
diff --git a/src/rugby-application.c b/src/rugby-application.c
index 58a74115c760338c8e7ab98c51fa81875dcafd96..96c8b4e0a5aa1064cd81a18d0d35ab77330013ef 100644
--- a/src/rugby-application.c
+++ b/src/rugby-application.c
@@ -11,22 +11,85 @@ struct _RugbyApplication
 G_DEFINE_TYPE (RugbyApplication, rugby_application, GTK_TYPE_APPLICATION);
 
 static void
-rugby_application_init (RugbyApplication *app)
+rugby_application_activate (GApplication *app)
 {
+    RugbyAppWindow *win = rugby_app_window_new (RUGBY_APPLICATION (app));
+    gtk_window_present (GTK_WINDOW (win));
 }
 
 static void
-rugby_application_activate (GApplication *app)
+about_activated (GSimpleAction *simple,
+                 GVariant      *parameter,
+                 gpointer       user_data)
 {
-    RugbyAppWindow *win = rugby_app_window_new (RUGBY_APPLICATION (app));
-    gtk_window_present (GTK_WINDOW (win));
+    GtkApplication *app = GTK_APPLICATION (user_data);
+    GtkWindow *window = gtk_application_get_active_window (app);
+
+    static const gchar *authors[] = { "Bruce Cowan", NULL };
+    g_autoptr (GDateTime) date = g_date_time_new_now_local ();
+    gint year = g_date_time_get_year (date);
+    g_autofree gchar *copyright = g_strdup_printf ("Copyright © 2012–%d Bruce Cowan",
+                                                   year);
+
+    gtk_show_about_dialog (window,
+                           "logo-icon-name", "face-wink",
+                           "program-name", "Rugby",
+                           "copyright", copyright,
+                           "license-type", GTK_LICENSE_LGPL_3_0,
+                           "authors", authors,
+                           "comments", "Rugby scores possiblities program",
+                           NULL);
+
+}
+
+static void
+quit_activated (GSimpleAction *simple,
+                GVariant      *parameter,
+                gpointer       user_data)
+{
+    g_application_quit (G_APPLICATION (user_data));
+}
+
+static const GActionEntry app_entries[] =
+{
+    { "about", about_activated, NULL, NULL, NULL },
+    { "quit", quit_activated, NULL, NULL, NULL }
+};
+
+static void
+rugby_application_startup (GApplication *app)
+{
+    G_APPLICATION_CLASS (rugby_application_parent_class)->startup (app);
+
+    g_action_map_add_action_entries (G_ACTION_MAP (app),
+                                     app_entries, G_N_ELEMENTS (app_entries),
+                                     app);
+
+    g_autoptr (GtkBuilder) builder = gtk_builder_new_from_resource ("/uk/me/bcowan/rugby/menu.ui");
+    GMenuModel *app_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "appmenu"));
+    gtk_application_set_app_menu (GTK_APPLICATION (app), app_menu);
+
+    // CSS styling
+    g_autoptr (GtkCssProvider) provider = gtk_css_provider_new ();
+    gtk_css_provider_load_from_resource (provider, "/uk/me/bcowan/rugby/rugby.css");
+
+    gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+                                               GTK_STYLE_PROVIDER (provider),
+                                               GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
 }
 
 static void
 rugby_application_class_init (RugbyApplicationClass *klass)
 {
     GApplicationClass *app_class = G_APPLICATION_CLASS (klass);
+
     app_class->activate = rugby_application_activate;
+    app_class->startup = rugby_application_startup;
+}
+
+static void
+rugby_application_init (RugbyApplication *self)
+{
 }
 
 RugbyApplication *