[shotwell] Remove GtkUIManager and Gtk*Action*



commit 17c8587e485cc8fad18abdecc2d6fa603416c973
Author: Jens Georg <mail jensge org>
Date:   Wed Oct 19 21:56:15 2016 +0200

    Remove GtkUIManager and Gtk*Action*
    
    https://bugzilla.gnome.org/show_bug.cgi?id=768271
    
    Signed-off-by: Jens Georg <mail jensge org>

 shotwell.am                          |    7 +-
 src/AppWindow.vala                   |  179 ++--------
 src/Application.vala                 |    4 +
 src/CollectionPage.vala              |  217 +++++--------
 src/MediaPage.vala                   |  447 ++++++-------------------
 src/Page.vala                        |  389 +++++++++++++---------
 src/PhotoPage.vala                   |  459 ++++++-------------------
 src/Resources.vala                   |   21 --
 src/SearchFilter.vala                |  355 +++++++-------------
 src/camera/ImportPage.vala           |   58 ++--
 src/direct/DirectPhotoPage.vala      |  207 ++----------
 src/events/EventPage.vala            |   26 +-
 src/events/EventsDirectoryPage.vala  |   76 ++---
 src/library/ImportQueuePage.vala     |   20 +-
 src/library/LibraryWindow.vala       |  395 ++++++++--------------
 src/library/OfflinePage.vala         |   29 +-
 src/library/TrashPage.vala           |   35 +--
 src/org.gnome.Shotwell.gresource.xml |    4 +
 src/searches/Branch.vala             |   36 +--
 src/searches/SavedSearchPage.vala    |   40 +--
 src/sidebar/Tree.vala                |   44 ++--
 src/tags/Branch.vala                 |   38 +--
 src/tags/TagPage.vala                |   52 ++--
 src/util/ui.vala                     |   10 -
 ui/collection.ui                     |  276 ++++++++++++---
 ui/direct.ui                         |  267 +++++++++++----
 ui/direct_context.ui                 |   42 ++-
 ui/event.ui                          |  618 ++++++++++++++++++++++++++++++++--
 ui/events_directory.ui               |  255 +++++++++++----
 ui/import.ui                         |  285 ++++++++++++----
 ui/import_queue.ui                   |  123 +++++--
 ui/media.ui                          |  552 +++++++++++++++++++++++-------
 ui/offline.ui                        |  319 ++++++++++++++----
 ui/photo.ui                          |  537 ++++++++++++++++++++++-------
 ui/photo_context.ui                  |  182 ++++++++--
 ui/savedsearch.ui                    |   30 ++-
 ui/search_bar.ui                     |   67 +++-
 ui/search_sidebar_context.ui         |   18 +-
 ui/set_background_dialog.ui          |   11 +-
 ui/sidebar_default_context.ui        |   22 +-
 ui/tag_sidebar_context.ui            |   17 +-
 ui/tags.ui                           |  470 ++++++++++++++++++++++++--
 ui/top.ui                            |   57 +++-
 ui/trash.ui                          |  405 ++++++++++++++++++-----
 44 files changed, 4772 insertions(+), 2929 deletions(-)
---
diff --git a/shotwell.am b/shotwell.am
index d1b64ef..6f8250d 100644
--- a/shotwell.am
+++ b/shotwell.am
@@ -24,7 +24,12 @@ nodist_shotwell_SOURCES = \
        src/resource.c
 MOSTLYCLEANFILES += src/resource.c
 
-src/resource.c: src/org.gnome.Shotwell.gresource.xml
+shotwell_resource_deps = $(shell $(GLIB_COMPILE_RESOURCES) \
+               --sourcedir=$(abs_top_srcdir)/icons \
+               --sourcedir=$(abs_top_srcdir)/ui \
+               --generate-dependencies src/org.gnome.Shotwell.gresource.xml)
+
+src/resource.c: src/org.gnome.Shotwell.gresource.xml $(shotwell_resource_deps)
        $(AM_V_GEN)$(GLIB_COMPILE_RESOURCES) --target=$@ \
                --sourcedir=$(abs_top_srcdir)/icons \
                --sourcedir=$(abs_top_srcdir)/ui \
diff --git a/src/AppWindow.vala b/src/AppWindow.vala
index 0103300..677a1c6 100644
--- a/src/AppWindow.vala
+++ b/src/AppWindow.vala
@@ -19,26 +19,17 @@ public class FullscreenWindow : PageWindow {
     private bool switched_to = false;
     private bool is_toolbar_dismissal_enabled;
 
+    private const GLib.ActionEntry[] entries = {
+        { "LeaveFullscreen", on_close }
+    };
+
     public FullscreenWindow(Page page) {
         set_current_page(page);
 
-        File ui_file = Resources.get_ui("fullscreen.ui");
+        AppWindow.get_instance().add_action_entries (entries, this);
+        const string[] accels = { "F11" };
+        Application.set_accels_for_action ("win.LeaveFullscreen", accels);
 
-        try {
-            ui.add_ui_from_file(ui_file.get_path());
-        } catch (Error err) {
-            error("Error loading UI file %s: %s", ui_file.get_path(), err.message);
-        }
-        
-        Gtk.ActionGroup action_group = new Gtk.ActionGroup("FullscreenActionGroup");
-        action_group.add_actions(create_actions(), this);
-        ui.insert_action_group(action_group, 0);
-        ui.ensure_update();
-
-        Gtk.AccelGroup accel_group = ui.get_accel_group();
-        if (accel_group != null)
-            add_accel_group(accel_group);
-        
         set_screen(AppWindow.get_instance().get_screen());
         
         // Needed so fullscreen will occur on correct monitor in multi-monitor setups
@@ -58,7 +49,7 @@ public class FullscreenWindow : PageWindow {
         
         close_button.set_icon_name("view-restore");
         close_button.set_tooltip_text(_("Leave fullscreen"));
-        close_button.clicked.connect(on_close);
+        close_button.set_action_name ("win.LeaveFullscreen");
         
         toolbar = page.get_toolbar();
         toolbar.set_show_arrow(false);
@@ -130,18 +121,6 @@ public class FullscreenWindow : PageWindow {
         
         return result;
     }
-    
-    private Gtk.ActionEntry[] create_actions() {
-        Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-        
-        Gtk.ActionEntry leave_fullscreen = { "LeaveFullscreen", Resources.LEAVE_FULLSCREEN_LABEL,
-            TRANSLATABLE, "F11", TRANSLATABLE, on_close };
-        leave_fullscreen.label = Resources.LEAVE_FULLSCREEN_LABEL;
-        leave_fullscreen.tooltip = Resources.LEAVE_FULLSCREEN_LABEL;
-        actions += leave_fullscreen;
-
-        return actions;
-    }
 
     public override bool key_press_event(Gdk.EventKey event) {
         // check for an escape/abort 
@@ -289,9 +268,7 @@ public class FullscreenWindow : PageWindow {
 // subclass.  A subclass should set current_page to the user-visible Page for it to receive
 // various notifications.  It is the responsibility of the subclass to notify Pages when they're
 // switched to and from, and other aspects of the Page interface.
-public abstract class PageWindow : Gtk.Window {
-    protected Gtk.UIManager ui = new Gtk.UIManager();
-
+public abstract class PageWindow : Gtk.ApplicationWindow {
     private Page current_page = null;
     private int busy_counter = 0;
     
@@ -302,12 +279,6 @@ public abstract class PageWindow : Gtk.Window {
         // the current page needs to know when modifier keys are pressed
         add_events(Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK
             | Gdk.EventMask.STRUCTURE_MASK);
-            
-        set_has_resize_grip(false);
-    }
-    
-    public Gtk.UIManager get_ui_manager() {
-        return ui;
     }
     
     public Page? get_current_page() {
@@ -416,14 +387,11 @@ public abstract class AppWindow : PageWindow {
     
     // the AppWindow maintains its own UI manager because the first UIManager an action group is
     // added to is the one that claims its accelerators
-    protected Gtk.ActionGroup[] common_action_groups;
     protected bool maximized = false;
     protected Dimensions dimensions;
     protected int pos_x = 0;
     protected int pos_y = 0;
     
-    private Gtk.ActionGroup common_action_group = new Gtk.ActionGroup("AppWindowGlobalActionGroup");
-    
     public AppWindow() {
         // although there are multiple AppWindow types, only one may exist per-process
         assert(instance == null);
@@ -454,18 +422,8 @@ public abstract class AppWindow : PageWindow {
         // UIManager.  In order to activate those accelerators, we need to create a dummy UI string
         // that lists all the common actions.  We build it on-the-fly from the actions associated
         // with each ActionGroup while we're adding the groups to the UIManager.
-        common_action_groups = create_common_action_groups();
-        foreach (Gtk.ActionGroup group in common_action_groups)
-            ui.insert_action_group(group, 0);
-        
-        try {
-            ui.add_ui_from_string(build_dummy_ui_string(common_action_groups), -1);
-        } catch (Error err) {
-            error("Unable to add AppWindow UI: %s", err.message);
-        }
-        
-        ui.ensure_update();
-        add_accel_group(ui.get_accel_group());
+
+        add_actions ();
         
         Gtk.CssProvider provider = new Gtk.CssProvider();
         try {
@@ -475,67 +433,20 @@ public abstract class AppWindow : PageWindow {
             debug("Unable to load custom CSS: %s", err.message);
         }
     }
-    
-    private Gtk.ActionEntry[] create_common_actions() {
-        Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-        
-        Gtk.ActionEntry quit = { "CommonQuit", Resources.QUIT_LABEL, TRANSLATABLE, "<Ctrl>Q",
-            TRANSLATABLE, on_quit };
-        quit.label = Resources.QUIT_LABEL;
-        actions += quit;
-
-        Gtk.ActionEntry about = { "CommonAbout", Resources.ABOUT_LABEL, TRANSLATABLE, null,
-            TRANSLATABLE, on_about };
-        about.label = Resources.ABOUT_LABEL;
-        actions += about;
 
-        Gtk.ActionEntry fullscreen = { "CommonFullscreen", Resources.FULLSCREEN_LABEL,
-            TRANSLATABLE, "F11", TRANSLATABLE, on_fullscreen };
-        fullscreen.label = Resources.FULLSCREEN_LABEL;
-        actions += fullscreen;
+    private const GLib.ActionEntry[] common_actions = {
+        { "CommonQuit", on_quit },
+        { "CommonFullscreen", on_fullscreen },
+        { "CommonHelpContents", on_help_contents },
+        { "CommonHelpFAQ", on_help_faq },
+        { "CommonHelpReportProblem", on_help_report_problem },
+        { "CommonUndo", on_undo },
+        { "CommonRedo", on_redo },
+        { "CommonJumpToFile", on_jump_to_file },
+        { "CommonSelectAll", on_select_all },
+        { "CommonSelectNone", on_select_none }
+    };
 
-        Gtk.ActionEntry help_contents = { "CommonHelpContents", Resources.HELP_LABEL,
-            TRANSLATABLE, "F1", TRANSLATABLE, on_help_contents };
-        help_contents.label = _("_Contents");
-        actions += help_contents;
-        
-        Gtk.ActionEntry help_faq = { "CommonHelpFAQ", null, TRANSLATABLE, null, 
-            TRANSLATABLE, on_help_faq };
-        help_faq.label = _("_Frequently Asked Questions");
-        actions += help_faq;
-        
-        Gtk.ActionEntry help_report_problem = { "CommonHelpReportProblem", null, TRANSLATABLE, null, 
-            TRANSLATABLE, on_help_report_problem };
-        help_report_problem.label = _("_Report a Problem…");
-        actions += help_report_problem;
-
-        Gtk.ActionEntry undo = { "CommonUndo", Resources.UNDO_MENU, TRANSLATABLE, "<Ctrl>Z",
-            TRANSLATABLE, on_undo };
-        undo.label = Resources.UNDO_MENU;
-        actions += undo;
-        
-        Gtk.ActionEntry redo = { "CommonRedo", Resources.REDO_MENU, TRANSLATABLE, "<Ctrl><Shift>Z",
-            TRANSLATABLE, on_redo };
-        redo.label = Resources.REDO_MENU;
-        actions += redo;
-
-        Gtk.ActionEntry jump_to_file = { "CommonJumpToFile", Resources.JUMP_TO_FILE_MENU, TRANSLATABLE, 
-            "<Ctrl><Shift>M", TRANSLATABLE, on_jump_to_file };
-        jump_to_file.label = Resources.JUMP_TO_FILE_MENU;
-        actions += jump_to_file;
-        
-        Gtk.ActionEntry select_all = { "CommonSelectAll", Resources.SELECT_ALL_MENU, TRANSLATABLE,
-            "<Ctrl>A", TRANSLATABLE, on_select_all };
-        select_all.label = Resources.SELECT_ALL_MENU;
-        actions += select_all;
-        
-        Gtk.ActionEntry select_none = { "CommonSelectNone", null, null,
-            "<Ctrl><Shift>A", TRANSLATABLE, on_select_none };
-        actions += select_none;
-        
-        return actions;
-    }
-    
     protected abstract void on_fullscreen();
     
     public static bool has_instance() {
@@ -747,22 +658,10 @@ public abstract class AppWindow : PageWindow {
         sys_show_uri(get_window().get_screen(), url);
     }
     
-    protected virtual Gtk.ActionGroup[] create_common_action_groups() {
-        Gtk.ActionGroup[] groups = new Gtk.ActionGroup[0];
-        
-        common_action_group.add_actions(create_common_actions(), this);
-        groups += common_action_group;
-        
-        return groups;
-    }
-    
-    public Gtk.ActionGroup[] get_common_action_groups() {
-        return common_action_groups;
-    }
-    
-    public virtual void replace_common_placeholders(Gtk.UIManager ui) {
+    protected virtual void add_actions () {
+        this.add_action_entries (AppWindow.common_actions, this);
     }
-    
+
     public void go_fullscreen(Page page) {
         // if already fullscreen, use that
         if (fullscreen_window != null) {
@@ -801,34 +700,26 @@ public abstract class AppWindow : PageWindow {
         present();
     }
     
-    public Gtk.Action? get_common_action(string name) {
-        foreach (Gtk.ActionGroup group in common_action_groups) {
-            Gtk.Action? action = group.get_action(name);
-            if (action != null)
-                return action;
-        }
-        
-        warning("No common action found: %s", name);
-        
-        return null;
+    public GLib.Action? get_common_action(string name) {
+        return lookup_action (name);
     }
     
     public void set_common_action_sensitive(string name, bool sensitive) {
-        Gtk.Action? action = get_common_action(name);
+        var action = get_common_action(name) as GLib.SimpleAction;
         if (action != null)
-            action.sensitive = sensitive;
+            action.set_enabled (sensitive);
     }
     
     public void set_common_action_important(string name, bool important) {
-        Gtk.Action? action = get_common_action(name);
+        var action = get_common_action(name) as GLib.SimpleAction;
         if (action != null)
-            action.is_important = important;
+            action.set_enabled (sensitive);
     }
     
     public void set_common_action_visible(string name, bool visible) {
-        Gtk.Action? action = get_common_action(name);
+        var action = get_common_action(name) as GLib.SimpleAction;
         if (action != null)
-            action.visible = visible;
+            action.set_enabled (sensitive);
     }
     
     protected override void switched_pages(Page? old_page, Page? new_page) {
@@ -891,6 +782,7 @@ public abstract class AppWindow : PageWindow {
     
     private void decorate_command_manager_action(string name, string prefix,
         string default_explanation, CommandDescription? desc) {
+#if 0
         Gtk.Action? action = get_common_action(name);
         if (action == null)
             return;
@@ -904,6 +796,7 @@ public abstract class AppWindow : PageWindow {
             action.tooltip = default_explanation;
             action.sensitive = false;
         }
+#endif
     }
     
     public void decorate_undo_action() {
diff --git a/src/Application.vala b/src/Application.vala
index fe3e3e9..21055dd 100644
--- a/src/Application.vala
+++ b/src/Application.vala
@@ -91,6 +91,10 @@ public class Application {
         return get_instance().direct;
     }
 
+    public static void set_accels_for_action (string action, string[] accel) {
+        get_instance().system_app.set_accels_for_action (action, accel);
+    }
+
     /**
      * @brief Signal handler for GApplication's 'command-line' signal.
      *
diff --git a/src/CollectionPage.vala b/src/CollectionPage.vala
index 953f9b5..7b871b6 100644
--- a/src/CollectionPage.vala
+++ b/src/CollectionPage.vala
@@ -34,8 +34,8 @@ public abstract class CollectionPage : MediaPage {
         
         get_view().items_altered.connect(on_photos_altered);
         
-        init_item_context_menu("/CollectionContextMenu");
-        init_toolbar("/CollectionToolbar");
+        init_item_context_menu("CollectionContextMenu");
+        init_toolbar("CollectionToolbar");
         
         show_all();
 
@@ -46,7 +46,7 @@ public abstract class CollectionPage : MediaPage {
     public override Gtk.Toolbar get_toolbar() {
         if (toolbar == null) {
             base.get_toolbar();
-            
+
             // separator to force slider to right side of toolbar
             Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem();
             separator.set_expand(true);
@@ -69,66 +69,78 @@ public abstract class CollectionPage : MediaPage {
     }
     
     private static InjectionGroup create_file_menu_injectables() {
-        InjectionGroup group = new InjectionGroup("/MenuBar/FileMenu/FileExtrasPlaceholder");
+        InjectionGroup group = new InjectionGroup("FileExtrasPlaceholder");
         
-        group.add_menu_item("Print");
+        group.add_menu_item(_("_Print"), "Print", "<Primary>p");
         group.add_separator();
-        group.add_menu_item("Publish");
-        group.add_menu_item("SendTo");
-        group.add_menu_item("SetBackground");
+        group.add_menu_item(_("_Publish"), "Publish", "<Primary><Shift>p");
+        group.add_menu_item(_("Send _To…"), "SendTo");
+        group.add_menu_item(_("Set as _Desktop Background"), "SetBackground");
         
         return group;
     }
     
     private static InjectionGroup create_edit_menu_injectables() {
-        InjectionGroup group = new InjectionGroup("/MenuBar/EditMenu/EditExtrasPlaceholder");
+        InjectionGroup group = new InjectionGroup("EditExtrasPlaceholder");
         
-        group.add_menu_item("Duplicate");
+        group.add_menu_item(_("_Duplicate"), "Duplicate", "<Primary>D");
 
         return group;
     }
 
     private static InjectionGroup create_view_menu_fullscreen_injectables() {
-        InjectionGroup group = new 
InjectionGroup("/MenuBar/ViewMenu/ViewExtrasFullscreenSlideshowPlaceholder");
+        InjectionGroup group = new InjectionGroup("ViewExtrasFullscreenSlideshowPlaceholder");
         
-        group.add_menu_item("Fullscreen", "CommonFullscreen");
+        group.add_menu_item(_("Fullscreen"), "CommonFullscreen", "F11");
         group.add_separator();
-        group.add_menu_item("Slideshow");
+        group.add_menu_item(_("S_lideshow"), "Slideshow", "F5");
         
         return group;
     }
 
     private static InjectionGroup create_photos_menu_edits_injectables() {
-        InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasEditsPlaceholder");
-        
-        group.add_menu_item("RotateClockwise");
-        group.add_menu_item("RotateCounterclockwise");
-        group.add_menu_item("FlipHorizontally");
-        group.add_menu_item("FlipVertically");
+        InjectionGroup group = new InjectionGroup("PhotosExtrasEditsPlaceholder");
+        
+        group.add_menu_item(_("Rotate _Right"),
+                            "RotateClockwise",
+                            "<Primary>r");
+        group.add_menu_item(_("Rotate _Left"),
+                            "RotateCounterclockwise",
+                            "<Primary><Shift>r");
+        group.add_menu_item(_("Flip Hori_zontally"), "FlipHorizontally");
+        group.add_menu_item(_("Flip Verti_cally"), "FlipVertically");
         group.add_separator();
-        group.add_menu_item("Enhance");
-        group.add_menu_item("Revert");
+        group.add_menu_item(_("_Enhance"), "Enhance");
+        group.add_menu_item(_("Re_vert to Original"), "Revert");
         group.add_separator();
-        group.add_menu_item("CopyColorAdjustments");
-        group.add_menu_item("PasteColorAdjustments");
+        group.add_menu_item(_("_Copy Color Adjustments"),
+                            "CopyColorAdjustments",
+                            "<Primary><Shift>c");
+        group.add_menu_item(_("_Paste Color Adjustments"),
+                            "PasteColorAdjustments",
+                            "<Primary><Shift>v");
         
         return group;
     }
   
     private static InjectionGroup create_photos_menu_date_injectables() {
-        InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasDateTimePlaceholder");
+        InjectionGroup group = new InjectionGroup("PhotosExtrasDateTimePlaceholder");
         
-        group.add_menu_item("AdjustDateTime");
+        group.add_menu_item(_("Adjust Date and Time…"), "AdjustDateTime");
         
         return group;
     }
 
     private static InjectionGroup create_photos_menu_externals_injectables() {
-        InjectionGroup group = new InjectionGroup("/MenuBar/PhotosMenu/PhotosExtrasExternalsPlaceholder");
+        InjectionGroup group = new InjectionGroup("PhotosExtrasExternalsPlaceholder");
         
-        group.add_menu_item("ExternalEdit");
-        group.add_menu_item("ExternalEditRAW");
-        group.add_menu_item("PlayVideo");
+        group.add_menu_item(_("Open With E_xternal Editor"),
+                            "ExternalEdit",
+                            "<Primary>Return");
+        group.add_menu_item(_("Open With RA_W Editor"),
+                            "ExternalEditRAW",
+                            "<Primary><Shift>Return");
+        group.add_menu_item(_("_Play"), "PlayVideo", "<Primary>Y");
         
         return group;
     }
@@ -138,102 +150,32 @@ public abstract class CollectionPage : MediaPage {
         
         ui_filenames.add("collection.ui");
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
 
-        Gtk.ActionEntry print = { "Print", Resources.PRINT_LABEL, TRANSLATABLE, "<Ctrl>P",
-            TRANSLATABLE, on_print };
-        print.label = Resources.PRINT_MENU;
-        actions += print;
-        
-        Gtk.ActionEntry publish = { "Publish", Resources.PUBLISH, TRANSLATABLE, "<Ctrl><Shift>P",
-            TRANSLATABLE, on_publish };
-        publish.label = Resources.PUBLISH_MENU;
-        publish.tooltip = Resources.PUBLISH_TOOLTIP;
-        actions += publish;
-  
-        Gtk.ActionEntry rotate_right = { "RotateClockwise", Resources.CLOCKWISE,
-            TRANSLATABLE, "<Ctrl>R", TRANSLATABLE, on_rotate_clockwise };
-        rotate_right.label = Resources.ROTATE_CW_MENU;
-        rotate_right.tooltip = Resources.ROTATE_CW_TOOLTIP;
-        actions += rotate_right;
-
-        Gtk.ActionEntry rotate_left = { "RotateCounterclockwise", Resources.COUNTERCLOCKWISE,
-            TRANSLATABLE, "<Ctrl><Shift>R", TRANSLATABLE, on_rotate_counterclockwise };
-        rotate_left.label = Resources.ROTATE_CCW_MENU;
-        rotate_left.tooltip = Resources.ROTATE_CCW_TOOLTIP;
-        actions += rotate_left;
-
-        Gtk.ActionEntry hflip = { "FlipHorizontally", Resources.HFLIP, TRANSLATABLE, null,
-            TRANSLATABLE, on_flip_horizontally };
-        hflip.label = Resources.HFLIP_MENU;
-        actions += hflip;
-        
-        Gtk.ActionEntry vflip = { "FlipVertically", Resources.VFLIP, TRANSLATABLE, null,
-            TRANSLATABLE, on_flip_vertically };
-        vflip.label = Resources.VFLIP_MENU;
-        actions += vflip;
-
-        Gtk.ActionEntry enhance = { "Enhance", Resources.ENHANCE, TRANSLATABLE, "<Ctrl>E",
-            TRANSLATABLE, on_enhance };
-        enhance.label = Resources.ENHANCE_MENU;
-        enhance.tooltip = Resources.ENHANCE_TOOLTIP;
-        actions += enhance;
-
-        Gtk.ActionEntry copy_adjustments = { "CopyColorAdjustments", null, TRANSLATABLE,
-            "<Ctrl><Shift>C", TRANSLATABLE, on_copy_adjustments};
-        copy_adjustments.label = Resources.COPY_ADJUSTMENTS_MENU;
-        copy_adjustments.tooltip = Resources.COPY_ADJUSTMENTS_TOOLTIP;
-        actions += copy_adjustments;
-
-        Gtk.ActionEntry paste_adjustments = { "PasteColorAdjustments", null, TRANSLATABLE,
-            "<Ctrl><Shift>V", TRANSLATABLE, on_paste_adjustments};
-        paste_adjustments.label = Resources.PASTE_ADJUSTMENTS_MENU;
-        paste_adjustments.tooltip = Resources.PASTE_ADJUSTMENTS_TOOLTIP;
-        actions += paste_adjustments;
-
-        Gtk.ActionEntry revert = { "Revert", null, TRANSLATABLE, null,
-            TRANSLATABLE, on_revert };
-        revert.label = Resources.REVERT_MENU;
-        actions += revert;
-        
-        Gtk.ActionEntry set_background = { "SetBackground", null, TRANSLATABLE, "<Ctrl>B",
-            TRANSLATABLE, on_set_background };
-        set_background.label = Resources.SET_BACKGROUND_MENU;
-        set_background.tooltip = Resources.SET_BACKGROUND_TOOLTIP;
-        actions += set_background;
-
-        Gtk.ActionEntry duplicate = { "Duplicate", null, TRANSLATABLE, "<Ctrl>D", TRANSLATABLE,
-            on_duplicate_photo };
-        duplicate.label = Resources.DUPLICATE_PHOTO_MENU;
-        duplicate.tooltip = Resources.DUPLICATE_PHOTO_TOOLTIP;
-        actions += duplicate;
-
-        Gtk.ActionEntry adjust_date_time = { "AdjustDateTime", null, TRANSLATABLE, null,
-            TRANSLATABLE, on_adjust_date_time };
-        adjust_date_time.label = Resources.ADJUST_DATE_TIME_MENU;
-        actions += adjust_date_time;
-        
-        Gtk.ActionEntry external_edit = { "ExternalEdit", Resources.EDIT_LABEL, TRANSLATABLE, "<Ctrl>Return",
-            TRANSLATABLE, on_external_edit };
-        external_edit.label = Resources.EXTERNAL_EDIT_MENU;
-        actions += external_edit;
-        
-        Gtk.ActionEntry edit_raw = { "ExternalEditRAW", null, TRANSLATABLE, "<Ctrl><Shift>Return", 
-            TRANSLATABLE, on_external_edit_raw };
-        edit_raw.label = Resources.EXTERNAL_EDIT_RAW_MENU;
-        actions += edit_raw;
-        
-        Gtk.ActionEntry slideshow = { "Slideshow", null, TRANSLATABLE, "F5", TRANSLATABLE,
-            on_slideshow };
-        slideshow.label = _("S_lideshow");
-        slideshow.tooltip = _("Play a slideshow");
-        actions += slideshow;
-        
-        return actions;
+    private const GLib.ActionEntry[] entries = {
+        { "Print", on_print },
+        { "Publish", on_publish },
+        { "RotateClockwise", on_rotate_clockwise },
+        { "RotateCounterclockwise", on_rotate_counterclockwise },
+        { "FlipHorizontally", on_flip_horizontally },
+        { "FlipVertically", on_flip_vertically },
+        { "Enhance", on_enhance },
+        { "CopyColorAdjustments", on_copy_adjustments },
+        { "PasteColorAdjustments", on_paste_adjustments },
+        { "Revert", on_revert },
+        { "SetBackground", on_set_background },
+        { "Duplicate", on_duplicate_photo },
+        { "AdjustDateTime", on_adjust_date_time },
+        { "ExternalEdit", on_external_edit },
+        { "ExternalEditRAW", on_external_edit_raw },
+        { "Slideshow", on_slideshow }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+
+        AppWindow.get_instance ().add_action_entries (entries, this);
     }
-    
+
     protected override InjectionGroup[] init_collect_injection_groups() {
         InjectionGroup[] groups = base.init_collect_injection_groups();
         
@@ -321,12 +263,13 @@ public abstract class CollectionPage : MediaPage {
         
         set_action_sensitive("SetBackground", (!selection_has_videos) && has_selected );
         if (has_selected) {
-            Gtk.Action? set_background = get_action("SetBackground");
+            debug ("Setting action label for SetBackground...");
+/*            Gtk.Action? set_background = get_action("SetBackground");
             if (set_background != null) {
                 set_background.label = one_selected
                     ? Resources.SET_BACKGROUND_MENU
                     : Resources.SET_BACKGROUND_SLIDESHOW_MENU;
-            }
+            } */
         }
     }
 
@@ -745,20 +688,24 @@ public abstract class CollectionPage : MediaPage {
     }
     
     protected override bool on_ctrl_pressed(Gdk.EventKey? event) {
-        Gtk.ToolButton? rotate_button = ui.get_widget("/CollectionToolbar/ToolRotate")
-            as Gtk.ToolButton;
-        if (rotate_button != null)
-            rotate_button.set_related_action(get_action("RotateCounterclockwise"));
-        
+        Gtk.ToolButton? rotate_button = this.builder.get_object ("ToolRotate") as Gtk.ToolButton;
+        if (rotate_button != null) {
+            rotate_button.set_action_name ("win.RotateCounterclockwise");
+            rotate_button.set_icon_name ("object-rotate-left");
+            rotate_button.set_tooltip_text (Resources.ROTATE_CCW_TOOLTIP);
+        }
+
         return base.on_ctrl_pressed(event);
     }
     
     protected override bool on_ctrl_released(Gdk.EventKey? event) {
-        Gtk.ToolButton? rotate_button = ui.get_widget("/CollectionToolbar/ToolRotate")
-            as Gtk.ToolButton;
-        if (rotate_button != null)
-            rotate_button.set_related_action(get_action("RotateClockwise"));
-        
+        Gtk.ToolButton? rotate_button = this.builder.get_object ("ToolRotate") as Gtk.ToolButton;
+        if (rotate_button != null) {
+            rotate_button.set_action_name ("win.RotateClockwise");
+            rotate_button.set_icon_name ("object-rotate-right");
+            rotate_button.set_tooltip_text (Resources.ROTATE_CW_TOOLTIP);
+        }
+
         return base.on_ctrl_released(event);
     }
     
diff --git a/src/MediaPage.vala b/src/MediaPage.vala
index 89aa2fc..c9b23b8 100644
--- a/src/MediaPage.vala
+++ b/src/MediaPage.vala
@@ -282,250 +282,62 @@ public abstract class MediaPage : CheckerboardPage {
         
         ui_filenames.add("media.ui");
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry export = { "Export", Resources.SAVE_AS_LABEL, TRANSLATABLE, "<Ctrl><Shift>E",
-            TRANSLATABLE, on_export };
-        export.label = Resources.EXPORT_MENU;
-        actions += export;
-
-        Gtk.ActionEntry send_to = { "SendTo", "document-send", TRANSLATABLE, null, 
-            TRANSLATABLE, on_send_to };
-        send_to.label = Resources.SEND_TO_MENU;
-        actions += send_to;
-
-        // This is identical to the above action, except that it has different 
-        // mnemonics and is _only_ for use in the context menu.
-        Gtk.ActionEntry send_to_context_menu = { "SendToContextMenu", "document-send", TRANSLATABLE, null,
-            TRANSLATABLE, on_send_to };
-        send_to_context_menu.label = Resources.SEND_TO_CONTEXT_MENU;
-        actions += send_to_context_menu;
-        
-        Gtk.ActionEntry remove_from_library = { "RemoveFromLibrary", Resources.REMOVE_LABEL, TRANSLATABLE,
-            "<Shift>Delete", TRANSLATABLE, on_remove_from_library };
-        remove_from_library.label = Resources.REMOVE_FROM_LIBRARY_MENU;
-        actions += remove_from_library;
-        
-        Gtk.ActionEntry move_to_trash = { "MoveToTrash", "user-trash-full", TRANSLATABLE, "Delete",
-            TRANSLATABLE, on_move_to_trash };
-        move_to_trash.label = Resources.MOVE_TO_TRASH_MENU;
-        actions += move_to_trash;
-        
-        Gtk.ActionEntry new_event = { "NewEvent", Resources.NEW_LABEL, TRANSLATABLE, "<Ctrl>N",
-            TRANSLATABLE, on_new_event };
-        new_event.label = Resources.NEW_EVENT_MENU;
-        actions += new_event;
-
-        Gtk.ActionEntry add_tags = { "AddTags", null, TRANSLATABLE, "<Ctrl>T", TRANSLATABLE, 
-            on_add_tags };
-        add_tags.label = Resources.ADD_TAGS_MENU;
-        actions += add_tags;
-
-        // This is identical to the above action, except that it has different 
-        // mnemonics and is _only_ for use in the context menu.
-        Gtk.ActionEntry add_tags_context_menu = { "AddTagsContextMenu", null, TRANSLATABLE, "<Ctrl>A", 
TRANSLATABLE,
-            on_add_tags };
-        add_tags_context_menu.label = Resources.ADD_TAGS_CONTEXT_MENU;
-        actions += add_tags_context_menu;
-
-        Gtk.ActionEntry modify_tags = { "ModifyTags", null, TRANSLATABLE, "<Ctrl>M", TRANSLATABLE, 
-            on_modify_tags };
-        modify_tags.label = Resources.MODIFY_TAGS_MENU;
-        actions += modify_tags;
-
-        Gtk.ActionEntry increase_size = { "IncreaseSize", Resources.ZOOM_IN_LABEL, TRANSLATABLE,
-            "<Ctrl>plus", TRANSLATABLE, on_increase_size };
-        increase_size.label = _("Zoom _In");
-        increase_size.tooltip = _("Increase the magnification of the thumbnails");
-        actions += increase_size;
-
-        Gtk.ActionEntry decrease_size = { "DecreaseSize", Resources.ZOOM_OUT_LABEL, TRANSLATABLE,
-            "<Ctrl>minus", TRANSLATABLE, on_decrease_size };
-        decrease_size.label = _("Zoom _Out");
-        decrease_size.tooltip = _("Decrease the magnification of the thumbnails");
-        actions += decrease_size;
-        
-        Gtk.ActionEntry flag = { "Flag", null, TRANSLATABLE, "<Ctrl>G", TRANSLATABLE, on_flag_unflag };
-        flag.label = Resources.FLAG_MENU;
-        actions += flag;
-        
-        Gtk.ActionEntry set_rating = { "Rate", null, TRANSLATABLE, null, null, null };
-        set_rating.label = Resources.RATING_MENU;
-        actions += set_rating;
-
-        Gtk.ActionEntry increase_rating = { "IncreaseRating", null, TRANSLATABLE, 
-            "greater", TRANSLATABLE, on_increase_rating };
-        increase_rating.label = Resources.INCREASE_RATING_MENU;
-        actions += increase_rating;
-
-        Gtk.ActionEntry decrease_rating = { "DecreaseRating", null, TRANSLATABLE, 
-            "less", TRANSLATABLE, on_decrease_rating };
-        decrease_rating.label = Resources.DECREASE_RATING_MENU;
-        actions += decrease_rating;
-
-        Gtk.ActionEntry rate_rejected = { "RateRejected", null, TRANSLATABLE, 
-            "9", TRANSLATABLE, on_rate_rejected };
-        rate_rejected.label = Resources.rating_menu(Rating.REJECTED);
-        actions += rate_rejected;
-
-        Gtk.ActionEntry rate_unrated = { "RateUnrated", null, TRANSLATABLE, 
-            "0", TRANSLATABLE, on_rate_unrated };
-        rate_unrated.label = Resources.rating_menu(Rating.UNRATED);
-        actions += rate_unrated;
-
-        Gtk.ActionEntry rate_one = { "RateOne", null, TRANSLATABLE, 
-            "1", TRANSLATABLE, on_rate_one };
-        rate_one.label = Resources.rating_menu(Rating.ONE);
-        actions += rate_one;
-
-        Gtk.ActionEntry rate_two = { "RateTwo", null, TRANSLATABLE, 
-            "2", TRANSLATABLE, on_rate_two };
-        rate_two.label = Resources.rating_menu(Rating.TWO);
-        actions += rate_two;
-
-        Gtk.ActionEntry rate_three = { "RateThree", null, TRANSLATABLE, 
-            "3", TRANSLATABLE, on_rate_three };
-        rate_three.label = Resources.rating_menu(Rating.THREE);
-        actions += rate_three;
-
-        Gtk.ActionEntry rate_four = { "RateFour", null, TRANSLATABLE, 
-            "4", TRANSLATABLE, on_rate_four };
-        rate_four.label = Resources.rating_menu(Rating.FOUR);
-        actions += rate_four;
-
-        Gtk.ActionEntry rate_five = { "RateFive", null, TRANSLATABLE, 
-            "5", TRANSLATABLE, on_rate_five };
-        rate_five.label = Resources.rating_menu(Rating.FIVE);
-        actions += rate_five;
-
-        Gtk.ActionEntry edit_title = { "EditTitle", null, TRANSLATABLE, "F2", TRANSLATABLE,
-            on_edit_title };
-        edit_title.label = Resources.EDIT_TITLE_MENU;
-        actions += edit_title;
-
-        Gtk.ActionEntry edit_comment = { "EditComment", null, TRANSLATABLE, "F3", TRANSLATABLE,
-            on_edit_comment };
-        edit_comment.label = Resources.EDIT_COMMENT_MENU;
-        actions += edit_comment;
-
-        Gtk.ActionEntry sort_photos = { "SortPhotos", null, TRANSLATABLE, null, null, null };
-        sort_photos.label = _("Sort _Photos");
-        actions += sort_photos;
-
-        Gtk.ActionEntry filter_photos = { "FilterPhotos", null, TRANSLATABLE, null, null, null };
-        filter_photos.label = Resources.FILTER_PHOTOS_MENU;
-        actions += filter_photos;
-        
-        Gtk.ActionEntry play = { "PlayVideo", Resources.PLAY_LABEL, TRANSLATABLE, "<Ctrl>Y",
-            TRANSLATABLE, on_play_video };
-        play.label = _("_Play Video");
-        play.tooltip = _("Open the selected videos in the system video player");
-        actions += play;
-        
-        Gtk.ActionEntry raw_developer = { "RawDeveloper", null, TRANSLATABLE, null, null, null };
-        raw_developer.label = _("_Developer");
-        actions += raw_developer;
-        
-        // RAW developers.
-        
-        Gtk.ActionEntry dev_shotwell = { "RawDeveloperShotwell", null, TRANSLATABLE, null, TRANSLATABLE,
-            on_raw_developer_shotwell };
-        dev_shotwell.label = _("Shotwell");
-        actions += dev_shotwell;
-        
-        Gtk.ActionEntry dev_camera = { "RawDeveloperCamera", null, TRANSLATABLE, null, TRANSLATABLE,
-            on_raw_developer_camera };
-        dev_camera.label = _("Camera");
-        actions += dev_camera;
 
-        return actions;
-    }
-    
-    protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
-        Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
-        
-        Gtk.ToggleActionEntry titles = { "ViewTitle", null, TRANSLATABLE, "<Ctrl><Shift>T",
-            TRANSLATABLE, on_display_titles, Config.Facade.get_instance().get_display_photo_titles() };
-        titles.label = _("_Titles");
-        titles.tooltip = _("Display the title of each photo");
-        toggle_actions += titles;
-        
-        Gtk.ToggleActionEntry comments = { "ViewComment", null, TRANSLATABLE, "<Ctrl><Shift>C",
-            TRANSLATABLE, on_display_comments, Config.Facade.get_instance().get_display_photo_comments() };
-        comments.label = _("_Comments");
-        comments.tooltip = _("Display the comment of each photo");
-        toggle_actions += comments;
-        
-        Gtk.ToggleActionEntry ratings = { "ViewRatings", null, TRANSLATABLE, "<Ctrl><Shift>N",
-            TRANSLATABLE, on_display_ratings, Config.Facade.get_instance().get_display_photo_ratings() };
-        ratings.label = Resources.VIEW_RATINGS_MENU;
-        ratings.tooltip = Resources.VIEW_RATINGS_TOOLTIP;
-        toggle_actions += ratings;
-
-        Gtk.ToggleActionEntry tags = { "ViewTags", null, TRANSLATABLE, "<Ctrl><Shift>G",
-            TRANSLATABLE, on_display_tags, Config.Facade.get_instance().get_display_photo_tags() };
-        tags.label = _("Ta_gs");
-        tags.tooltip = _("Display each photo’s tags");
-        toggle_actions += tags;
-        
-        return toggle_actions;
-    }
-    
-    protected override void register_radio_actions(Gtk.ActionGroup action_group) {
+    private const GLib.ActionEntry[] entries = {
+        { "Export", on_export },
+        { "SendTo", on_send_to },
+        { "SendToContextMenu", on_send_to },
+        { "RemoveFromLibrary", on_remove_from_library },
+        { "MoveToTrash", on_move_to_trash },
+        { "NewEvent", on_new_event },
+        { "AddTags", on_add_tags },
+        { "AddTagsContextMenu", on_add_tags },
+        { "ModifyTags", on_modify_tags },
+        { "IncreaseSize", on_increase_size },
+        { "DecreaseSize", on_decrease_size },
+        { "Flag", on_flag_unflag },
+        { "IncreaseRating", on_increase_rating },
+        { "DecreaseRating", on_decrease_rating },
+        { "RateRejected", on_rate_rejected },
+        { "RateUnrated", on_rate_unrated },
+        { "RateOne", on_rate_one },
+        { "RateTwo", on_rate_two },
+        { "RateThree", on_rate_three },
+        { "RateFour", on_rate_four },
+        { "RateFive", on_rate_five },
+        { "EditTitle", on_edit_title },
+        { "EditComment", on_edit_comment },
+        { "PlayVideo", on_play_video },
+
+        // Toggle actions
+        { "ViewTitle", on_action_toggle, null, "false", on_display_titles },
+        { "ViewComment", on_action_toggle, null, "false", on_display_comments },
+        { "ViewRatings", on_action_toggle, null, "false", on_display_ratings },
+        { "ViewTags", on_action_toggle, null, "false", on_display_tags },
+
+        // Radio actions
+        { "SortBy", on_action_radio, "s", "'1'", on_sort_changed },
+        { "Sort", on_action_radio, "s", "'ascending'", on_sort_changed },
+        { "RawDeveloper", on_action_radio, "s", "'Shotwell'", on_raw_developer_changed }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+
         bool sort_order;
         int sort_by;
         get_config_photos_sort(out sort_order, out sort_by);
-        
-        // Sort criteria.
-        Gtk.RadioActionEntry[] sort_crit_actions = new Gtk.RadioActionEntry[0];
-        
-        Gtk.RadioActionEntry by_title = { "SortByTitle", null, TRANSLATABLE, null, TRANSLATABLE,
-            SortBy.TITLE };
-        by_title.label = _("By _Title");
-        by_title.tooltip = _("Sort photos by title");
-        sort_crit_actions += by_title;
-        
-        Gtk.RadioActionEntry by_date = { "SortByExposureDate", null, TRANSLATABLE, null,
-            TRANSLATABLE, SortBy.EXPOSURE_DATE };
-        by_date.label = _("By Exposure _Date");
-        by_date.tooltip = _("Sort photos by exposure date");
-        sort_crit_actions += by_date;
-        
-        Gtk.RadioActionEntry by_rating = { "SortByRating", null, TRANSLATABLE, null,
-            TRANSLATABLE, SortBy.RATING };
-        by_rating.label = _("By _Rating");
-        by_rating.tooltip = _("Sort photos by rating");
-        sort_crit_actions += by_rating;
-        
-        Gtk.RadioActionEntry by_filename = { "SortByFilename", null, TRANSLATABLE, null,
-            TRANSLATABLE, SortBy.FILENAME };
-        by_filename.label = _("By _Filename");
-        by_filename.tooltip = _("Sort photos by filename");
-        sort_crit_actions += by_filename;
 
-        action_group.add_radio_actions(sort_crit_actions, sort_by, on_sort_changed);
-        
-        // Sort order.
-        Gtk.RadioActionEntry[] sort_order_actions = new Gtk.RadioActionEntry[0];
-        
-        Gtk.RadioActionEntry ascending = { "SortAscending", Resources.SORT_ASCENDING_LABEL,
-            TRANSLATABLE, null, TRANSLATABLE, SORT_ORDER_ASCENDING };
-        ascending.label = _("_Ascending");
-        ascending.tooltip = _("Sort photos in an ascending order");
-        sort_order_actions += ascending;
-        
-        Gtk.RadioActionEntry descending = { "SortDescending", Resources.SORT_DESCENDING_LABEL,
-            TRANSLATABLE, null, TRANSLATABLE, SORT_ORDER_DESCENDING };
-        descending.label = _("D_escending");
-        descending.tooltip = _("Sort photos in a descending order");
-        sort_order_actions += descending;
-        
-        action_group.add_radio_actions(sort_order_actions,
-            sort_order ? SORT_ORDER_ASCENDING : SORT_ORDER_DESCENDING, on_sort_changed);
-        
-        base.register_radio_actions(action_group);
+        AppWindow.get_instance ().add_action_entries (entries, this);
+        (get_action ("ViewTitle") as GLib.SimpleAction).set_state (Config.Facade.get_instance 
().get_display_photo_titles ());
+        (get_action ("ViewComment") as GLib.SimpleAction).set_state (Config.Facade.get_instance 
().get_display_photo_comments ());
+        (get_action ("ViewRatings") as GLib.SimpleAction).set_state (Config.Facade.get_instance 
().get_display_photo_ratings ());
+        (get_action ("ViewTags") as GLib.SimpleAction).set_state (Config.Facade.get_instance 
().get_display_photo_tags ());
+        (get_action ("SortBy") as GLib.SimpleAction).set_state ("%d".printf (sort_by));
+        (get_action ("Sort") as GLib.SimpleAction).set_state (sort_order ? "'ascending'" : "'descending'");
+        var d = Config.Facade.get_instance().get_default_raw_developer();
+        var action = get_action ("RawDeveloper") as GLib.SimpleAction;
+        action.set_state (d == RawDeveloper.SHOTWELL ? "'Shotwell'" : "'Camera'");
     }
     
     protected override void update_actions(int selected_count, int count) {
@@ -584,76 +396,34 @@ public abstract class MediaPage : CheckerboardPage {
         }
         
         // Collect some stats about what's selected.
-        bool avail_shotwell = false; // True if Shotwell developer is available.
-        bool avail_camera = false;   // True if camera developer is available.
         bool is_raw = false;    // True if any RAW photos are selected
         foreach (DataView view in get_view().get_selected()) {
             Photo? photo = ((Thumbnail) view).get_media_source() as Photo;
             if (photo != null && photo.get_master_file_format() == PhotoFileFormat.RAW) {
                 is_raw = true;
-                
-                if (!avail_shotwell && photo.is_raw_developer_available(RawDeveloper.SHOTWELL))
-                    avail_shotwell = true;
-                
-                if (!avail_camera && (photo.is_raw_developer_available(RawDeveloper.CAMERA) ||
-                    photo.is_raw_developer_available(RawDeveloper.EMBEDDED)))
-                    avail_camera = true;
-                
-                if (avail_shotwell && avail_camera)
-                    break; // optimization: break out of loop when all options available
-                
+
+                break;
             }
         }
         
         // Enable/disable menu.
         set_action_sensitive("RawDeveloper", is_raw);
-        
-        if (is_raw) {
-            // Set which developers are available.
-            set_action_sensitive("RawDeveloperShotwell", avail_shotwell);
-            set_action_sensitive("RawDeveloperCamera", avail_camera);
-        }
     }
     
     private void update_flag_action(int selected_count) {
         set_action_sensitive("Flag", selected_count > 0);
-        
-        string flag_label = Resources.FLAG_MENU;
-
-        if (selected_count > 0) {
-            bool all_flagged = true;
-            foreach (DataSource source in get_view().get_selected_sources()) {
-                Flaggable? flaggable = source as Flaggable;
-                if (flaggable != null && !flaggable.is_flagged()) {
-                    all_flagged = false;
-                    
-                    break;
-                }
-            }
-            
-            if (all_flagged) {
-                flag_label = Resources.UNFLAG_MENU;
-            }
-        }
-        
-        Gtk.Action? flag_action = get_action("Flag");
-        if (flag_action != null) {
-            flag_action.label = flag_label;
-        }
     }
     
     public override Core.ViewTracker? get_view_tracker() {
         return tracker;
     }
-    
+
     public void set_display_ratings(bool display) {
         get_view().freeze_notifications();
         get_view().set_property(Thumbnail.PROP_SHOW_RATINGS, display);
         get_view().thaw_notifications();
-        
-        Gtk.ToggleAction? action = get_action("ViewRatings") as Gtk.ToggleAction;
-        if (action != null)
-            action.set_active(display);
+
+        this.set_action_active ("ViewRatings", display);
     }
 
     private bool can_rate_selected(Rating rating) {
@@ -937,10 +707,8 @@ public abstract class MediaPage : CheckerboardPage {
         get_view().freeze_notifications();
         get_view().set_property(Thumbnail.PROP_SHOW_TAGS, display);
         get_view().thaw_notifications();
-        
-        Gtk.ToggleAction? action = get_action("ViewTags") as Gtk.ToggleAction;
-        if (action != null)
-            action.set_active(display);
+
+        this.set_action_active ("ViewTags", display);
     }
 
     private void on_new_event() {
@@ -1072,58 +840,84 @@ public abstract class MediaPage : CheckerboardPage {
             get_command_manager().execute(new EditMultipleCommentsCommand(media_sources, new_comment));
     }
 
-    protected virtual void on_display_titles(Gtk.Action action) {
-        bool display = ((Gtk.ToggleAction) action).get_active();
+    protected virtual void on_display_titles(GLib.SimpleAction action, Variant? value) {
+        bool display = value.get_boolean ();
         
         set_display_titles(display);
         
         Config.Facade.get_instance().set_display_photo_titles(display);
+        action.set_state (value);
     }
 
-    protected virtual void on_display_comments(Gtk.Action action) {
-        bool display = ((Gtk.ToggleAction) action).get_active();
+    protected virtual void on_display_comments(GLib.SimpleAction action, Variant? value) {
+        bool display = value.get_boolean ();
         
         set_display_comments(display);
         
         Config.Facade.get_instance().set_display_photo_comments(display);
+        action.set_state (value);
     }
 
-    protected virtual void on_display_ratings(Gtk.Action action) {
-        bool display = ((Gtk.ToggleAction) action).get_active();
+    protected virtual void on_display_ratings(GLib.SimpleAction action, Variant? value) {
+        bool display = value.get_boolean ();
         
         set_display_ratings(display);
         
         Config.Facade.get_instance().set_display_photo_ratings(display);
+        action.set_state (value);
     }
 
-    protected virtual void on_display_tags(Gtk.Action action) {
-        bool display = ((Gtk.ToggleAction) action).get_active();
+    protected virtual void on_display_tags(GLib.SimpleAction action, Variant? value) {
+        bool display = value.get_boolean ();
         
         set_display_tags(display);
         
         Config.Facade.get_instance().set_display_photo_tags(display);
+        action.set_state (value);
     }
 
     protected abstract void get_config_photos_sort(out bool sort_order, out int sort_by);
 
     protected abstract void set_config_photos_sort(bool sort_order, int sort_by);
 
-    public virtual void on_sort_changed() {
+    public virtual void on_sort_changed(GLib.SimpleAction action, Variant? value) {
         int sort_by = get_menu_sort_by();
         bool sort_order = get_menu_sort_order();
         
         set_view_comparator(sort_by, sort_order);
         set_config_photos_sort(sort_order, sort_by);
+
+        action.set_state (value);
     }
     
-    public void on_raw_developer_shotwell(Gtk.Action action) {
+    public void on_raw_developer_shotwell() {
         developer_changed(RawDeveloper.SHOTWELL);
     }
     
-    public void on_raw_developer_camera(Gtk.Action action) {
+    public void on_raw_developer_camera() {
         developer_changed(RawDeveloper.CAMERA);
     }
-    
+
+    private void on_raw_developer_changed(GLib.SimpleAction action,
+                                          Variant? value) {
+        RawDeveloper developer = RawDeveloper.SHOTWELL;
+
+        switch (value.get_string ()) {
+            case "Shotwell":
+                developer = RawDeveloper.SHOTWELL;
+                break;
+            case "Camera":
+                developer = RawDeveloper.CAMERA;
+                break;
+            default:
+                break;
+        }
+
+        developer_changed(developer);
+
+        action.set_state (value);
+    }
+
     protected virtual void developer_changed(RawDeveloper rd) {
         if (get_view().get_selected_count() == 0)
             return;
@@ -1156,49 +950,46 @@ public abstract class MediaPage : CheckerboardPage {
 
     protected override void set_display_titles(bool display) {
         base.set_display_titles(display);
-    
-        Gtk.ToggleAction? action = get_action("ViewTitle") as Gtk.ToggleAction;
-        if (action != null)
-            action.set_active(display);
+
+        this.set_action_active ("ViewTitle", display);
     }
 
     protected override void set_display_comments(bool display) {
         base.set_display_comments(display);
     
-        Gtk.ToggleAction? action = get_action("ViewComment") as Gtk.ToggleAction;
-        if (action != null)
-            action.set_active(display);
+        this.set_action_active ("ViewComment", display);
     }
 
-    private Gtk.RadioAction sort_by_title_action() {
-        Gtk.RadioAction action = (Gtk.RadioAction) get_action("SortByTitle");
+    private GLib.Action sort_by_title_action() {
+        var action = get_action ("SortBy");
         assert(action != null);
         return action;
     }
 
-    private Gtk.RadioAction sort_ascending_action() {
-        Gtk.RadioAction action = (Gtk.RadioAction) get_action("SortAscending");
+    private GLib.Action sort_ascending_action() {
+        var action = get_action ("Sort");
         assert(action != null);
         return action;
     }
 
     protected int get_menu_sort_by() {
         // any member of the group knows the current value
-        return sort_by_title_action().get_current_value();
+        return int.parse (sort_by_title_action().get_state().get_string ());
     }
     
     protected void set_menu_sort_by(int val) {
-        sort_by_title_action().set_current_value(val);
+        var sort = "%d".printf (val);
+        (sort_by_title_action() as GLib.SimpleAction).set_state (sort);
     }
     
     protected bool get_menu_sort_order() {
         // any member of the group knows the current value
-        return sort_ascending_action().get_current_value() == SORT_ORDER_ASCENDING;
+        return sort_ascending_action().get_state ().get_string () == "ascending";
     }
     
     protected void set_menu_sort_order(bool ascending) {
-        sort_ascending_action().set_current_value(
-            ascending ? SORT_ORDER_ASCENDING : SORT_ORDER_DESCENDING);
+        (sort_ascending_action() as GLib.SimpleAction).set_state (
+            ascending ? "'ascending'" : "'descending'");
     }
     
     void set_view_comparator(int sort_by, bool ascending) {
@@ -1244,26 +1035,6 @@ public abstract class MediaPage : CheckerboardPage {
         get_view().set_comparator(comparator, predicate);
     }
 
-    protected string get_sortby_path(int sort_by) {
-        switch(sort_by) {
-            case SortBy.TITLE:
-                return "/MenuBar/ViewMenu/SortPhotos/SortByTitle";
-            
-            case SortBy.EXPOSURE_DATE:
-                return "/MenuBar/ViewMenu/SortPhotos/SortByExposureDate";
-            
-            case SortBy.RATING:
-                return "/MenuBar/ViewMenu/SortPhotos/SortByRating";
-
-            case SortBy.FILENAME:
-                return "/MenuBar/ViewMenu/SortPhotos/SortByFilename";
-            
-            default:
-                debug("Unknown sort criteria: %d", sort_by);
-                return "/MenuBar/ViewMenu/SortPhotos/SortByTitle";
-        }
-    }
-
     protected void sync_sort() {
         // It used to be that the config and UI could both agree on what 
         // sort order and criteria were selected, but the sorting wouldn't
diff --git a/src/Page.vala b/src/Page.vala
index 4877a47..e02028b 100644
--- a/src/Page.vala
+++ b/src/Page.vala
@@ -6,50 +6,60 @@
 
 public class InjectionGroup {
     public class Element {
+        public enum ItemType {
+            MENUITEM,
+            MENU,
+            SEPARATOR
+        }
         public string name;
         public string action;
-        public Gtk.UIManagerItemType kind;
-        
-        public Element(string name, string? action, Gtk.UIManagerItemType kind) {
+        public string? accellerator;
+        public ItemType kind;
+
+        public Element(string name, string? action, string? accellerator, ItemType kind) {
             this.name = name;
             this.action = action != null ? action : name;
+            this.accellerator = accellerator;
             this.kind = kind;
         }
     }
-    
+
     private string path;
     private Gee.ArrayList<Element?> elements = new Gee.ArrayList<Element?>();
     private int separator_id = 0;
-    
+
     public InjectionGroup(string path) {
         this.path = path;
     }
-    
+
     public string get_path() {
         return path;
     }
-    
+
     public Gee.List<Element?> get_elements() {
         return elements;
     }
-    
-    public void add_menu_item(string name, string? action = null) {
-        elements.add(new Element(name, action, Gtk.UIManagerItemType.MENUITEM));
+
+    public void add_menu_item(string name, string? action = null, string?
+            accellerator = null) {
+        elements.add(new Element(name, action, accellerator, Element.ItemType.MENUITEM));
     }
-    
+
     public void add_menu(string name, string? action = null) {
-        elements.add(new Element(name, action, Gtk.UIManagerItemType.MENU));
+        elements.add(new Element(name, action, null, Element.ItemType.MENU));
     }
-    
+
     public void add_separator() {
-        elements.add(new Element("%d-separator".printf(separator_id++), null, 
Gtk.UIManagerItemType.SEPARATOR));
+        elements.add(new Element("%d-separator".printf(separator_id++), null,
+                    null,
+                    Element.ItemType.SEPARATOR));
     }
 }
 
 public abstract class Page : Gtk.ScrolledWindow {
     private const int CONSIDER_CONFIGURE_HALTED_MSEC = 400;
     
-    protected Gtk.UIManager ui;
+    protected Gtk.Builder builder = new Gtk.Builder ();
     protected Gtk.Toolbar toolbar;
     protected bool in_view = false;
     
@@ -76,10 +86,6 @@ public abstract class Page : Gtk.ScrolledWindow {
     private int cursor_hide_time_cached = 0;
     private bool are_actions_attached = false;
     private OneShotScheduler? update_actions_scheduler = null;
-    private Gtk.ActionGroup? action_group = null;
-    private Gtk.ActionGroup[]? common_action_groups = null;
-    
-    private uint[] merge_ids = new uint[0];
     
     protected Page(string page_name) {
         this.page_name = page_name;
@@ -155,7 +161,6 @@ public abstract class Page : Gtk.ScrolledWindow {
         assert(this.container == null);
         
         this.container = container;
-        ui = ((PageWindow) container).get_ui_manager();
     }
     
     public virtual void clear_container() {
@@ -199,22 +204,59 @@ public abstract class Page : Gtk.ScrolledWindow {
     public Gtk.Widget? get_event_source() {
         return event_source;
     }
-    
-    public virtual Gtk.MenuBar get_menubar() {
-        Gtk.MenuBar? menubar = ui.get_widget("/MenuBar") as Gtk.MenuBar;
-        assert(menubar != null);
-        
-        return menubar;
-    }
 
-    public virtual unowned Gtk.Widget get_page_ui_widget(string path) {
-        return ui.get_widget(path);
+    private Gtk.MenuBar menubar;
+
+    public Gtk.MenuBar get_menubar() {
+        if (this.menubar == null) {
+            var model = builder.get_object ("MenuBar") as GLib.Menu;
+
+            // Collect injected UI elements and add them to the UI manager
+            InjectionGroup[] injection_groups = init_collect_injection_groups();
+            foreach (InjectionGroup group in injection_groups) {
+                var items = model.get_n_items ();
+                for (int i = 0; i < items; i++) {
+                    var submenu = model.get_item_link (i, GLib.Menu.LINK_SUBMENU);
+
+                    var section = this.find_extension_point (submenu,
+                                                             group.get_path ());
+
+                    if (section == null) {
+                        continue;
+                    }
+
+                    foreach (var element in group.get_elements ()) {
+                        var menu = section as GLib.Menu;
+                        switch (element.kind) {
+                            case InjectionGroup.Element.ItemType.MENUITEM:
+                                var item = new GLib.MenuItem (element.name,
+                                                              "win." + element.action);
+                                if (element.accellerator != null) {
+                                    item.set_attribute ("accel",
+                                                        "s",
+                                                        element.accellerator);
+                                }
+
+                                menu.append_item (item);
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                }
+            }
+
+            this.menubar = new Gtk.MenuBar.from_model (model);
+        }
+
+        return this.menubar;
     }
 
     public virtual Gtk.Toolbar get_toolbar() {
         if (toolbar == null) {
             toolbar = toolbar_path == null ? new Gtk.Toolbar() :
-                                             ui.get_widget(toolbar_path) as Gtk.Toolbar;
+                                             builder.get_object (toolbar_path)
+                                             as Gtk.Toolbar;
             toolbar.get_style_context().add_class("bottom-toolbar");  // for elementary theme
             toolbar.set_icon_size(Gtk.IconSize.SMALL_TOOLBAR);
         }
@@ -227,7 +269,6 @@ public abstract class Page : Gtk.ScrolledWindow {
     
     public virtual void switching_from() {
         in_view = false;
-        remove_ui();
         if (toolbar_path != null)
             toolbar = null;
     }
@@ -250,77 +291,59 @@ public abstract class Page : Gtk.ScrolledWindow {
     
     public virtual void returning_from_fullscreen(FullscreenWindow fsw) {
     }
-    
-    public Gtk.Action? get_action(string name) {
-        if (action_group == null)
-            return null;
-        
-        Gtk.Action? action = action_group.get_action(name);
-        if (action == null)
-            action = get_common_action(name, false);
-        
-        if (action == null)
-            warning("Page %s: Unable to locate action %s", get_page_name(), name);
-        
-        return action;
+
+    public GLib.Action? get_action (string name) {
+        var aw = AppWindow.get_instance ();
+
+        if (aw != null) {
+            return aw.lookup_action (name);
+        }
+
+        return null;
     }
     
     public void set_action_sensitive(string name, bool sensitive) {
-        Gtk.Action? action = get_action(name);
+        GLib.SimpleAction? action = get_action(name) as GLib.SimpleAction;
         if (action != null)
-            action.sensitive = sensitive;
+            action.set_enabled (sensitive);
     }
     
     public void set_action_important(string name, bool important) {
-        Gtk.Action? action = get_action(name);
-        if (action != null)
-            action.is_important = important;
+        set_action_sensitive (name, important);
     }
     
     public void set_action_visible(string name, bool visible) {
-        Gtk.Action? action = get_action(name);
-        if (action == null)
-            return;
-        
-        action.visible = visible;
-        action.sensitive = visible;
+        set_action_sensitive (name, visible);
     }
     
     public void set_action_short_label(string name, string short_label) {
-        Gtk.Action? action = get_action(name);
-        if (action != null)
-            action.short_label = short_label;
+        debug ("=> Set action short_label called for %s", name);
     }
     
     public void set_action_details(string name, string? label, string? tooltip, bool sensitive) {
-        Gtk.Action? action = get_action(name);
+        GLib.SimpleAction? action = get_action(name) as GLib.SimpleAction;
+
         if (action == null)
             return;
-        
+
         if (label != null)
-            action.label = label;
-        
-        if (tooltip != null)
-            action.tooltip = tooltip;
-        
-        action.sensitive = sensitive;
+            this.update_menu_item_label (name, label);
+
+        action.set_enabled (sensitive);
     }
     
     public void activate_action(string name) {
-        Gtk.Action? action = get_action(name);
+        var action = get_action(name);
+
         if (action != null)
-            action.activate();
+            action.activate (null);
     }
     
-    public Gtk.Action? get_common_action(string name, bool log_warning = true) {
-        if (common_action_groups == null)
-            return null;
-        
-        foreach (Gtk.ActionGroup group in common_action_groups) {
-            Gtk.Action? action = group.get_action(name);
-            if (action != null)
-                return action;
-        }
+    public GLib.Action? get_common_action(string name, bool log_warning = true) {
+        var action = get_action (name);
+
+        if (action != null)
+            return action;
         
         if (log_warning)
             warning("Page %s: Unable to locate common action %s", get_page_name(), name);
@@ -329,27 +352,23 @@ public abstract class Page : Gtk.ScrolledWindow {
     }
     
     public void set_common_action_sensitive(string name, bool sensitive) {
-        Gtk.Action? action = get_common_action(name);
+        var action = get_common_action(name) as GLib.SimpleAction;
         if (action != null)
-            action.sensitive = sensitive;
+            action.set_enabled (sensitive);
     }
 
     public void set_common_action_label(string name, string label) {
-        Gtk.Action? action = get_common_action(name);
-        if (action != null)
-            action.set_label(label);
+        debug ("Trying to set common action label for %s", name);
     }
     
     public void set_common_action_important(string name, bool important) {
-        Gtk.Action? action = get_common_action(name);
-        if (action != null)
-            action.is_important = important;
+        debug ("Setting action to important: %s", name);
     }
     
     public void activate_common_action(string name) {
-        Gtk.Action? action = get_common_action(name);
+        var action = get_common_action(name) as GLib.SimpleAction;
         if (action != null)
-            action.activate();
+            action.activate(null);
     }
     
     public bool get_ctrl_pressed() {
@@ -367,7 +386,14 @@ public abstract class Page : Gtk.ScrolledWindow {
     public bool get_super_pressed() {
         return super_pressed;
     }
-    
+
+     protected void set_action_active (string name, bool active) {
+        var action = get_action (name) as GLib.SimpleAction;
+        if (action != null) {
+            action.set_state (active);
+        }
+    }
+
     private bool get_modifiers(out bool ctrl, out bool alt, out bool shift, out bool super) {
         if (AppWindow.get_instance().get_window() == null) {
             ctrl = false;
@@ -440,27 +466,20 @@ public abstract class Page : Gtk.ScrolledWindow {
     public CommandManager get_command_manager() {
         return AppWindow.get_command_manager();
     }
-    
+
+    protected virtual void add_actions () { }
+
+    protected void on_action_toggle (GLib.Action action, Variant? value) {
+        Variant new_state = ! (bool) action.get_state ();
+        action.change_state (new_state);
+    }
+
+    protected void on_action_radio (GLib.Action action, Variant? value) {
+        action.change_state (value);
+    }
+
     private void init_ui() {
-        action_group = new Gtk.ActionGroup("PageActionGroup");
-        
-        // Collect all Gtk.Actions and add them to the Page's Gtk.ActionGroup
-        Gtk.ActionEntry[] action_entries = init_collect_action_entries();
-        if (action_entries.length > 0)
-            action_group.add_actions(action_entries, this);
-        
-        // Collect all Gtk.ToggleActionEntries and add them to the Gtk.ActionGroup
-        Gtk.ToggleActionEntry[] toggle_entries = init_collect_toggle_action_entries();
-        if (toggle_entries.length > 0)
-            action_group.add_toggle_actions(toggle_entries, this);
-        
-        // Collect all Gtk.RadioActionEntries and add them to the Gtk.ActionGroup
-        // (Would use a similar collection scheme as the other calls, but there is a binding
-        // problem with Gtk.RadioActionCallback that doesn't allow it to be stored in a struct)
-        register_radio_actions(action_group);
-        
-        // Get global (common) action groups from the application window
-        common_action_groups = AppWindow.get_instance().get_common_action_groups();
+        add_actions ();
     }
     
     private void add_ui() {
@@ -472,34 +491,10 @@ public abstract class Page : Gtk.ScrolledWindow {
         
         foreach (string ui_filename in ui_filenames)
             init_load_ui(ui_filename);
-            
-        ui.insert_action_group(action_group, 0);
-
-        // Collect injected UI elements and add them to the UI manager
-        InjectionGroup[] injection_groups = init_collect_injection_groups();
-        foreach (InjectionGroup group in injection_groups) {
-            foreach (InjectionGroup.Element element in group.get_elements()) {
-                uint merge_id = ui.new_merge_id();
-                ui.add_ui(merge_id, group.get_path(), element.name, element.action,
-                    element.kind, false);
-                merge_ids += merge_id;
-            }
-        }
-        
-        AppWindow.get_instance().replace_common_placeholders(ui);
-        
-        ui.ensure_update();
-    }
-    
-    private void remove_ui() {
-        for (int i = merge_ids.length - 1 ; i >= 0 ; --i)
-            ui.remove_ui(merge_ids[i]);
-        ui.remove_action_group(action_group);
-        merge_ids.resize(0);
-        
-        ui.ensure_update();
+
+        //ui.insert_action_group(action_group, 0);
     }
-    
+
     public void init_toolbar(string path) {
         toolbar_path = path;
     }
@@ -558,7 +553,7 @@ public abstract class Page : Gtk.ScrolledWindow {
         File ui_file = Resources.get_ui(ui_filename);
         
         try {
-            merge_ids += ui.add_ui_from_file(ui_file.get_path());
+            builder.add_from_file(ui_file.get_path());
         } catch (Error err) {
             AppWindow.error_message("Error loading UI file %s: %s".printf(
                 ui_file.get_path(), err.message));
@@ -571,21 +566,7 @@ public abstract class Page : Gtk.ScrolledWindow {
     // classes' filename.
     protected virtual void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
     }
-    
-    // This is called during init_ui() to collect all Gtk.ActionEntries for the page.
-    protected virtual Gtk.ActionEntry[] init_collect_action_entries() {
-        return new Gtk.ActionEntry[0];
-    }
-    
-    // This is called during init_ui() to collect all Gtk.ToggleActionEntries for the page
-    protected virtual Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
-        return new Gtk.ToggleActionEntry[0];
-    }
-    
-    // This is called during init_ui() to collect all Gtk.RadioActionEntries for the page
-    protected virtual void register_radio_actions(Gtk.ActionGroup action_group) {
-    }
-    
+
     // This is called during init_ui() to collect all Page.InjectedUIElements for the page.  They
     // should be added to the MultiSet using the injection path as the key.
     protected virtual InjectionGroup[] init_collect_injection_groups() {
@@ -1162,6 +1143,84 @@ public abstract class Page : Gtk.ScrolledWindow {
 
         return false;
     }
+
+    protected void update_menu_item_label (string id,
+                                           string new_label) {
+        var bar = this.builder.get_object ("MenuBar") as GLib.Menu;
+
+        if (bar == null) {
+            return;
+        }
+
+        var items = bar.get_n_items ();
+        for (var i = 0; i< items; i++) {
+            var model = bar.get_item_link (i, GLib.Menu.LINK_SUBMENU);
+            if (bar == null) {
+                continue;
+            }
+
+            var model_items = model.get_n_items ();
+            for (var j = 0; j < model_items; j++) {
+                var subsection = model.get_item_link (j, GLib.Menu.LINK_SECTION);
+
+                if (subsection == null)
+                    continue;
+
+                // Recurse into submenus
+                var sub_items = subsection.get_n_items ();
+                for (var k = 0; k < sub_items; k++) {
+                    var it = subsection.iterate_item_attributes (k);
+                    while (it.next ()) {
+                        if (it.get_name () == "id") {
+                            if (it.get_value ().get_string () == id) {
+                                var md = subsection as GLib.Menu;
+                                var m = new GLib.MenuItem.from_model
+                                    (subsection, k);
+                                m.set_label (new_label);
+                                md.remove (k);
+                                md.insert_item (k, m);
+
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    protected GLib.MenuModel? find_extension_point (GLib.MenuModel model,
+                                                    string extension_point) {
+        var items = model.get_n_items ();
+        GLib.MenuModel? section = null;
+
+        for (int i = 0; i < items && section == null; i++) {
+            string? name = null;
+            model.get_item_attribute (i, "id", "s", out name);
+            if (name == extension_point) {
+                section = model.get_item_link (i, GLib.Menu.LINK_SECTION);
+            } else {
+                var subsection = model.get_item_link (i, GLib.Menu.LINK_SECTION);
+
+                if (subsection == null)
+                    continue;
+
+                // Recurse into submenus
+                var sub_items = subsection.get_n_items ();
+                for (int j = 0; j < sub_items && section == null; j++) {
+                    var submenu = subsection.get_item_link
+                                                (j, GLib.Menu.LINK_SUBMENU);
+                    if (submenu != null) {
+                        section = this.find_extension_point (submenu,
+                                                             extension_point);
+                    }
+                }
+            }
+        }
+
+        return section;
+    }
+
 }
 
 public abstract class CheckerboardPage : Page {
@@ -1244,18 +1303,28 @@ public abstract class CheckerboardPage : Page {
             get_page_context_menu();
     }
     
+    private Gtk.Menu item_context_menu;
     public virtual Gtk.Menu? get_item_context_menu() {
-        Gtk.Menu menu = (Gtk.Menu) ui.get_widget(item_context_menu_path);
-        assert(menu != null);
-        return menu;
+        if (item_context_menu == null) {
+            var model = this.builder.get_object (item_context_menu_path)
+                as GLib.MenuModel;
+            item_context_menu = new Gtk.Menu.from_model (model);
+            item_context_menu.attach_to_widget (this, null);
+        }
+
+        return item_context_menu;
     }
     
+    private Gtk.Menu page_context_menu;
     public override Gtk.Menu? get_page_context_menu() {
-        if (page_context_menu_path == null)
-            return null;
-        Gtk.Menu menu = (Gtk.Menu) ui.get_widget(page_context_menu_path);
-        assert(menu != null);
-        return menu;
+        if (page_context_menu == null) {
+            var model = this.builder.get_object (page_context_menu_path)
+                as GLib.MenuModel;
+            page_context_menu = new Gtk.Menu.from_model (model);
+            page_context_menu.attach_to_widget (this, null);
+        }
+
+        return page_context_menu;
     }
     
     protected override bool on_context_keypress() {
@@ -2593,4 +2662,6 @@ public class DragAndDropHandler {
     private void on_export_completed() {
         exporter = null;
     }
+
+
 }
diff --git a/src/PhotoPage.vala b/src/PhotoPage.vala
index 0e14aab..09995bd 100644
--- a/src/PhotoPage.vala
+++ b/src/PhotoPage.vala
@@ -2378,352 +2378,105 @@ public class LibraryPhotoPage : EditingHostPage {
         ui_filenames.add("photo_context.ui");
         ui_filenames.add("photo.ui");
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry export = { "Export", Resources.SAVE_AS_LABEL, TRANSLATABLE, "<Ctrl><Shift>E",
-            TRANSLATABLE, on_export };
-        export.label = Resources.EXPORT_MENU;
-        actions += export;
-
-        Gtk.ActionEntry print = { "Print", Resources.PRINT_LABEL, TRANSLATABLE, "<Ctrl>P",
-            TRANSLATABLE, on_print };
-        print.label = Resources.PRINT_MENU;
-        actions += print;
-        
-        Gtk.ActionEntry publish = { "Publish", Resources.PUBLISH, TRANSLATABLE, "<Ctrl><Shift>P",
-            TRANSLATABLE, on_publish };
-        publish.label = Resources.PUBLISH_MENU;
-        publish.tooltip = Resources.PUBLISH_TOOLTIP;
-        actions += publish;
-        
-        Gtk.ActionEntry remove_from_library = { "RemoveFromLibrary", Resources.REMOVE_LABEL, TRANSLATABLE,
-            "<Shift>Delete", TRANSLATABLE, on_remove_from_library };
-        remove_from_library.label = Resources.REMOVE_FROM_LIBRARY_MENU;
-        actions += remove_from_library;
-
-        Gtk.ActionEntry move_to_trash = { "MoveToTrash", "user-trash-full", TRANSLATABLE, "Delete",
-            TRANSLATABLE, on_move_to_trash };
-        move_to_trash.label = Resources.MOVE_TO_TRASH_MENU;
-        actions += move_to_trash;
-
-        Gtk.ActionEntry view = { "ViewMenu", null, TRANSLATABLE, null, null, on_view_menu };
-        view.label = _("_View");
-        actions += view;
-        
-        Gtk.ActionEntry tools = { "Tools", null, TRANSLATABLE, null, null, null };
-        tools.label = _("T_ools");
-        actions += tools;
-        
-        Gtk.ActionEntry prev = { "PrevPhoto", Resources.PREVIOUS_LABEL, TRANSLATABLE, null,
-            TRANSLATABLE, on_previous_photo };
-        prev.label = _("_Previous Photo");
-        prev.tooltip = _("Previous Photo");
-        actions += prev;
-
-        Gtk.ActionEntry next = { "NextPhoto", Resources.NEXT_LABEL, TRANSLATABLE, null,
-            TRANSLATABLE, on_next_photo };
-        next.label = _("_Next Photo");
-        next.tooltip = _("Next Photo");
-        actions += next;
-
-        Gtk.ActionEntry rotate_right = { "RotateClockwise", Resources.CLOCKWISE, TRANSLATABLE,
-            "<Ctrl>R", TRANSLATABLE, on_rotate_clockwise };
-        rotate_right.label = Resources.ROTATE_CW_MENU;
-        rotate_right.tooltip = Resources.ROTATE_CW_TOOLTIP;
-        actions += rotate_right;
-
-        Gtk.ActionEntry rotate_left = { "RotateCounterclockwise", Resources.COUNTERCLOCKWISE,
-            TRANSLATABLE, "<Ctrl><Shift>R", TRANSLATABLE, on_rotate_counterclockwise };
-        rotate_left.label = Resources.ROTATE_CCW_MENU;
-        rotate_left.tooltip = Resources.ROTATE_CCW_TOOLTIP;
-        actions += rotate_left;
-
-        Gtk.ActionEntry hflip = { "FlipHorizontally", Resources.HFLIP, TRANSLATABLE, null,
-            TRANSLATABLE, on_flip_horizontally };
-        hflip.label = Resources.HFLIP_MENU;
-        actions += hflip;
-        
-        Gtk.ActionEntry vflip = { "FlipVertically", Resources.VFLIP, TRANSLATABLE, null,
-            TRANSLATABLE, on_flip_vertically };
-        vflip.label = Resources.VFLIP_MENU;
-        actions += vflip;
-        
-        Gtk.ActionEntry enhance = { "Enhance", Resources.ENHANCE, TRANSLATABLE, "<Ctrl>E",
-            TRANSLATABLE, on_enhance };
-        enhance.label = Resources.ENHANCE_MENU;
-        enhance.tooltip = Resources.ENHANCE_TOOLTIP;
-        actions += enhance;
-        
-        Gtk.ActionEntry copy_adjustments = { "CopyColorAdjustments", null, TRANSLATABLE,
-            "<Ctrl><Shift>C", TRANSLATABLE, on_copy_adjustments};
-        copy_adjustments.label = Resources.COPY_ADJUSTMENTS_MENU;
-        copy_adjustments.tooltip = Resources.COPY_ADJUSTMENTS_TOOLTIP;
-        actions += copy_adjustments;
-        
-        Gtk.ActionEntry paste_adjustments = { "PasteColorAdjustments", null, TRANSLATABLE,
-            "<Ctrl><Shift>V", TRANSLATABLE, on_paste_adjustments};
-        paste_adjustments.label = Resources.PASTE_ADJUSTMENTS_MENU;
-        paste_adjustments.tooltip = Resources.PASTE_ADJUSTMENTS_TOOLTIP;
-        actions += paste_adjustments;
-        
-        Gtk.ActionEntry crop = { "Crop", Resources.CROP, TRANSLATABLE, "<Ctrl>O",
-            TRANSLATABLE, toggle_crop };
-        crop.label = Resources.CROP_MENU;
-        crop.tooltip = Resources.CROP_TOOLTIP;
-        actions += crop;
-        
-        Gtk.ActionEntry straighten = { "Straighten", Resources.REFRESH_LABEL, TRANSLATABLE, "<Ctrl>A",
-            TRANSLATABLE, toggle_straighten };
-        straighten.label = Resources.STRAIGHTEN_MENU;
-        straighten.tooltip = Resources.STRAIGHTEN_TOOLTIP;
-        actions += straighten;
-        
-        Gtk.ActionEntry red_eye = { "RedEye", Resources.REDEYE, TRANSLATABLE, "<Ctrl>Y",
-            TRANSLATABLE, toggle_redeye };
-        red_eye.label = Resources.RED_EYE_MENU;
-        red_eye.tooltip = Resources.RED_EYE_TOOLTIP;
-        actions += red_eye;
-        
-        Gtk.ActionEntry adjust = { "Adjust", Resources.ADJUST, TRANSLATABLE, "<Ctrl>D",
-            TRANSLATABLE, toggle_adjust };
-        adjust.label = Resources.ADJUST_MENU;
-        adjust.tooltip = Resources.ADJUST_TOOLTIP;
-        actions += adjust;
-        
-        Gtk.ActionEntry revert = { "Revert", Resources.REVERT_TO_SAVED_LABEL, TRANSLATABLE,
-            null, TRANSLATABLE, on_revert };
-        revert.label = Resources.REVERT_MENU;
-        actions += revert;
-        
-        Gtk.ActionEntry edit_title = { "EditTitle", null, TRANSLATABLE, "F2", TRANSLATABLE,
-            on_edit_title };
-        edit_title.label = Resources.EDIT_TITLE_MENU;
-        actions += edit_title;
-
-        Gtk.ActionEntry edit_comment = { "EditComment", null, TRANSLATABLE, "F3", TRANSLATABLE,
-            on_edit_comment };
-        edit_comment.label = Resources.EDIT_COMMENT_MENU;
-        actions += edit_comment;
-
-        Gtk.ActionEntry adjust_date_time = { "AdjustDateTime", null, TRANSLATABLE, null,
-            TRANSLATABLE, on_adjust_date_time };
-        adjust_date_time.label = Resources.ADJUST_DATE_TIME_MENU;
-        actions += adjust_date_time;
-        
-        Gtk.ActionEntry external_edit = { "ExternalEdit", Resources.EDIT_LABEL, TRANSLATABLE,
-            "<Ctrl>Return", TRANSLATABLE, on_external_edit };
-        external_edit.label = Resources.EXTERNAL_EDIT_MENU;
-        actions += external_edit;
-
-        Gtk.ActionEntry edit_raw = { "ExternalEditRAW", null, TRANSLATABLE, "<Ctrl><Shift>Return", 
-            TRANSLATABLE, on_external_edit_raw };
-        edit_raw.label = Resources.EXTERNAL_EDIT_RAW_MENU;
-        actions += edit_raw;
-        
-        Gtk.ActionEntry send_to = { "SendTo", "document-send", TRANSLATABLE, null,
-            TRANSLATABLE, on_send_to };
-        send_to.label = Resources.SEND_TO_MENU;
-        actions += send_to;
-        
-        Gtk.ActionEntry set_background = { "SetBackground", null, TRANSLATABLE, "<Ctrl>B",
-            TRANSLATABLE, on_set_background };
-        set_background.label = Resources.SET_BACKGROUND_MENU;
-        set_background.tooltip = Resources.SET_BACKGROUND_TOOLTIP;
-        actions += set_background;
-        
-        Gtk.ActionEntry flag = { "Flag", null, TRANSLATABLE, "<Ctrl>G", TRANSLATABLE, on_flag_unflag };
-        flag.label = Resources.FLAG_MENU;
-        actions += flag;
-        
-        Gtk.ActionEntry set_rating = { "Rate", null, TRANSLATABLE, null, null, null };
-        set_rating.label = Resources.RATING_MENU;
-        actions += set_rating;
-
-        Gtk.ActionEntry increase_rating = { "IncreaseRating", null, TRANSLATABLE, 
-            "greater", TRANSLATABLE, on_increase_rating };
-        increase_rating.label = Resources.INCREASE_RATING_MENU;
-        actions += increase_rating;
-
-        Gtk.ActionEntry decrease_rating = { "DecreaseRating", null, TRANSLATABLE, 
-            "less", TRANSLATABLE, on_decrease_rating };
-        decrease_rating.label = Resources.DECREASE_RATING_MENU;
-        actions += decrease_rating;
-
-        Gtk.ActionEntry rate_rejected = { "RateRejected", null, TRANSLATABLE, 
-            "9", TRANSLATABLE, on_rate_rejected };
-        rate_rejected.label = Resources.rating_menu(Rating.REJECTED);
-        actions += rate_rejected;
-
-        Gtk.ActionEntry rate_unrated = { "RateUnrated", null, TRANSLATABLE, 
-            "0", TRANSLATABLE, on_rate_unrated };
-        rate_unrated.label = Resources.rating_menu(Rating.UNRATED);
-        actions += rate_unrated;
-
-        Gtk.ActionEntry rate_one = { "RateOne", null, TRANSLATABLE, 
-            "1", TRANSLATABLE, on_rate_one };
-        rate_one.label = Resources.rating_menu(Rating.ONE);
-        actions += rate_one;
-
-        Gtk.ActionEntry rate_two = { "RateTwo", null, TRANSLATABLE, 
-            "2", TRANSLATABLE, on_rate_two };
-        rate_two.label = Resources.rating_menu(Rating.TWO);
-        actions += rate_two;
-
-        Gtk.ActionEntry rate_three = { "RateThree", null, TRANSLATABLE, 
-            "3", TRANSLATABLE, on_rate_three };
-        rate_three.label = Resources.rating_menu(Rating.THREE);
-        actions += rate_three;
-
-        Gtk.ActionEntry rate_four = { "RateFour", null, TRANSLATABLE, 
-            "4", TRANSLATABLE, on_rate_four };
-        rate_four.label = Resources.rating_menu(Rating.FOUR);
-        actions += rate_four;
-
-        Gtk.ActionEntry rate_five = { "RateFive", null, TRANSLATABLE, 
-            "5", TRANSLATABLE, on_rate_five };
-        rate_five.label = Resources.rating_menu(Rating.FIVE);
-        actions += rate_five;
-
-        Gtk.ActionEntry increase_size = { "IncreaseSize", Resources.ZOOM_IN_LABEL, TRANSLATABLE,
-            "<Ctrl>plus", TRANSLATABLE, on_increase_size };
-        increase_size.label = _("Zoom _In");
-        increase_size.tooltip = _("Increase the magnification of the photo");
-        actions += increase_size;
-
-        Gtk.ActionEntry decrease_size = { "DecreaseSize", Resources.ZOOM_OUT_LABEL, TRANSLATABLE,
-            "<Ctrl>minus", TRANSLATABLE, on_decrease_size };
-        decrease_size.label = _("Zoom _Out");
-        decrease_size.tooltip = _("Decrease the magnification of the photo");
-        actions += decrease_size;
-
-        Gtk.ActionEntry best_fit = { "ZoomFit", Resources.ZOOM_FIT_LABEL, TRANSLATABLE,
-            "<Ctrl>0", TRANSLATABLE, snap_zoom_to_min };
-        best_fit.label = _("Fit to _Page");
-        best_fit.tooltip = _("Zoom the photo to fit on the screen");
-        actions += best_fit;
-
-        Gtk.ActionEntry actual_size = { "Zoom100", Resources.ZOOM_100_LABEL, TRANSLATABLE,
-            "<Ctrl>1", TRANSLATABLE, snap_zoom_to_isomorphic };
-        /// xgettext:no-c-format
-        actual_size.label = _("Zoom _100%");
-        /// xgettext:no-c-format
-        actual_size.tooltip = _("Zoom the photo to 100% magnification");
-        actions += actual_size;
-        
-        Gtk.ActionEntry max_size = { "Zoom200", null, TRANSLATABLE,
-            "<Ctrl>2", TRANSLATABLE, snap_zoom_to_max };
-        /// xgettext:no-c-format
-        max_size.label = _("Zoom _200%");
-        /// xgettext:no-c-format
-        max_size.tooltip = _("Zoom the photo to 200% magnification");
-        actions += max_size;
-
-        Gtk.ActionEntry add_tags = { "AddTags", null, TRANSLATABLE, "<Ctrl>T", TRANSLATABLE, 
-            on_add_tags };
-        add_tags.label = Resources.ADD_TAGS_MENU;
-        actions += add_tags;
-        
-        Gtk.ActionEntry modify_tags = { "ModifyTags", null, TRANSLATABLE, "<Ctrl>M", TRANSLATABLE, 
-            on_modify_tags };
-        modify_tags.label = Resources.MODIFY_TAGS_MENU;
-        actions += modify_tags;
-        
-        Gtk.ActionEntry slideshow = { "Slideshow", null, TRANSLATABLE, "F5", TRANSLATABLE,
-            on_slideshow };
-        slideshow.label = _("S_lideshow");
-        slideshow.tooltip = _("Play a slideshow");
-        actions += slideshow;
-        
-        Gtk.ActionEntry raw_developer = { "RawDeveloper", null, TRANSLATABLE, null, null, null };
-        raw_developer.label = _("_Developer");
-        actions += raw_developer;
-
-        // These are identical to add_tags and send_to, except that they have
-        // different mnemonics and are _only_ for use in the context menu.
-        Gtk.ActionEntry send_to_context_menu = { "SendToContextMenu", "document-send", TRANSLATABLE, null,
-            TRANSLATABLE, on_send_to };
-        send_to_context_menu.label = Resources.SEND_TO_CONTEXT_MENU;
-        actions += send_to_context_menu;        
-
-        Gtk.ActionEntry add_tags_context_menu = { "AddTagsContextMenu", null, TRANSLATABLE, "<Ctrl>A", 
TRANSLATABLE,
-            on_add_tags };
-        add_tags_context_menu.label = Resources.ADD_TAGS_CONTEXT_MENU;
-        actions += add_tags_context_menu;
-
-        return actions;
-    }
-    
-    protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
-        Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
-        
-        Gtk.ToggleActionEntry ratings = { "ViewRatings", null, TRANSLATABLE, "<Ctrl><Shift>N",
-            TRANSLATABLE, on_display_ratings, Config.Facade.get_instance().get_display_photo_ratings() };
-        ratings.label = Resources.VIEW_RATINGS_MENU;
-        ratings.tooltip = Resources.VIEW_RATINGS_TOOLTIP;
-        toggle_actions += ratings;
-        
-        return toggle_actions;
+
+    private const GLib.ActionEntry[] entries = {
+        { "Export", on_export },
+        { "Print", on_print },
+        { "Publish", on_publish },
+        { "RemoveFromLibrary", on_remove_from_library },
+        { "MoveToTrash", on_move_to_trash },
+        { "PrevPhoto", on_previous_photo },
+        { "NextPhoto", on_next_photo },
+        { "RotateClockwise", on_rotate_clockwise },
+        { "RotateCounterclockwise", on_rotate_counterclockwise },
+        { "FlipHorizontally", on_flip_horizontally },
+        { "FlipVertically", on_flip_vertically },
+        { "Enhance", on_enhance },
+        { "CopyColorAdjustments", on_copy_adjustments },
+        { "PasteColorAdjustments", on_paste_adjustments },
+        { "Crop", toggle_crop },
+        { "Straighten", toggle_straighten },
+        { "RedEye", toggle_redeye },
+        { "Adjust", toggle_adjust },
+        { "Revert", on_revert },
+        { "EditTitle", on_edit_title },
+        { "EditComment", on_edit_comment },
+        { "AdjustDateTime", on_adjust_date_time },
+        { "ExternalEdit", on_external_edit },
+        { "ExternalEditRAW", on_external_edit_raw },
+        { "SendTo", on_send_to },
+        { "SetBackground", on_set_background },
+        { "Flag", on_flag_unflag },
+        { "IncreaseRating", on_increase_rating },
+        { "DecreaseRating", on_decrease_rating },
+        { "RateRejected", on_rate_rejected },
+        { "RateUnrated", on_rate_unrated },
+        { "RateOne", on_rate_one },
+        { "RateTwo", on_rate_two },
+        { "RateThree", on_rate_three },
+        { "RateFour", on_rate_four },
+        { "RateFive", on_rate_five },
+        { "IncreaseSize", on_increase_size },
+        { "DecreaseSize", on_decrease_size },
+        { "ZoomFit", snap_zoom_to_min },
+        { "Zoom100", snap_zoom_to_isomorphic },
+        { "Zoom200", snap_zoom_to_max },
+        { "AddTags", on_add_tags },
+        { "ModifyTags", on_modify_tags },
+        { "Slideshow", on_slideshow },
+
+        // Toggle actions
+        { "ViewRatings", on_action_toggle, null, "false", on_display_ratings },
+
+        // Radio actions
+        { "RawDeveloper", on_action_radio, "s", "'Shotwell'", on_raw_developer_changed }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+
+        AppWindow.get_instance ().add_action_entries (entries, this);
+        (get_action ("ViewRatings") as GLib.SimpleAction).set_state (Config.Facade.get_instance 
().get_display_photo_ratings ());
+        var d = Config.Facade.get_instance().get_default_raw_developer();
+        var action = get_action ("RawDeveloper") as GLib.SimpleAction;
+        action.set_state (d == RawDeveloper.SHOTWELL ? "'Shotwell'" : "'Camera'");
     }
-    
+
     protected override InjectionGroup[] init_collect_injection_groups() {
         InjectionGroup[] groups = base.init_collect_injection_groups();
-        
-        InjectionGroup print_group = new InjectionGroup("/MenuBar/FileMenu/PrintPlaceholder");
-        print_group.add_menu_item("Print");
+
+        InjectionGroup print_group = new InjectionGroup("PrintPlaceholder");
+        print_group.add_menu_item(_("_Print"), "Print", "<Primary>p");
         
         groups += print_group;
         
-        InjectionGroup publish_group = new InjectionGroup("/MenuBar/FileMenu/PublishPlaceholder");
-        publish_group.add_menu_item("Publish");
+        InjectionGroup publish_group = new InjectionGroup("PublishPlaceholder");
+        publish_group.add_menu_item(_("_Publish"), "Publish", "<Primary><Shift>p");
         
         groups += publish_group;
         
-        InjectionGroup bg_group = new InjectionGroup("/MenuBar/FileMenu/SetBackgroundPlaceholder");
-        bg_group.add_menu_item("SetBackground");
+        InjectionGroup bg_group = new InjectionGroup("SetBackgroundPlaceholder");
+        bg_group.add_menu_item(_("Set as _Desktop Background"), "SetBackground");
         
         groups += bg_group;
         
         return groups;
     }
     
-    protected override void register_radio_actions(Gtk.ActionGroup action_group) {
-        // RAW developer.
-        //get_config_photos_sort(out sort_order, out sort_by); // TODO: fetch default from config
-        
-        Gtk.RadioActionEntry[] developer_actions = new Gtk.RadioActionEntry[0];
-        
-        Gtk.RadioActionEntry dev_shotwell = { "RawDeveloperShotwell", null, TRANSLATABLE, null, TRANSLATABLE,
-            RawDeveloper.SHOTWELL };
-        string label_shotwell = RawDeveloper.SHOTWELL.get_label();
-        dev_shotwell.label = label_shotwell;
-        developer_actions += dev_shotwell;
-        
-        Gtk.RadioActionEntry dev_camera = { "RawDeveloperCamera", null, TRANSLATABLE, null, TRANSLATABLE,
-            RawDeveloper.CAMERA };
-        string label_camera = RawDeveloper.CAMERA.get_label();
-        dev_camera.label = label_camera;
-        developer_actions += dev_camera;
-        
-        action_group.add_radio_actions(developer_actions, RawDeveloper.SHOTWELL, on_raw_developer_changed);
-        
-        base.register_radio_actions(action_group);
-    }
-    
-    private void on_display_ratings(Gtk.Action action) {
-        bool display = ((Gtk.ToggleAction) action).get_active();
+    private void on_display_ratings(GLib.SimpleAction action, Variant? value) {
+        bool display = value.get_boolean ();
         
         set_display_ratings(display);
         
         Config.Facade.get_instance().set_display_photo_ratings(display);
-        repaint();
+        action.set_state (value);
     }
 
+
     private void set_display_ratings(bool display) {
-        Gtk.ToggleAction? action = get_action("ViewRatings") as Gtk.ToggleAction;
+        var action = get_action("ViewRatings") as GLib.SimpleAction;
         if (action != null)
-            action.set_active(display);
+            action.set_enabled(display);
     }
     
     protected override void update_actions(int selected_count, int count) {
@@ -2774,8 +2527,24 @@ public class LibraryPhotoPage : EditingHostPage {
         update_flag_action();
     }
     
-    private void on_raw_developer_changed(Gtk.Action action, Gtk.Action current) {
-        developer_changed((RawDeveloper) ((Gtk.RadioAction) current).get_current_value());
+    private void on_raw_developer_changed(GLib.SimpleAction action,
+                                          Variant? value) {
+        RawDeveloper developer = RawDeveloper.SHOTWELL;
+
+        switch (value.get_string ()) {
+            case "Shotwell":
+                developer = RawDeveloper.SHOTWELL;
+                break;
+            case "Camera":
+                developer = RawDeveloper.CAMERA;
+                break;
+            default:
+                break;
+        }
+
+        developer_changed(developer);
+
+        action.set_state (value);
     }
     
     protected virtual void developer_changed(RawDeveloper rd) {
@@ -2799,13 +2568,14 @@ public class LibraryPhotoPage : EditingHostPage {
     
     private void update_flag_action() {
         if (has_photo()) {
-            Gtk.Action? action = get_action("Flag");
+            var action = get_action("Flag") as GLib.SimpleAction;
             assert(action != null);
             
-            bool is_flagged = ((LibraryPhoto) get_photo()).is_flagged();
+//            bool is_flagged = ((LibraryPhoto) get_photo()).is_flagged();
             
-            action.label = is_flagged ? Resources.UNFLAG_MENU : Resources.FLAG_MENU;
-            action.sensitive = true;
+            debug ("Setting label of action flagged");
+//            action.label = is_flagged ? Resources.UNFLAG_MENU : Resources.FLAG_MENU;
+            action.set_enabled (true);
         } else {
             set_action_sensitive("Flag", false);
         }
@@ -3049,11 +2819,18 @@ public class LibraryPhotoPage : EditingHostPage {
         
         return base.on_left_released(event);
     }
-    
+
+    private Gtk.Menu context_menu;
+
     private Gtk.Menu get_context_menu() {
-        Gtk.Menu menu = (Gtk.Menu) ui.get_widget("/PhotoContextMenu");
-        assert(menu != null);
-        return menu;
+        if (context_menu == null) {
+            var model = this.builder.get_object ("PhotoContextMenu")
+                as GLib.MenuModel;
+            context_menu = new Gtk.Menu.from_model (model);
+            context_menu.attach_to_widget (this, null);
+        }
+
+        return this.context_menu;
     }
     
     protected override bool on_context_buttonpress(Gdk.EventButton event) {
@@ -3236,10 +3013,6 @@ public class LibraryPhotoPage : EditingHostPage {
                 (Gee.Collection<MediaSource>) get_view().get_selected_sources());
     }
     
-    private void on_view_menu() {
-        update_zoom_menu_item_sensitivity();
-    }
-
     private void on_increase_rating() {
         if (!has_photo() || get_photo_missing())
             return;
@@ -3315,22 +3088,16 @@ public class LibraryPhotoPage : EditingHostPage {
         set_action_sensitive("RawDeveloper", format == PhotoFileFormat.RAW);
         
         if (format == PhotoFileFormat.RAW) {
-            // Set which developers are available.
-            set_action_sensitive("RawDeveloperShotwell", 
-                get_photo().is_raw_developer_available(RawDeveloper.SHOTWELL));
-            set_action_sensitive("RawDeveloperCamera", 
-                get_photo().is_raw_developer_available(RawDeveloper.EMBEDDED) || 
-                get_photo().is_raw_developer_available(RawDeveloper.CAMERA));;
-                
+            // FIXME: Only enable radio actions that are actually possible..
             // Set active developer in menu.
             switch (get_photo().get_raw_developer()) {
                 case RawDeveloper.SHOTWELL:
-                    activate_action("RawDeveloperShotwell");
+                    get_action ("RawDeveloper").change_state ("'Shotwell'");
                     break;
                 
                 case RawDeveloper.CAMERA:
                 case RawDeveloper.EMBEDDED:
-                    activate_action("RawDeveloperCamera");
+                    get_action ("RawDeveloper").change_state ("'Camera'");
                     break;
                 
                 default:
diff --git a/src/Resources.vala b/src/Resources.vala
index 6829d7c..bf34ae0 100644
--- a/src/Resources.vala
+++ b/src/Resources.vala
@@ -423,27 +423,6 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
         return _("Delete Search “%s”").printf(name);
     }
     
-    private unowned string rating_menu(Rating rating) {
-        switch (rating) {
-            case Rating.REJECTED:
-                return RATE_REJECTED_MENU;
-            case Rating.UNRATED:
-                return RATE_UNRATED_MENU;
-            case Rating.ONE:
-                return RATE_ONE_MENU;
-            case Rating.TWO:
-                return RATE_TWO_MENU;
-            case Rating.THREE:
-                return RATE_THREE_MENU;
-            case Rating.FOUR:
-                return RATE_FOUR_MENU;
-            case Rating.FIVE:
-                return RATE_FIVE_MENU;
-            default:
-                return RATE_UNRATED_MENU;
-        }
-    }
-
     private unowned string rating_label(Rating rating) {
         switch (rating) {
             case Rating.REJECTED:
diff --git a/src/SearchFilter.vala b/src/SearchFilter.vala
index 5fcf76f..d947bfa 100644
--- a/src/SearchFilter.vala
+++ b/src/SearchFilter.vala
@@ -331,33 +331,33 @@ public class TextAction {
 
 
 public class SearchFilterActions {
-    public unowned Gtk.ToggleAction? flagged {
+    public unowned GLib.SimpleAction? flagged {
         get {
-            return get_action("CommonDisplayFlagged") as Gtk.ToggleAction;
+            return get_action ("display.flagged");
         }
     }
     
-    public unowned Gtk.ToggleAction? photos {
+    public unowned GLib.SimpleAction? photos {
         get {
-            return get_action("CommonDisplayPhotos") as Gtk.ToggleAction;
+            return get_action ("display.photos");
         }
     }
     
-    public unowned Gtk.ToggleAction? videos {
+    public unowned GLib.SimpleAction? videos {
         get {
-            return get_action("CommonDisplayVideos") as Gtk.ToggleAction;
+            return get_action ("display.videos");
         }
     }
     
-    public unowned Gtk.ToggleAction? raw {
+    public unowned GLib.SimpleAction? raw {
         get {
-            return get_action("CommonDisplayRaw") as Gtk.ToggleAction;
+            return get_action ("display.raw");
         }
     }
     
-    public unowned Gtk.RadioAction? rating {
+    public unowned GLib.SimpleAction? rating {
         get {
-            return get_action("CommonDisplayUnratedOrHigher") as Gtk.RadioAction;
+            return get_action ("display.rating");
         }
     }
     
@@ -368,7 +368,6 @@ public class SearchFilterActions {
         }
     }
     
-    private Gtk.ActionGroup action_group = new Gtk.ActionGroup("SearchFilterActionGroup");
     private SearchFilterCriteria criteria = SearchFilterCriteria.ALL;
     private TextAction? _text = null;
     private bool has_flagged = true;
@@ -388,6 +387,7 @@ public class SearchFilterActions {
     public signal void rating_changed(RatingFilter filter);
     
     public signal void text_changed(string? text);
+
     
     /**
      * fired when the kinds of media present in the current view change (e.g., a video becomes
@@ -410,30 +410,39 @@ public class SearchFilterActions {
         text.text_changed.connect(on_text_changed);
     }
     
-    public Gtk.ActionGroup get_action_group() {
-        return action_group;
-    }
-    
     public SearchFilterCriteria get_criteria() {
         return criteria;
     }
+
+    public unowned GLib.ActionEntry[] get_actions () {
+        return SearchFilterActions.entries;
+    }
     
-    public unowned Gtk.Action? get_action(string name) {
-        return action_group.get_action(name);
+    public unowned GLib.SimpleAction? get_action(string name) {
+        var lw = AppWindow.get_instance () as LibraryWindow;
+        if (lw != null) {
+            return lw.lookup_action (name) as GLib.SimpleAction;
+        }
+
+        return null;
+        //    return action_group.lookup_action(name) as GLib.SimpleAction;
     }
     
-    public void set_action_sensitive(string name, bool sensitive) {
-        Gtk.Action? action = get_action(name);
-        if (action != null)
-            action.sensitive = sensitive;
+    public void set_action_sensitive (string name, bool sensitive) {
+        var action = get_action(name);
+        if (action != null) {
+            action.set_enabled (sensitive);
+        }
     }
     
     public void reset() {
-        flagged.active = false;
-        photos.active = false;
-        raw.active = false;
-        videos.active = false;
-        rating.current_value = RatingFilter.UNRATED_OR_HIGHER;
+        rating.set_enabled (false);
+        photos.set_enabled (false);
+        raw.set_enabled (false);
+        videos.set_enabled (false);
+        Variant v = "'%d'".printf (RatingFilter.UNRATED_OR_HIGHER);
+        rating.set_state (v);
+
         text.set_text(null);
     }
     
@@ -506,27 +515,9 @@ public class SearchFilterActions {
     }
     
     private void update_sensitivities() {
-        flagged.set_stock_id(((SearchFilterCriteria.FLAG & criteria) != 0 && has_flagged) ?
-            Resources.ICON_FILTER_FLAGGED : Resources.ICON_FILTER_FLAGGED_DISABLED);
-        
-        bool allow_media = (SearchFilterCriteria.MEDIA & criteria) != 0;
-        videos.set_stock_id((allow_media && has_videos) ?
-             Resources.ICON_FILTER_VIDEOS :  Resources.ICON_FILTER_VIDEOS_DISABLED);
-        photos.set_stock_id((allow_media && has_photos) ?
-             Resources.ICON_FILTER_PHOTOS :  Resources.ICON_FILTER_PHOTOS_DISABLED);
-        raw.set_stock_id((allow_media && has_raw) ?
-             Resources.ICON_FILTER_RAW :  Resources.ICON_FILTER_RAW_DISABLED);
-        
         bool allow_ratings = (SearchFilterCriteria.RATING & criteria) != 0;
-        set_action_sensitive("CommonDisplayRejectedOnly", allow_ratings & can_filter_by_stars);
-        set_action_sensitive("CommonDisplayRejectedOrHigher", allow_ratings & can_filter_by_stars);
-        set_action_sensitive("CommonDisplayUnratedOrHigher", allow_ratings & can_filter_by_stars);
-        set_action_sensitive("CommonDisplayOneOrHigher", allow_ratings & can_filter_by_stars);
-        set_action_sensitive("CommonDisplayTwoOrHigher", allow_ratings & can_filter_by_stars);
-        set_action_sensitive("CommonDisplayThreeOrHigher", allow_ratings & can_filter_by_stars);
-        set_action_sensitive("CommonDisplayFourOrHigher", allow_ratings & can_filter_by_stars);
-        set_action_sensitive("CommonDisplayFiveOrHigher", allow_ratings & can_filter_by_stars);
-        
+        set_action_sensitive("display.rating", allow_ratings & can_filter_by_stars);
+
         // Ticket #3343 - Don't disable the text field, even
         // when no searchable items are available.
         text.set_sensitive(true);
@@ -537,111 +528,59 @@ public class SearchFilterActions {
     private void on_text_changed(TextAction action, string? text) {
         text_changed(text);
     }
+
+    private const GLib.ActionEntry[] entries = {
+        { "display.rating", on_action_radio, "s", "'2'", on_rating_changed },
+        { "display.flagged", on_action_toggle, null, "false", on_flagged_toggled },
+        { "display.photos", on_action_toggle, null, "false", on_photos_toggled },
+        { "display.videos", on_action_toggle, null, "false", on_videos_toggled },
+        { "display.raw", on_action_toggle, null, "false", on_raw_toggled }
+    };
+
+    private void on_action_radio (GLib.SimpleAction action,
+                                  GLib.Variant?     parameter) {
+        action.change_state (parameter);
+    }
+
+    private void on_action_toggle (GLib.SimpleAction action,
+                                   GLib.Variant?     parameter) {
+        var state = (bool) action.get_state ();
+        action.change_state (!state);
+    }
     
     private void register() {
         _text = new TextAction();
-        
-        Gtk.RadioActionEntry[] view_filter_actions = new Gtk.RadioActionEntry[0];
-        
-        Gtk.RadioActionEntry rejected_only = { "CommonDisplayRejectedOnly", null, TRANSLATABLE,
-            "<Ctrl>8", TRANSLATABLE, RatingFilter.REJECTED_ONLY };
-        rejected_only.label = Resources.DISPLAY_REJECTED_ONLY_MENU;
-        rejected_only.tooltip = Resources.DISPLAY_REJECTED_ONLY_TOOLTIP;
-        view_filter_actions += rejected_only;
-        
-        Gtk.RadioActionEntry rejected_or_higher = { "CommonDisplayRejectedOrHigher", null, TRANSLATABLE,
-            "<Ctrl>9", TRANSLATABLE, RatingFilter.REJECTED_OR_HIGHER };
-        rejected_or_higher.label = Resources.DISPLAY_REJECTED_OR_HIGHER_MENU;
-        rejected_or_higher.tooltip = GLib.dpgettext2 (null, "Tooltip",
-                Resources.DISPLAY_REJECTED_OR_HIGHER_TOOLTIP);
-        view_filter_actions += rejected_or_higher;
-        
-        Gtk.RadioActionEntry unrated_or_higher = { "CommonDisplayUnratedOrHigher", null, TRANSLATABLE, 
-            "<Ctrl>0", TRANSLATABLE, RatingFilter.UNRATED_OR_HIGHER };
-        unrated_or_higher.label = Resources.DISPLAY_UNRATED_OR_HIGHER_MENU;
-        unrated_or_higher.tooltip = Resources.DISPLAY_UNRATED_OR_HIGHER_TOOLTIP;
-        view_filter_actions += unrated_or_higher;
-        
-        Gtk.RadioActionEntry one_or_higher = { "CommonDisplayOneOrHigher", null, TRANSLATABLE,
-            "<Ctrl>1", TRANSLATABLE, RatingFilter.ONE_OR_HIGHER };
-        one_or_higher.label = Resources.DISPLAY_ONE_OR_HIGHER_MENU;
-        one_or_higher.tooltip = Resources.DISPLAY_ONE_OR_HIGHER_TOOLTIP;
-        view_filter_actions += one_or_higher;
-        
-        Gtk.RadioActionEntry two_or_higher = { "CommonDisplayTwoOrHigher", null, TRANSLATABLE,
-            "<Ctrl>2", TRANSLATABLE, RatingFilter.TWO_OR_HIGHER };
-        two_or_higher.label = Resources.DISPLAY_TWO_OR_HIGHER_MENU;
-        two_or_higher.tooltip = Resources.DISPLAY_TWO_OR_HIGHER_TOOLTIP;
-        view_filter_actions += two_or_higher;
-        
-        Gtk.RadioActionEntry three_or_higher = { "CommonDisplayThreeOrHigher", null, TRANSLATABLE,
-            "<Ctrl>3", TRANSLATABLE, RatingFilter.THREE_OR_HIGHER };
-        three_or_higher.label = Resources.DISPLAY_THREE_OR_HIGHER_MENU;
-        three_or_higher.tooltip = Resources.DISPLAY_THREE_OR_HIGHER_TOOLTIP;
-        view_filter_actions += three_or_higher;
-        
-        Gtk.RadioActionEntry four_or_higher = { "CommonDisplayFourOrHigher", null, TRANSLATABLE,
-            "<Ctrl>4", TRANSLATABLE, RatingFilter.FOUR_OR_HIGHER };
-        four_or_higher.label = Resources.DISPLAY_FOUR_OR_HIGHER_MENU;
-        four_or_higher.tooltip = Resources.DISPLAY_FOUR_OR_HIGHER_TOOLTIP;
-        view_filter_actions += four_or_higher;
-        
-        Gtk.RadioActionEntry five_or_higher = { "CommonDisplayFiveOrHigher", null, TRANSLATABLE,
-            "<Ctrl>5", TRANSLATABLE, RatingFilter.FIVE_OR_HIGHER };
-        five_or_higher.label = Resources.DISPLAY_FIVE_OR_HIGHER_MENU;
-        five_or_higher.tooltip = Resources.DISPLAY_FIVE_OR_HIGHER_TOOLTIP;
-        view_filter_actions += five_or_higher;
-        
-        action_group.add_radio_actions(view_filter_actions, RatingFilter.UNRATED_OR_HIGHER,
-            on_rating_changed);
-        
-        Gtk.ToggleActionEntry[] toggle_actions = new Gtk.ToggleActionEntry[0];
-        
-        Gtk.ToggleActionEntry flagged_action = { "CommonDisplayFlagged", Resources.ICON_FILTER_FLAGGED,
-            TRANSLATABLE, null, TRANSLATABLE, on_flagged_toggled, false };
-        flagged_action.label = _("Flagged");
-        flagged_action.tooltip = _("Flagged");
-        toggle_actions += flagged_action;
-        
-        Gtk.ToggleActionEntry photos_action = { "CommonDisplayPhotos", Resources.ICON_FILTER_PHOTOS,
-            TRANSLATABLE, null, TRANSLATABLE, on_photos_toggled, false };
-        photos_action.label = _("Photos");
-        photos_action.tooltip = _("Photos");
-        toggle_actions += photos_action;
-        
-        Gtk.ToggleActionEntry videos_action = { "CommonDisplayVideos", Resources.ICON_FILTER_VIDEOS,
-            TRANSLATABLE, null, TRANSLATABLE, on_videos_toggled, false };
-        videos_action.label = _("Videos");
-        videos_action.tooltip = _("Videos");
-        toggle_actions += videos_action;
-        
-        Gtk.ToggleActionEntry raw_action = { "CommonDisplayRaw", Resources.ICON_FILTER_RAW, TRANSLATABLE,
-            null, TRANSLATABLE, on_raw_toggled, false };
-        raw_action.label = _("RAW Photos");
-        raw_action.tooltip = _("RAW photos");
-        toggle_actions += raw_action;
-        
-        action_group.add_toggle_actions(toggle_actions, this);
     }
-    
-    private void on_rating_changed(Gtk.Action action, Gtk.Action current) {
-        rating_changed((RatingFilter) ((Gtk.RadioAction) current).get_current_value());
+
+    private void on_rating_changed (GLib.SimpleAction action,
+                                    GLib.Variant      value) {
+        action.set_state (value);
+        var filter = (RatingFilter) int.parse (value.get_string ());
+        rating_changed(filter);
     }
     
-    private void on_flagged_toggled(Gtk.Action action) {
-        flagged_toggled(((Gtk.ToggleAction) action).active);
+    private void on_flagged_toggled (GLib.SimpleAction action,
+                                     GLib.Variant      value) {
+        action.set_state (value);
+        flagged_toggled (value.get_boolean ());
     }
     
-    private void on_photos_toggled(Gtk.Action action) {
-        photos_toggled(((Gtk.ToggleAction) action).active);
+    private void on_photos_toggled (GLib.SimpleAction action,
+                                    GLib.Variant      value) {
+        action.set_state (value);
+        photos_toggled (value.get_boolean ());
     }
     
-    private void on_videos_toggled(Gtk.Action action) {
-        videos_toggled(((Gtk.ToggleAction) action).active);
+    private void on_videos_toggled (GLib.SimpleAction action,
+                                    GLib.Variant      value) {
+        action.set_state (value);
+        videos_toggled (value.get_boolean ());
     }
     
-    private void on_raw_toggled(Gtk.Action action) {
-        raw_toggled(((Gtk.ToggleAction) action).active);
+    private void on_raw_toggled (GLib.SimpleAction action,
+                                 GLib.Variant      value) {
+        action.set_state (value);
+        raw_toggled (value.get_boolean ());
     }
     
     public bool get_has_photos() {
@@ -689,14 +628,11 @@ public class SearchFilterToolbar : Gtk.Revealer {
     
     private class ToggleActionToolButton : Gtk.ToolItem {
         private Gtk.ToggleButton button;
-        private Gtk.ToggleAction action;
 
-        public ToggleActionToolButton(Gtk.ToggleAction action) {
-            this.action = action;
+        public ToggleActionToolButton(string action) {
             button = new Gtk.ToggleButton();
             button.set_can_focus(false);
-            button.set_active(action.active);
-            button.clicked.connect(on_button_activate);
+            button.set_action_name (action);
             button.set_has_tooltip(true);
             button.set_relief(Gtk.ReliefStyle.NONE);
             button.set_margin_start(2);
@@ -704,14 +640,6 @@ public class SearchFilterToolbar : Gtk.Revealer {
             this.add(button);
         }
         
-        ~ToggleActionToolButton() {
-            button.clicked.disconnect(on_button_activate);
-        }
-        
-        private void on_button_activate() {
-            action.activate();
-        }
-        
         public void set_icon_name(string icon_name) {
             Gtk.Image? image = null;
             button.set_always_show_image(true);
@@ -811,33 +739,22 @@ public class SearchFilterToolbar : Gtk.Revealer {
     
     // Handles ratings filters.
     protected class RatingFilterButton : Gtk.ToolItem {
-        public Gtk.Menu filter_popup = null;
-        public Gtk.Button button;
-        
-        public signal void clicked();
-        
-        public RatingFilterButton() {
-            button = new Gtk.Button();
-            button.set_image(get_filter_icon(RatingFilter.UNRATED_OR_HIGHER));
+        public Gtk.MenuButton button;
+
+        public RatingFilterButton(GLib.MenuModel model) {
+            button = new Gtk.MenuButton();
+
+            button.set_image (get_filter_icon(RatingFilter.UNRATED_OR_HIGHER));
             button.set_can_focus(false);
             button.set_relief(Gtk.ReliefStyle.NONE);
             button.set_margin_start(2);
+            button.set_menu_model (model);
 
-            button.clicked.connect(on_clicked);
-            
             set_homogeneous(false);
-            
+
             this.add(button);
         }
-        
-        ~RatingFilterButton() {
-            button.clicked.disconnect(on_clicked);
-        }
-        
-        private void on_clicked() {
-            clicked();
-        }
-        
+
         private Gtk.Widget get_filter_icon(RatingFilter filter) {
             string filename = null;
 
@@ -845,7 +762,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
                 case RatingFilter.ONE_OR_HIGHER:
                     filename = Resources.ICON_FILTER_ONE_OR_BETTER;
                 break;
-                
+
                 case RatingFilter.TWO_OR_HIGHER:
                     filename = Resources.ICON_FILTER_TWO_OR_BETTER;
                 break;
@@ -1112,12 +1029,12 @@ public class SearchFilterToolbar : Gtk.Revealer {
         }
     }
     
-    public Gtk.UIManager ui = new Gtk.UIManager();
+    public Gtk.Builder builder = new Gtk.Builder ();
     
     private SearchFilterActions actions;
     private SavedSearch saved_search = null;
     private SearchBox search_box;
-    private RatingFilterButton rating_button = new RatingFilterButton();
+    private RatingFilterButton rating_button;
     private SavedSearchFilterButton saved_search_button = new SavedSearchFilterButton();
     private bool elide_showing_again = false;
     private SearchViewFilter? search_filter = null;
@@ -1133,22 +1050,20 @@ public class SearchFilterToolbar : Gtk.Revealer {
     public SearchFilterToolbar(SearchFilterActions actions) {
         this.actions = actions;
         toolbar = new Gtk.Toolbar();
+//        toolbar.insert_action_group ("filterbar", actions.get_action_group ());
         actions.media_context_changed.connect(on_media_context_changed);
         search_box = new SearchBox(actions.text);
         
         toolbar.set_name("search-filter-toolbar");
         toolbar.set_icon_size(Gtk.IconSize.SMALL_TOOLBAR);
         
-        File ui_file = Resources.get_ui("search_bar.ui");
         try {
-            ui.add_ui_from_file(ui_file.get_path());
+            this.builder.add_from_resource ("/org/gnome/Shotwell/search_bar.ui");
         } catch (Error err) {
-            AppWindow.panic(_("Error loading UI file %s: %s").printf(
-                ui_file.get_path(), err.message));
+            AppWindow.panic(_("Error loading search bar UI: %s").printf(
+                err.message));
         }
         
-        ui.insert_action_group(actions.get_action_group(), 0);
-        
         // Ticket #3260 - Add a 'close' context menu to
         // the searchbar.
         // Prepare the close menu for use, but don't
@@ -1163,14 +1078,14 @@ public class SearchFilterToolbar : Gtk.Revealer {
         label_type = new LabelToolItem(_("Type"), 10, 5);
         toolbar.insert(label_type, -1);
         
-        toolbtn_photos = new ToggleActionToolButton(actions.photos);
-        
toolbtn_photos.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayPhotos").tooltip);
+        toolbtn_photos = new ToggleActionToolButton("win.display.photos");
+        toolbtn_photos.set_tooltip_text (_("Photos"));
         
-        toolbtn_videos = new ToggleActionToolButton(actions.videos);
-        
toolbtn_videos.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayVideos").tooltip);
+        toolbtn_videos = new ToggleActionToolButton("win.display.videos");
+        toolbtn_videos.set_tooltip_text(_("Videos"));
         
-        toolbtn_raw = new ToggleActionToolButton(actions.raw);
-        toolbtn_raw.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayRaw").tooltip);
+        toolbtn_raw = new ToggleActionToolButton("win.display.raw");
+        toolbtn_raw.set_tooltip_text(_("RAW Photos"));
         
         toolbar.insert(toolbtn_photos, -1);
         toolbar.insert(toolbtn_videos, -1);
@@ -1182,9 +1097,9 @@ public class SearchFilterToolbar : Gtk.Revealer {
         
         // Flagged button
         
-        toolbtn_flag = new ToggleActionToolButton(actions.flagged);
+        toolbtn_flag = new ToggleActionToolButton("win.display.flagged");
         toolbtn_flag.set_label(_("Flagged"));
-        toolbtn_flag.set_tooltip_text(actions.get_action_group().get_action("CommonDisplayFlagged").tooltip);
+        toolbtn_flag.set_tooltip_text(_("Flagged"));
         
         toolbar.insert(toolbtn_flag, -1);
         
@@ -1193,10 +1108,10 @@ public class SearchFilterToolbar : Gtk.Revealer {
         toolbar.insert(sepr_flagged_rating, -1);
         
         // Rating button
-        rating_button.filter_popup = (Gtk.Menu) ui.get_widget("/FilterPopupMenu");
+        var model = this.builder.get_object ("popup-menu") as GLib.MenuModel;
+        rating_button = new RatingFilterButton (model);
         rating_button.set_label(_("Rating"));
         rating_button.set_expand(false);
-        rating_button.clicked.connect(on_filter_button_clicked);
         toolbar.insert(rating_button, -1);
         
         // separator
@@ -1289,12 +1204,13 @@ public class SearchFilterToolbar : Gtk.Revealer {
         // Try to obtain the action for toggling the searchbar.  If
         // it's null, then we're probably in direct edit mode, and 
         // shouldn't do anything anyway.
-        Gtk.ToggleAction searchbar_toggle = aw.get_common_action("CommonDisplaySearchbar") as 
Gtk.ToggleAction;
+        var action = aw.lookup_action ("CommonDisplaySearchbar") as
+            GLib.SimpleAction;
         
         // Could we find the appropriate action?
-        if(searchbar_toggle != null) {
+        if(action != null) {
             // Yes, hide the search bar.
-            searchbar_toggle.set_active(false);
+            action.set_state(false);
         }
     }
     
@@ -1324,9 +1240,13 @@ public class SearchFilterToolbar : Gtk.Revealer {
         if (aw == null)
             return;
 
-        Gtk.ToggleAction searchbar_toggle = aw.get_common_action("CommonDisplaySearchbar") as 
Gtk.ToggleAction;
-        if(searchbar_toggle != null)
-            searchbar_toggle.set_active(true);
+        var action = aw.lookup_action ("CommonDisplaySearchbar") as
+            GLib.SimpleAction;
+
+        // Could we find the appropriate action?
+        if(action != null) {
+            action.set_state(true);
+        }
 
         update();
     }
@@ -1365,12 +1285,14 @@ public class SearchFilterToolbar : Gtk.Revealer {
         assert(null != search_filter);
         
         search_filter.set_search_filter(actions.text.value);
-        search_filter.flagged = actions.flagged.active;
-        search_filter.show_media_video = actions.videos.active;
-        search_filter.show_media_photos = actions.photos.active;
-        search_filter.show_media_raw = actions.raw.active;
-        
-        RatingFilter filter = (RatingFilter) actions.rating.current_value;
+        search_filter.flagged = actions.flagged.get_state ().get_boolean ();
+        search_filter.show_media_video = actions.videos.get_state
+            ().get_boolean ();
+        search_filter.show_media_photos = actions.photos.get_state
+            ().get_boolean ();
+        search_filter.show_media_raw = actions.raw.get_state ().get_boolean ();
+
+        var filter = (RatingFilter) int.parse (actions.rating.get_state ().get_string ());
         search_filter.set_rating_filter(filter);
         rating_button.set_filter_icon(filter);
 
@@ -1404,31 +1326,6 @@ public class SearchFilterToolbar : Gtk.Revealer {
         search_filter.refresh();
     }
     
-    private void position_filter_popup(Gtk.Menu menu, out int x, out int y, out bool push_in) {
-        menu.realize();
-        int rx, ry;
-        rating_button.get_window().get_root_origin(out rx, out ry);
-        
-        Gtk.Allocation rating_button_allocation;
-        rating_button.get_allocation(out rating_button_allocation);
-        
-        Gtk.Allocation menubar_allocation;
-        AppWindow.get_instance().get_current_page().get_menubar().get_allocation(out menubar_allocation);
-        
-        int sidebar_w = Config.Facade.get_instance().get_sidebar_position();
-        
-        x = rx + rating_button_allocation.x + sidebar_w;
-        y = ry + rating_button_allocation.y + rating_button_allocation.height +
-                menubar_allocation.height;
-
-        push_in = false;
-    }
-    
-    private void on_filter_button_clicked() {
-        rating_button.filter_popup.popup(null, null, position_filter_popup, 0,
-            Gtk.get_current_event_time());
-    }
-
     private void on_savedsearch_selected(SavedSearch saved_search) {
         this.saved_search = saved_search;
         update();
@@ -1438,7 +1335,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
         this.saved_search = null;
         update();
     }
-    
+
     private void edit_dialog(SavedSearch search) {
         saved_search_button.filter_popup.hide();
         SavedSearchDialog ssd = new SavedSearchDialog.edit_existing(search);
diff --git a/src/camera/ImportPage.vala b/src/camera/ImportPage.vala
index db48634..352bba6 100644
--- a/src/camera/ImportPage.vala
+++ b/src/camera/ImportPage.vala
@@ -801,7 +801,7 @@ public class ImportPage : CheckerboardPage {
             
             // Find button
             Gtk.ToggleToolButton find_button = new Gtk.ToggleToolButton();
-            find_button.set_related_action(get_action("CommonDisplaySearchbar"));
+            find_button.set_action_name ("win.CommonDisplaySearchbar");
             
             toolbar.insert(find_button, -1);
             
@@ -811,14 +811,14 @@ public class ImportPage : CheckerboardPage {
             // Import selected
             Gtk.ToolButton import_selected_button = new Gtk.ToolButton(null, null);
             import_selected_button.set_icon_name(Resources.IMPORT);
-            import_selected_button.set_related_action(get_action("ImportSelected"));
+            import_selected_button.set_action_name ("win.ImportSelected");
             
             toolbar.insert(import_selected_button, -1);
             
             // Import all
             Gtk.ToolButton import_all_button = new Gtk.ToolButton(null, null);
             import_all_button.set_icon_name(Resources.IMPORT_ALL);
-            import_all_button.set_related_action(get_action("ImportAll"));
+            import_all_button.set_action_name ("win.ImportAll");
             
             toolbar.insert(import_all_button, -1);
 
@@ -864,35 +864,20 @@ public class ImportPage : CheckerboardPage {
         
         ui_filenames.add("import.ui");
     }
-    
-    protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
-        Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
 
-        Gtk.ToggleActionEntry titles = { "ViewTitle", null, TRANSLATABLE, "<Ctrl><Shift>T",
-            TRANSLATABLE, on_display_titles, Config.Facade.get_instance().get_display_photo_titles() };
-        titles.label = _("_Titles");
-        titles.tooltip = _("Display the title of each photo");
-        toggle_actions += titles;
+    private const GLib.ActionEntry[] entries = {
+        { "ImportSelected", on_import_selected },
+        { "ImportAll", on_import_all },
+        // Toggle actions
+        { "ViewTitle", on_action_toggle, null, "false", on_display_titles },
+    };
 
-        return toggle_actions;
-    }
+    protected override void add_actions () {
+        base.add_actions ();
 
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry import_selected = { "ImportSelected", Resources.IMPORT,
-            TRANSLATABLE, null, null, on_import_selected };
-        import_selected.label = _("Import _Selected");
-        import_selected.tooltip = _("Import the selected photos into your library");
-        actions += import_selected;
+        AppWindow.get_instance ().add_action_entries (entries, this);
 
-        Gtk.ActionEntry import_all = { "ImportAll", Resources.IMPORT_ALL, TRANSLATABLE,
-            null, null, on_import_all };
-        import_all.label = _("Import _All");
-        import_all.tooltip = _("Import all the photos into your library");
-        actions += import_all;
-
-        return actions;
+        (get_action ("ViewTitle") as GLib.SimpleAction).set_state (Config.Facade.get_instance 
().get_display_photo_titles ());
     }
     
     public GPhoto.Camera get_camera() {
@@ -948,8 +933,7 @@ public class ImportPage : CheckerboardPage {
     private void on_view_changed() {
         set_action_sensitive("ImportSelected", !busy && refreshed && get_view().get_selected_count() > 0);
         set_action_sensitive("ImportAll", !busy && refreshed && get_view().get_count() > 0);
-        AppWindow.get_instance().set_common_action_sensitive("CommonSelectAll",
-            !busy && (get_view().get_count() > 0));
+        set_action_sensitive("CommonSelectAll", !busy && (get_view().get_count() > 0));
 
         update_toolbar_state();
     }
@@ -958,13 +942,15 @@ public class ImportPage : CheckerboardPage {
         search_filter.refresh();
     }
 
-    private void on_display_titles(Gtk.Action action) {
-        bool display = ((Gtk.ToggleAction) action).get_active();
+    private void on_display_titles(GLib.SimpleAction action, Variant? value) {
+        bool display = value.get_boolean ();
 
         set_display_titles(display);
+
         Config.Facade.get_instance().set_display_photo_titles(display);
+        action.set_state (value);
     }
-    
+
     public override void switched_to() {
         set_display_titles(Config.Facade.get_instance().get_display_photo_titles());
         
@@ -1791,10 +1777,8 @@ public class ImportPage : CheckerboardPage {
 
     public override void set_display_titles(bool display) {
         base.set_display_titles(display);
-    
-        Gtk.ToggleAction? action = get_action("ViewTitle") as Gtk.ToggleAction;
-        if (action != null)
-            action.set_active(display);
+
+        set_action_active ("ViewTitle", display);
     }
     
     // Gets the search view filter for this page.
diff --git a/src/direct/DirectPhotoPage.vala b/src/direct/DirectPhotoPage.vala
index 2a56887..57dfe11 100644
--- a/src/direct/DirectPhotoPage.vala
+++ b/src/direct/DirectPhotoPage.vala
@@ -38,184 +38,49 @@ public class DirectPhotoPage : EditingHostPage {
         ui_filenames.add("direct_context.ui");
         ui_filenames.add("direct.ui");
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry file = { "FileMenu", null, TRANSLATABLE, null, null, null };
-        file.label = _("_File");
-        actions += file;
-
-        Gtk.ActionEntry save = { "Save", Resources.SAVE_LABEL, TRANSLATABLE, "<Ctrl>S", TRANSLATABLE,
-            on_save };
-        save.label = _("_Save");
-        save.tooltip = _("Save photo");
-        actions += save;
-
-        Gtk.ActionEntry save_as = { "SaveAs", Resources.SAVE_AS_LABEL, TRANSLATABLE,
-            "<Ctrl><Shift>S", TRANSLATABLE, on_save_as };
-        save_as.label = _("Save _As…");
-        save_as.tooltip = _("Save photo with a different name");
-        actions += save_as;
-        
-        Gtk.ActionEntry send_to = { "SendTo", "document-send", TRANSLATABLE, null,
-            TRANSLATABLE, on_send_to };
-        send_to.label = Resources.SEND_TO_MENU;
-        actions += send_to;
-
-        Gtk.ActionEntry print = { "Print", Resources.PRINT_LABEL, TRANSLATABLE, "<Ctrl>P",
-            TRANSLATABLE, on_print };
-        print.label = Resources.PRINT_MENU;
-        print.tooltip = _("Print the photo to a printer connected to your computer");
-        actions += print;
-        
-        Gtk.ActionEntry edit = { "EditMenu", null, TRANSLATABLE, null, null, null };
-        edit.label = _("_Edit");
-        actions += edit;
-
-        Gtk.ActionEntry photo = { "PhotoMenu", null, "", null, null, null };
-        photo.label = _("_Photo");
-        actions += photo;
-        
-        Gtk.ActionEntry tools = { "Tools", null, TRANSLATABLE, null, null, null };
-        tools.label = _("T_ools");
-        actions += tools;
-        
-        Gtk.ActionEntry prev = { "PrevPhoto", Resources.PREVIOUS_LABEL, TRANSLATABLE, null,
-            TRANSLATABLE, on_previous_photo };
-        prev.label = _("_Previous Photo");
-        prev.tooltip = _("Previous Photo");
-        actions += prev;
-
-        Gtk.ActionEntry next = { "NextPhoto", Resources.NEXT_LABEL, TRANSLATABLE, null,
-            TRANSLATABLE, on_next_photo };
-        next.label = _("_Next Photo");
-        next.tooltip = _("Next Photo");
-        actions += next;
-
-        Gtk.ActionEntry rotate_right = { "RotateClockwise", Resources.CLOCKWISE,
-            TRANSLATABLE, "<Ctrl>R", TRANSLATABLE, on_rotate_clockwise };
-        rotate_right.label = Resources.ROTATE_CW_MENU;
-        rotate_right.tooltip = Resources.ROTATE_CCW_TOOLTIP;
-        actions += rotate_right;
-
-        Gtk.ActionEntry rotate_left = { "RotateCounterclockwise", Resources.COUNTERCLOCKWISE,
-            TRANSLATABLE, "<Ctrl><Shift>R", TRANSLATABLE, on_rotate_counterclockwise };
-        rotate_left.label = Resources.ROTATE_CCW_MENU;
-        rotate_left.tooltip = Resources.ROTATE_CCW_TOOLTIP;
-        actions += rotate_left;
-
-        Gtk.ActionEntry hflip = { "FlipHorizontally", Resources.HFLIP, TRANSLATABLE, null,
-            TRANSLATABLE, on_flip_horizontally };
-        hflip.label = Resources.HFLIP_MENU;
-        actions += hflip;
-        
-        Gtk.ActionEntry vflip = { "FlipVertically", Resources.VFLIP, TRANSLATABLE, null,
-            TRANSLATABLE, on_flip_vertically };
-        vflip.label = Resources.VFLIP_MENU;
-        actions += vflip;
-        
-        Gtk.ActionEntry enhance = { "Enhance", Resources.ENHANCE, TRANSLATABLE, "<Ctrl>E",
-            TRANSLATABLE, on_enhance };
-        enhance.label = Resources.ENHANCE_MENU;
-        enhance.tooltip = Resources.ENHANCE_TOOLTIP;
-        actions += enhance;
-        
-        Gtk.ActionEntry crop = { "Crop", Resources.CROP, TRANSLATABLE, "<Ctrl>O",
-            TRANSLATABLE, toggle_crop };
-        crop.label = Resources.CROP_MENU;
-        crop.tooltip = Resources.CROP_TOOLTIP;
-        actions += crop;
-        
-        Gtk.ActionEntry straighten = { "Straighten", Resources.REFRESH_LABEL, TRANSLATABLE, "<Ctrl>A",
-            TRANSLATABLE, toggle_straighten };
-        straighten.label = Resources.STRAIGHTEN_MENU;
-        straighten.tooltip = Resources.STRAIGHTEN_TOOLTIP;
-        actions += straighten;
-        
-        Gtk.ActionEntry red_eye = { "RedEye", Resources.REDEYE, TRANSLATABLE, "<Ctrl>Y",
-            TRANSLATABLE, toggle_redeye };
-        red_eye.label = Resources.RED_EYE_MENU;
-        red_eye.tooltip = Resources.RED_EYE_TOOLTIP;
-        actions += red_eye;
-        
-        Gtk.ActionEntry adjust = { "Adjust", Resources.ADJUST, TRANSLATABLE, "<Ctrl>D",
-            TRANSLATABLE, toggle_adjust };
-        adjust.label = Resources.ADJUST_MENU;
-        adjust.tooltip = Resources.ADJUST_TOOLTIP;
-        actions += adjust;
-        
-        Gtk.ActionEntry revert = { "Revert", Resources.REVERT_LABEL, TRANSLATABLE,
-            null, TRANSLATABLE, on_revert };
-        revert.label = Resources.REVERT_MENU;
-        actions += revert;
-
-        Gtk.ActionEntry adjust_date_time = { "AdjustDateTime", null, TRANSLATABLE, null,
-            TRANSLATABLE, on_adjust_date_time };
-        adjust_date_time.label = Resources.ADJUST_DATE_TIME_MENU;
-        actions += adjust_date_time;
-        
-        Gtk.ActionEntry set_background = { "SetBackground", null, TRANSLATABLE, "<Ctrl>B",
-            TRANSLATABLE, on_set_background };
-        set_background.label = Resources.SET_BACKGROUND_MENU;
-        set_background.tooltip = Resources.SET_BACKGROUND_TOOLTIP;
-        actions += set_background;
-
-        Gtk.ActionEntry view = { "ViewMenu", null, TRANSLATABLE, null, null, null };
-        view.label = _("_View");
-        actions += view;
-
-        Gtk.ActionEntry help = { "HelpMenu", null, TRANSLATABLE, null, null, null };
-        help.label = _("_Help");
-        actions += help;
-
-        Gtk.ActionEntry increase_size = { "IncreaseSize", Resources.ZOOM_IN_LABEL, TRANSLATABLE,
-            "<Ctrl>plus", TRANSLATABLE, on_increase_size };
-        increase_size.label = _("Zoom _In");
-        increase_size.tooltip = _("Increase the magnification of the photo");
-        actions += increase_size;
-
-        Gtk.ActionEntry decrease_size = { "DecreaseSize", Resources.ZOOM_OUT_LABEL, TRANSLATABLE,
-            "<Ctrl>minus", TRANSLATABLE, on_decrease_size };
-        decrease_size.label = _("Zoom _Out");
-        decrease_size.tooltip = _("Decrease the magnification of the photo");
-        actions += decrease_size;
-
-        Gtk.ActionEntry best_fit = { "ZoomFit", Resources.ZOOM_FIT_LABEL, TRANSLATABLE,
-            "<Ctrl>0", TRANSLATABLE, snap_zoom_to_min };
-        best_fit.label = _("Fit to _Page");
-        best_fit.tooltip = _("Zoom the photo to fit on the screen");
-        actions += best_fit;
-
-        Gtk.ActionEntry actual_size = { "Zoom100", Resources.ZOOM_100_LABEL, TRANSLATABLE,
-            "<Ctrl>1", TRANSLATABLE, snap_zoom_to_isomorphic };
-        /// xgettext:no-c-format
-        actual_size.label = _("Zoom _100%");
-        /// xgettext:no-c-format
-        actual_size.tooltip = _("Zoom the photo to 100% magnification");
-        actions += actual_size;
-        
-        Gtk.ActionEntry max_size = { "Zoom200", null, TRANSLATABLE,
-            "<Ctrl>2", TRANSLATABLE, snap_zoom_to_max };
-        /// xgettext:no-c-format
-        max_size.label = _("Zoom _200%");
-        /// xgettext:no-c-format
-        max_size.tooltip = _("Zoom the photo to 200% magnification");
-        actions += max_size;
 
-        return actions;
+    private const GLib.ActionEntry[] entries = {
+        { "Save", on_save },
+        { "SaveAs", on_save_as },
+        { "SendTo", on_send_to },
+        { "Print", on_print },
+        { "PrevPhoto", on_previous_photo },
+        { "NextPhoto", on_next_photo },
+        { "RotateClockwise", on_rotate_clockwise },
+        { "RotateCounterclockwise", on_rotate_counterclockwise },
+        { "FlipHorizontally", on_flip_horizontally },
+        { "FlipVertically", on_flip_vertically },
+        { "Enhance", on_enhance },
+        { "Crop", toggle_crop },
+        { "Straighten", toggle_straighten },
+        { "RedEye", toggle_redeye },
+        { "Adjust", toggle_adjust },
+        { "Revert", on_revert },
+        { "AdjustDateTime", on_adjust_date_time },
+        { "SetBackground", on_set_background },
+        { "IncreaseSize", on_increase_size },
+        { "DecreaseSize", on_decrease_size },
+        { "ZoomFit", snap_zoom_to_min },
+        { "Zoom100", snap_zoom_to_isomorphic },
+        { "Zoom200", snap_zoom_to_max }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+
+        AppWindow.get_instance ().add_action_entries (entries, this);
     }
     
     protected override InjectionGroup[] init_collect_injection_groups() {
         InjectionGroup[] groups = base.init_collect_injection_groups();
         
-        InjectionGroup print_group = new InjectionGroup("/MenuBar/FileMenu/PrintPlaceholder");
-        print_group.add_menu_item("Print");
+        InjectionGroup print_group = new InjectionGroup("PrintPlaceholder");
+        print_group.add_menu_item(_("_Print"), "Print", "<Primary>p");
         
         groups += print_group;
         
-        InjectionGroup bg_group = new InjectionGroup("/MenuBar/FileMenu/SetBackgroundPlaceholder");
-        bg_group.add_menu_item("SetBackground");
+        InjectionGroup bg_group = new InjectionGroup("SetBackgroundPlaceholder");
+        bg_group.add_menu_item(_("Set as _Desktop Background"), "SetBackground");
         
         groups += bg_group;
         
@@ -274,8 +139,8 @@ public class DirectPhotoPage : EditingHostPage {
     }
 
     protected override bool on_context_buttonpress(Gdk.EventButton event) {
-        Gtk.Menu context_menu = (Gtk.Menu) ui.get_widget("/DirectContextMenu");
-        popup_context_menu(context_menu, event);
+//        Gtk.Menu context_menu = (Gtk.Menu) ui.get_widget("/DirectContextMenu");
+//        popup_context_menu(context_menu, event);
 
         return true;
     }
diff --git a/src/events/EventPage.vala b/src/events/EventPage.vala
index fdaf80b..8b271d1 100644
--- a/src/events/EventPage.vala
+++ b/src/events/EventPage.vala
@@ -46,27 +46,19 @@ public class EventPage : CollectionPage {
         
         ui_filenames.add("event.ui");
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] new_actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry make_primary = { "MakePrimary", Resources.MAKE_PRIMARY,
-            TRANSLATABLE, null, TRANSLATABLE, on_make_primary };
-        make_primary.label = Resources.MAKE_KEY_PHOTO_MENU;
-        new_actions += make_primary;
 
-        Gtk.ActionEntry rename = { "Rename", null, TRANSLATABLE, null, TRANSLATABLE, on_rename };
-        rename.label = Resources.RENAME_EVENT_MENU;
-        new_actions += rename;
+    private const GLib.ActionEntry[] entries = {
+        { "MakePrimary", on_make_primary },
+        { "Rename", on_rename },
+        { "EditEventComment", on_edit_comment }
+    };
 
-        Gtk.ActionEntry comment = { "EditEventComment", null, TRANSLATABLE, null,
-            Resources.EDIT_EVENT_COMMENT_MENU, on_edit_comment};
-        comment.label = Resources.EDIT_EVENT_COMMENT_MENU;
-        new_actions += comment;
+    protected override void add_actions () {
+        base.add_actions ();
 
-        return new_actions;
+        AppWindow.get_instance ().add_action_entries (entries, this);
     }
-    
+
     protected override void init_actions(int selected_count, int count) {
         base.init_actions(selected_count, count);
     }
diff --git a/src/events/EventsDirectoryPage.vala b/src/events/EventsDirectoryPage.vala
index 75ac468..2e0624f 100644
--- a/src/events/EventsDirectoryPage.vala
+++ b/src/events/EventsDirectoryPage.vala
@@ -54,7 +54,7 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
         get_view().set_property(Event.PROP_SHOW_COMMENTS,
             Config.Facade.get_instance().get_display_event_comments());
         
-        init_item_context_menu("/EventsDirectoryContextMenu");
+        init_item_context_menu("EventsDirectoryContextMenu");
 
         this.view_manager = view_manager;
 
@@ -63,15 +63,18 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
         
         // merge tool
         Gtk.ToolButton merge_button = new Gtk.ToolButton.from_stock(Resources.MERGE);
-        merge_button.set_related_action(get_action("Merge"));
+        merge_button.set_action_name("win.Merge");
+        merge_button.is_important = true;
+        merge_button.set_tooltip_text (Resources.MERGE_TOOLTIP);
+        merge_button.set_label (Resources.MERGE_LABEL);
         
         toolbar.insert(merge_button, -1);
     }
     
     ~EventsDirectoryPage() {
-        Gtk.RadioAction? action = get_action("CommonSortEventsAscending") as Gtk.RadioAction;
+        var action = get_action("CommonSortEvents") as GLib.SimpleAction;
         assert(action != null);
-        action.changed.disconnect(on_sort_changed);
+        action.change_state.disconnect(on_sort_changed);
     }
     
     protected override void init_collect_ui_filenames(Gee.List<string> ui_filenames) {
@@ -101,45 +104,30 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
         else
             return event_descending_comparator;
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry rename = { "Rename", null, TRANSLATABLE, "F2", TRANSLATABLE, on_rename };
-        rename.label = Resources.RENAME_EVENT_MENU;
-        actions += rename;
-       
-        Gtk.ActionEntry merge = { "Merge", Resources.MERGE, TRANSLATABLE, null, Resources.MERGE_TOOLTIP,
-            on_merge };
-        merge.label = Resources.MERGE_MENU;
-        actions += merge;
-        
-        Gtk.ActionEntry comment = { "EditComment", null, TRANSLATABLE, null, Resources.EDIT_COMMENT_MENU,
-            on_edit_comment };
-        comment.label = Resources.EDIT_COMMENT_MENU;
-        actions += comment;
-        
-        return actions;
-    }
-    
-    protected override Gtk.ToggleActionEntry[] init_collect_toggle_action_entries() {
-        Gtk.ToggleActionEntry[] toggle_actions = base.init_collect_toggle_action_entries();
-        
-        Gtk.ToggleActionEntry comments = { "ViewComment", null, TRANSLATABLE, "<Ctrl><Shift>C",
-            TRANSLATABLE, on_display_comments, Config.Facade.get_instance().get_display_event_comments() };
-        comments.label = _("_Comments");
-        comments.tooltip = _("Display the comment of each event");
-        toggle_actions += comments;
-        
-        return toggle_actions;
+
+    private const GLib.ActionEntry[] entries = {
+        { "Rename", on_rename },
+        { "Merge", on_merge },
+        { "EditComment", on_edit_comment },
+
+        // Toggle actions
+        { "ViewComment", on_action_toggle, null, "false", on_display_comments  }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+        AppWindow.get_instance ().add_action_entries (entries, this);
+
+        (get_action ("ViewComment") as GLib.SimpleAction).set_state
+            (Config.Facade.get_instance().get_display_event_comments());
     }
 
     protected override void init_actions(int selected_count, int count) {
         base.init_actions(selected_count, count);
         
-        Gtk.RadioAction? action = get_action("CommonSortEventsAscending") as Gtk.RadioAction;
+        var action = get_action("CommonSortEvents") as GLib.SimpleAction;
         assert(action != null);
-        action.changed.connect(on_sort_changed);
+        action.change_state.connect(on_sort_changed);
     }
     
     protected override void update_actions(int selected_count, int count) {
@@ -165,12 +153,12 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
         LibraryWindow.get_app().switch_to_event(event.event);
     }
     
-    private void on_sort_changed(Gtk.Action action, Gtk.Action c) {
-        Gtk.RadioAction current = (Gtk.RadioAction) c;
-        
+    private void on_sort_changed(GLib.SimpleAction action, Variant? value) {
         get_view().set_comparator(
-            get_event_comparator(current.current_value == LibraryWindow.SORT_EVENTS_ORDER_ASCENDING),
+            get_event_comparator(value.get_string() == LibraryWindow.SORT_EVENTS_ORDER_ASCENDING),
             event_comparator_predicate);
+
+        action.set_state (value);
     }
     
     private void on_rename() {
@@ -213,12 +201,14 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
         get_command_manager().execute(command);
     }
     
-    private void on_display_comments(Gtk.Action action) {
-        bool display = ((Gtk.ToggleAction) action).get_active();
+    private void on_display_comments(GLib.SimpleAction action, Variant? value) {
+        bool display = value.get_boolean ();
         
         set_display_comments(display);
         
         Config.Facade.get_instance().set_display_event_comments(display);
+
+        action.set_state (value);
     }
     
     public override SearchViewFilter get_search_view_filter() {
diff --git a/src/library/ImportQueuePage.vala b/src/library/ImportQueuePage.vala
index b5a5eb6..a2f2290 100644
--- a/src/library/ImportQueuePage.vala
+++ b/src/library/ImportQueuePage.vala
@@ -30,7 +30,7 @@ public class ImportQueuePage : SinglePhotoPage {
         // Stop button
         Gtk.ToolButton stop_button = new Gtk.ToolButton(null, null);
         stop_button.set_icon_name("stop");
-        stop_button.set_related_action(get_action("Stop"));
+        stop_button.set_action_name ("win.Stop");
         
         toolbar.insert(stop_button, -1);
 
@@ -58,17 +58,15 @@ public class ImportQueuePage : SinglePhotoPage {
         
         base.init_collect_ui_filenames(ui_filenames);
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry stop = { "Stop", Resources.STOP_LABEL, TRANSLATABLE, null, TRANSLATABLE,
-            on_stop };
-        stop.label = _("_Stop Import");
-        stop.tooltip = _("Stop importing photos");
-        actions += stop;
 
-        return actions;
+    private const GLib.ActionEntry[] entries = {
+        {"Stop", on_stop }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+
+        AppWindow.get_instance ().add_action_entries (entries, this);
     }
     
     public void enqueue_and_schedule(BatchImport batch_import, bool allow_user_cancel) {
diff --git a/src/library/LibraryWindow.vala b/src/library/LibraryWindow.vala
index b464f11..e6b9d11 100644
--- a/src/library/LibraryWindow.vala
+++ b/src/library/LibraryWindow.vala
@@ -13,8 +13,8 @@ public class LibraryWindow : AppWindow {
         }
     }
     
-    public const int SORT_EVENTS_ORDER_ASCENDING = 0;
-    public const int SORT_EVENTS_ORDER_DESCENDING = 1;
+    public const string SORT_EVENTS_ORDER_ASCENDING = "ascending";
+    public const string SORT_EVENTS_ORDER_DESCENDING = "descending";
     
     private const string[] SUPPORTED_MOUNT_SCHEMES = {
         "gphoto2:",
@@ -98,8 +98,6 @@ public class LibraryWindow : AppWindow {
     private Gtk.Paned client_paned = new Gtk.Paned(Gtk.Orientation.HORIZONTAL);
     private Gtk.Frame bottom_frame = new Gtk.Frame(null);
     
-    private Gtk.ActionGroup common_action_group = new Gtk.ActionGroup("LibraryWindowGlobalActionGroup");
-    
     private OneShotScheduler properties_scheduler = null;
     private bool notify_library_is_home_dir = true;
     
@@ -176,7 +174,7 @@ public class LibraryWindow : AppWindow {
         // setup search bar and add its accelerators to the window
         search_toolbar = new SearchFilterToolbar(search_actions);
         
-        try {
+/*        try {
             File ui_file = Resources.get_ui("top.ui");
             ui.add_ui_from_file(ui_file.get_path());
         } catch (Error e) {
@@ -189,6 +187,7 @@ public class LibraryWindow : AppWindow {
         // We never want to invoke show_all() on the menubar since that will show empty menus,
         // which should be hidden.
         menubar.no_show_all = true;
+        */
         
         // create the main layout & start at the Library page
         create_layout(library_branch.photos_entry.get_page());
@@ -276,227 +275,88 @@ public class LibraryWindow : AppWindow {
         monitor.auto_import_preparing.disconnect(on_library_monitor_auto_import_preparing);
         monitor.auto_import_progress.disconnect(on_library_monitor_auto_import_progress);
     }
-    
-    private Gtk.ActionEntry[] create_common_actions() {
-        Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-        
-        Gtk.ActionEntry import = { "CommonFileImport", Resources.IMPORT,
-            TRANSLATABLE, "<Ctrl>I", TRANSLATABLE, on_file_import };
-        import.label = _("_Import From Folder…");
-        import.tooltip = _("Import photos from disk to library");
-        actions += import;
-        
-        Gtk.ActionEntry import_from_external = {
-            "ExternalLibraryImport", Resources.IMPORT, TRANSLATABLE,
-            null, TRANSLATABLE, on_external_library_import
-        };
-        import_from_external.label = _("Import From _Application…");
-        actions += import_from_external;
-
-        Gtk.ActionEntry sort = { "CommonSortEvents", null, TRANSLATABLE, null, null, null };
-        sort.label = _("Sort _Events");
-        actions += sort;
-
-        Gtk.ActionEntry preferences = { "CommonPreferences", Resources.PREFERENCES_LABEL, TRANSLATABLE,
-            null, TRANSLATABLE, on_preferences };
-        preferences.label = Resources.PREFERENCES_MENU;
-        actions += preferences;
-        
-        Gtk.ActionEntry empty = { "CommonEmptyTrash", null, TRANSLATABLE, null, null,
-            on_empty_trash };
-        empty.label = _("Empty T_rash");
-        empty.tooltip = _("Delete all photos in the trash");
-        actions += empty;
-        
-        Gtk.ActionEntry jump_to_event = { "CommonJumpToEvent", null, TRANSLATABLE, null,
-            TRANSLATABLE, on_jump_to_event };
-        jump_to_event.label = _("View Eve_nt for Photo");
-        actions += jump_to_event;
-        
-        Gtk.ActionEntry find = { "CommonFind", null, TRANSLATABLE, null, null, on_find };
-        find.label = _("_Find");
-        find.tooltip = _("Find photos and videos by search criteria");
-        actions += find;
-        
-        // add the common action for the FilterPhotos submenu (the submenu contains items from
-        // SearchFilterActions)
-        Gtk.ActionEntry filter_photos = { "CommonFilterPhotos", null, TRANSLATABLE, null, null, null };
-        filter_photos.label = Resources.FILTER_PHOTOS_MENU;
-        actions += filter_photos;
-        
-        Gtk.ActionEntry new_search = { "CommonNewSearch", null, TRANSLATABLE, "<Ctrl>S", null, 
-            on_new_search };
-        new_search.label =  _("Ne_w Saved Search…");
-        actions += new_search;
 
-        // top-level menus
-        
-        Gtk.ActionEntry file = { "FileMenu", null, TRANSLATABLE, null, null, null };
-        file.label = _("_File");
-        actions += file;
-
-        Gtk.ActionEntry edit = { "EditMenu", null, TRANSLATABLE, null, null, null };
-        edit.label = _("_Edit");
-        actions += edit;
-
-        Gtk.ActionEntry view = { "ViewMenu", null, TRANSLATABLE, null, null, null };
-        view.label = _("_View");
-        actions += view;
-
-        Gtk.ActionEntry photo = { "PhotoMenu", null, TRANSLATABLE, null, null, null };
-        photo.label = _("_Photo");
-        actions += photo;
-
-        Gtk.ActionEntry photos = { "PhotosMenu", null, TRANSLATABLE, null, null, null };
-        photos.label = _("_Photos");
-        actions += photos;
-
-        Gtk.ActionEntry event = { "EventsMenu", null, TRANSLATABLE, null, null, null };
-        event.label = _("Even_ts");
-        actions += event;
-
-        Gtk.ActionEntry tags = { "TagsMenu", null, TRANSLATABLE, null, null, null };
-        tags.label = _("Ta_gs");
-        actions += tags;
-
-        Gtk.ActionEntry help = { "HelpMenu", null, TRANSLATABLE, null, null, null };
-        help.label = _("_Help");
-        actions += help;
-
-        return actions;
-    }
-    
-    private Gtk.ToggleActionEntry[] create_common_toggle_actions() {
-        Gtk.ToggleActionEntry[] actions = new Gtk.ToggleActionEntry[0];
-        
-        Gtk.ToggleActionEntry basic_props = { "CommonDisplayBasicProperties", null,
-            TRANSLATABLE, "<Ctrl><Shift>I", TRANSLATABLE, on_display_basic_properties, false };
-        basic_props.label = _("_Basic Information");
-        basic_props.tooltip = _("Display basic information for the selection");
-        actions += basic_props;
-
-        Gtk.ToggleActionEntry extended_props = { "CommonDisplayExtendedProperties", null,
-            TRANSLATABLE, "<Ctrl><Shift>X", TRANSLATABLE, on_display_extended_properties, false };
-        extended_props.label = _("E_xtended Information");
-        extended_props.tooltip = _("Display extended information for the selection");
-        actions += extended_props;
-        
-        Gtk.ToggleActionEntry searchbar = { "CommonDisplaySearchbar", "edit-find", TRANSLATABLE,
-            "F8", TRANSLATABLE, on_display_searchbar, is_search_toolbar_visible };
-        searchbar.label = _("_Search Bar");
-        searchbar.tooltip = _("Display the search bar");
-        actions += searchbar;
-        
-        Gtk.ToggleActionEntry sidebar = { "CommonDisplaySidebar", null, TRANSLATABLE,
-            "F9", TRANSLATABLE, on_display_sidebar, is_sidebar_visible() };
-        sidebar.label = _("S_idebar");
-        sidebar.tooltip = _("Display the sidebar");
-        actions += sidebar;
-
-        Gtk.ToggleActionEntry toolbar = { "CommonDisplayToolbar", null, TRANSLATABLE,
-            "<Ctrl>F9", TRANSLATABLE, on_display_toolbar, is_toolbar_visible() };
-        toolbar.label = _("T_oolbar");
-        toolbar.tooltip = _("Display the tool bar");
-        actions += toolbar;
-
-        return actions;
-    }
-    
-    private void add_common_radio_actions(Gtk.ActionGroup group) {
-        Gtk.RadioActionEntry[] actions = new Gtk.RadioActionEntry[0];
-        
-        Gtk.RadioActionEntry ascending = { "CommonSortEventsAscending",
-            Resources.SORT_ASCENDING_LABEL, TRANSLATABLE, null, TRANSLATABLE,
-            SORT_EVENTS_ORDER_ASCENDING };
-        ascending.label = _("_Ascending");
-        ascending.tooltip = _("Sort photos in an ascending order");
-        actions += ascending;
+    private const GLib.ActionEntry[] common_actions = {
+        // Normal actions
+        { "CommonFileImport", on_file_import },
+        { "ExternalLibraryImport", on_external_library_import },
+        { "CommonPreferences", on_preferences },
+        { "CommonEmptyTrash", on_empty_trash },
+        { "CommonJumpToEvent", on_jump_to_event },
+        { "CommonFind", on_find },
+        { "CommonNewSearch", on_new_search },
 
-        Gtk.RadioActionEntry descending = { "CommonSortEventsDescending",
-            Resources.SORT_DESCENDING_LABEL, TRANSLATABLE, null, TRANSLATABLE,
-            SORT_EVENTS_ORDER_DESCENDING };
-        descending.label = _("D_escending");
-        descending.tooltip = _("Sort photos in a descending order");
-        actions += descending;
-        
-        group.add_radio_actions(actions, SORT_EVENTS_ORDER_ASCENDING, on_events_sort_changed);
-    }
-    
-    protected override Gtk.ActionGroup[] create_common_action_groups() {
-        Gtk.ActionGroup[] groups = base.create_common_action_groups();
-        
-        common_action_group.add_actions(create_common_actions(), this);
-        common_action_group.add_toggle_actions(create_common_toggle_actions(), this);
-        add_common_radio_actions(common_action_group);
-        
-        Gtk.Action? action = common_action_group.get_action("CommonDisplaySearchbar");
-        if (action != null) {
-            action.short_label = Resources.FIND_LABEL;
-            action.is_important = true;
-        }
-        
-        groups += common_action_group;
-        groups += search_actions.get_action_group();
-        
-        return groups;
-    }
-    
-    public override void replace_common_placeholders(Gtk.UIManager ui) {
-        base.replace_common_placeholders(ui);
+        // Toogle actions
+        { "CommonDisplayBasicProperties", on_action_toggle, null, "false", on_display_basic_properties },
+        { "CommonDisplayExtendedProperties", on_action_toggle, null, "false", on_display_extended_properties 
},
+
+#if 0
+        { "CommonDisplaySearchbar", on_display_searchbar, null, is_search_toolbar_visible.to_string () },
+        { "CommonDisplaySidebar", on_display_sidebar, null, is_sidebar_visible ().to_string () },
+        { "CommonDisplayToolbar", on_display_toolbar, null, is_toolbar_visible ().to_string () }
+#endif
+        { "CommonDisplaySearchbar", on_action_toggle, null, "false", on_display_searchbar },
+        { "CommonDisplaySidebar", on_action_toggle, null, "true", on_display_sidebar },
+        { "CommonDisplayToolbar", on_action_toggle, null, "true", on_display_toolbar },
+
+        { "CommonSortEvents", on_action_radio, "s", "'ascending'", on_events_sort_changed }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+        this.add_action_entries (common_actions, this);
+        this.add_action_entries (search_actions.get_actions (), search_actions);
     }
-    
+
     protected override void switched_pages(Page? old_page, Page? new_page) {
         base.switched_pages(old_page, new_page);
-        
+
         // monitor when the ViewFilter is changed in any page
         if (old_page != null) {
             old_page.get_view().view_filter_installed.disconnect(on_view_filter_installed);
             old_page.get_view().view_filter_removed.disconnect(on_view_filter_removed);
         }
-        
+
         if (new_page != null) {
             new_page.get_view().view_filter_installed.connect(on_view_filter_installed);
             new_page.get_view().view_filter_removed.connect(on_view_filter_removed);
         }
-        
+
         search_actions.monitor_page_contents(old_page, new_page);
     }
-    
+
     private void on_view_filter_installed(ViewFilter filter) {
         filter.refresh.connect(on_view_filter_refreshed);
     }
-    
+
     private void on_view_filter_removed(ViewFilter filter) {
         filter.refresh.disconnect(on_view_filter_refreshed);
     }
-    
+
     private void on_view_filter_refreshed() {
         // if view filter is reset to show all items, do nothing (leave searchbar in current
         // state)
         if (!get_current_page().get_view().are_items_filtered_out())
             return;
-        
+
         // always show the searchbar when items are filtered
-        Gtk.ToggleAction? display_searchbar = get_common_action("CommonDisplaySearchbar")
-            as Gtk.ToggleAction;
-        if (display_searchbar != null)
-            display_searchbar.active = true;
+        var action = this.lookup_action ("CommonDisplaySearchbar") as
+            GLib.SimpleAction;
+
+        if (action != null)
+            action.set_state (true);
     }
-    
+
     // show_all() may make visible certain items we wish to keep programmatically hidden
     public override void show_all() {
         base.show_all();
-        
-        Gtk.ToggleAction? basic_properties_action = get_current_page().get_common_action(
-            "CommonDisplayBasicProperties") as Gtk.ToggleAction;
+
+        var basic_properties_action = get_current_page ().get_common_action
+            ("CommonDisplayBasicProperties");
         assert(basic_properties_action != null);
-        
-        if (!basic_properties_action.get_active())
+
+        if (!basic_properties_action.get_state().get_boolean())
             bottom_frame.hide();
-        
-        Gtk.ToggleAction? searchbar_action = get_current_page().get_common_action(
-            "CommonDisplaySearchbar") as Gtk.ToggleAction;
-        assert(searchbar_action != null);
 
         // Make sure rejected pictures are not being displayed on startup
         CheckerboardPage? current_page = get_current_page() as CheckerboardPage;
@@ -504,27 +364,27 @@ public class LibraryWindow : AppWindow {
             init_view_filter(current_page);
 
         toggle_search_bar(should_show_search_bar(), current_page);
-        
+
         // Sidebar
         set_sidebar_visible(is_sidebar_visible());
     }
-    
+
     public static LibraryWindow get_app() {
         assert(instance is LibraryWindow);
-        
+
         return (LibraryWindow) instance;
     }
-    
+
     // This may be called before Debug.init(), so no error logging may be made
     public static bool is_mount_uri_supported(string uri) {
         foreach (string scheme in SUPPORTED_MOUNT_SCHEMES) {
             if (uri.has_prefix(scheme))
                 return true;
         }
-        
+
         return false;
     }
-    
+
     public override string get_app_role() {
         return Resources.APP_LIBRARY_ROLE;
     }
@@ -536,7 +396,7 @@ public class LibraryWindow : AppWindow {
         else
             debug("No tag entry found for rename");
     }
-    
+
     public void rename_event_in_sidebar(Event event) {
         Events.EventEntry? entry = events_branch.get_entry_for_event(event);
         if (entry != null)
@@ -544,7 +404,7 @@ public class LibraryWindow : AppWindow {
         else
             debug("No event entry found for rename");
     }
-    
+
     public void rename_search_in_sidebar(SavedSearch search) {
         Searches.SidebarEntry? entry = saved_search_branch.get_entry_for_saved_search(search);
         if (entry != null)
@@ -552,28 +412,28 @@ public class LibraryWindow : AppWindow {
         else
             debug("No search entry found for rename");
     }
-    
+
     protected override void on_quit() {
         Config.Facade.get_instance().set_library_window_state(maximized, dimensions);
 
         Config.Facade.get_instance().set_sidebar_position(client_paned.position);
-        
+
         base.on_quit();
     }
-    
+
     private Photo? get_start_fullscreen_photo(CollectionPage page) {
         ViewCollection view = page.get_view();
-        
+
         // if a selection is present, use the first selected LibraryPhoto, otherwise do
         // nothing; if no selection present, use the first LibraryPhoto
         Gee.List<DataSource>? sources = (view.get_selected_count() > 0)
             ? view.get_selected_sources_of_type(typeof(LibraryPhoto))
             : view.get_sources_of_type(typeof(LibraryPhoto));
-        
+
         return (sources != null && sources.size != 0)
             ? (Photo) sources[0] : null;
     }
-    
+
     private bool get_fullscreen_photo(Page page, out CollectionPage collection, out Photo start,
         out ViewCollection? view_collection = null) {
         collection = null;
@@ -586,7 +446,7 @@ public class LibraryWindow : AppWindow {
             Photo? photo = get_start_fullscreen_photo(collection);
             if (photo == null)
                 return false;
-            
+
             start = photo;
             view_collection = null;
             
@@ -601,11 +461,11 @@ public class LibraryWindow : AppWindow {
             Event? event = (Event?) ((DataView) view.get_at(0)).get_source();
             if (event == null)
                 return false;
-            
+
             Events.EventEntry? entry = events_branch.get_entry_for_event(event);
             if (entry == null)
                 return false;
-            
+
             collection = (EventPage) entry.get_page();
             Photo? photo = get_start_fullscreen_photo(collection);
             if (photo == null)
@@ -616,7 +476,7 @@ public class LibraryWindow : AppWindow {
             
             return true;
         }
-        
+
         if (page is LibraryPhotoPage) {
             LibraryPhotoPage photo_page = (LibraryPhotoPage) page;
             
@@ -626,11 +486,11 @@ public class LibraryWindow : AppWindow {
             
             if (!photo_page.has_photo())
                 return false;
-            
+
             collection = controller;
             start = photo_page.get_photo();
             view_collection = photo_page.get_view();
-            
+
             return true;
         }
         
@@ -652,7 +512,7 @@ public class LibraryWindow : AppWindow {
 
         go_fullscreen(fs_photo);
     }
-    
+
     private void on_file_import() {
         Gtk.FileChooserDialog import_dialog = new Gtk.FileChooserDialog(_("Import From Folder"), null,
             Gtk.FileChooserAction.SELECT_FOLDER, Resources.CANCEL_LABEL, Gtk.ResponseType.CANCEL, 
@@ -670,7 +530,7 @@ public class LibraryWindow : AppWindow {
                     ? Gtk.ResponseType.REJECT : copy_files_dialog();
             
             if (copy_files_response != Gtk.ResponseType.CANCEL) {
-                dispatch_import_jobs(import_dialog.get_uris(), "folders", 
+                dispatch_import_jobs(import_dialog.get_uris(), "folders",
                     copy_files_response == Gtk.ResponseType.ACCEPT);
             }
         }
@@ -689,7 +549,7 @@ public class LibraryWindow : AppWindow {
         base.update_common_action_availability(old_page, new_page);
         
         bool is_checkerboard = new_page is CheckerboardPage;
-        
+
         set_common_action_sensitive("CommonDisplaySearchbar", is_checkerboard);
         set_common_action_sensitive("CommonFind", is_checkerboard);
     }
@@ -717,7 +577,7 @@ public class LibraryWindow : AppWindow {
     private bool can_empty_trash() {
         return (LibraryPhoto.global.get_trashcan_count() > 0) || (Video.global.get_trashcan_count() > 0);
     }
-    
+
     private void on_empty_trash() {
         Gee.ArrayList<MediaSource> to_remove = new Gee.ArrayList<MediaSource>();
         to_remove.add_all(LibraryPhoto.global.get_trashcan_contents());
@@ -762,10 +622,10 @@ public class LibraryWindow : AppWindow {
     }
     
     private void on_find() {
-        Gtk.ToggleAction action = (Gtk.ToggleAction) get_current_page().get_common_action(
-            "CommonDisplaySearchbar");
-        action.active = true;
-        
+        var action = this.lookup_action ("CommonDisplaySearchbar") as
+            GLib.SimpleAction;
+        action.set_state (true);
+
         // give it focus (which should move cursor to the text entry control)
         search_toolbar.take_focus();
     }
@@ -780,24 +640,27 @@ public class LibraryWindow : AppWindow {
     }
     
     public int get_events_sort() {
-        Gtk.RadioAction? action = get_common_action("CommonSortEventsAscending") as Gtk.RadioAction;
+        var action = this.lookup_action ("CommonSortEvents") as GLib.SimpleAction;
         
-        return (action != null) ? action.current_value : SORT_EVENTS_ORDER_DESCENDING;
+        return (action != null) ? (action.state.get_string () == SORT_EVENTS_ORDER_ASCENDING)
+            ? 0 : 1
+            : 1;
     }
 
-    private void on_events_sort_changed(Gtk.Action action, Gtk.Action c) {
-        Gtk.RadioAction current = (Gtk.RadioAction) c;
+    private void on_events_sort_changed(GLib.SimpleAction action, Variant? value) {
         
         Config.Facade.get_instance().set_events_sort_ascending(
-            current.current_value == SORT_EVENTS_ORDER_ASCENDING);
+            value.get_string () == SORT_EVENTS_ORDER_ASCENDING);
+
+        action.set_state (value);
     }
     
     private void on_preferences() {
         PreferencesDialog.show();
     }
     
-    private void on_display_basic_properties(Gtk.Action action) {
-        bool display = ((Gtk.ToggleAction) action).get_active();
+    private void on_display_basic_properties(GLib.SimpleAction action, Variant? value) {
+        bool display = value.get_boolean ();
 
         if (display) {
             basic_properties.update_properties(get_current_page());
@@ -810,10 +673,20 @@ public class LibraryWindow : AppWindow {
 
         // sync the setting so it will persist
         Config.Facade.get_instance().set_display_basic_properties(display);
+        action.set_state (value);
+    }
+
+    private void on_action_toggle (GLib.Action action, Variant? value) {
+        Variant new_state = ! (bool) action.get_state ();
+        action.change_state (new_state);
+    }
+
+    private void on_action_radio (GLib.Action action, Variant? value) {
+        action.change_state (value);
     }
 
-    private void on_display_extended_properties(Gtk.Action action) {
-        bool display = ((Gtk.ToggleAction) action).get_active();
+    private void on_display_extended_properties(GLib.SimpleAction action, Variant? value) {
+        bool display = value.get_boolean ();
 
         if (display) {
             extended_properties.update_properties(get_current_page());
@@ -821,12 +694,17 @@ public class LibraryWindow : AppWindow {
         } else {
             extended_properties.hide();
         }
+
+        action.set_state (value);
     }
     
-    private void on_display_searchbar(Gtk.Action action) {
-        bool is_shown = ((Gtk.ToggleAction) action).get_active();
+    private void on_display_searchbar(GLib.SimpleAction action, Variant? value) {
+        bool is_shown = value.get_boolean ();
+
         Config.Facade.get_instance().set_display_search_bar(is_shown);
         show_search_bar(is_shown);
+
+        action.set_state (value);
     }
     
     public void show_search_bar(bool display) {
@@ -839,9 +717,10 @@ public class LibraryWindow : AppWindow {
             search_actions.reset();
     }
     
-    private void on_display_sidebar(Gtk.Action action) {
-        set_sidebar_visible(((Gtk.ToggleAction) action).get_active());
-        
+    private void on_display_sidebar(GLib.SimpleAction action, Variant? variant) {
+        set_sidebar_visible(variant.get_boolean ());
+
+        action.set_state (variant);
     }
 
     private void set_sidebar_visible(bool visible) {
@@ -853,8 +732,10 @@ public class LibraryWindow : AppWindow {
         return Config.Facade.get_instance().get_display_sidebar();
     }
     
-    private void on_display_toolbar (Gtk.Action action) {
-        set_toolbar_visible ((action as Gtk.ToggleAction).get_active ());
+    private void on_display_toolbar (GLib.SimpleAction action, Variant? variant) {
+        set_toolbar_visible (variant.get_boolean ());
+
+        action.set_state (variant);
     }
 
     private void set_toolbar_visible (bool visible) {
@@ -878,10 +759,9 @@ public class LibraryWindow : AppWindow {
     }
 
     private void sync_extended_properties(bool show) {
-        Gtk.ToggleAction? extended_display_action = get_common_action("CommonDisplayExtendedProperties")
-            as Gtk.ToggleAction;
-        assert(extended_display_action != null);
-        extended_display_action.set_active(show);
+        var action = this.lookup_action ("CommonDisplayExtendedProperties")
+            as GLib.SimpleAction;
+        action.set_state (show);
 
         // sync the setting so it will persist
         Config.Facade.get_instance().set_display_extended_properties(show);
@@ -966,7 +846,7 @@ public class LibraryWindow : AppWindow {
             
             return true;
         }
-        
+
         // since we cannot set a default action, we must set it when we spy a drag motion
         Gdk.DragAction drag_action = get_drag_action();
         
@@ -1120,32 +1000,28 @@ public class LibraryWindow : AppWindow {
     
     // check for settings that should persist between instances
     private void load_configuration() {
-        Gtk.ToggleAction? basic_display_action = get_common_action("CommonDisplayBasicProperties")
-            as Gtk.ToggleAction;
+        var basic_display_action = lookup_action("CommonDisplayBasicProperties");
         assert(basic_display_action != null);
-        basic_display_action.set_active(Config.Facade.get_instance().get_display_basic_properties());
+        basic_display_action.change_state (Config.Facade.get_instance().get_display_basic_properties());
 
-        Gtk.ToggleAction? extended_display_action = get_common_action("CommonDisplayExtendedProperties")
-            as Gtk.ToggleAction;
+        var extended_display_action = lookup_action("CommonDisplayExtendedProperties");
         assert(extended_display_action != null);
-        extended_display_action.set_active(Config.Facade.get_instance().get_display_extended_properties());
+        extended_display_action.change_state(Config.Facade.get_instance().get_display_extended_properties());
         
-        Gtk.ToggleAction? search_bar_display_action = get_common_action("CommonDisplaySearchbar")
-            as Gtk.ToggleAction;
+        var search_bar_display_action = lookup_action("CommonDisplaySearchbar");
         assert(search_bar_display_action != null);
-        search_bar_display_action.set_active(Config.Facade.get_instance().get_display_search_bar());
+        search_bar_display_action.change_state(Config.Facade.get_instance().get_display_search_bar());
 
-        Gtk.RadioAction? sort_events_action = get_common_action("CommonSortEventsAscending")
-            as Gtk.RadioAction;
+        var sort_events_action = lookup_action("CommonSortEvents");
         assert(sort_events_action != null);
         
         // Ticket #3321 - Event sorting order wasn't saving on exit.
         // Instead of calling set_active against one of the toggles, call
         // set_current_value against the entire radio group...
-        int event_sort_val = Config.Facade.get_instance().get_events_sort_ascending() ? 
SORT_EVENTS_ORDER_ASCENDING :
+        string event_sort_val = Config.Facade.get_instance().get_events_sort_ascending() ? 
SORT_EVENTS_ORDER_ASCENDING :
             SORT_EVENTS_ORDER_DESCENDING;
         
-        sort_events_action.set_current_value(event_sort_val);
+        sort_events_action.change_state (event_sort_val);
     }
     
     private void start_pulse_background_progress_bar(string label, int priority) {
@@ -1345,6 +1221,11 @@ public class LibraryWindow : AppWindow {
         
         Page current_page = get_current_page();
         if (current_page != null) {
+            var menubar = current_page.get_menubar ();
+            if (menubar != null) {
+                layout.remove (menubar);
+            }
+
             Gtk.Toolbar toolbar = current_page.get_toolbar();
             if (toolbar != null)
                 right_vbox.remove(toolbar);
@@ -1399,6 +1280,12 @@ public class LibraryWindow : AppWindow {
         subscribe_for_basic_information(get_current_page());
         
         page.switched_to();
+
+        var menubar = page.get_menubar ();
+        if (menubar != null) {
+            layout.pack_start (menubar, false, false);
+            menubar.show_all ();
+        }
         
         Gtk.Toolbar toolbar = page.get_toolbar();
         if (toolbar != null) {
diff --git a/src/library/OfflinePage.vala b/src/library/OfflinePage.vala
index 899dc53..bd916d0 100644
--- a/src/library/OfflinePage.vala
+++ b/src/library/OfflinePage.vala
@@ -28,8 +28,8 @@ public class OfflinePage : CheckerboardPage {
     public OfflinePage() {
         base (NAME);
         
-        init_item_context_menu("/OfflineContextMenu");
-        init_toolbar("/OfflineToolbar");
+        init_item_context_menu("OfflineContextMenu");
+        init_toolbar("OfflineToolbar");
         
         tracker = new MediaViewTracker(get_view());
         
@@ -51,27 +51,24 @@ public class OfflinePage : CheckerboardPage {
         
         ui_filenames.add("offline.ui");
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry remove = { "RemoveFromLibrary", Resources.REMOVE_LABEL, TRANSLATABLE, "Delete",
-            TRANSLATABLE, on_remove_from_library };
-        remove.label = Resources.REMOVE_FROM_LIBRARY_MENU;
-        remove.tooltip = Resources.DELETE_FROM_LIBRARY_TOOLTIP;
-        actions += remove;
-        
-        return actions;
+
+    private const GLib.ActionEntry[] entries = {
+        { "RemoveFromLibrary", on_remove_from_library }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+
+        AppWindow.get_instance ().add_action_entries (entries, this);
     }
-    
+
     public override Core.ViewTracker? get_view_tracker() {
         return tracker;
     }
     
     protected override void update_actions(int selected_count, int count) {
         set_action_sensitive("RemoveFromLibrary", selected_count > 0);
-        set_action_important("RemoveFromLibrary", true);
-        
+
         base.update_actions(selected_count, count);
     }
     
diff --git a/src/library/TrashPage.vala b/src/library/TrashPage.vala
index 0a38ac0..943c5e1 100644
--- a/src/library/TrashPage.vala
+++ b/src/library/TrashPage.vala
@@ -28,9 +28,9 @@ public class TrashPage : CheckerboardPage {
     public TrashPage() {
         base (NAME);
         
-        init_item_context_menu("/TrashContextMenu");
-        init_page_context_menu("/TrashPageMenu");
-        init_toolbar("/TrashToolbar");
+        init_item_context_menu("TrashContextMenu");
+        init_page_context_menu("TrashPageMenu");
+        init_toolbar("TrashToolbar");
         
         tracker = new MediaViewTracker(get_view());
         
@@ -46,25 +46,18 @@ public class TrashPage : CheckerboardPage {
         
         ui_filenames.add("trash.ui");
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry delete_action = { "Delete", Resources.DELETE_LABEL, TRANSLATABLE, "Delete",
-            TRANSLATABLE, on_delete };
-        delete_action.label = Resources.DELETE_PHOTOS_MENU;
-        delete_action.tooltip = Resources.DELETE_FROM_TRASH_TOOLTIP;
-        actions += delete_action;
-        
-        Gtk.ActionEntry restore = { "Restore", Resources.UNDELETE_LABEL, TRANSLATABLE, null, TRANSLATABLE,
-            on_restore };
-        restore.label = Resources.RESTORE_PHOTOS_MENU;
-        restore.tooltip = Resources.RESTORE_PHOTOS_TOOLTIP;
-        actions += restore;
-        
-        return actions;
+
+    private const GLib.ActionEntry[] entries = {
+        { "Delete", on_delete },
+        { "Restore", on_restore }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+
+        AppWindow.get_instance ().add_action_entries (entries, this);
     }
-    
+
     public override Core.ViewTracker? get_view_tracker() {
         return tracker;
     }
diff --git a/src/org.gnome.Shotwell.gresource.xml b/src/org.gnome.Shotwell.gresource.xml
index a7e3d8d..abf7eb2 100644
--- a/src/org.gnome.Shotwell.gresource.xml
+++ b/src/org.gnome.Shotwell.gresource.xml
@@ -2,5 +2,9 @@
 <gresources>
   <gresource prefix="/org/gnome/Shotwell">
       <file>crop-pivot-reticle.png</file>
+      <file>search_sidebar_context.ui</file>
+      <file>tag_sidebar_context.ui</file>
+      <file>sidebar_default_context.ui</file>
+      <file>search_bar.ui</file>
   </gresource>
 </gresources>
diff --git a/src/searches/Branch.vala b/src/searches/Branch.vala
index 0c86733..f557baa 100644
--- a/src/searches/Branch.vala
+++ b/src/searches/Branch.vala
@@ -61,45 +61,31 @@ public class Searches.Branch : Sidebar.Branch {
 }
 
 public class Searches.Header : Sidebar.Header, Sidebar.Contextable {
-    private Gtk.UIManager ui = new Gtk.UIManager();
+    private Gtk.Builder builder;
     private Gtk.Menu? context_menu = null;
     
     public Header() {
         base (_("Saved Searches"));
         setup_context_menu();
     }
-    
+
     private void setup_context_menu() {
-        Gtk.ActionGroup group = new Gtk.ActionGroup("SidebarDefault");
-        Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-        
-        Gtk.ActionEntry new_search = { "CommonNewSearch", null, TRANSLATABLE, null, null, on_new_search };
-        new_search.label = _("Ne_w Saved Search…");
-        actions += new_search;
-        
-        group.add_actions(actions, this);
-        ui.insert_action_group(group, 0);
-        
-        File ui_file = Resources.get_ui("search_sidebar_context.ui");
+        this.builder = new Gtk.Builder ();
         try {
-            ui.add_ui_from_file(ui_file.get_path());
-        } catch (Error err) {
-            AppWindow.error_message("Error loading UI file %s: %s".printf(
-                ui_file.get_path(), err.message));
+            this.builder.add_from_resource
+                            ("/org/gnome/Shotwell/search_sidebar_context.ui");
+            var model = builder.get_object ("popup-menu") as GLib.MenuModel;
+            this.context_menu = new Gtk.Menu.from_model (model);
+        } catch (Error error) {
+            AppWindow.error_message("Error loading UI resource: %s".printf(
+                error.message));
             Application.get_instance().panic();
         }
-        context_menu = (Gtk.Menu) ui.get_widget("/SidebarSearchContextMenu");
-        
-        ui.ensure_update();
     }
-    
+
     public Gtk.Menu? get_sidebar_context_menu(Gdk.EventButton? event) {
         return context_menu;
     }
-    
-    private void on_new_search() {
-        (new SavedSearchDialog()).show();
-    }
 }
 
 public class Searches.SidebarEntry : Sidebar.SimplePageEntry, Sidebar.RenameableEntry,
diff --git a/src/searches/SavedSearchPage.vala b/src/searches/SavedSearchPage.vala
index 1693ca3..c57ec7d 100644
--- a/src/searches/SavedSearchPage.vala
+++ b/src/searches/SavedSearchPage.vala
@@ -31,7 +31,7 @@ public class SavedSearchPage : CollectionPage {
         foreach (MediaSourceCollection sources in MediaCollectionRegistry.get_instance().get_all())
             get_view().monitor_source_collection(sources, new SavedSearchManager(this, search), null);
         
-        init_page_context_menu("/SearchContextMenu");
+        init_page_context_menu("SearchContextMenu");
     }
     
     protected override void get_config_photos_sort(out bool sort_order, out int sort_by) {
@@ -46,20 +46,17 @@ public class SavedSearchPage : CollectionPage {
         base.init_collect_ui_filenames(ui_filenames);
         ui_filenames.add("savedsearch.ui");
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry rename_search = { "RenameSearch", null, TRANSLATABLE, null, null, on_rename_search };
-        actions += rename_search;
-        
-        Gtk.ActionEntry edit_search = { "EditSearch", null, TRANSLATABLE, null, null, on_edit_search };
-        actions += edit_search;
-        
-        Gtk.ActionEntry delete_search = { "DeleteSearch", null, TRANSLATABLE, null, null, on_delete_search };
-        actions += delete_search;
-        
-        return actions;
+
+    private const GLib.ActionEntry[] entries = {
+        { "RenameSearch", on_rename_search },
+        { "EditSearch", on_edit_search },
+        { "DeleteSearch", on_delete_search }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
+
+        AppWindow.get_instance ().add_action_entries (entries, this);
     }
     
     private void on_delete_search() {
@@ -77,15 +74,10 @@ public class SavedSearchPage : CollectionPage {
     }
     
     protected override void update_actions(int selected_count, int count) {
-        set_action_details("RenameSearch",
-            Resources.RENAME_SEARCH_MENU,
-            null, true);
-        set_action_details("EditSearch",
-            Resources.EDIT_SEARCH_MENU,
-            null, true);
-        set_action_details("DeleteSearch",
-            Resources.DELETE_SEARCH_MENU,
-            null, true);
+        set_action_sensitive ("RenameSearch", true);
+        set_action_sensitive ("EditSearch", true);
+        set_action_sensitive ("DeleteSearch", true);
+
         base.update_actions(selected_count, count);
     }
 }
diff --git a/src/sidebar/Tree.vala b/src/sidebar/Tree.vala
index 0fd9144..267c8de 100644
--- a/src/sidebar/Tree.vala
+++ b/src/sidebar/Tree.vala
@@ -59,7 +59,7 @@ public class Sidebar.Tree : Gtk.TreeView {
         typeof (string?)            // ICON
     );
     
-    private Gtk.UIManager ui = new Gtk.UIManager();
+    private Gtk.Builder builder = new Gtk.Builder ();
     private Gtk.CellRendererText text_renderer;
     private unowned ExternalDropHandler drop_handler;
     private Gtk.Entry? text_entry = null;
@@ -190,33 +190,27 @@ public class Sidebar.Tree : Gtk.TreeView {
         
         return false;
     }
-    
-    private void setup_default_context_menu() {
-        Gtk.ActionGroup group = new Gtk.ActionGroup("SidebarDefault");
-        Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-        
-        Gtk.ActionEntry new_search = { "CommonNewSearch", null, TRANSLATABLE, null, null, on_new_search };
-        new_search.label = _("Ne_w Saved Search…");
-        actions += new_search;
 
-        Gtk.ActionEntry new_tag = { "CommonNewTag", null, TRANSLATABLE, null, null, on_new_tag };
-        new_tag.label = _("New _Tag…");
-        actions += new_tag;
-        
-        group.add_actions(actions, this);
-        ui.insert_action_group(group, 0);
-        
-        File ui_file = Resources.get_ui("sidebar_default_context.ui");
+    private const GLib.ActionEntry[] entries = {
+        { "tag.new", on_new_tag },
+        { "search.new", on_new_search }
+    };
+
+    private void setup_default_context_menu() {
         try {
-            ui.add_ui_from_file(ui_file.get_path());
-        } catch (Error err) {
-            AppWindow.error_message("Error loading UI file %s: %s".printf(
-                ui_file.get_path(), err.message));
+            this.builder.add_from_resource
+                            ("/org/gnome/Shotwell/sidebar_default_context.ui");
+            var model = builder.get_object ("popup-menu") as GLib.MenuModel;
+            this.default_context_menu = new Gtk.Menu.from_model (model);
+            var group = new GLib.SimpleActionGroup ();
+            group.add_action_entries (entries, this);
+            this.insert_action_group ("sidebar", group);
+            this.default_context_menu.attach_to_widget (this, null);
+        } catch (Error error) {
+            AppWindow.error_message("Error loading UI resource: %s".printf(
+                error.message));
             Application.get_instance().panic();
         }
-        default_context_menu = (Gtk.Menu) ui.get_widget("/SidebarDefaultContextMenu");
-        
-        ui.ensure_update();
     }
     
     private bool has_wrapper(Sidebar.Entry entry) {
@@ -852,6 +846,8 @@ public class Sidebar.Tree : Gtk.TreeView {
         if (context_menu == null)
             return false;
 
+        context_menu.attach_to_widget (this, null);
+
         if (event != null)
             context_menu.popup(null, null, null, event.button, event.time);
         else
diff --git a/src/tags/Branch.vala b/src/tags/Branch.vala
index 0663fe4..41c6feb 100644
--- a/src/tags/Branch.vala
+++ b/src/tags/Branch.vala
@@ -124,38 +124,28 @@ public class Tags.Branch : Sidebar.Branch {
 
 public class Tags.Header : Sidebar.Header, Sidebar.InternalDropTargetEntry, 
     Sidebar.InternalDragSourceEntry, Sidebar.Contextable {
-    private Gtk.UIManager ui = new Gtk.UIManager();
+    private Gtk.Builder builder;
     private Gtk.Menu? context_menu = null;
     
     public Header() {
         base (_("Tags"));
         setup_context_menu();
     }
-    
+
     private void setup_context_menu() {
-        Gtk.ActionGroup group = new Gtk.ActionGroup("SidebarDefault");
-        Gtk.ActionEntry[] actions = new Gtk.ActionEntry[0];
-        
-        Gtk.ActionEntry new_tag = { "CommonNewTag", null, TRANSLATABLE, null, null, on_new_tag };
-        new_tag.label = Resources.NEW_CHILD_TAG_SIDEBAR_MENU;
-        actions += new_tag;
-        
-        group.add_actions(actions, this);
-        ui.insert_action_group(group, 0);
-        
-        File ui_file = Resources.get_ui("tag_sidebar_context.ui");
+        this.builder = new Gtk.Builder ();
         try {
-            ui.add_ui_from_file(ui_file.get_path());
-        } catch (Error err) {
-            AppWindow.error_message("Error loading UI file %s: %s".printf(
-                ui_file.get_path(), err.message));
+            this.builder.add_from_resource
+                            ("/org/gnome/Shotwell/tag_sidebar_context.ui");
+            var model = builder.get_object ("popup-menu") as GLib.MenuModel;
+            this.context_menu = new Gtk.Menu.from_model (model);
+        } catch (Error error) {
+            AppWindow.error_message("Error loading UI resource: %s".printf(
+                error.message));
             Application.get_instance().panic();
         }
-        context_menu = (Gtk.Menu) ui.get_widget("/SidebarTagContextMenu");
-        
-        ui.ensure_update();
     }
-    
+
     public bool internal_drop_received(Gee.List<MediaSource> media) {
         AddTagsDialog dialog = new AddTagsDialog();
         string[]? names = dialog.execute();
@@ -192,12 +182,6 @@ public class Tags.Header : Sidebar.Header, Sidebar.InternalDropTargetEntry,
     public Gtk.Menu? get_sidebar_context_menu(Gdk.EventButton? event) {
         return context_menu;
     }
-    
-    private void on_new_tag() {
-        NewRootTagCommand creation_command = new NewRootTagCommand();
-        AppWindow.get_command_manager().execute(creation_command);
-        LibraryWindow.get_app().rename_tag_in_sidebar(creation_command.get_created_tag());
-    }
 }
 
 public class Tags.SidebarEntry : Sidebar.SimplePageEntry, Sidebar.RenameableEntry,
diff --git a/src/tags/TagPage.vala b/src/tags/TagPage.vala
index 7e937ad..04696c5 100644
--- a/src/tags/TagPage.vala
+++ b/src/tags/TagPage.vala
@@ -15,7 +15,7 @@ public class TagPage : CollectionPage {
         Tag.global.items_altered.connect(on_tags_altered);
         tag.mirror_sources(get_view(), create_thumbnail);
         
-        init_page_context_menu("/TagsContextMenu");
+        init_page_context_menu("TagsContextMenu");
     }
     
     ~TagPage() {
@@ -39,44 +39,36 @@ public class TagPage : CollectionPage {
     protected override void set_config_photos_sort(bool sort_order, int sort_by) {
         Config.Facade.get_instance().set_event_photos_sort(sort_order, sort_by);
     }
-    
-    protected override Gtk.ActionEntry[] init_collect_action_entries() {
-        Gtk.ActionEntry[] actions = base.init_collect_action_entries();
-        
-        Gtk.ActionEntry delete_tag = { "DeleteTag", null, TRANSLATABLE, null, null, on_delete_tag };
-        // label and tooltip are assigned when the menu is displayed
-        actions += delete_tag;
-        
-        Gtk.ActionEntry rename_tag = { "RenameTag", null, TRANSLATABLE, null, null, on_rename_tag };
-        // label and tooltip are assigned when the menu is displayed
-        actions += rename_tag;
-        
-        Gtk.ActionEntry remove_tag = { "RemoveTagFromPhotos", null, TRANSLATABLE, null, null, 
-            on_remove_tag_from_photos };
-        // label and tooltip are assigned when the menu is displayed
-        actions += remove_tag;
-        
-        Gtk.ActionEntry delete_tag_sidebar = { "DeleteTagSidebar", null, Resources.DELETE_TAG_SIDEBAR_MENU, 
-            null, null, on_delete_tag };
-        actions += delete_tag_sidebar;
-        
-        Gtk.ActionEntry rename_tag_sidebar = { "RenameTagSidebar", null, Resources.RENAME_TAG_SIDEBAR_MENU, 
-            null, null, on_rename_tag };
-        actions += rename_tag_sidebar;
 
-        Gtk.ActionEntry new_child_tag_sidebar = { "NewChildTagSidebar", null, 
Resources.NEW_CHILD_TAG_SIDEBAR_MENU,
-            null, null, on_new_child_tag_sidebar };
-        actions += new_child_tag_sidebar;
+    private const GLib.ActionEntry entries[] = {
+        { "DeleteTag", on_delete_tag },
+        { "RenameTag", on_rename_tag },
+        { "RemoveTagFromPhotos", on_remove_tag_from_photos },
+        { "NewChildTagSidebar", on_new_child_tag_sidebar }
+    };
+
+    protected override void add_actions () {
+        base.add_actions ();
 
-        return actions;
+        AppWindow.get_instance ().add_action_entries (entries, this);
     }
-    
+
     private void on_tags_altered(Gee.Map<DataObject, Alteration> map) {
         if (map.has_key(tag)) {
             set_page_name(tag.get_name());
             update_actions(get_view().get_selected_count(), get_view().get_count());
         }
     }
+
+    public override void switched_to () {
+        base.switched_to ();
+        this.update_menu_item_label ("DeleteTag",
+            Resources.delete_tag_menu(tag.get_user_visible_name()));
+        this.update_menu_item_label ("RenameTag",
+            Resources.rename_tag_menu(tag.get_user_visible_name()));
+        this.update_menu_item_label ("RemoveTagFromPhotos",
+            Resources.untag_photos_menu(tag.get_user_visible_name(), 0));
+     }
     
     protected override void update_actions(int selected_count, int count) {
         set_action_details("DeleteTag",
diff --git a/src/util/ui.vala b/src/util/ui.vala
index a161ebd..e1c22f1 100644
--- a/src/util/ui.vala
+++ b/src/util/ui.vala
@@ -86,13 +86,3 @@ public bool has_only_key_modifier(Gdk.ModifierType field, Gdk.ModifierType mask)
         | Gdk.ModifierType.META_MASK)) == mask;
 }
 
-public string build_dummy_ui_string(Gtk.ActionGroup[] groups) {
-    string ui_string = "<ui>";
-    foreach (Gtk.ActionGroup group in groups) {
-        foreach (Gtk.Action action in group.list_actions())
-            ui_string += "<accelerator name=\"%s\" action=\"%s\" />".printf(action.name, action.name);
-    }
-    ui_string += "</ui>";
-    
-    return ui_string;
-}
diff --git a/ui/collection.ui b/ui/collection.ui
index d832ea6..d634579 100644
--- a/ui/collection.ui
+++ b/ui/collection.ui
@@ -1,51 +1,225 @@
-<ui>
-    <popup name="CollectionContextMenu">
-        <menuitem name="ContextEnhance" action="Enhance" />
-        <menuitem name="ContextRevert" action="Revert" />
-        <separator />
-        <menuitem name="ContextAddTags" action="AddTagsContextMenu" />
-        <menuitem name="ContextModifyTags" action="ModifyTags" />
-        <placeholder name="ContextTagsPlaceholder" />
-        <separator />
-        <placeholder name="ContextFacesPlaceholder" />
-        <separator />
-        <menuitem name="ContextFlag" action="Flag" />
-        <menu name="Rate" action="Rate">
-            <menuitem name="RateFive" action="RateFive" />
-            <menuitem name="RateFour" action="RateFour" />
-            <menuitem name="RateThree" action="RateThree" />
-            <menuitem name="RateTwo" action="RateTwo" />
-            <menuitem name="RateOne" action="RateOne" />
-            <menuitem name="RateUnrated" action="RateUnrated" />
-            <menuitem name="RateRejected" action="RateRejected" />
-            <separator />
-            <menuitem name="IncreaseRating" action="IncreaseRating" />
-            <menuitem name="DecreaseRating" action="DecreaseRating" />
-        </menu>
-        <menu name="RawDeveloper" action="RawDeveloper">
-            <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
-            <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
-        </menu>
-        <separator />
-        <menuitem name="ContextEditTitle" action="EditTitle" />
-        <menuitem name="ContextEditComment" action="EditComment" />
-        <menuitem name="ContextExternalEdit" action="ExternalEdit" />
-        <menuitem name="ContextExternalEditRAW" action="ExternalEditRAW" />
-        <separator />
-        <menuitem name="ContextJumpToEvent" action="CommonJumpToEvent" />
-        <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
-        <menuitem name="ContextSendTo" action="SendToContextMenu" />
-        <separator />
-        <menuitem name="ContextMoveToTrash" action="MoveToTrash" />
-    </popup>
-    
-    <toolbar name="CollectionToolbar">
-        <toolitem name="ToolRotate" action="RotateClockwise" />
-        <toolitem name="ToolEnhance" action="Enhance" />
-        <separator />
-        <toolitem name="ToolPublish" action="Publish" />
-        <separator />
-        <toolitem name="ToolFind" action="CommonDisplaySearchbar" />
-    </toolbar>
-</ui>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="shotwell">
+  <requires lib="gtk+" version="3.14"/>
+  <menu id="CollectionContextMenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Enhance</attribute>
+        <attribute name="accel">&lt;Primary&gt;e</attribute>
+        <attribute name="action">win.Enhance</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+        <attribute name="action">win.Revert</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Add _Tags…</attribute>
+        <attribute name="accel">&lt;Primary&gt;t</attribute>
+        <attribute name="action">win.AddTags</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+        <attribute name="accel">&lt;Primary&gt;m</attribute>
+        <attribute name="action">win.ModifyTags</attribute>
+      </item>
+      <attribute name="id">ContextTagsPlaceholder</attribute>
+    </section>
+    <section>
+      <attribute name="id">ContextFacesPlaceholder</attribute>
+      <item>
+        <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+        <attribute name="accel">&lt;Primary&gt;g</attribute>
+        <attribute name="action">win.Flag</attribute>
+      </item>
+    </section>
+    <submenu>
+      <attribute name="label" translatable="yes">_Set Rating</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="no">★★★★★</attribute>
+          <attribute name="action">win.RateFive</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="no">★★★★</attribute>
+          <attribute name="action">win.RateFour</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="no">★★★</attribute>
+          <attribute name="action">win.RateThree</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="no">★★</attribute>
+          <attribute name="action">win.RateTwo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="no">★</attribute>
+          <attribute name="action">win.RateOne</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Unrated</attribute>
+          <attribute name="action">win.RateUnrated</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Rejected</attribute>
+          <attribute name="action">win.RateRejected</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Increase</attribute>
+          <attribute name="action">win.IncreaseRating</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Decrease</attribute>
+          <attribute name="action">win.DecreaseRating</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Developer</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Shotwell</attribute>
+          <attribute name="action">win.RawDeveloper</attribute>
+          <attribute name="target">Shotwell</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Camera</attribute>
+          <attribute name="action">win.RawDeveloper</attribute>
+          <attribute name="target">Camera</attribute>
+        </item>
+      </section>
+    </submenu>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Edit _Title…</attribute>
+        <attribute name="action">win.EditTitle</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+        <attribute name="action">win.EditComment</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Open with E_xternal Editor</attribute>
+        <attribute name="accel">&lt;Primary&gt;Return</attribute>
+        <attribute name="action">win.ExternalEdit</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Open With RA_W Editor</attribute>
+        <attribute name="action">win.ExternalEditRAW</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+        <attribute name="action">win.CommonJumpToEvent</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+        <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+        <attribute name="action">win.CommonJumpToFile</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Send _To…</attribute>
+        <attribute name="action">win.SendTo</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Move to Trash</attribute>
+        <attribute name="accel">Delete</attribute>
+        <attribute name="action">win.MoveToTrash</attribute>
+      </item>
+    </section>
+  </menu>
+  <object class="GtkToolbar" id="CollectionToolbar">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="toolbar_style">both-horiz</property>
+    <child>
+      <object class="GtkToolButton" id="ToolRotate">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Rotate the photos right (press Ctrl to rotate 
left)</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.RotateClockwise</property>
+        <property name="label" translatable="yes">Rotate</property>
+        <property name="use_underline">True</property>
+        <property name="icon_name">object-rotate-right</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="ToolEnhance">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Automatically improve the photo’s 
appearance</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.Enhance</property>
+        <property name="label" translatable="yes">Enhance</property>
+        <property name="use_underline">True</property>
+        <property name="icon_name">shotwell-auto-enhance</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkSeparatorToolItem">
+        <property name="can_focus">False</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">False</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="ToolPublish">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Publish to various websites</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.Publish</property>
+        <property name="label" translatable="yes">Publish</property>
+        <property name="use_underline">True</property>
+        <property name="icon_name">applications-internet</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkSeparatorToolItem">
+        <property name="can_focus">False</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">False</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="ToolFind">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Find an image by typing text that appears in its 
name or tags</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.CommonDisplaySearchbar</property>
+        <property name="label" translatable="yes">Find</property>
+        <property name="use_underline">True</property>
+        <property name="icon_name">edit-find</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/ui/direct.ui b/ui/direct.ui
index e3d4e34..75acb0f 100644
--- a/ui/direct.ui
+++ b/ui/direct.ui
@@ -1,70 +1,197 @@
-<ui>
-
-    <menubar name="MenuBar">
-        <menu name="FileMenu" action="FileMenu">
-            <menuitem name="Save" action="Save" />
-            <menuitem name="SaveAs" action="SaveAs" />
-            <separator />
-            <placeholder name="PrintPlaceholder"/>
-            <separator />
-            <menuitem name="SendTo" action="SendTo" />
-            <placeholder name="SetBackgroundPlaceholder" />
-            <separator />
-            <menuitem name="JumpToFile" action="CommonJumpToFile" />
-            <separator />
-            <menuitem name="Quit" action="CommonQuit" />
-        </menu>
-        
-        <menu name="EditMenu" action="EditMenu">
-            <menuitem name="Undo" action="CommonUndo" />
-            <menuitem name="Redo" action="CommonRedo" />
-        </menu>
-        
-        <menu name="ViewMenu" action="ViewMenu">
-            <menuitem name="Fullscreen" action="CommonFullscreen" />
-            <separator />
-            <menuitem name="IncreaseSize" action="IncreaseSize" />
-            <menuitem name="DecreaseSize" action="DecreaseSize" />
-            <separator />
-            <menuitem name="ZoomFit" action="ZoomFit" />
-            <menuitem name="Zoom100" action="Zoom100" />
-            <menuitem name="Zoom200" action="Zoom200" />
-        </menu>
-
-        <menu name="PhotoMenu" action="PhotoMenu">
-            <menuitem name="PrevPhoto" action="PrevPhoto" />
-            <menuitem name="NextPhoto" action="NextPhoto" />
-            <separator />
-            <menuitem name="RotateClockwise" action="RotateClockwise" />
-            <menuitem name="RotateCounterclockwise" action="RotateCounterclockwise" />
-            <menuitem name="FlipHorizontally" action="FlipHorizontally" />
-            <menuitem name="FlipVertically" action="FlipVertically" />
-            <separator />
-            <menu name="Tools" action="Tools">
-                <menuitem name="Enhance" action="Enhance" />
-                <menuitem name="Crop" action="Crop" />
-                <menuitem name="Straighten" action="Straighten" />
-                <menuitem name="RedEye" action="RedEye" />
-                <menuitem name="Adjust" action="Adjust" />
-            </menu>
-            <menuitem name="Revert" action="Revert" />
-            <separator />
-            <menuitem name="AdjustDateTime" action="AdjustDateTime" />
-        </menu>
-        
-        <menu name="HelpMenu" action="HelpMenu">
-            <menuitem name="Contents" action="CommonHelpContents" />
-            <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
-            <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
-            <separator />
-            <menuitem name="About" action="CommonAbout" />
-        </menu>
-    </menubar>
-
-    <popup name="DirectContextMenu">
-        <placeholder name="ContextJumpPlaceholder">
-            <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
-        </placeholder>
-    </popup>
-    
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Save</attribute>
+          <attribute name="accel">&lt;Primary&gt;s</attribute>
+          <attribute name="action">win.Save</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Save _As…</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;s</attribute>
+          <attribute name="action">win.SaveAs</attribute>
+        </item>
+      </section>
+      <section>
+      <attribute name="id">PrintPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Send _To…</attribute>
+          <attribute name="action">win.SendTo</attribute>
+        </item>
+      <attribute name="id">SetBackgroundPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;q</attribute>
+          <attribute name="action">win.CommonJumpToFile</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Undo</attribute>
+          <attribute name="accel">&lt;Primary&gt;z</attribute>
+          <attribute name="action">win.CommonUndo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Redo</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;z</attribute>
+          <attribute name="action">win.CommonRedo</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Fulls_creen</attribute>
+          <attribute name="accel">F11</attribute>
+          <attribute name="action">win.CommonFullscreen</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _In</attribute>
+          <attribute name="accel">&lt;Primary&gt;plus</attribute>
+          <attribute name="action">win.IncreaseSize</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _Out</attribute>
+          <attribute name="accel">&lt;Primary&gt;minus</attribute>
+          <attribute name="action">win.DecreaseSize</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Fit to _Page</attribute>
+          <attribute name="accel">&lt;Primary&gt;0</attribute>
+          <attribute name="action">win.ZoomFit</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _100%</attribute>
+          <attribute name="accel">&lt;Primary&gt;1</attribute>
+          <attribute name="action">win.Zoom100</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _200%</attribute>
+          <attribute name="accel">&lt;Primary&gt;2</attribute>
+          <attribute name="action">win.Zoom200</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Photo</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Previous Photo</attribute>
+          <attribute name="action">win.PrevPhoto</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Next Photo</attribute>
+          <attribute name="action">win.NextPhoto</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Rotate _Right</attribute>
+          <attribute name="accel">&lt;Primary&gt;r</attribute>
+          <attribute name="action">win.RotateClockwise</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Rotate _Left</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;r</attribute>
+          <attribute name="action">win.RotateCounterclockwise</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Flip Hori_zontally</attribute>
+          <attribute name="action">win.FlipHorizontally</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Flip Verti_cally</attribute>
+          <attribute name="action">win.FlipVertically</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">T_ools</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Enhance</attribute>
+              <attribute name="accel">&lt;Primary&gt;e</attribute>
+              <attribute name="action">win.Enhance</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Crop</attribute>
+              <attribute name="accel">&lt;Primary&gt;o</attribute>
+              <attribute name="action">win.Crop</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Straighten</attribute>
+              <attribute name="accel">&lt;Primary&gt;a</attribute>
+              <attribute name="action">win.Straighten</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Red-eye</attribute>
+              <attribute name="accel">&lt;Primary&gt;y</attribute>
+              <attribute name="action">win.RedEye</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Adjust</attribute>
+              <attribute name="accel">&lt;Primary&gt;d</attribute>
+              <attribute name="action">win.Adjust</attribute>
+            </item>
+          </section>
+        </submenu>
+        <item>
+          <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+          <attribute name="action">win.Revert</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Adjust Date and Time…</attribute>
+          <attribute name="action">win.AdjustDateTime</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+</interface>
diff --git a/ui/direct_context.ui b/ui/direct_context.ui
index 7b0d564..de758c2 100644
--- a/ui/direct_context.ui
+++ b/ui/direct_context.ui
@@ -1,10 +1,32 @@
-<ui>
-    <popup name="DirectContextMenu">
-        <menuitem name="ContextEnhance" action="Enhance" />
-        <menuitem name="ContextRevert" action="Revert" />
-        <separator />
-        <placeholder name="ContextJumpPlaceholder" />
-        <menuitem name="ContextSendTo" action="SendTo" />
-    </popup>
-</ui>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="shotwell">
+  <requires lib="gtk+" version="3.14"/>
+  <menu id="DirectContextMenu">
+    <submenu>
+      <attribute name="label" translatable="yes">DirectContextMenu</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Enhance</attribute>
+          <attribute name="accel">&lt;Primary&gt;e</attribute>
+          <attribute name="action">win.Enhance</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+          <attribute name="action">win.Revert</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+          <attribute name="action">win.CommonJumpToFile</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Send _To…</attribute>
+          <attribute name="action">win.SendTo</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+</interface>
diff --git a/ui/event.ui b/ui/event.ui
index dcb1d95..11d9b74 100644
--- a/ui/event.ui
+++ b/ui/event.ui
@@ -1,25 +1,593 @@
-<ui>
-
-    <menubar name="MenuBar">
-        <menu name="PhotosMenu" action="PhotosMenu">
-            <separator />
-            <menuitem name="MakePrimary" action="MakePrimary" />
-        </menu>
-        <menu name="EventsMenu" action="EventsMenu">
-            <menuitem name="EventRename" action="Rename" />
-            <menuitem name="EditComment" action="EditComment" />
-        </menu>
-    </menubar>
-
-    <popup name="CollectionContextMenu">
-        <separator />
-        <menuitem name="ContextMakePrimary" action="MakePrimary" />
-    </popup>
-
-    <popup name="EventContextMenu">
-        <menuitem name="ContextRename" action="Rename" />
-        <menuitem name="EditEventComment" action="EditEventComment" />
-    </popup>
-    
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+          <attribute name="accel">&lt;Primary&gt;i</attribute>
+          <attribute name="action">win.CommonFileImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import From _Application…</attribute>
+          <attribute name="action">win.ExternalLibraryImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Save _As…</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;e</attribute>
+          <attribute name="action">win.Export</attribute>
+        </item>
+      </section>
+      <section>
+        <attribute name="id">FileExtrasPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+          <attribute name="action">win.CommonJumpToFile</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Empty T_rash</attribute>
+          <attribute name="action">win.CommonEmptyTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Undo</attribute>
+          <attribute name="accel">&lt;Primary&gt;z</attribute>
+          <attribute name="action">win.CommonUndo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Redo</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;z</attribute>
+          <attribute name="action">win.CommonRedo</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Find</attribute>
+          <attribute name="action">win.CommonFind</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+          <attribute name="accel">&lt;Primary&gt;s</attribute>
+          <attribute name="action">win.CommonNewSearch</attribute>
+        </item>
+      </section>
+      <section>
+        <attribute name="id">EditExtrasPlaceholder</attribute>
+        <item>
+          <attribute name="label" translatable="yes">R_emove from Library</attribute>
+          <attribute name="accel">&lt;Shift&gt;Delete</attribute>
+          <attribute name="action">win.RemoveFromLibrary</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Move to Trash</attribute>
+          <attribute name="accel">Delete</attribute>
+          <attribute name="action">win.MoveToTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Select _All</attribute>
+          <attribute name="accel">&lt;Primary&gt;a</attribute>
+          <attribute name="action">win.CommonSelectAll</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Preferences</attribute>
+          <attribute name="action">win.CommonPreferences</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Basic Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;i</attribute>
+          <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">E_xtended Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;x</attribute>
+          <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Search Bar</attribute>
+          <attribute name="accel">F8</attribute>
+          <attribute name="action">win.CommonDisplaySearchbar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">S_idebar</attribute>
+          <attribute name="accel">F9</attribute>
+          <attribute name="action">win.CommonDisplaySidebar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">T_oolbar</attribute>
+          <attribute name="accel">&lt;Primary&gt;F9</attribute>
+          <attribute name="action">win.CommonDisplayToolbar</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Titles</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;t</attribute>
+          <attribute name="action">win.ViewTitle</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Comments</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;c</attribute>
+          <attribute name="action">win.ViewComment</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Ta_gs</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;g</attribute>
+          <attribute name="action">win.ViewTags</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Ratings</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;n</attribute>
+          <attribute name="action">win.ViewRatings</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Filter Photos</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">7</attribute>
+              <attribute name="accel">&lt;Primary&gt;5</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">6</attribute>
+              <attribute name="accel">&lt;Primary&gt;4</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">5</attribute>
+              <attribute name="accel">&lt;Primary&gt;3</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">4</attribute>
+              <attribute name="accel">&lt;Primary&gt;2</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">3</attribute>
+              <attribute name="accel">&lt;Primary&gt;1</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_All Photos</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">2</attribute>
+              <attribute name="accel">&lt;Primary&gt;0</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">All + _Rejected</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">1</attribute>
+              <attribute name="accel">&lt;Primary&gt;9</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Rejected _Only</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">8</attribute>
+              <attribute name="accel">&lt;Primary&gt;8</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Photos</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">By _Title</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">1</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">By _Filename</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">4</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">By Exposure _Date</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">2</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">By _Rating</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">3</attribute>
+            </item>
+          </section>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.Sort</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">D_escending</attribute>
+              <attribute name="action">win.Sort</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Events</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Descending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _In</attribute>
+          <attribute name="accel">&lt;Primary&gt;plus</attribute>
+          <attribute name="action">win.IncreaseSize</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _Out</attribute>
+          <attribute name="accel">&lt;Primary&gt;minus</attribute>
+          <attribute name="action">win.DecreaseSize</attribute>
+        </item>
+      </section>
+      <section>
+      <attribute name="id">ViewExtrasFullscreenSlideshowPlaceholder</attribute>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Photos</attribute>
+      <section>
+      <attribute name="id">PhotosExtrasEditsPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+          <attribute name="accel">&lt;Primary&gt;g</attribute>
+          <attribute name="action">win.Flag</attribute>
+        </item>
+        <submenu>
+          <attribute name="label" translatable="yes">_Set Rating</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="accel">5</attribute>
+              <attribute name="action">win.RateFive</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="accel">4</attribute>
+              <attribute name="action">win.RateFour</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="accel">3</attribute>
+              <attribute name="action">win.RateThree</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="accel">2</attribute>
+              <attribute name="action">win.RateTwo</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="accel">1</attribute>
+              <attribute name="action">win.RateOne</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Unrated</attribute>
+              <attribute name="accel">0</attribute>
+              <attribute name="action">win.RateUnrated</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Rejected</attribute>
+              <attribute name="accel">9</attribute>
+              <attribute name="action">win.RateRejected</attribute>
+            </item>
+          </section>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Increase</attribute>
+              <attribute name="accel">greater</attribute>
+              <attribute name="action">win.IncreaseRating</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Decrease</attribute>
+              <attribute name="accel">less</attribute>
+              <attribute name="action">win.DecreaseRating</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Title…</attribute>
+          <attribute name="action">win.EditTitle</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+          <attribute name="action">win.EditComment</attribute>
+        </item>
+      <attribute name="id">PhotosExtrasDateTimePlaceholder</attribute>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Developer</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">Shotwell</attribute>
+              <attribute name="action">win.RawDeveloper</attribute>
+              <attribute name="target">Shotwell</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Camera</attribute>
+              <attribute name="action">win.RawDeveloper</attribute>
+              <attribute name="target">Camera</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+      <attribute name="id">PhotosExtrasExternalsPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Make _Key Photo for Event</attribute>
+          <attribute name="action">win.MakePrimary</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Even_ts</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_New Event</attribute>
+          <attribute name="accel">&lt;Primary&gt;n</attribute>
+          <attribute name="action">win.NewEvent</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+          <attribute name="action">win.CommonJumpToEvent</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Re_name Event…</attribute>
+          <attribute name="accel">F2</attribute>
+          <attribute name="action">win.Rename</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+          <attribute name="action">win.EditComment</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Ta_gs</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Add _Tags…</attribute>
+          <attribute name="accel">&lt;Primary&gt;t</attribute>
+          <attribute name="action">win.AddTags</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+          <attribute name="accel">&lt;Primary&gt;m</attribute>
+          <attribute name="action">win.ModifyTags</attribute>
+        </item>
+      </section>
+    </submenu>
+    <!-- Faces menu goes here FacesMenuPlaceholder -->
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+  <menu id="CollectionContextMenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Enhance</attribute>
+        <attribute name="accel">&lt;Primary&gt;e</attribute>
+        <attribute name="action">win.Enhance</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+        <attribute name="action">win.Revert</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Add _Tags…</attribute>
+        <attribute name="accel">&lt;Primary&gt;t</attribute>
+        <attribute name="action">win.AddTags</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+        <attribute name="accel">&lt;Primary&gt;m</attribute>
+        <attribute name="action">win.ModifyTags</attribute>
+      </item>
+      <attribute name="id">ContextTagsPlaceholder</attribute>
+    </section>
+    <section>
+      <attribute name="id">ContextFacesPlaceholder</attribute>
+      <item>
+        <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+        <attribute name="accel">&lt;Primary&gt;g</attribute>
+        <attribute name="action">win.Flag</attribute>
+      </item>
+    </section>
+    <submenu>
+      <attribute name="label" translatable="yes">_Set Rating</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="no">★★★★★</attribute>
+          <attribute name="action">win.RateFive</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="no">★★★★</attribute>
+          <attribute name="action">win.RateFour</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="no">★★★</attribute>
+          <attribute name="action">win.RateThree</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="no">★★</attribute>
+          <attribute name="action">win.RateTwo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="no">★</attribute>
+          <attribute name="action">win.RateOne</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Unrated</attribute>
+          <attribute name="action">win.RateUnrated</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Rejected</attribute>
+          <attribute name="action">win.RateRejected</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Increase</attribute>
+          <attribute name="action">win.IncreaseRating</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Decrease</attribute>
+          <attribute name="action">win.DecreaseRating</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Developer</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Shotwell</attribute>
+          <attribute name="action">win.RawDeveloper</attribute>
+          <attribute name="target">Shotwell</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Camera</attribute>
+          <attribute name="action">win.RawDeveloper</attribute>
+          <attribute name="target">Camera</attribute>
+        </item>
+      </section>
+    </submenu>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Edit _Title…</attribute>
+        <attribute name="action">win.EditTitle</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+        <attribute name="action">win.EditComment</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Open with E_xternal Editor</attribute>
+        <attribute name="accel">&lt;Primary&gt;Return</attribute>
+        <attribute name="action">win.ExternalEdit</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Open With RA_W Editor</attribute>
+        <attribute name="action">win.ExternalEditRAW</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+        <attribute name="action">win.CommonJumpToEvent</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+        <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+        <attribute name="action">win.CommonJumpToFile</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Send _To…</attribute>
+        <attribute name="action">win.SendTo</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Move to Trash</attribute>
+        <attribute name="accel">Delete</attribute>
+        <attribute name="action">win.MoveToTrash</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Make _Key Photo for Event</attribute>
+        <attribute name="action">win.MakePrimary</attribute>
+      </item>
+    </section>
+  </menu>
+  <menu id="EventContextMenu">
+    <section>
+        <item>
+          <attribute name="label" translatable="yes">Re_name Event…</attribute>
+          <attribute name="action">win.Rename</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Edit Event _Comment…</attribute>
+          <attribute name="action">win.EditEventComment</attribute>
+        </item>
+    </section>
+  </menu>
+</interface>
diff --git a/ui/events_directory.ui b/ui/events_directory.ui
index 33ab5d7..380da0a 100644
--- a/ui/events_directory.ui
+++ b/ui/events_directory.ui
@@ -1,64 +1,191 @@
-<ui>
-
-    <menubar name="MenuBar">
-        <menu name="FileMenu" action="FileMenu">
-            <menuitem name="Import" action="CommonFileImport" />
-            <menuitem name="ImportExternal" action="ExternalLibraryImport" />
-            <separator />
-            <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
-            <separator />
-            <menuitem name="Quit" action="CommonQuit" />
-        </menu>
-
-        <menu name="EditMenu" action="EditMenu">
-            <menuitem name="Undo" action="CommonUndo" />
-            <menuitem name="Redo" action="CommonRedo" />
-            <separator />
-            <menuitem name="Find" action="CommonFind" />
-            <menuitem name="NewSearch" action="CommonNewSearch" />
-            <separator />
-            <menuitem name="SelectAll" action="CommonSelectAll" />
-            <separator />
-            <menuitem name="Preferences" action="CommonPreferences" />
-        </menu>
-        
-        <menu name="ViewMenu" action="ViewMenu">
-            <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
-            <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
-            <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
-            <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
-            <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
-            <separator />
-            <menuitem name="ViewComment" action="ViewComment" />
-            <separator />
-            <menu name="SortEvents" action="CommonSortEvents">
-                <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
-                <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
-            </menu>
-            <separator />
-            <menuitem name="Fullscreen" action="CommonFullscreen" />
-        </menu>
-
-        <menu name="EventsMenu" action="EventsMenu">
-            <menuitem name="EventMerge" action="Merge" />
-            <menuitem name="EventRename" action="Rename" />
-            <menuitem name="EditComment" action="EditComment" />
-        </menu>
-        
-        <menu name="HelpMenu" action="HelpMenu">
-            <menuitem name="Contents" action="CommonHelpContents" />
-            <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
-            <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
-            <separator />
-            <menuitem name="About" action="CommonAbout" />
-        </menu>
-    </menubar>
-
-    <popup name="EventsDirectoryContextMenu">
-        <menuitem name="ContextMerge" action="Merge" />
-        <menuitem name="ContextRename" action="Rename" />
-        <menuitem name="ContextEditComment" action="EditComment" />
-    </popup>
-
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+          <attribute name="accel">&lt;Primary&gt;i</attribute>
+          <attribute name="action">win.CommonFileImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import From _Application…</attribute>
+          <attribute name="action">win.ExternalLibraryImport</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Empty T_rash</attribute>
+          <attribute name="action">win.CommonEmptyTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Undo</attribute>
+          <attribute name="accel">&lt;Primary&gt;z</attribute>
+          <attribute name="action">win.CommonUndo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Redo</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;z</attribute>
+          <attribute name="action">win.CommonRedo</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Find</attribute>
+          <attribute name="action">win.CommonFind</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+          <attribute name="accel">&lt;Primary&gt;s</attribute>
+          <attribute name="action">win.CommonNewSearch</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Select _All</attribute>
+          <attribute name="accel">&lt;Primary&gt;a</attribute>
+          <attribute name="action">win.CommonSelectAll</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Preferences</attribute>
+          <attribute name="action">win.CommonPreferences</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Basic Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;i</attribute>
+          <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">E_xtended Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;x</attribute>
+          <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Search Bar</attribute>
+          <attribute name="accel">F8</attribute>
+          <attribute name="action">win.CommonDisplaySearchbar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">S_idebar</attribute>
+          <attribute name="accel">F9</attribute>
+          <attribute name="action">win.CommonDisplaySidebar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">T_oolbar</attribute>
+          <attribute name="accel">&lt;Primary&gt;F9</attribute>
+          <attribute name="action">win.CommonDisplayToolbar</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Comments</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;c</attribute>
+          <attribute name="action">win.ViewComment</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Events</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">D_escending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Fulls_creen</attribute>
+          <attribute name="accel">F11</attribute>
+          <attribute name="action">win.CommonFullscreen</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Even_ts</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Merge Events</attribute>
+          <attribute name="action">win.Merge</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Re_name Event…</attribute>
+          <attribute name="accel">F2</attribute>
+          <attribute name="action">win.Rename</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+          <attribute name="action">win.EditComment</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+  <menu id="EventsDirectoryContextMenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Merge Events</attribute>
+        <attribute name="action">win.Merge</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Re_name Event…</attribute>
+        <attribute name="accel">F2</attribute>
+        <attribute name="action">win.Rename</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+        <attribute name="action">win.EditComment</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/ui/import.ui b/ui/import.ui
index 3c3cac3..522ca7b 100644
--- a/ui/import.ui
+++ b/ui/import.ui
@@ -1,66 +1,219 @@
-<ui>
-
-    <menubar name="MenuBar">
-        <menu name="FileMenu" action="FileMenu">
-            <menuitem name="Import" action="CommonFileImport" />
-            <menuitem name="ImportSelected" action="ImportSelected" />
-            <menuitem name="ImportAll" action="ImportAll" />
-            <menuitem name="ImportExternal" action="ExternalLibraryImport" />
-            <separator />
-            <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
-            <separator />
-            <menuitem name="Quit" action="CommonQuit" />
-        </menu>
-        
-        <menu name="EditMenu" action="EditMenu">
-            <menuitem name="Undo" action="CommonUndo" />
-            <menuitem name="Redo" action="CommonRedo" />
-            <separator />
-            <menuitem name="Find" action="CommonFind" />
-            <separator />
-            <menuitem name="SelectAll" action="CommonSelectAll" />
-            <separator />
-            <menuitem name="Preferences" action="CommonPreferences" />
-        </menu>
-        
-        <menu name="ViewMenu" action="ViewMenu">
-            <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
-            <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
-            <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
-            <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
-            <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
-            <separator />
-            <menuitem name="ViewTitle" action="ViewTitle" />
-            <separator />
-            <menu name="FilterPhotos" action="CommonFilterPhotos">
-                <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
-                <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
-                <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
-                <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
-                <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
-                <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
-                <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
-                <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
-            </menu>
-            <separator />
-            <menu name="SortEvents" action="CommonSortEvents">
-                <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
-                <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
-            </menu>
-        </menu>
-        
-        <menu name="HelpMenu" action="HelpMenu">
-            <menuitem name="Contents" action="CommonHelpContents" />
-            <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
-            <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
-            <separator />
-            <menuitem name="About" action="CommonAbout" />
-        </menu>
-    </menubar>
-
-    <popup name="ImportContextMenu">
-            <menuitem name="ContextImportSelected" action="ImportSelected" />
-            <menuitem name="ContextImportAll" action="ImportAll" />
-    </popup>
-    
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+          <attribute name="accel">&lt;Primary&gt;i</attribute>
+          <attribute name="action">win.CommonFileImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import _Selected</attribute>
+          <attribute name="action">win.ImportSelected</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import _All</attribute>
+          <attribute name="action">win.ImportAll</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import From _Application…</attribute>
+          <attribute name="action">win.ExternalLibraryImport</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Empty T_rash</attribute>
+          <attribute name="action">win.CommonEmptyTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Undo</attribute>
+          <attribute name="accel">&lt;Primary&gt;z</attribute>
+          <attribute name="action">win.CommonUndo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Redo</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;z</attribute>
+          <attribute name="action">win.CommonRedo</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Find</attribute>
+          <attribute name="action">win.CommonFind</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Select _All</attribute>
+          <attribute name="accel">&lt;Primary&gt;a</attribute>
+          <attribute name="action">win.CommonSelectAll</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Preferences</attribute>
+          <attribute name="action">win.CommonPreferences</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Basic Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;i</attribute>
+          <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">E_xtended Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;x</attribute>
+          <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Search Bar</attribute>
+          <attribute name="accel">F8</attribute>
+          <attribute name="action">win.CommonDisplaySearchbar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">S_idebar</attribute>
+          <attribute name="accel">F9</attribute>
+          <attribute name="action">win.CommonDisplaySidebar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">T_oolbar</attribute>
+          <attribute name="accel">&lt;Primary&gt;F9</attribute>
+          <attribute name="action">win.CommonDisplayToolbar</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Titles</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;t</attribute>
+          <attribute name="action">win.ViewTitle</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Filter Photos</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">7</attribute>
+              <attribute name="accel">&lt;Primary&gt;5</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">6</attribute>
+              <attribute name="accel">&lt;Primary&gt;4</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">5</attribute>
+              <attribute name="accel">&lt;Primary&gt;3</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">4</attribute>
+              <attribute name="accel">&lt;Primary&gt;2</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">3</attribute>
+              <attribute name="accel">&lt;Primary&gt;1</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_All Photos</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">2</attribute>
+              <attribute name="accel">&lt;Primary&gt;0</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">All + _Rejected</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">1</attribute>
+              <attribute name="accel">&lt;Primary&gt;9</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Rejected _Only</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">8</attribute>
+              <attribute name="accel">&lt;Primary&gt;8</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Events</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Descending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+  <menu id="ImportContextMenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Import _Selected</attribute>
+        <attribute name="action">win.ImportSelected</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Import _All</attribute>
+        <attribute name="action">win.ImportAll</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/ui/import_queue.ui b/ui/import_queue.ui
index 88078b8..9b07d9c 100644
--- a/ui/import_queue.ui
+++ b/ui/import_queue.ui
@@ -1,34 +1,89 @@
-<ui>
-
-    <menubar name="MenuBar">
-        <menu name="FileMenu" action="FileMenu">
-            <menuitem name="Stop" action="Stop" />
-            <separator />
-            <menuitem name="Import" action="CommonFileImport" />
-            <menuitem name="ImportExternal" action="ExternalLibraryImport" />
-            <separator />
-            <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
-            <separator />
-            <menuitem name="Quit" action="CommonQuit" />
-        </menu>
-        
-        <menu name="ViewMenu" action="ViewMenu">
-            <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
-            <separator />
-            <menu name="SortEvents" action="CommonSortEvents">
-                <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
-                <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
-            </menu>
-        </menu>
-        
-        <menu name="HelpMenu" action="HelpMenu">
-            <menuitem name="Contents" action="CommonHelpContents" />
-            <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
-            <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
-            <separator />
-            <menuitem name="About" action="CommonAbout" />
-        </menu>
-    </menubar>
-
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Stop Import</attribute>
+          <attribute name="action">win.Stop</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+          <attribute name="accel">&lt;Primary&gt;i</attribute>
+          <attribute name="action">win.CommonFileImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import From _Application…</attribute>
+          <attribute name="action">win.ExternalLibraryImport</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Empty T_rash</attribute>
+          <attribute name="action">win.CommonEmptyTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Basic Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;i</attribute>
+          <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Events</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">D_escending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+</interface>
diff --git a/ui/media.ui b/ui/media.ui
index f42c189..e3d8ba1 100644
--- a/ui/media.ui
+++ b/ui/media.ui
@@ -1,127 +1,425 @@
-<ui>
-
-    <menubar name="MenuBar">
-        <menu name="FileMenu" action="FileMenu">
-            <menuitem name="Import" action="CommonFileImport" />
-            <menuitem name="ImportExternal" action="ExternalLibraryImport" />
-            <menuitem name="Export" action="Export" />
-            <separator />
-            <placeholder name="FileExtrasPlaceholder" />
-            <separator />
-            <menuitem name="JumpToFile" action="CommonJumpToFile" />
-            <separator />
-            <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
-            <separator />
-            <menuitem name="Quit" action="CommonQuit" />
-        </menu>
-        
-        <menu name="EditMenu" action="EditMenu">
-            <menuitem name="Undo" action="CommonUndo" />
-            <menuitem name="Redo" action="CommonRedo" />
-            <separator />
-            <menuitem name="Find" action="CommonFind" />
-            <menuitem name="NewSearch" action="CommonNewSearch" />
-            <separator />
-            <placeholder name="EditExtrasPlaceholder" />
-            <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
-            <menuitem name="MoveToTrash" action="MoveToTrash" />
-            <separator />
-            <menuitem name="SelectAll" action="CommonSelectAll" />
-            <separator />
-            <menuitem name="Preferences" action="CommonPreferences" />
-        </menu>
-
-        <menu name="ViewMenu" action="ViewMenu">
-            <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
-            <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
-            <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
-            <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
-            <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
-            <separator />
-            <menuitem name="ViewTitle" action="ViewTitle" />
-            <menuitem name="ViewComment" action="ViewComment" />
-            <menuitem name="ViewTags" action="ViewTags" />
-            <menuitem name="ViewRatings" action="ViewRatings" />
-            <separator />
-            <menu name="FilterPhotos" action="CommonFilterPhotos">
-                <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
-                <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
-                <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
-                <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
-                <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
-                <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
-                <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
-                <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
-            </menu>
-            <separator />
-            <menu name="SortPhotos" action="SortPhotos">
-                <menuitem name="SortByTitle" action="SortByTitle" />
-                <menuitem name="SortByFilename" action="SortByFilename" />
-                <menuitem name="SortByExposureDate" action="SortByExposureDate" />
-                <menuitem name="SortByRating" action="SortByRating" />
-                <separator />
-                <menuitem name="SortAscending" action="SortAscending" />
-                <menuitem name="SortDescending" action="SortDescending" />
-            </menu>
-            <menu name="SortEvents" action="CommonSortEvents">
-                <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
-                <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
-            </menu>
-            <separator />
-            <menuitem name="IncreaseSize" action="IncreaseSize" />
-            <menuitem name="DecreaseSize" action="DecreaseSize" />
-            <separator />
-            <placeholder name="ViewExtrasFullscreenSlideshowPlaceholder" />
-        </menu>
-                
-        <menu name="PhotosMenu" action="PhotosMenu">
-            <placeholder name="PhotosExtrasEditsPlaceholder" />
-            <separator />
-            <menuitem name="Flag" action="Flag" />
-            <menu name="Rate" action="Rate">
-                <menuitem name="RateFive" action="RateFive" />
-                <menuitem name="RateFour" action="RateFour" />
-                <menuitem name="RateThree" action="RateThree" />
-                <menuitem name="RateTwo" action="RateTwo" />
-                <menuitem name="RateOne" action="RateOne" />
-                <menuitem name="RateUnrated" action="RateUnrated" />
-                <menuitem name="RateRejected" action="RateRejected" />
-                <separator />
-                <menuitem name="IncreaseRating" action="IncreaseRating" />
-                <menuitem name="DecreaseRating" action="DecreaseRating" />
-            </menu>
-            <separator />
-            <menuitem name="EditTitle" action="EditTitle" />
-            <menuitem name="EditComment" action="EditComment" />
-            <placeholder name="PhotosExtrasDateTimePlaceholder" />
-            <separator />
-            <menu name="RawDeveloper" action="RawDeveloper">
-                <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
-                <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
-            </menu>
-            <separator />
-            <placeholder name="PhotosExtrasExternalsPlaceholder" />
-        </menu>
-
-        <menu name="EventsMenu" action="EventsMenu">
-            <menuitem name="NewEvent" action="NewEvent" />
-            <menuitem name="CommonJumpToEvent" action="CommonJumpToEvent" />
-        </menu>
-
-        <menu name="TagsMenu" action="TagsMenu">
-            <menuitem name="AddTags" action="AddTags" />
-            <menuitem name="ModifyTags" action="ModifyTags" />
-        </menu>
-        
-        <placeholder name="FacesMenuPlaceholder" />
-
-        <menu name="HelpMenu" action="HelpMenu">
-            <menuitem name="Contents" action="CommonHelpContents" />
-            <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
-            <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
-            <separator />
-            <menuitem name="About" action="CommonAbout" />
-        </menu>
-    </menubar>
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+          <attribute name="accel">&lt;Primary&gt;i</attribute>
+          <attribute name="action">win.CommonFileImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import From _Application…</attribute>
+          <attribute name="action">win.ExternalLibraryImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Save _As…</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;e</attribute>
+          <attribute name="action">win.Export</attribute>
+        </item>
+      </section>
+      <section>
+        <attribute name="id">FileExtrasPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+          <attribute name="action">win.CommonJumpToFile</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Empty T_rash</attribute>
+          <attribute name="action">win.CommonEmptyTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Undo</attribute>
+          <attribute name="accel">&lt;Primary&gt;z</attribute>
+          <attribute name="action">win.CommonUndo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Redo</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;z</attribute>
+          <attribute name="action">win.CommonRedo</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Find</attribute>
+          <attribute name="action">win.CommonFind</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+          <attribute name="accel">&lt;Primary&gt;s</attribute>
+          <attribute name="action">win.CommonNewSearch</attribute>
+        </item>
+      </section>
+      <section>
+        <attribute name="id">EditExtrasPlaceholder</attribute>
+        <item>
+          <attribute name="label" translatable="yes">R_emove from Library</attribute>
+          <attribute name="accel">&lt;Shift&gt;Delete</attribute>
+          <attribute name="action">win.RemoveFromLibrary</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Move to Trash</attribute>
+          <attribute name="accel">Delete</attribute>
+          <attribute name="action">win.MoveToTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Select _All</attribute>
+          <attribute name="accel">&lt;Primary&gt;a</attribute>
+          <attribute name="action">win.CommonSelectAll</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Preferences</attribute>
+          <attribute name="action">win.CommonPreferences</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Basic Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;i</attribute>
+          <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">E_xtended Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;x</attribute>
+          <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Search Bar</attribute>
+          <attribute name="accel">F8</attribute>
+          <attribute name="action">win.CommonDisplaySearchbar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">S_idebar</attribute>
+          <attribute name="accel">F9</attribute>
+          <attribute name="action">win.CommonDisplaySidebar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">T_oolbar</attribute>
+          <attribute name="accel">&lt;Primary&gt;F9</attribute>
+          <attribute name="action">win.CommonDisplayToolbar</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Titles</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;t</attribute>
+          <attribute name="action">win.ViewTitle</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Comments</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;c</attribute>
+          <attribute name="action">win.ViewComment</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Ta_gs</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;g</attribute>
+          <attribute name="action">win.ViewTags</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Ratings</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;n</attribute>
+          <attribute name="action">win.ViewRatings</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Filter Photos</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">7</attribute>
+              <attribute name="accel">&lt;Primary&gt;5</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">6</attribute>
+              <attribute name="accel">&lt;Primary&gt;4</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">5</attribute>
+              <attribute name="accel">&lt;Primary&gt;3</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">4</attribute>
+              <attribute name="accel">&lt;Primary&gt;2</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">3</attribute>
+              <attribute name="accel">&lt;Primary&gt;1</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_All Photos</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">2</attribute>
+              <attribute name="accel">&lt;Primary&gt;0</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">All + _Rejected</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">1</attribute>
+              <attribute name="accel">&lt;Primary&gt;9</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Rejected _Only</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">8</attribute>
+              <attribute name="accel">&lt;Primary&gt;8</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Photos</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">By _Title</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">1</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">By _Filename</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">4</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">By Exposure _Date</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">2</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">By _Rating</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">3</attribute>
+            </item>
+          </section>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.Sort</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">D_escending</attribute>
+              <attribute name="action">win.Sort</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Events</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Descending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _In</attribute>
+          <attribute name="accel">&lt;Primary&gt;plus</attribute>
+          <attribute name="action">win.IncreaseSize</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _Out</attribute>
+          <attribute name="accel">&lt;Primary&gt;minus</attribute>
+          <attribute name="action">win.DecreaseSize</attribute>
+        </item>
+      </section>
+      <section>
+      <attribute name="id">ViewExtrasFullscreenSlideshowPlaceholder</attribute>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Photos</attribute>
+      <section>
+      <attribute name="id">PhotosExtrasEditsPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+          <attribute name="accel">&lt;Primary&gt;g</attribute>
+          <attribute name="action">win.Flag</attribute>
+        </item>
+        <submenu>
+          <attribute name="label" translatable="yes">_Set Rating</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="accel">5</attribute>
+              <attribute name="action">win.RateFive</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="accel">4</attribute>
+              <attribute name="action">win.RateFour</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="accel">3</attribute>
+              <attribute name="action">win.RateThree</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="accel">2</attribute>
+              <attribute name="action">win.RateTwo</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="accel">1</attribute>
+              <attribute name="action">win.RateOne</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Unrated</attribute>
+              <attribute name="accel">0</attribute>
+              <attribute name="action">win.RateUnrated</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Rejected</attribute>
+              <attribute name="accel">9</attribute>
+              <attribute name="action">win.RateRejected</attribute>
+            </item>
+          </section>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Increase</attribute>
+              <attribute name="accel">greater</attribute>
+              <attribute name="action">win.IncreaseRating</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Decrease</attribute>
+              <attribute name="accel">less</attribute>
+              <attribute name="action">win.DecreaseRating</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Title…</attribute>
+          <attribute name="action">win.EditTitle</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+          <attribute name="action">win.EditComment</attribute>
+        </item>
+      <attribute name="id">PhotosExtrasDateTimePlaceholder</attribute>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Developer</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">Shotwell</attribute>
+              <attribute name="action">win.RawDeveloper</attribute>
+              <attribute name="target">Shotwell</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Camera</attribute>
+              <attribute name="action">win.RawDeveloper</attribute>
+              <attribute name="target">Camera</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+      <attribute name="id">PhotosExtrasExternalsPlaceholder</attribute>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Even_ts</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_New Event</attribute>
+          <attribute name="accel">&lt;Primary&gt;n</attribute>
+          <attribute name="action">win.NewEvent</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+          <attribute name="action">win.CommonJumpToEvent</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Ta_gs</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Add _Tags…</attribute>
+          <attribute name="accel">&lt;Primary&gt;t</attribute>
+          <attribute name="action">win.AddTags</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+          <attribute name="accel">&lt;Primary&gt;m</attribute>
+          <attribute name="action">win.ModifyTags</attribute>
+        </item>
+      </section>
+    </submenu>
+    <!-- Faces menu goes here FacesMenuPlaceholder -->
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+</interface>
diff --git a/ui/offline.ui b/ui/offline.ui
index ff56ae9..f886526 100644
--- a/ui/offline.ui
+++ b/ui/offline.ui
@@ -1,70 +1,249 @@
-<ui>
-
-    <menubar name="MenuBar">
-        <menu name="FileMenu" action="FileMenu">
-            <menuitem name="Import" action="CommonFileImport" />
-            <menuitem name="ImportExternal" action="ExternalLibraryImport" />
-            <separator />
-            <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
-            <separator />
-            <menuitem name="Quit" action="CommonQuit" />
-        </menu>
-        
-        <menu name="EditMenu" action="EditMenu">
-            <menuitem name="Undo" action="CommonUndo" />
-            <menuitem name="Redo" action="CommonRedo" />
-            <separator />
-            <menuitem name="Find" action="CommonFind" />
-            <menuitem name="NewSearch" action="CommonNewSearch" />
-            <separator />
-            <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
-            <separator />
-            <menuitem name="SelectAll" action="CommonSelectAll" />
-            <separator />
-            <menuitem name="Preferences" action="CommonPreferences" />
-        </menu>
-        
-        <menu name="ViewMenu" action="ViewMenu">
-            <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
-            <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
-            <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
-            <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
-            <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
-            <separator />
-            <menu name="FilterPhotos" action="CommonFilterPhotos">
-                <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
-                <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
-                <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
-                <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
-                <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
-                <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
-                <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
-                <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
-            </menu>
-            <separator />
-            <menu name="SortEvents" action="CommonSortEvents">
-                <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
-                <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
-            </menu>
-        </menu>
-        
-        <menu name="HelpMenu" action="HelpMenu">
-            <menuitem name="Contents" action="CommonHelpContents" />
-            <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
-            <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
-            <separator />
-            <menuitem name="About" action="CommonAbout" />
-        </menu>
-    </menubar>
-    
-    <popup name="OfflineContextMenu">
-        <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
-    </popup>
-    
-    <toolbar name="OfflineToolbar">
-        <toolitem name="ToolRemoveFromLibrary" action="RemoveFromLibrary" />
-        <separator />
-        <toolitem name="ToolFind" action="CommonDisplaySearchbar" />
-    </toolbar>
-    
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+          <attribute name="accel">&lt;Primary&gt;i</attribute>
+          <attribute name="action">win.CommonFileImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import From _Application…</attribute>
+          <attribute name="action">win.ExternalLibraryImport</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Empty T_rash</attribute>
+          <attribute name="action">win.CommonEmptyTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Undo</attribute>
+          <attribute name="accel">&lt;Primary&gt;z</attribute>
+          <attribute name="action">win.CommonUndo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Redo</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;z</attribute>
+          <attribute name="action">win.CommonRedo</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Find</attribute>
+          <attribute name="action">win.CommonFind</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+          <attribute name="accel">&lt;Primary&gt;s</attribute>
+          <attribute name="action">win.CommonNewSearch</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">R_emove from Library</attribute>
+          <attribute name="accel">Delete</attribute>
+          <attribute name="action">win.RemoveFromLibrary</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Select _All</attribute>
+          <attribute name="accel">&lt;Primary&gt;a</attribute>
+          <attribute name="action">win.CommonSelectAll</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Preferences</attribute>
+          <attribute name="action">win.CommonPreferences</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Basic Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;i</attribute>
+          <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">E_xtended Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;x</attribute>
+          <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Search Bar</attribute>
+          <attribute name="accel">F8</attribute>
+          <attribute name="action">win.CommonDisplaySearchbar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">S_idebar</attribute>
+          <attribute name="accel">F9</attribute>
+          <attribute name="action">win.CommonDisplaySidebar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">T_oolbar</attribute>
+          <attribute name="accel">&lt;Primary&gt;F9</attribute>
+          <attribute name="action">win.CommonDisplayToolbar</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Filter Photos</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">7</attribute>
+              <attribute name="accel">&lt;Primary&gt;5</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">6</attribute>
+              <attribute name="accel">&lt;Primary&gt;4</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">5</attribute>
+              <attribute name="accel">&lt;Primary&gt;3</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">4</attribute>
+              <attribute name="accel">&lt;Primary&gt;2</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">3</attribute>
+              <attribute name="accel">&lt;Primary&gt;1</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_All Photos</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">2</attribute>
+              <attribute name="accel">&lt;Primary&gt;0</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">All + _Rejected</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">1</attribute>
+              <attribute name="accel">&lt;Primary&gt;9</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Rejected _Only</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">8</attribute>
+              <attribute name="accel">&lt;Primary&gt;8</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Events</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">D_escending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+  <menu id="OfflineContextMenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">R_emove from Library</attribute>
+        <attribute name="accel">Delete</attribute>
+        <attribute name="action">win.RemoveFromLibrary</attribute>
+      </item>
+    </section>
+  </menu>
+  <object class="GtkToolbar" id="OfflineToolbar">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="toolbar_style">both-horiz</property>
+    <child>
+      <object class="GtkToolButton" id="ToolRemoveFromLibrary">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Remove the selected photos from the 
library</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.RemoveFromLibrary</property>
+        <property name="label" translatable="yes">R_emove From Library</property>
+        <property name="use_underline">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="ToolFind">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Find an image by typing text that appears in its 
name or tags</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.CommonDisplaySearchbar</property>
+        <property name="label" translatable="yes">Find</property>
+        <property name="use_underline">True</property>
+        <property name="icon_name">edit-find</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/ui/photo.ui b/ui/photo.ui
index a4c587e..6b662a5 100644
--- a/ui/photo.ui
+++ b/ui/photo.ui
@@ -1,129 +1,408 @@
-<ui>
-
-    <menubar name="MenuBar">
-        <menu name="FileMenu" action="FileMenu">
-            <menuitem name="Import" action="CommonFileImport" />
-            <menuitem name="ImportExternal" action="ExternalLibraryImport" />
-            <menuitem name="Export" action="Export" />
-            <separator />
-            <placeholder name="PrintPlaceholder" />
-            <separator />
-            <placeholder name="PublishPlaceholder" />
-            <menuitem name="SendTo" action="SendTo" />
-            <placeholder name="SetBackgroundPlaceholder" />
-            <separator />
-            <menuitem name="JumpToFile" action="CommonJumpToFile" />
-            <separator />
-            <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
-            <separator />
-            <menuitem name="Quit" action="CommonQuit" />
-        </menu>
-        
-        <menu name="EditMenu" action="EditMenu">
-            <menuitem name="Undo" action="CommonUndo" />
-            <menuitem name="Redo" action="CommonRedo" />
-            <separator />
-            <menuitem name="NewSearch" action="CommonNewSearch" />
-            <separator />
-            <menuitem name="RemoveFromLibrary" action="RemoveFromLibrary" />
-            <menuitem name="MoveToTrash" action="MoveToTrash" />
-            <separator />
-            <menuitem name="Preferences" action="CommonPreferences" />
-        </menu>
-        
-        <menu name="ViewMenu" action="ViewMenu">
-            <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
-            <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
-            <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
-            <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
-            <separator />
-            <menuitem name="ViewRatings" action="ViewRatings" />
-            <separator />
-            <menu name="SortEvents" action="CommonSortEvents">
-                <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
-                <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
-            </menu>
-            <separator />
-            <menuitem name="IncreaseSize" action="IncreaseSize" />
-            <menuitem name="DecreaseSize" action="DecreaseSize" />
-            <separator />
-            <menuitem name="ZoomFit" action="ZoomFit" />
-            <menuitem name="Zoom100" action="Zoom100" />
-            <menuitem name="Zoom200" action="Zoom200" />
-            <separator />
-            <menuitem name="Fullscreen" action="CommonFullscreen" />
-            <separator />
-            <menuitem name="Slideshow" action="Slideshow" />
-        </menu>
-        
-        <menu name="PhotoMenu" action="PhotoMenu">
-            <menuitem name="PrevPhoto" action="PrevPhoto" />
-            <menuitem name="NextPhoto" action="NextPhoto" />
-            <separator />
-            <menuitem name="RotateClockwise" action="RotateClockwise" />
-            <menuitem name="RotateCounterclockwise" action="RotateCounterclockwise" />
-            <menuitem name="FlipHorizontally" action="FlipHorizontally" />
-            <menuitem name="FlipVertically" action="FlipVertically" />
-            <separator />
-            <menu name="Tools" action="Tools">
-                <menuitem name="Enhance" action="Enhance" />
-                <menuitem name="Crop" action="Crop" />
-                <menuitem name="Straighten" action="Straighten" />
-                <menuitem name="RedEye" action="RedEye" />
-                <menuitem name="Adjust" action="Adjust" />
-            </menu>
-            <menuitem name="Revert" action="Revert" />
-            <separator />
-            <menuitem name="CopyColorAdjustments" action="CopyColorAdjustments" />
-            <menuitem name="PasteColorAdjustments" action="PasteColorAdjustments" />
-            <separator/>
-            <menuitem name="Flag" action="Flag" />
-            <menu name="Rate" action="Rate">
-                <menuitem name="RateFive" action="RateFive" />
-                <menuitem name="RateFour" action="RateFour" />
-                <menuitem name="RateThree" action="RateThree" />
-                <menuitem name="RateTwo" action="RateTwo" />
-                <menuitem name="RateOne" action="RateOne" />
-                <menuitem name="RateUnrated" action="RateUnrated" />
-                <menuitem name="RateRejected" action="RateRejected" />
-                <separator />
-                <menuitem name="IncreaseRating" action="IncreaseRating" />
-                <menuitem name="DecreaseRating" action="DecreaseRating" />
-            </menu>
-            <separator />
-            <menuitem name="EditTitle" action="EditTitle" />
-            <menuitem name="EditComment" action="EditComment" />
-            <menuitem name="AdjustDateTime" action="AdjustDateTime" />
-            <separator />
-            <menu name="RawDeveloper" action="RawDeveloper">
-                <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
-                <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
-            </menu>
-            <separator />
-            <menuitem name="ExternalEdit" action="ExternalEdit" />
-            <menuitem name="ExternalEditRAW" action="ExternalEditRAW" />
-        </menu>
-
-        <menu name="TagsMenu" action="TagsMenu">
-            <menuitem name="AddTags" action="AddTags" />
-            <menuitem name="ModifyTags" action="ModifyTags" />
-        </menu>
-        
-        <menu name="HelpMenu" action="HelpMenu">
-            <menuitem name="Contents" action="CommonHelpContents" />
-            <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
-            <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
-            <separator />
-            <menuitem name="About" action="CommonAbout" />
-        </menu>
-    </menubar>
-
-    <popup name="PhotoContextMenu">
-        <placeholder name="ContextJumpPlaceholder">
-            <menuitem name="ContextJumpToEvent" action="CommonJumpToEvent" />
-            <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
-        </placeholder>
-    </popup>
-    
-</ui>
-
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+          <attribute name="accel">&lt;Primary&gt;i</attribute>
+          <attribute name="action">win.CommonFileImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import From _Application…</attribute>
+          <attribute name="action">win.ExternalLibraryImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Save _As…</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;e</attribute>
+          <attribute name="action">win.Export</attribute>
+        </item>
+      </section>
+      <section>
+      <attribute name="id">PrintPlaceholder</attribute>
+      </section>
+      <section>
+      <attribute name="id">PublishPlaceholder</attribute>
+        <item>
+          <attribute name="label" translatable="yes">Send _To…</attribute>
+          <attribute name="action">win.SendTo</attribute>
+        </item>
+      <attribute name="id">SetBackgroundPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+          <attribute name="action">win.CommonJumpToFile</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Empty T_rash</attribute>
+          <attribute name="action">win.CommonEmptyTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Undo</attribute>
+          <attribute name="accel">&lt;Primary&gt;z</attribute>
+          <attribute name="action">win.CommonUndo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Redo</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;z</attribute>
+          <attribute name="action">win.CommonRedo</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+          <attribute name="accel">&lt;Primary&gt;s</attribute>
+          <attribute name="action">win.CommonNewSearch</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">R_emove from Library</attribute>
+          <attribute name="accel">&lt;Shift&gt;Delete</attribute>
+          <attribute name="action">win.RemoveFromLibrary</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Move to Trash</attribute>
+          <attribute name="accel">Delete</attribute>
+          <attribute name="action">win.MoveToTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Preferences</attribute>
+          <attribute name="action">win.CommonPreferences</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Basic Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;i</attribute>
+          <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">E_xtended Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;x</attribute>
+          <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">S_idebar</attribute>
+          <attribute name="accel">F9</attribute>
+          <attribute name="action">win.CommonDisplaySidebar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">T_oolbar</attribute>
+          <attribute name="accel">&lt;Primary&gt;F9</attribute>
+          <attribute name="action">win.CommonDisplayToolbar</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Ratings</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;n</attribute>
+          <attribute name="action">win.ViewRatings</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Events</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Descending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _In</attribute>
+          <attribute name="accel">&lt;Primary&gt;plus</attribute>
+          <attribute name="action">win.IncreaseSize</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _Out</attribute>
+          <attribute name="accel">&lt;Primary&gt;minus</attribute>
+          <attribute name="action">win.DecreaseSize</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Fit to _Page</attribute>
+          <attribute name="accel">&lt;Primary&gt;0</attribute>
+          <attribute name="action">win.ZoomFit</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _100%</attribute>
+          <attribute name="accel">&lt;Primary&gt;1</attribute>
+          <attribute name="action">win.Zoom100</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _200%</attribute>
+          <attribute name="accel">&lt;Primary&gt;2</attribute>
+          <attribute name="action">win.Zoom200</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Fulls_creen</attribute>
+          <attribute name="accel">F11</attribute>
+          <attribute name="action">win.CommonFullscreen</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">S_lideshow</attribute>
+          <attribute name="accel">F5</attribute>
+          <attribute name="action">win.Slideshow</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Photo</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Previous Photo</attribute>
+          <attribute name="action">win.PrevPhoto</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Next Photo</attribute>
+          <attribute name="action">win.NextPhoto</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Rotate _Right</attribute>
+          <attribute name="accel">&lt;Primary&gt;r</attribute>
+          <attribute name="action">win.RotateClockwise</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Rotate _Left</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;r</attribute>
+          <attribute name="action">win.RotateCounterclockwise</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Flip Hori_zontally</attribute>
+          <attribute name="action">win.FlipHorizontally</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Flip Verti_cally</attribute>
+          <attribute name="action">win.FlipVertically</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">T_ools</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Enhance</attribute>
+              <attribute name="accel">&lt;Primary&gt;e</attribute>
+              <attribute name="action">win.Enhance</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Crop</attribute>
+              <attribute name="accel">&lt;Primary&gt;o</attribute>
+              <attribute name="action">win.Crop</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Straighten</attribute>
+              <attribute name="accel">&lt;Primary&gt;a</attribute>
+              <attribute name="action">win.Straighten</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Red-eye</attribute>
+              <attribute name="accel">&lt;Primary&gt;y</attribute>
+              <attribute name="action">win.RedEye</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Adjust</attribute>
+              <attribute name="accel">&lt;Primary&gt;d</attribute>
+              <attribute name="action">win.Adjust</attribute>
+            </item>
+          </section>
+        </submenu>
+        <item>
+          <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+          <attribute name="action">win.Revert</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Copy Color Adjustments</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;c</attribute>
+          <attribute name="action">win.CopyColorAdjustments</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Paste Color Adjustments</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;v</attribute>
+          <attribute name="action">win.PasteColorAdjustments</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+          <attribute name="accel">&lt;Primary&gt;g</attribute>
+          <attribute name="action">win.Flag</attribute>
+        </item>
+        <submenu>
+          <attribute name="label" translatable="yes">_Set Rating</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="accel">5</attribute>
+              <attribute name="action">win.RateFive</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="accel">4</attribute>
+              <attribute name="action">win.RateFour</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="accel">3</attribute>
+              <attribute name="action">win.RateThree</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="accel">2</attribute>
+              <attribute name="action">win.RateTwo</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="accel">1</attribute>
+              <attribute name="action">win.RateOne</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Unrated</attribute>
+              <attribute name="accel">0</attribute>
+              <attribute name="action">win.RateUnrated</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Rejected</attribute>
+              <attribute name="accel">9</attribute>
+              <attribute name="action">win.RateRejected</attribute>
+            </item>
+          </section>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Increase</attribute>
+              <attribute name="accel">greater</attribute>
+              <attribute name="action">win.IncreaseRating</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Decrease</attribute>
+              <attribute name="accel">less</attribute>
+              <attribute name="action">win.DecreaseRating</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Title…</attribute>
+          <attribute name="action">win.EditTitle</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+          <attribute name="action">win.EditComment</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Adjust Date and Time…</attribute>
+          <attribute name="action">win.AdjustDateTime</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Developer</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">Shotwell</attribute>
+              <attribute name="action">win.RawDeveloper</attribute>
+              <attribute name="target">Shotwell</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Camera</attribute>
+              <attribute name="action">win.RawDeveloper</attribute>
+              <attribute name="target">Camera</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Open with E_xternal Editor</attribute>
+          <attribute name="accel">&lt;Primary&gt;Return</attribute>
+          <attribute name="action">win.ExternalEdit</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Open With RA_W Editor</attribute>
+          <attribute name="action">win.ExternalEditRAW</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Ta_gs</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Add _Tags…</attribute>
+          <attribute name="accel">&lt;Primary&gt;t</attribute>
+          <attribute name="action">win.AddTags</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+          <attribute name="accel">&lt;Primary&gt;m</attribute>
+          <attribute name="action">win.ModifyTags</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+</interface>
diff --git a/ui/photo_context.ui b/ui/photo_context.ui
index f897022..10dcd3d 100644
--- a/ui/photo_context.ui
+++ b/ui/photo_context.ui
@@ -1,39 +1,145 @@
-<ui>
-    <popup name="PhotoContextMenu">
-        <menuitem name="ContextEnhance" action="Enhance" />
-        <menuitem name="ContextRevert" action="Revert" />
-        <separator />
-        <menuitem name="ContextAddTags" action="AddTagsContextMenu" />
-        <menuitem name="ContextModifyTags" action="ModifyTags" />
-        <placeholder name="ContextTagsPlaceholder" />
-        <separator />
-        <menuitem name="ContextFlag" action="Flag" />
-        <menu name="Rate" action="Rate">
-            <menuitem name="RateFive" action="RateFive" />
-            <menuitem name="RateFour" action="RateFour" />
-            <menuitem name="RateThree" action="RateThree" />
-            <menuitem name="RateTwo" action="RateTwo" />
-            <menuitem name="RateOne" action="RateOne" />
-            <menuitem name="RateUnrated" action="RateUnrated" />
-            <menuitem name="RateRejected" action="RateRejected" />
-            <separator />
-            <menuitem name="IncreaseRating" action="IncreaseRating" />
-            <menuitem name="DecreaseRating" action="DecreaseRating" />
-        </menu>
-        <menu name="RawDeveloper" action="RawDeveloper">
-            <menuitem name="RawDeveloperShotwell" action="RawDeveloperShotwell" />
-            <menuitem name="RawDeveloperCamera" action="RawDeveloperCamera" />
-        </menu>
-        <separator />
-        <menuitem name="ContextEditTitle" action="EditTitle" />
-        <menuitem name="ContextEditComment" action="EditComment" />
-        <menuitem name="ContextExternalEdit" action="ExternalEdit" />
-        <menuitem name="ContextExternalEditRAW" action="ExternalEditRAW" />
-        <separator />
-        <placeholder name="ContextJumpPlaceholder" />
-        <menuitem name="ContextSendTo" action="SendToContextMenu" />
-        <separator />
-        <menuitem name="ContextMoveToTrash" action="MoveToTrash" />
-    </popup>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="PhotoContextMenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Enhance</attribute>
+        <attribute name="accel">&lt;Primary&gt;e</attribute>
+        <attribute name="action">win.Enhance</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Re_vert to Original</attribute>
+        <attribute name="action">win.Revert</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Add Tags…</attribute>
+        <attribute name="accel">&lt;Primary&gt;a</attribute>
+        <attribute name="action">win.AddTags</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+        <attribute name="accel">&lt;Primary&gt;m</attribute>
+        <attribute name="action">win.ModifyTags</attribute>
+      </item>
+      <attribute name="id">ContextTagsPlaceholder</attribute>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+        <attribute name="accel">&lt;Primary&gt;g</attribute>
+        <attribute name="action">win.Flag</attribute>
+      </item>
+      <submenu>
+        <attribute name="label" translatable="yes">_Set Rating</attribute>
+        <section>
+          <item>
+            <attribute name="label" translatable="no">★★★★★</attribute>
+            <attribute name="accel">5</attribute>
+            <attribute name="action">win.RateFive</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="no">★★★★</attribute>
+            <attribute name="accel">4</attribute>
+            <attribute name="action">win.RateFour</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="no">★★★</attribute>
+            <attribute name="accel">3</attribute>
+            <attribute name="action">win.RateThree</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="no">★★</attribute>
+            <attribute name="accel">2</attribute>
+            <attribute name="action">win.RateTwo</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="no">★</attribute>
+            <attribute name="accel">1</attribute>
+            <attribute name="action">win.RateOne</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="yes">_Unrated</attribute>
+            <attribute name="accel">0</attribute>
+            <attribute name="action">win.RateUnrated</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="yes">_Rejected</attribute>
+            <attribute name="accel">9</attribute>
+            <attribute name="action">win.RateRejected</attribute>
+          </item>
+        </section>
+        <section>
+          <item>
+            <attribute name="label" translatable="yes">_Increase</attribute>
+            <attribute name="accel">greater</attribute>
+            <attribute name="action">win.IncreaseRating</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="yes">_Decrease</attribute>
+            <attribute name="accel">less</attribute>
+            <attribute name="action">win.DecreaseRating</attribute>
+          </item>
+        </section>
+      </submenu>
 
-</ui>
+      <submenu>
+        <attribute name="label" translatable="yes">_Developer</attribute>
+        <section>
+          <item>
+            <attribute name="label" translatable="yes">Shotwell</attribute>
+            <attribute name="action">win.RawDeveloper</attribute>
+            <attribute name="target">Shotwell</attribute>
+          </item>
+          <item>
+            <attribute name="label" translatable="yes">Camera</attribute>
+            <attribute name="action">win.RawDeveloper</attribute>
+            <attribute name="target">Camera</attribute>
+          </item>
+        </section>
+      </submenu>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Edit _Title…</attribute>
+        <attribute name="action">win.EditTitle</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+        <attribute name="action">win.EditComment</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Open with E_xternal Editor</attribute>
+        <attribute name="accel">&lt;Primary&gt;Return</attribute>
+        <attribute name="action">win.ExternalEdit</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Open With RA_W Editor</attribute>
+        <attribute name="action">win.ExternalEditRAW</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+        <attribute name="action">win.CommonJumpToEvent</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+        <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+        <attribute name="action">win.CommonJumpToFile</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Send T_o…</attribute>
+        <attribute name="action">win.SendTo</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Move to Trash</attribute>
+        <attribute name="accel">Delete</attribute>
+        <attribute name="action">win.MoveToTrash</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/ui/savedsearch.ui b/ui/savedsearch.ui
index 4217cbc..fe0010e 100644
--- a/ui/savedsearch.ui
+++ b/ui/savedsearch.ui
@@ -1,8 +1,22 @@
-<ui>
-    <popup name="SearchContextMenu">
-        <menuitem name="ContextRenameSearch" action="RenameSearch" />
-        <menuitem name="ContextEditSearch" action="EditSearch" />
-        <menuitem name="ContextDeleteSearch" action="DeleteSearch" />
-    </popup>
-
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="SearchContextMenu">
+    <submenu>
+      <attribute name="label" translatable="yes">SearchContextMenu</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Re_name…</attribute>
+          <attribute name="action">win.RenameSearch</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Edit…</attribute>
+          <attribute name="action">win.EditSearch</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Delete</attribute>
+          <attribute name="action">win.DeleteSearch</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+</interface>
diff --git a/ui/search_bar.ui b/ui/search_bar.ui
index 957c8b3..9d56962 100644
--- a/ui/search_bar.ui
+++ b/ui/search_bar.ui
@@ -1,12 +1,55 @@
-<ui>
-    <popup name="FilterPopupMenu" action="CommonFilterPhotos">
-        <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
-        <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
-        <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
-        <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
-        <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
-        <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
-        <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
-        <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
-    </popup>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="shotwell">
+  <menu id='popup-menu'>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Rejected _Only</attribute>
+        <attribute name="action">win.display.rating</attribute>
+        <attribute name="target">8</attribute>
+        <attribute name="accel">&lt;Primary&gt;8</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">All + _Rejected</attribute>
+        <attribute name="action">win.display.rating</attribute>
+        <attribute name="target">1</attribute>
+        <attribute name="accel">&lt;Primary&gt;9</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_All Photos</attribute>
+        <attribute name="action">win.display.rating</attribute>
+        <attribute name="target">2</attribute>
+        <attribute name="accel">&lt;Primary&gt;0</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="no">★</attribute>
+        <attribute name="action">win.display.rating</attribute>
+        <attribute name="target">3</attribute>
+        <attribute name="accel">&lt;Primary&gt;1</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="no">★★</attribute>
+        <attribute name="action">win.display.rating</attribute>
+        <attribute name="target">4</attribute>
+        <attribute name="accel">&lt;Primary&gt;2</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="no">★★★</attribute>
+        <attribute name="action">win.display.rating</attribute>
+        <attribute name="target">5</attribute>
+        <attribute name="accel">&lt;Primary&gt;3</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="no">★★★★</attribute>
+        <attribute name="action">win.display.rating</attribute>
+        <attribute name="target">6</attribute>
+        <attribute name="accel">&lt;Primary&gt;4</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="no">★★★★★</attribute>
+        <attribute name="action">win.display.rating</attribute>
+        <attribute name="target">7</attribute>
+        <attribute name="accel">&lt;Primary&gt;5</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/ui/search_sidebar_context.ui b/ui/search_sidebar_context.ui
index 9db976e..a925800 100644
--- a/ui/search_sidebar_context.ui
+++ b/ui/search_sidebar_context.ui
@@ -1,6 +1,12 @@
-<ui>
-    <popup name="SidebarSearchContextMenu">
-        <menuitem name="NewSearch" action="CommonNewSearch" />
-    </popup>
-</ui>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="shotwell">
+  <menu id='popup-menu'>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+        <attribute name="action">win.CommonNewSearch</attribute>
+        <attribute name="accel">&lt;Primary&gt;s</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/ui/set_background_dialog.ui b/ui/set_background_dialog.ui
index f857693..ee7106f 100644
--- a/ui/set_background_dialog.ui
+++ b/ui/set_background_dialog.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.18.2 -->
-<interface>
-  <requires lib="gtk+" version="3.0"/>
+<!-- Generated with glade 3.20.0 -->
+<interface domain="shotwell">
+  <requires lib="gtk+" version="3.14"/>
   <object class="GtkAdjustment" id="adjustment1">
     <property name="upper">100</property>
     <property name="step_increment">10</property>
@@ -78,8 +78,7 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">False</property>
-                <property name="xalign">0</property>
-                <property name="yalign">0.5899999737739563</property>
+                <property name="halign">start</property>
                 <property name="draw_indicator">True</property>
               </object>
               <packing>
@@ -94,7 +93,7 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">False</property>
-                <property name="xalign">0</property>
+                <property name="halign">start</property>
                 <property name="draw_indicator">True</property>
               </object>
               <packing>
diff --git a/ui/sidebar_default_context.ui b/ui/sidebar_default_context.ui
index 2e5ed87..644d8c7 100644
--- a/ui/sidebar_default_context.ui
+++ b/ui/sidebar_default_context.ui
@@ -1,7 +1,17 @@
-<ui>
-    <popup name="SidebarDefaultContextMenu">
-        <menuitem name="NewSearch" action="CommonNewSearch" />
-        <menuitem name="NewTag" action="CommonNewTag" />
-    </popup>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="shotwell">
+  <menu id='popup-menu'>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+        <attribute name="action">win.CommonNewSearch</attribute>
+        <attribute name="accel">&lt;Primary&gt;s</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">New _Tag…</attribute>
+        <attribute name="action">win.CommonNewTag</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
 
diff --git a/ui/tag_sidebar_context.ui b/ui/tag_sidebar_context.ui
index 4a3d049..96b0f1e 100644
--- a/ui/tag_sidebar_context.ui
+++ b/ui/tag_sidebar_context.ui
@@ -1,6 +1,11 @@
-<ui>
-    <popup name="SidebarTagContextMenu">
-        <menuitem name="NewTag" action="CommonNewTag" />
-    </popup>
-</ui>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="shotwell">
+  <menu id='popup-menu'>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">New _Tag…</attribute>
+        <attribute name="action">win.CommonNewTag</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/ui/tags.ui b/ui/tags.ui
index d0373d6..c693e7f 100644
--- a/ui/tags.ui
+++ b/ui/tags.ui
@@ -1,25 +1,447 @@
-<ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+          <attribute name="accel">&lt;Primary&gt;i</attribute>
+          <attribute name="action">win.CommonFileImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import From _Application…</attribute>
+          <attribute name="action">win.ExternalLibraryImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Save _As…</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;e</attribute>
+          <attribute name="action">win.Export</attribute>
+        </item>
+      </section>
+      <section>
+        <attribute name="id">FileExtrasPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+          <attribute name="action">win.CommonJumpToFile</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Empty T_rash</attribute>
+          <attribute name="action">win.CommonEmptyTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Undo</attribute>
+          <attribute name="accel">&lt;Primary&gt;z</attribute>
+          <attribute name="action">win.CommonUndo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Redo</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;z</attribute>
+          <attribute name="action">win.CommonRedo</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Find</attribute>
+          <attribute name="action">win.CommonFind</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+          <attribute name="accel">&lt;Primary&gt;s</attribute>
+          <attribute name="action">win.CommonNewSearch</attribute>
+        </item>
+      </section>
+      <section>
+        <attribute name="id">EditExtrasPlaceholder</attribute>
+        <item>
+          <attribute name="label" translatable="yes">R_emove from Library</attribute>
+          <attribute name="accel">&lt;Shift&gt;Delete</attribute>
+          <attribute name="action">win.RemoveFromLibrary</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Move to Trash</attribute>
+          <attribute name="accel">Delete</attribute>
+          <attribute name="action">win.MoveToTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Select _All</attribute>
+          <attribute name="accel">&lt;Primary&gt;a</attribute>
+          <attribute name="action">win.CommonSelectAll</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Preferences</attribute>
+          <attribute name="action">win.CommonPreferences</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Basic Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;i</attribute>
+          <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">E_xtended Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;x</attribute>
+          <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Search Bar</attribute>
+          <attribute name="accel">F8</attribute>
+          <attribute name="action">win.CommonDisplaySearchbar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">S_idebar</attribute>
+          <attribute name="accel">F9</attribute>
+          <attribute name="action">win.CommonDisplaySidebar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">T_oolbar</attribute>
+          <attribute name="accel">&lt;Primary&gt;F9</attribute>
+          <attribute name="action">win.CommonDisplayToolbar</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Titles</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;t</attribute>
+          <attribute name="action">win.ViewTitle</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Comments</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;c</attribute>
+          <attribute name="action">win.ViewComment</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Ta_gs</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;g</attribute>
+          <attribute name="action">win.ViewTags</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Ratings</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;n</attribute>
+          <attribute name="action">win.ViewRatings</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Filter Photos</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">7</attribute>
+              <attribute name="accel">&lt;Primary&gt;5</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">6</attribute>
+              <attribute name="accel">&lt;Primary&gt;4</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">5</attribute>
+              <attribute name="accel">&lt;Primary&gt;3</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">4</attribute>
+              <attribute name="accel">&lt;Primary&gt;2</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">3</attribute>
+              <attribute name="accel">&lt;Primary&gt;1</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_All Photos</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">2</attribute>
+              <attribute name="accel">&lt;Primary&gt;0</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">All + _Rejected</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">1</attribute>
+              <attribute name="accel">&lt;Primary&gt;9</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Rejected _Only</attribute>
+              <attribute name="action">win.display.rating</attribute>
+              <attribute name="target">8</attribute>
+              <attribute name="accel">&lt;Primary&gt;8</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Photos</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">By _Title</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">1</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">By _Filename</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">4</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">By Exposure _Date</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">2</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">By _Rating</attribute>
+              <attribute name="action">win.SortBy</attribute>
+              <attribute name="target">3</attribute>
+            </item>
+          </section>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.Sort</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">D_escending</attribute>
+              <attribute name="action">win.Sort</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Events</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Descending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _In</attribute>
+          <attribute name="accel">&lt;Primary&gt;plus</attribute>
+          <attribute name="action">win.IncreaseSize</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Zoom _Out</attribute>
+          <attribute name="accel">&lt;Primary&gt;minus</attribute>
+          <attribute name="action">win.DecreaseSize</attribute>
+        </item>
+      </section>
+      <section>
+      <attribute name="id">ViewExtrasFullscreenSlideshowPlaceholder</attribute>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Photos</attribute>
+      <section>
+      <attribute name="id">PhotosExtrasEditsPlaceholder</attribute>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Toggle _Flag</attribute>
+          <attribute name="accel">&lt;Primary&gt;g</attribute>
+          <attribute name="action">win.Flag</attribute>
+        </item>
+        <submenu>
+          <attribute name="label" translatable="yes">_Set Rating</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="accel">5</attribute>
+              <attribute name="action">win.RateFive</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="accel">4</attribute>
+              <attribute name="action">win.RateFour</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="accel">3</attribute>
+              <attribute name="action">win.RateThree</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="accel">2</attribute>
+              <attribute name="action">win.RateTwo</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="accel">1</attribute>
+              <attribute name="action">win.RateOne</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Unrated</attribute>
+              <attribute name="accel">0</attribute>
+              <attribute name="action">win.RateUnrated</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Rejected</attribute>
+              <attribute name="accel">9</attribute>
+              <attribute name="action">win.RateRejected</attribute>
+            </item>
+          </section>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Increase</attribute>
+              <attribute name="accel">greater</attribute>
+              <attribute name="action">win.IncreaseRating</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_Decrease</attribute>
+              <attribute name="accel">less</attribute>
+              <attribute name="action">win.DecreaseRating</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Title…</attribute>
+          <attribute name="action">win.EditTitle</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Edit _Comment…</attribute>
+          <attribute name="action">win.EditComment</attribute>
+        </item>
+      <attribute name="id">PhotosExtrasDateTimePlaceholder</attribute>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Developer</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">Shotwell</attribute>
+              <attribute name="action">win.RawDeveloper</attribute>
+              <attribute name="target">Shotwell</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Camera</attribute>
+              <attribute name="action">win.RawDeveloper</attribute>
+              <attribute name="action">Camera</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+      <attribute name="id">PhotosExtrasExternalsPlaceholder</attribute>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Even_ts</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_New Event</attribute>
+          <attribute name="accel">&lt;Primary&gt;n</attribute>
+          <attribute name="action">win.NewEvent</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">View Eve_nt for Photo</attribute>
+          <attribute name="action">win.CommonJumpToEvent</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Ta_gs</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Add _Tags…</attribute>
+          <attribute name="accel">&lt;Primary&gt;t</attribute>
+          <attribute name="action">win.AddTags</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Modif_y Tags…</attribute>
+          <attribute name="accel">&lt;Primary&gt;m</attribute>
+          <attribute name="action">win.ModifyTags</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="id">RemoveTagFromPhotos</attribute>
+          <attribute name="label" translatable="yes"></attribute>
+          <attribute name="action">win.RemoveTagFromPhotos</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="id">RenameTag</attribute>
+          <attribute name="label" translatable="yes"></attribute>
+          <attribute name="action">win.RenameTag</attribute>
+        </item>
+        <item>
+          <attribute name="id">DeleteTag</attribute>
+          <attribute name="label" translatable="yes"></attribute>
+          <attribute name="action">win.DeleteTag</attribute>
+        </item>
+      </section>
+    </submenu>
+    <!-- Faces menu goes here FacesMenuPlaceholder -->
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
 
-    <menubar name="MenuBar">
-        <menu name="TagsMenu" action="TagsMenu">
-            <menuitem name="RemoveTagFromPhotos" action="RemoveTagFromPhotos" />
-            <separator />
-            <menuitem name="RenameTag" action="RenameTag" />
-            <menuitem name="DeleteTag" action="DeleteTag" />
-        </menu>
-    </menubar>
-    
-    <popup name="CollectionContextMenu">
-        <placeholder name="ContextTagsPlaceholder">
-            <menuitem name="ContextRemoveTagFromPhotos" action="RemoveTagFromPhotos" />
-        </placeholder>
-    </popup>
-    
-    <popup name="TagsContextMenu">
-        <menuitem name="ContextNewChildTag" action="NewChildTagSidebar" />
-        <separator />
-        <menuitem name="ContextDeleteTag" action="RenameTagSidebar" />
-        <menuitem name="ContextRenameTag" action="DeleteTagSidebar" />
-    </popup>
-
-</ui>
+  <menu id="TagsContextMenu">
+  </menu>
+</interface>
diff --git a/ui/top.ui b/ui/top.ui
index 81d1006..683a2fa 100644
--- a/ui/top.ui
+++ b/ui/top.ui
@@ -1,12 +1,45 @@
-<ui>
-    <menubar name="MenuBar">
-        <menu name="FileMenu" action="FileMenu" />
-        <menu name="EditMenu" action="EditMenu" />  
-        <menu name="ViewMenu" action="ViewMenu" />
-        <menu name="PhotoMenu" action="PhotoMenu" />
-        <menu name="PhotosMenu" action="PhotosMenu" />
-        <menu name="EventsMenu" action="EventsMenu" />
-        <menu name="TagsMenu" action="TagsMenu" />
-        <menu name="HelpMenu" action="HelpMenu" />
-    </menubar>
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Photo</attribute>
+      <section>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Photos</attribute>
+      <section>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Even_ts</attribute>
+      <section>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">Ta_gs</attribute>
+      <section>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+      </section>
+    </submenu>
+  </menu>
+</interface>
diff --git a/ui/trash.ui b/ui/trash.ui
index 9a464bb..2e68df8 100644
--- a/ui/trash.ui
+++ b/ui/trash.ui
@@ -1,83 +1,322 @@
-<ui>
-
-    <menubar name="MenuBar">
-        <menu name="FileMenu" action="FileMenu">
-            <menuitem name="Import" action="CommonFileImport" />
-            <menuitem name="ImportExternal" action="ExternalLibraryImport" />
-            <separator />
-            <menuitem name="JumpToFile" action="CommonJumpToFile" />
-            <menuitem name="EmptyTrash" action="CommonEmptyTrash" />
-            <separator />
-            <menuitem name="Quit" action="CommonQuit" />
-        </menu>
-        
-        <menu name="EditMenu" action="EditMenu">
-            <menuitem name="Undo" action="CommonUndo" />
-            <menuitem name="Redo" action="CommonRedo" />
-            <separator />
-            <menuitem name="Find" action="CommonFind" />
-            <menuitem name="NewSearch" action="CommonNewSearch" />
-            <separator />
-            <menuitem name="Delete" action="Delete" />
-            <menuitem name="Restore" action="Restore" />
-            <separator />
-            <menuitem name="SelectAll" action="CommonSelectAll" />
-            <separator />
-            <menuitem name="Preferences" action="CommonPreferences" />
-        </menu>
-        
-        <menu name="ViewMenu" action="ViewMenu">
-            <menuitem name="DisplayBasicProperties" action="CommonDisplayBasicProperties" />
-            <menuitem name="DisplayExtendedProperties" action="CommonDisplayExtendedProperties" />
-            <menuitem name="DisplaySearchbar" action="CommonDisplaySearchbar" />
-            <menuitem name="DisplaySidebar" action="CommonDisplaySidebar" />
-            <menuitem name="DisplayToolbar" action="CommonDisplayToolbar" />
-            <separator />
-            <menu name="FilterPhotos" action="CommonFilterPhotos">
-                <menuitem name="DisplayFiveOrHigher" action="CommonDisplayFiveOrHigher" />
-                <menuitem name="DisplayFourOrHigher" action="CommonDisplayFourOrHigher" />
-                <menuitem name="DisplayThreeOrHigher" action="CommonDisplayThreeOrHigher" />
-                <menuitem name="DisplayTwoOrHigher" action="CommonDisplayTwoOrHigher" />
-                <menuitem name="DisplayOneOrHigher" action="CommonDisplayOneOrHigher" />
-                <menuitem name="DisplayUnratedOrHigher" action="CommonDisplayUnratedOrHigher" />
-                <menuitem name="DisplayRejectedOrHigher" action="CommonDisplayRejectedOrHigher" />
-                <menuitem name="DisplayRejectedOnly" action="CommonDisplayRejectedOnly" />
-            </menu>
-            <separator />
-            <menu name="SortEvents" action="CommonSortEvents">
-                <menuitem name="SortEventsAscending" action="CommonSortEventsAscending" />
-                <menuitem name="SortEventsDescending" action="CommonSortEventsDescending" />
-            </menu>
-        </menu>
-        
-        <menu name="HelpMenu" action="HelpMenu">
-            <menuitem name="Contents" action="CommonHelpContents" />
-            <menuitem name="Frequently Asked Questions" action="CommonHelpFAQ" />
-            <menuitem name="Report a Problem…" action="CommonHelpReportProblem" />
-            <separator />
-            <menuitem name="About" action="CommonAbout" />
-        </menu>
-    </menubar>
-    
-    <popup name="TrashContextMenu">
-        <menuitem name="ContextDelete" action="Delete" />
-        <menuitem name="ContextRestore" action="Restore" />
-        <separator />
-        <menuitem name="ContextJumpToFile" action="CommonJumpToFile" />
-        <separator />
-        <menuitem name="ContextEmptyTrash" action="CommonEmptyTrash" />
-    </popup>
-    
-    <popup name="TrashPageMenu">
-        <menuitem name="ContextEmptyTrash" action="CommonEmptyTrash" />
-    </popup>
-    
-    <toolbar name="TrashToolbar">
-        <toolitem name="ToolDelete" action="Delete" />
-        <toolitem name="ToolRestore" action="Restore" />
-        <toolitem name="ToolEmptyTrash" action="CommonEmptyTrash" />
-        <separator />
-        <toolitem name="ToolFind" action="CommonDisplaySearchbar" />
-    </toolbar>
-    
-</ui>
+<?xml version="1.0"?>
+<interface domain="shotwell">
+  <menu id="MenuBar">
+    <submenu>
+      <attribute name="label" translatable="yes">_File</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Import from Folder…</attribute>
+          <attribute name="accel">&lt;Primary&gt;i</attribute>
+          <attribute name="action">win.CommonFileImport</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Import From _Application…</attribute>
+          <attribute name="action">win.ExternalLibraryImport</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+          <attribute name="action">win.CommonJumpToFile</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Empty T_rash</attribute>
+          <attribute name="action">win.CommonEmptyTrash</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Quit</attribute>
+          <attribute name="accel">&lt;Primary&gt;q</attribute>
+          <attribute name="action">win.CommonQuit</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Edit</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Undo</attribute>
+          <attribute name="accel">&lt;Primary&gt;z</attribute>
+          <attribute name="action">win.CommonUndo</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Redo</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;z</attribute>
+          <attribute name="action">win.CommonRedo</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Find</attribute>
+          <attribute name="action">win.CommonFind</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">Ne_w Saved Search…</attribute>
+          <attribute name="accel">&lt;Primary&gt;s</attribute>
+          <attribute name="action">win.CommonNewSearch</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Delete</attribute>
+          <attribute name="accel">Delete</attribute>
+          <attribute name="action">win.Delete</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Restore</attribute>
+          <attribute name="action">win.Restore</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">Select _All</attribute>
+          <attribute name="accel">&lt;Primary&gt;a</attribute>
+          <attribute name="action">win.CommonSelectAll</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Preferences</attribute>
+          <attribute name="action">win.CommonPreferences</attribute>
+        </item>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_View</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Basic Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;i</attribute>
+          <attribute name="action">win.CommonDisplayBasicProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">E_xtended Information</attribute>
+          <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;x</attribute>
+          <attribute name="action">win.CommonDisplayExtendedProperties</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Search Bar</attribute>
+          <attribute name="accel">F8</attribute>
+          <attribute name="action">win.CommonDisplaySearchbar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">S_idebar</attribute>
+          <attribute name="accel">F9</attribute>
+          <attribute name="action">win.CommonDisplaySidebar</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">T_oolbar</attribute>
+          <attribute name="accel">&lt;Primary&gt;F9</attribute>
+          <attribute name="action">win.CommonDisplayToolbar</attribute>
+        </item>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">_Filter Photos</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="no">★★★★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">7</attribute>
+              <attribute name="accel">&lt;Primary&gt;5</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">6</attribute>
+              <attribute name="accel">&lt;Primary&gt;4</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">5</attribute>
+              <attribute name="accel">&lt;Primary&gt;3</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">4</attribute>
+              <attribute name="accel">&lt;Primary&gt;2</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="no">★</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">3</attribute>
+              <attribute name="accel">&lt;Primary&gt;1</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">_All Photos</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">2</attribute>
+              <attribute name="accel">&lt;Primary&gt;0</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">All + _Rejected</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">1</attribute>
+              <attribute name="accel">&lt;Primary&gt;9</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">Rejected _Only</attribute>
+              <attribute name="action">filterbar.display.rating</attribute>
+              <attribute name="target">8</attribute>
+              <attribute name="accel">&lt;Primary&gt;8</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+      <section>
+        <submenu>
+          <attribute name="label" translatable="yes">Sort _Events</attribute>
+          <section>
+            <item>
+              <attribute name="label" translatable="yes">_Ascending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">ascending</attribute>
+            </item>
+            <item>
+              <attribute name="label" translatable="yes">D_escending</attribute>
+              <attribute name="action">win.CommonSortEvents</attribute>
+              <attribute name="target">descending</attribute>
+            </item>
+          </section>
+        </submenu>
+      </section>
+    </submenu>
+    <submenu>
+      <attribute name="label" translatable="yes">_Help</attribute>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_Help</attribute>
+          <attribute name="accel">F1</attribute>
+          <attribute name="action">win.CommonHelpContents</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Frequently Asked Questions</attribute>
+          <attribute name="action">win.CommonHelpFAQ</attribute>
+        </item>
+        <item>
+          <attribute name="label" translatable="yes">_Report a Problem…</attribute>
+          <attribute name="action">win.CommonHelpReportProblem</attribute>
+        </item>
+      </section>
+      <section>
+        <item>
+          <attribute name="label" translatable="yes">_About</attribute>
+          <attribute name="action">win.CommonAbout</attribute>
+        </item>
+      </section>
+    </submenu>
+  </menu>
+  <menu id="TrashContextMenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Delete</attribute>
+        <attribute name="accel">Delete</attribute>
+        <attribute name="action">win.Delete</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_Restore</attribute>
+        <attribute name="action">win.Restore</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Show in File Mana_ger</attribute>
+        <attribute name="accel">&lt;Primary&gt;&lt;Shift&gt;m</attribute>
+        <attribute name="action">win.CommonJumpToFile</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Empty T_rash</attribute>
+        <attribute name="action">win.CommonEmptyTrash</attribute>
+      </item>
+    </section>
+  </menu>
+  <menu id="TrashPageMenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Empty T_rash</attribute>
+        <attribute name="action">win.CommonEmptyTrash</attribute>
+      </item>
+    </section>
+  </menu>
+  <object class="GtkToolbar" id="TrashToolbar">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="toolbar_style">both-horiz</property>
+    <child>
+      <object class="GtkToolButton" id="ToolDelete">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Remove the selected photos from the trash</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.Delete</property>
+        <property name="label" translatable="yes">_Delete</property>
+        <property name="use_underline">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="ToolRestore">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Move the selected photos back into the 
library</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.Restore</property>
+        <property name="label" translatable="yes">_Restore</property>
+        <property name="use_underline">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="ToolEmptyTrash">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Delete all photos in the trash</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.CommonEmptyTrash</property>
+        <property name="label" translatable="yes">Empty Trash</property>
+        <property name="use_underline">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkSeparatorToolItem">
+        <property name="can_focus">False</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">False</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="ToolFind">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Find an image by typing text that appears in its 
name or tags</property>
+        <property name="is_important">True</property>
+        <property name="action_name">win.CommonDisplaySearchbar</property>
+        <property name="label" translatable="yes">Find</property>
+        <property name="use_underline">True</property>
+        <property name="icon_name">edit-find</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+  </object>
+</interface>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]