[shotwell/wip/gtk4: 1/3] vala compiles




commit a31cc9c1781315dcdbcd33db364de98adb726aa8
Author: Jens Georg <mail jensge org>
Date:   Sun Apr 3 18:20:18 2022 +0200

    vala compiles

 data/ui/login_welcome_pane_widget.ui        |  40 +----
 data/ui/preferences_dialog.ui               |   8 +-
 data/ui/printing_widget.ui                  |   6 +-
 meson.build                                 |   9 +-
 plugins/shotwell-transitions/meson.build    |   2 +-
 src/.unitize/_DataImportsInternals.vala     |   4 +-
 src/.unitize/_EditingToolsInternals.vala    |   4 +-
 src/.unitize/_SidebarInternals.vala         |   4 +-
 src/AppWindow.vala                          | 112 ++++++++------
 src/CheckerboardLayout.vala                 |  45 +++---
 src/CheckerboardPage.vala                   |  57 ++++---
 src/CollectionPage.vala                     |  28 ++--
 src/Commands.vala                           |   5 +-
 src/Dialogs.vala                            |  64 ++++----
 src/Dimensions.vala                         |   4 +-
 src/MediaPage.vala                          |  44 +++---
 src/MetadataWriter.vala                     |   2 +-
 src/Page.vala                               |  70 +++++----
 src/Photo.vala                              |  24 ++-
 src/PhotoPage.vala                          | 221 +++++++++++++++-------------
 src/Portal.vala                             |   3 +
 src/Printing.vala                           |  24 ++-
 src/Properties.vala                         |  13 +-
 src/Resources.vala                          |  21 ++-
 src/SearchFilter.vala                       | 164 ++++++++++-----------
 src/SinglePhotoPage.vala                    |  29 ++--
 src/SlideshowPage.vala                      |  31 ++--
 src/camera/Camera.vala                      |   4 +-
 src/camera/ImportPage.vala                  |  49 ++----
 src/dialogs/AdjustDateTimeDialog.vala       |  66 +++++----
 src/dialogs/EntryMultiCompletion.vala       |   3 +-
 src/dialogs/ExportDialog.vala               |  11 +-
 src/dialogs/MultiTextEntryDialog.vala       |   7 +-
 src/dialogs/Preferences.vala                |  26 ++--
 src/dialogs/ProgressDialog.vala             |  23 ++-
 src/dialogs/SetBackground.vala              |   4 +-
 src/dialogs/SetBackgroundSlideshow.vala     |   4 +-
 src/dialogs/TextEntry.vala                  |   6 +-
 src/dialogs/WelcomeDialog.vala              |  42 +++---
 src/direct/DirectPhotoPage.vala             |  37 +++--
 src/direct/DirectWindow.vala                |  16 +-
 src/events/EventPage.vala                   |   2 +
 src/events/Events.vala                      |   4 +-
 src/events/EventsDirectoryPage.vala         |   8 +-
 src/library/FlaggedSidebarEntry.vala        |   3 +
 src/library/ImportQueuePage.vala            |  18 +--
 src/library/Library.vala                    |   4 +-
 src/library/LibraryWindow.vala              | 164 +++++++++++++--------
 src/library/TrashSidebarEntry.vala          |   2 +
 src/main.vala                               |  12 +-
 src/meson.build                             |  39 +----
 src/plugins/ManifestWidget.vala             |  30 ++--
 src/publishing/PublishingPluginHost.vala    |   3 +-
 src/publishing/PublishingUI.vala            |  32 ++--
 src/publishing/StaticMessagePaneWidget.vala |   2 +-
 src/searches/SavedSearchDialog.vala         |  77 +++++-----
 src/searches/Searches.vala                  |   4 +-
 src/sidebar/Entry.vala                      |   2 +
 src/sidebar/Tree.vala                       |   2 +-
 src/tags/Tags.vala                          |   4 +-
 src/util/KeyValueMap.vala                   |  10 +-
 src/util/image.vala                         |  12 +-
 src/util/misc.vala                          |   8 +-
 src/util/system.vala                        |   2 +-
 src/util/ui.vala                            |   9 +-
 src/video-support/Video.vala                |   4 +
 66 files changed, 927 insertions(+), 866 deletions(-)
---
diff --git a/data/ui/login_welcome_pane_widget.ui b/data/ui/login_welcome_pane_widget.ui
index 82698f47..14c0a42e 100644
--- a/data/ui/login_welcome_pane_widget.ui
+++ b/data/ui/login_welcome_pane_widget.ui
@@ -1,10 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.0 -->
 <interface domain="shotwell">
-  <requires lib="gtk+" version="3.18"/>
+  <requires lib="gtk" version="4.0"/>
   <template class="PublishingUILoginWelcomePane" parent="GtkBox">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
     <property name="margin_start">18</property>
     <property name="margin_end">18</property>
     <property name="margin_top">18</property>
@@ -12,46 +9,23 @@
     <property name="orientation">vertical</property>
     <child type="center">
       <object class="GtkLabel" id="not_logged_in_label">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="label" comments="This is a placeholder string and may be ignored.">This is populated 
from within the code;
 changes made here will not display.</property>
-        <property name="wrap">True</property>
+        <property name="wrap">1</property>
         <property name="max_width_chars">70</property>
       </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="position">2</property>
-      </packing>
     </child>
     <child>
-      <object class="GtkButtonBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="layout_style">spread</property>
-        <child>
+      <object class="GtkBox">
+        <child type="end">
           <object class="GtkButton" id="login_button">
             <property name="label" translatable="yes">_Log in</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="use_underline">True</property>
-            <property name="image_position">top</property>
+            <property name="focusable">1</property>
+            <property name="receives_default">1</property>
+            <property name="use_underline">1</property>
           </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
         </child>
       </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">True</property>
-        <property name="pack_type">end</property>
-        <property name="position">1</property>
-      </packing>
     </child>
   </template>
 </interface>
diff --git a/data/ui/preferences_dialog.ui b/data/ui/preferences_dialog.ui
index f020c974..a28eacf0 100644
--- a/data/ui/preferences_dialog.ui
+++ b/data/ui/preferences_dialog.ui
@@ -37,7 +37,7 @@
                 <property name="row_spacing">4</property>
                 <property name="column_spacing">8</property>
                 <child>
-                  <object class="GtkFileChooserButton" id="library_dir_button">
+                  <object class="GtkButton" id="library_dir_button">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <property name="action">select-folder</property>
@@ -353,7 +353,7 @@
                     <property name="can_focus">False</property>
                     <property name="orientation">vertical</property>
                     <child>
-                      <object class="GtkRadioButton" id="transparent_checker_radio">
+                      <object class="GtkToggleButton" id="transparent_checker_radio">
                         <property name="label" translatable="yes">Checkered</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
@@ -374,7 +374,7 @@
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <child>
-                          <object class="GtkRadioButton" id="transparent_solid_radio">
+                          <object class="GtkToggleButton" id="transparent_solid_radio">
                             <property name="label" translatable="yes">Solid color</property>
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
@@ -410,7 +410,7 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkRadioButton" id="transparent_none_radio">
+                      <object class="GtkToggleButton" id="transparent_none_radio">
                         <property name="label" translatable="yes">None</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
diff --git a/data/ui/printing_widget.ui b/data/ui/printing_widget.ui
index 86f215d7..401156da 100644
--- a/data/ui/printing_widget.ui
+++ b/data/ui/printing_widget.ui
@@ -34,7 +34,7 @@
         <property name="column_spacing">6</property>
         <property name="row_homogeneous">True</property>
         <child>
-          <object class="GtkRadioButton" id="standard_size_radio">
+          <object class="GtkToggleButton" id="standard_size_radio">
             <property name="label" translatable="yes">Use a _standard size:</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
@@ -61,7 +61,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkRadioButton" id="custom_size_radio">
+          <object class="GtkToggleButton" id="custom_size_radio">
             <property name="label" translatable="yes">Use a c_ustom size:</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
@@ -157,7 +157,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkRadioButton" id="image_per_page_radio">
+          <object class="GtkToggleButton" id="image_per_page_radio">
             <property name="label" translatable="yes">_Autosize:</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
diff --git a/meson.build b/meson.build
index b8735b5d..2a629c66 100644
--- a/meson.build
+++ b/meson.build
@@ -28,6 +28,7 @@ add_global_arguments(
         '--vapidir=@0@'.format(join_paths(meson.current_source_dir(), 'vapi')),
         '--enable-checking',
         '--enable-experimental',
+        '--enable-deprecated',
     ],
     language : 'vala'
 )
@@ -44,7 +45,7 @@ endif
 version_h = vcs_tag(command: ['git', 'rev-parse', 'HEAD'], input: 'version.h.in', output: 'version.h', 
fallback: '')
 version = declare_dependency(sources : version_h, include_directories : include_directories('.'))
 
-gtk = dependency('gtk+-3.0', version : '>= 3.22')
+gtk = dependency('gtk4', version : '>= 4.4')
 gio = dependency('gio-2.0', version: '>= 2.40')
 gmodule = dependency('gmodule-2.0', version: '>= 2.40')
 gio_unix = dependency('gio-unix-2.0', version: '>= 2.40')
@@ -53,7 +54,6 @@ webkit = dependency('webkit2gtk-4.0', version: '>= 2.26')
 soup = dependency('libsoup-2.4')
 json_glib = dependency('json-glib-1.0')
 xml = dependency('libxml-2.0')
-gdk = dependency('gdk-3.0', version : '>= 3.22')
 gdk_pixbuf = dependency('gdk-pixbuf-2.0')
 sqlite = dependency('sqlite3', version : '>= 3.5.9')
 gstreamer = dependency('gstreamer-1.0', version : '>= 1.0')
@@ -65,8 +65,7 @@ libraw = dependency('libraw', version : '>= 0.13.2')
 libexif = dependency('libexif', version : '>= 0.6.16')
 unity = dependency('unity', required : false)
 secret = dependency('libsecret-1', required: true)
-gdk = [ dependency('gdk-x11-3.0'), dependency('gdk-wayland-3.0') ]
- 
+pangocairo = dependency('pangocairo', required: true)
 webpdemux = dependency('libwebpdemux')
 webp = dependency('libwebp')
 
@@ -120,7 +119,7 @@ posix = valac.find_library('posix')
 
 subdir('data')
 subdir('src')
-subdir('plugins')
+#subdir('plugins')
 subdir('po')
 subdir('help')
 subdir('thumbnailer')
diff --git a/plugins/shotwell-transitions/meson.build b/plugins/shotwell-transitions/meson.build
index 81342926..e016f361 100644
--- a/plugins/shotwell-transitions/meson.build
+++ b/plugins/shotwell-transitions/meson.build
@@ -19,7 +19,7 @@ libm = cc.find_library('m', required : false)
 
 shared_module('shotwell-transitions',
               shotwell_transitions_sources + shotwell_transitions_resources,
-              dependencies : [gio, gdk_pixbuf, cairo, gtk, gdk, xml, sw_plugin,
+              dependencies : [gio, gdk_pixbuf, cairo, gtk, xml, sw_plugin,
                               sw_plugin_common_dep, gee, soup, webkit, libm],
               vala_args : [
                   '--gresources', 'org.gnome.Shotwell.Transitions.gresource.xml',
diff --git a/src/.unitize/_DataImportsInternals.vala b/src/.unitize/_DataImportsInternals.vala
index 002b6a7b..238969e0 100644
--- a/src/.unitize/_DataImportsInternals.vala
+++ b/src/.unitize/_DataImportsInternals.vala
@@ -16,14 +16,14 @@ public void init_entry() throws Error {
 
     Unit.init_entry();
 
-    DataImports.init();
+    //DataImports.init();
 }
 
 public void terminate_entry() {
     if (_unit_init_count == 0 || --_unit_init_count != 0)
         return;
 
-    DataImports.terminate();
+    //DataImports.terminate();
 
     Unit.terminate_entry();
 }
diff --git a/src/.unitize/_EditingToolsInternals.vala b/src/.unitize/_EditingToolsInternals.vala
index 7b913f64..b06afb74 100644
--- a/src/.unitize/_EditingToolsInternals.vala
+++ b/src/.unitize/_EditingToolsInternals.vala
@@ -16,14 +16,14 @@ public void init_entry() throws Error {
 
     Unit.init_entry();
 
-    EditingTools.init();
+    //EditingTools.init();
 }
 
 public void terminate_entry() {
     if (_unit_init_count == 0 || --_unit_init_count != 0)
         return;
 
-    EditingTools.terminate();
+    //EditingTools.terminate();
 
     Unit.terminate_entry();
 }
diff --git a/src/.unitize/_SidebarInternals.vala b/src/.unitize/_SidebarInternals.vala
index 0940c438..2f5a531b 100644
--- a/src/.unitize/_SidebarInternals.vala
+++ b/src/.unitize/_SidebarInternals.vala
@@ -16,14 +16,14 @@ public void init_entry() throws Error {
 
     Unit.init_entry();
 
-    Sidebar.init();
+    //Sidebar.init();
 }
 
 public void terminate_entry() {
     if (_unit_init_count == 0 || --_unit_init_count != 0)
         return;
 
-    Sidebar.terminate();
+    //Sidebar.terminate();
 
     Unit.terminate_entry();
 }
diff --git a/src/AppWindow.vala b/src/AppWindow.vala
index 608d1807..eb2e415d 100644
--- a/src/AppWindow.vala
+++ b/src/AppWindow.vala
@@ -10,9 +10,9 @@ public class FullscreenWindow : PageWindow {
     public const int TOOLBAR_CHECK_DISMISSAL_MSEC = 500;
     
     private Gtk.Overlay overlay = new Gtk.Overlay();
-    private Gtk.Toolbar toolbar = null;
-    private Gtk.ToolButton close_button = new Gtk.ToolButton(null, null);
-    private Gtk.ToggleToolButton pin_button = new Gtk.ToggleToolButton();
+    private Gtk.Box toolbar = null;
+    private Gtk.Button close_button = new Gtk.Button();
+    private Gtk.ToggleButton pin_button = new Gtk.ToggleButton();
     private bool is_toolbar_shown = false;
     private bool waiting_for_invoke = false;
     private time_t left_toolbar_time = 0;
@@ -32,13 +32,13 @@ public class FullscreenWindow : PageWindow {
         const string[] accels = { "F11", null };
         Application.set_accels_for_action ("win.LeaveFullscreen", accels);
 
-        set_screen(AppWindow.get_instance().get_screen());
+        //set_screen(AppWindow.get_instance().get_screen());
         
         // Needed so fullscreen will occur on correct monitor in multi-monitor setups
         Gdk.Rectangle monitor = get_monitor_geometry();
-        move(monitor.x, monitor.y);
+        //move(monitor.x, monitor.y);
         
-        set_border_width(0);
+        //set_border_width(0);
 
         // restore pin state
         is_toolbar_dismissal_enabled = Config.Facade.get_instance().get_pin_toolbar_state();
@@ -54,10 +54,10 @@ public class FullscreenWindow : PageWindow {
         close_button.set_action_name ("win.LeaveFullscreen");
         
         toolbar = page.get_toolbar();
-        toolbar.set_show_arrow(false);
+        //toolbar.set_show_arrow(false);
         toolbar.valign = Gtk.Align.END;
         toolbar.halign = Gtk.Align.CENTER;
-        toolbar.expand = false;
+        //toolbar.expand = false;
         toolbar.opacity = Resources.TRANSIENT_WINDOW_OPACITY;
 
         if (page is SlideshowPage) {
@@ -65,16 +65,16 @@ public class FullscreenWindow : PageWindow {
             ((SlideshowPage) page).hide_toolbar.connect(hide_toolbar);
         } else {
             // only non-slideshow pages should have pin button
-            toolbar.insert(pin_button, -1); 
+            toolbar.append(pin_button);
         }
 
         page.set_cursor_hide_time(TOOLBAR_DISMISSAL_SEC * 1000);
         page.start_cursor_hiding();
 
-        toolbar.insert(close_button, -1);
+        toolbar.append(close_button);
         
-        add(overlay);
-        overlay.add(page);
+        set_child(overlay);
+        overlay.set_child(page);
         overlay.add_overlay (toolbar);
 
         // call to set_default_size() saves one repaint caused by changing
@@ -84,10 +84,10 @@ public class FullscreenWindow : PageWindow {
         
         // need to create a Gdk.Window to set masks
         fullscreen();
-        show_all();
+        show();
 
         // capture motion events to show the toolbar
-        add_events(Gdk.EventMask.POINTER_MOTION_MASK);
+        //add_events(Gdk.EventMask.POINTER_MOTION_MASK);
         
         // If toolbar is enabled in "normal" ui OR was pinned in
         // fullscreen, start off with toolbar invoked, as a clue for the
@@ -115,10 +115,15 @@ public class FullscreenWindow : PageWindow {
     }
 
     private Gdk.Rectangle get_monitor_geometry() {
+        #if 0
         var monitor = get_display().get_monitor_at_window(AppWindow.get_instance().get_window());
         return monitor.get_geometry();
+        #endif
+
+        return Gdk.Rectangle();
     }
     
+    #if 0
     public override bool configure_event(Gdk.EventConfigure event) {
         bool result = base.configure_event(event);
         
@@ -145,6 +150,7 @@ public class FullscreenWindow : PageWindow {
         // ... then propagate to the underlying window hidden behind this fullscreen one
         return AppWindow.get_instance().key_press_event(event);
     }
+    #endif
     
     private void on_close() {
         Config.Facade.get_instance().set_pin_toolbar_state(is_toolbar_dismissal_enabled);
@@ -157,7 +163,7 @@ public class FullscreenWindow : PageWindow {
         on_close();
     }
     
-    public override void destroy() {
+    public override void dispose() {
         Page? page = get_current_page();
         clear_current_page();
         
@@ -166,16 +172,17 @@ public class FullscreenWindow : PageWindow {
             page.switching_from();
         }
         
-        base.destroy();
+        base.dispose();
     }
     
-    public override bool delete_event(Gdk.EventAny event) {
+    public override bool close_request() {
         on_close();
         AppWindow.get_instance().destroy();
         
         return true;
     }
     
+    #if 0
     public override bool motion_notify_event(Gdk.EventMotion event) {
         if (!is_toolbar_shown) {
             // if pointer is in toolbar height range without the mouse down (i.e. in the middle of
@@ -189,6 +196,7 @@ public class FullscreenWindow : PageWindow {
         
         return (base.motion_notify_event != null) ? base.motion_notify_event(event) : false;
     }
+    #endif
     
     private bool is_pointer_in_toolbar() {
         var seat = get_display().get_default_seat();
@@ -198,6 +206,7 @@ public class FullscreenWindow : PageWindow {
             return false;
         }
         
+        #if 0
         int py;
         seat.get_pointer().get_position(null, null, out py);
         
@@ -205,6 +214,8 @@ public class FullscreenWindow : PageWindow {
         toolbar.get_window().get_geometry(null, out wy, null, null);
 
         return (py >= wy);
+        #endif
+        return false;
     }
     
     private bool on_check_toolbar_invocation() {
@@ -222,7 +233,7 @@ public class FullscreenWindow : PageWindow {
     }
     
     private void invoke_toolbar() {
-        toolbar.show_all();
+        toolbar.show();
 
         is_toolbar_shown = true;
         
@@ -287,9 +298,12 @@ public abstract class PageWindow : Gtk.ApplicationWindow {
         Object (application: Application.get_instance().get_system_app ());
 
         // the current page needs to know when modifier keys are pressed
+        #if 0
         add_events(Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK
             | Gdk.EventMask.STRUCTURE_MASK);
+            #endif
         set_show_menubar (true);
+
     }
     
     public Page? get_current_page() {
@@ -317,6 +331,7 @@ public abstract class PageWindow : Gtk.ApplicationWindow {
         switched_pages(old_page, null);
     }
     
+    #if 0
     public override bool key_press_event(Gdk.EventKey event) {
         if (get_focus() is Gtk.Entry && get_focus().key_press_event(event))
             return true;
@@ -359,14 +374,13 @@ public abstract class PageWindow : Gtk.ApplicationWindow {
 
         return (base.configure_event != null) ? base.configure_event(event) : false;
     }
+    #endif
 
     public void set_busy_cursor() {
         if (busy_counter++ > 0)
             return;
 
-        var display = get_window ().get_display ();
-        var cursor = new Gdk.Cursor.for_display (display, Gdk.CursorType.WATCH);
-        get_window().set_cursor (cursor);
+        set_cursor (new Gdk.Cursor.from_name ("wait", null));
     }
     
     public void set_normal_cursor() {
@@ -376,10 +390,8 @@ public abstract class PageWindow : Gtk.ApplicationWindow {
         } else if (--busy_counter > 0) {
             return;
         }
-        
-        var display = get_window ().get_display ();
-        var cursor = new Gdk.Cursor.for_display (display, Gdk.CursorType.LEFT_PTR);
-        get_window().set_cursor (cursor);
+
+        set_cursor (new Gdk.Cursor.from_name ("default", null));
     }
     
 }
@@ -400,7 +412,6 @@ 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 bool maximized = false;
     protected Dimensions dimensions;
     protected int pos_x = 0;
     protected int pos_y = 0;
@@ -416,16 +427,18 @@ public abstract class AppWindow : PageWindow {
         set_default_icon_name("org.gnome.Shotwell");
 
         // restore previous size and maximization state
+
+        bool was_maximized;
         if (this is LibraryWindow) {
-            Config.Facade.get_instance().get_library_window_state(out maximized, out dimensions);
+            Config.Facade.get_instance().get_library_window_state(out was_maximized, out dimensions);
         } else {
             assert(this is DirectWindow);
-            Config.Facade.get_instance().get_direct_window_state(out maximized, out dimensions);
+            Config.Facade.get_instance().get_direct_window_state(out was_maximized, out dimensions);
         }
 
         set_default_size(dimensions.width, dimensions.height);
 
-        if (maximized)
+        if (was_maximized)
             maximize();
 
         assert(command_manager == null);
@@ -439,6 +452,8 @@ public abstract class AppWindow : PageWindow {
         // with each ActionGroup while we're adding the groups to the UIManager.
 
         add_actions ();
+
+        notify["maximized"].connect(on_maximized);
     }
 
     private const GLib.ActionEntry[] common_actions = {
@@ -484,8 +499,8 @@ public abstract class AppWindow : PageWindow {
         dialog.set_markup(build_alert_body_text(title, message, should_escape));
 
         dialog.use_markup = true;
-        dialog.run();
-        dialog.destroy();
+        dialog.show();
+        dialog.response.connect(() => dialog.destroy());
     }
     
     public static bool negate_affirm_question(string message, string negative, string affirmative,
@@ -495,9 +510,8 @@ public abstract class AppWindow : PageWindow {
 
         dialog.set_markup(build_alert_body_text(title, message));
         dialog.add_buttons(negative, Gtk.ResponseType.NO, affirmative, Gtk.ResponseType.YES);
-        dialog.set_urgency_hint(true);
         
-        bool response = (dialog.run() == Gtk.ResponseType.YES);
+        bool response = false; // TODO (dialog.run() == Gtk.ResponseType.YES);
 
         dialog.destroy();
         
@@ -516,7 +530,7 @@ public abstract class AppWindow : PageWindow {
         dialog.set_markup(build_alert_body_text(title, message));
         dialog.use_markup = true;
 
-        int response = dialog.run();
+        int response = 0; //dialog.run();
         
         dialog.destroy();
         
@@ -534,7 +548,9 @@ public abstract class AppWindow : PageWindow {
         dialog.add_buttons(affirmative, Gtk.ResponseType.YES, _("_Cancel"),
             Gtk.ResponseType.CANCEL);
         
-        int response = dialog.run();
+        dialog.show();
+        //int response = dialog.run();
+        int response = Gtk.ResponseType.OK;
         
         dialog.destroy();
         
@@ -550,7 +566,7 @@ public abstract class AppWindow : PageWindow {
         dialog.add_buttons(negative, Gtk.ResponseType.NO, affirmative, Gtk.ResponseType.YES,
             affirmative_all, Gtk.ResponseType.APPLY,  _("_Cancel"), Gtk.ResponseType.CANCEL);
         
-        int response = dialog.run();
+        int response = Gtk.ResponseType.CANCEL;//dialog.run();
         
         dialog.destroy();
         
@@ -630,8 +646,10 @@ public abstract class AppWindow : PageWindow {
         }
     }
     
-    protected override void destroy() {
+    protected override bool close_request() {
         on_quit();
+
+        return false;
     }
     
     public void show_file_uri(File file) throws Error {
@@ -639,7 +657,7 @@ public abstract class AppWindow : PageWindow {
     }
     
     public void show_uri(string url) throws Error {
-        Gtk.show_uri_on_window(this, url, Gdk.CURRENT_TIME);
+        Gtk.show_uri(this, url, Gdk.CURRENT_TIME);
     }
     
     protected virtual void add_actions () {
@@ -654,7 +672,7 @@ public abstract class AppWindow : PageWindow {
             return;
         }
 
-        get_position(out pos_x, out pos_y);
+        //get_position(out pos_x, out pos_y);
         hide();
         
         FullscreenWindow fsw = new FullscreenWindow(page);
@@ -670,9 +688,9 @@ public abstract class AppWindow : PageWindow {
         if (fullscreen_window == null)
             return;
         
-        move(pos_x, pos_y);
+        //move(pos_x, pos_y);
 
-        show_all();
+        show();
         
         if (get_current_page() != null)
             get_current_page().returning_from_fullscreen(fullscreen_window);
@@ -858,13 +876,11 @@ public abstract class AppWindow : PageWindow {
             page.get_view().unselect_all();
     }
     
-    public override bool configure_event(Gdk.EventConfigure event) {
-        maximized = (get_window().get_state() == Gdk.WindowState.MAXIMIZED);
-
-        if (!maximized)
-            get_size(out dimensions.width, out dimensions.height);
-
-        return base.configure_event(event);
+    public void on_maximized() {
+        if (!maximized) {
+            dimensions.width = get_size (Gtk.Orientation.HORIZONTAL);
+            dimensions.height = get_size (Gtk.Orientation.VERTICAL);
+        }
     }
     
 }
diff --git a/src/CheckerboardLayout.vala b/src/CheckerboardLayout.vala
index 85232f37..e7da76ce 100644
--- a/src/CheckerboardLayout.vala
+++ b/src/CheckerboardLayout.vala
@@ -55,7 +55,7 @@ public class CheckerboardLayout : Gtk.DrawingArea {
     private bool flow_scheduled = false;
     private bool exposure_dirty = true;
     private CheckerboardItem? anchor = null;
-    private CheckerboardItem? cursor = null;
+    private CheckerboardItem? current_cursor = null;
     private bool in_center_on_anchor = false;
     private bool size_allocate_due_to_reflow = false;
     private bool is_in_view = false;
@@ -82,6 +82,7 @@ public class CheckerboardLayout : Gtk.DrawingArea {
 
         // CheckerboardItems offer tooltips
         has_tooltip = true;
+        set_draw_func (on_draw);
     }
     
     ~CheckerboardLayout() {
@@ -105,8 +106,10 @@ public class CheckerboardLayout : Gtk.DrawingArea {
         if (vadjustment != null)
             vadjustment.value_changed.disconnect(on_viewport_shifted);
         
+        #if 0
         if (parent != null)
             parent.size_allocate.disconnect(on_viewport_resized);
+            #endif
 
         Config.Facade.get_instance().colors_changed.disconnect(on_colors_changed);
     }
@@ -120,7 +123,7 @@ public class CheckerboardLayout : Gtk.DrawingArea {
         vadjustment.value_changed.connect(on_viewport_shifted);
         
         // monitor parent's size changes for a similar reason
-        parent.size_allocate.connect(on_viewport_resized);
+        //parent.resized.connect(on_viewport_resized);
     }
     
     // This method allows for some optimizations to occur in reflow() by using the known max.
@@ -133,7 +136,7 @@ public class CheckerboardLayout : Gtk.DrawingArea {
         return scale;
     }
     
-    public void set_name(string name) {
+    public new void set_name(string name) {
         page_name = name;
     }
     
@@ -224,23 +227,23 @@ public class CheckerboardLayout : Gtk.DrawingArea {
         in_center_on_anchor = false;
     }
 
-    public void set_cursor(CheckerboardItem item) {
+    public new void set_cursor(CheckerboardItem item) {
         Gee.HashSet<DataView> collection = new Gee.HashSet<DataView>();
         if (cursor != null) {
-            cursor.set_is_cursor(false);
+            current_cursor.set_is_cursor(false);
             // Bug #732334, the cursor DataView might have disappeared when user drags a full screen Photo 
to another event
-            if (view.contains(cursor)) {
-                collection.add(cursor);
+            if (view.contains(current_cursor)) {
+                collection.add(current_cursor);
             }
         }
         item.set_is_cursor(true);
-        cursor = item;
+        current_cursor = item;
         collection.add(item);
         on_items_state_changed(collection);
     }
     
-    public CheckerboardItem get_cursor() {
-        return cursor;
+    public new CheckerboardItem get_cursor() {
+        return current_cursor;
     }
     
     
@@ -609,12 +612,15 @@ public class CheckerboardLayout : Gtk.DrawingArea {
         selection_band = Box.from_points(drag_origin, drag_endpoint).get_rectangle();
         
         // force repaint of the union of the old and new, which covers the band reducing in size
+        #if 0
         if (get_window() != null) {
             Gdk.Rectangle union;
             selection_band.union(old_selection_band, out union);
             
             queue_draw_area(union.x, union.y, union.width, union.height);
         }
+        #endif
+        queue_draw();
     }
     
     public Gee.List<CheckerboardItem>? items_in_selection_band() {
@@ -1054,7 +1060,8 @@ public class CheckerboardLayout : Gtk.DrawingArea {
             debug("items_dirty %s (%s): Queuing draw of dirty area %s on visible_page %s",
                 page_name, reason, rectangle_to_string(dirty), rectangle_to_string(visible_page));
 #endif
-            queue_draw_area(dirty.x, dirty.y, dirty.width, dirty.height);
+            //queue_draw_area(dirty.x, dirty.y, dirty.width, dirty.height);
+            queue_draw();
         }
     }
     
@@ -1065,6 +1072,7 @@ public class CheckerboardLayout : Gtk.DrawingArea {
     }
 
     private void set_colors(bool in_focus = true) {
+    #if 0
         // set up selected/unselected colors
         var ctx = get_style_context();
         ctx.save();
@@ -1082,15 +1090,16 @@ public class CheckerboardLayout : Gtk.DrawingArea {
         val = ctx.get_property("color", Gtk.StateFlags.NORMAL);
         unselected_color = *(Gdk.RGBA*)val.get_boxed();
         ctx.restore();
+        #endif
     }
     
-    public override void size_allocate(Gtk.Allocation allocation) {
-        base.size_allocate(allocation);
+    public override void size_allocate(int a, int b, int c)  {
+        base.size_allocate(a, b, c);
         
         viewport_resized();
     }
     
-    public override bool draw(Cairo.Context ctx) {
+    public void on_draw(Gtk.DrawingArea da, Cairo.Context ctx, int width, int height) {
         // Note: It's possible for draw to be called when in_view is false; this happens
         // when pages are switched prior to switched_to() being called, and some of the other
         // controls allow for events to be processed while they are orienting themselves.  Since
@@ -1115,12 +1124,8 @@ public class CheckerboardLayout : Gtk.DrawingArea {
                 border_color, focus_color);
         }
         
-        bool result = (base.draw != null) ? base.draw(ctx) : true;
-        
         // draw the selection band last, so it appears floating over everything else
         draw_selection_band(ctx);
-        
-        return result;
     }
     
     private void draw_selection_band(Cairo.Context ctx) {
@@ -1138,7 +1143,7 @@ public class CheckerboardLayout : Gtk.DrawingArea {
         visible_page.intersect(selection_band, out visible_band);
         
         get_style_context().save();
-        get_style_context().add_class(Gtk.STYLE_CLASS_RUBBERBAND);
+        get_style_context().add_class("rubberband");
         // pixelate selection rectangle interior
         if (visible_band.width > 1 && visible_band.height > 1) {
             get_style_context().render_background(ctx, visible_band.x, visible_band.y, visible_band.width, 
visible_band.height);
@@ -1167,6 +1172,7 @@ public class CheckerboardLayout : Gtk.DrawingArea {
         queue_draw();
     }
 
+#if 0
     public override bool focus_in_event(Gdk.EventFocus event) {
         set_colors(true);
         items_dirty("focus_in_event", view.get_selected());
@@ -1180,4 +1186,5 @@ public class CheckerboardLayout : Gtk.DrawingArea {
         
         return base.focus_out_event(event);
     }
+    #endif
 }
diff --git a/src/CheckerboardPage.vala b/src/CheckerboardPage.vala
index 24a252a6..e74f9a8a 100644
--- a/src/CheckerboardPage.vala
+++ b/src/CheckerboardPage.vala
@@ -15,7 +15,7 @@ public abstract class CheckerboardPage : Page {
     private string page_context_menu_path = null;
     private Gtk.Viewport viewport = new Gtk.Viewport(null, null);
     protected CheckerboardItem anchor = null;
-    protected CheckerboardItem cursor = null;
+    protected CheckerboardItem current_cursor = null;
     private CheckerboardItem current_hovered_item = null;
     private bool autoscroll_scheduled = false;
     private CheckerboardItem activated_item = null;
@@ -54,19 +54,13 @@ public abstract class CheckerboardPage : Page {
 
         set_event_source(layout);
 
-        set_border_width(0);
-        set_shadow_type(Gtk.ShadowType.NONE);
-
-        viewport.set_border_width(0);
-        viewport.set_shadow_type(Gtk.ShadowType.NONE);
-
-        viewport.add(stack);
+        viewport.set_child(stack);
 
         // want to set_adjustments before adding to ScrolledWindow to let our signal handlers
         // run first ... otherwise, the thumbnails draw late
         layout.set_adjustments(get_hadjustment(), get_vadjustment());
 
-        add(viewport);
+        set_child(viewport);
 
         // need to monitor items going hidden when dealing with anchor/cursor/highlighted items
         get_view().items_hidden.connect(on_items_hidden);
@@ -86,41 +80,40 @@ public abstract class CheckerboardPage : Page {
         page_context_menu_path = path;
     }
 
-    public Gtk.Menu? get_context_menu() {
+    public Gtk.PopoverMenu? get_context_menu() {
         // show page context menu if nothing is selected
         return (get_view().get_selected_count() != 0) ? get_item_context_menu() :
             get_page_context_menu();
     }
 
-    private Gtk.Menu item_context_menu;
-    public virtual Gtk.Menu? get_item_context_menu() {
+    private Gtk.PopoverMenu item_context_menu;
+    public virtual Gtk.PopoverMenu? get_item_context_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);
+            item_context_menu = new Gtk.PopoverMenu.from_model (model);
         }
 
         return item_context_menu;
     }
 
-    private Gtk.Menu page_context_menu;
-    public override Gtk.Menu? get_page_context_menu() {
+    private Gtk.PopoverMenu page_context_menu;
+    public override Gtk.PopoverMenu? get_page_context_menu() {
         if (page_context_menu_path == null)
             return null;
 
         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);
+            page_context_menu = new Gtk.PopoverMenu.from_model (model);
         }
 
         return page_context_menu;
     }
 
     protected override bool on_context_keypress() {
-        return popup_context_menu(get_context_menu());
+        //return popup_context_menu(get_context_menu());
+        return true;
     }
 
     protected virtual string get_view_empty_icon() {
@@ -255,14 +248,15 @@ public abstract class CheckerboardPage : Page {
             if (anchor == item)
                 anchor = null;
 
-            if (cursor == item)
-                cursor = null;
+            if (current_cursor == item)
+                current_cursor = null;
 
             if (current_hovered_item == item)
                 current_hovered_item = null;
         }
     }
 
+#if 0
     protected override bool key_press_event(Gdk.EventKey event) {
         bool handled = true;
 
@@ -571,6 +565,7 @@ public abstract class CheckerboardPage : Page {
         // return true to stop a potential drag-and-drop operation
         return true;
     }
+    #endif
 
     private void updated_selection_band() {
         assert(layout.is_drag_select_active());
@@ -600,8 +595,8 @@ public abstract class CheckerboardPage : Page {
             else
                 to_unselect.mark(item);
 
-            if (cursor == null)
-                cursor = item;
+            if (current_cursor == null)
+                current_cursor = item;
         }
 
         get_view().select_marked(to_select);
@@ -660,7 +655,7 @@ public abstract class CheckerboardPage : Page {
     public void cursor_to_item(CheckerboardItem item) {
         assert(get_view().contains(item));
 
-        cursor = item;
+        current_cursor = item;
 
         if (!get_ctrl_pressed()) {
             get_view().unselect_all();
@@ -679,7 +674,7 @@ public abstract class CheckerboardPage : Page {
         // if there is no better starting point, simply select the first and exit
         // The right half of the or is related to Bug #732334, the cursor might be non-null and still not 
contained in
         // the view, if the user dragged a full screen Photo off screen
-        if (cursor == null && layout.get_cursor() == null || cursor != null && !get_view().contains(cursor)) 
{
+        if (cursor == null && layout.get_cursor() == null || cursor != null && 
!get_view().contains(current_cursor)) {
             CheckerboardItem item = layout.get_item_at_coordinate(0, 0);
             cursor_to_item(item);
             anchor = item;
@@ -688,20 +683,20 @@ public abstract class CheckerboardPage : Page {
         }
 
         if (cursor == null) {
-            cursor = layout.get_cursor() as CheckerboardItem;
+            current_cursor = layout.get_cursor() as CheckerboardItem;
         }
 
         // move the cursor relative to the "first" item
-        CheckerboardItem? item = layout.get_item_relative_to(cursor, point);
+        CheckerboardItem? item = layout.get_item_relative_to(current_cursor, point);
         if (item != null)
             cursor_to_item(item);
    }
 
-    public void set_cursor(CheckerboardItem item) {
+    public new void set_cursor(CheckerboardItem item) {
         Marker marker = get_view().mark(item);
         get_view().select_marked(marker);
 
-        cursor = item;
+        current_cursor = item;
         anchor = item;
    }
 
@@ -736,9 +731,9 @@ public abstract class CheckerboardPage : Page {
 
         if (state == Gdk.ModifierType.SHIFT_MASK) {
             get_view().unselect_all();
-            select_between_items(anchor, cursor);
+            select_between_items(anchor, current_cursor);
         } else {
-            anchor = cursor;
+            anchor = current_cursor;
         }
     }
 
diff --git a/src/CollectionPage.vala b/src/CollectionPage.vala
index ac05f8b8..183c0de1 100644
--- a/src/CollectionPage.vala
+++ b/src/CollectionPage.vala
@@ -37,38 +37,28 @@ public abstract class CollectionPage : MediaPage {
         init_item_context_menu("CollectionContextMenu");
         init_toolbar("CollectionToolbar");
         
-        show_all();
+        show();
 
         // watch for updates to the external app settings
         Config.Facade.get_instance().external_app_changed.connect(on_external_app_changed);
     }
 
-    public override Gtk.Toolbar get_toolbar() {
+    public override Gtk.Box 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);
-            separator.set_draw(false);
-            get_toolbar().insert(separator, -1);
-
-            Gtk.SeparatorToolItem drawn_separator = new Gtk.SeparatorToolItem();
-            drawn_separator.set_expand(false);
-            drawn_separator.set_draw(true);
-            
-            get_toolbar().insert(drawn_separator, -1);
-            
             // zoom slider assembly
             MediaPage.ZoomSliderAssembly zoom_slider_assembly = create_zoom_slider_assembly();
             connect_slider(zoom_slider_assembly);
-            get_toolbar().insert(zoom_slider_assembly, -1);
+            get_toolbar().append(zoom_slider_assembly);
 
-            Gtk.ToolButton? rotate_button = this.builder.get_object ("ToolRotate") as Gtk.ToolButton;
+            Gtk.Button? rotate_button = this.builder.get_object ("ToolRotate") as Gtk.Button;
+            #if 0
+            is this even necessary?
             unowned Gtk.BindingSet binding_set = Gtk.BindingSet.by_class(rotate_button.get_class());
             Gtk.BindingEntry.add_signal(binding_set, Gdk.Key.KP_Space, Gdk.ModifierType.CONTROL_MASK, 
"clicked", 0);
             Gtk.BindingEntry.add_signal(binding_set, Gdk.Key.space, Gdk.ModifierType.CONTROL_MASK, 
"clicked", 0);
-
+#endif
         }
         
         return toolbar;
@@ -355,6 +345,7 @@ public abstract class CollectionPage : MediaPage {
         }
     }
     
+    #if 0
     protected override bool on_app_key_pressed(Gdk.EventKey event) {
         bool handled = true;
         switch (Gdk.keyval_name(event.keyval)) {
@@ -384,6 +375,7 @@ public abstract class CollectionPage : MediaPage {
         
         return handled ? true : base.on_app_key_pressed(event);
     }
+    #endif
 
     protected override void on_export() {
         if (exporter != null)
@@ -698,6 +690,7 @@ public abstract class CollectionPage : MediaPage {
             photo));
     }
     
+    #if 0
     protected override bool on_ctrl_pressed(Gdk.EventKey? event) {
         Gtk.ToolButton? rotate_button = this.builder.get_object ("ToolRotate") as Gtk.ToolButton;
         if (rotate_button != null) {
@@ -719,6 +712,7 @@ public abstract class CollectionPage : MediaPage {
 
         return base.on_ctrl_released(event);
     }
+    #endif
     
     public override SearchViewFilter get_search_view_filter() {
         return search_filter;
diff --git a/src/Commands.vala b/src/Commands.vala
index 9825b6de..c6b46212 100644
--- a/src/Commands.vala
+++ b/src/Commands.vala
@@ -864,7 +864,7 @@ public class AdjustColorsMultipleCommand : MultiplePhotoTransformationCommand {
         ((Photo) source).set_color_adjustments(transformations);
     }
 }
-
+#if 0
 public class RedeyeCommand : GenericPhotoTransformationCommand {
     private EditingTools.RedeyeInstance redeye_instance;
     
@@ -879,6 +879,7 @@ public class RedeyeCommand : GenericPhotoTransformationCommand {
         photo.add_redeye_instance(redeye_instance);
     }
 }
+#endif
 
 public abstract class MovePhotosCommand : Command {
     // Piggyback on a private command so that processing to determine new_event can occur before
@@ -2468,7 +2469,7 @@ public class FlagUnflagCommand : MultipleDataSourceAtOnceCommand {
             progress_dialog = new ProgressDialog(null,
                 flag ? FLAG_PROGRESS : UNFLAG_PROGRESS);
             
-            progress_dialog.show_all();
+            progress_dialog.show();
         }
     }
     
diff --git a/src/Dialogs.vala b/src/Dialogs.vala
index ee9aef9b..1a600c2c 100644
--- a/src/Dialogs.vala
+++ b/src/Dialogs.vala
@@ -39,7 +39,10 @@ public bool confirm_warn_developer_changed(int number) {
     dialog.add_buttons(Resources.CANCEL_LABEL, Gtk.ResponseType.CANCEL);
     dialog.add_buttons(_("_Switch Developer"), Gtk.ResponseType.YES);
     
-    int response = dialog.run();
+    dialog.show();
+    // TODO
+
+    int response = 0; //dialog.run();
     
     dialog.destroy();
     
@@ -75,14 +78,17 @@ public File? choose_file(string current_file_basename) {
         
     var chooser = new Gtk.FileChooserNative(file_chooser_title,
         AppWindow.get_instance(), Gtk.FileChooserAction.SAVE, Resources.SAVE_LABEL, Resources.CANCEL_LABEL);
-    chooser.set_do_overwrite_confirmation(true);
-    chooser.set_current_folder(current_export_dir.get_path());
+        try {
+            chooser.set_current_folder(current_export_dir);
+        } catch (Error error) {
+        }
     chooser.set_current_name(current_file_basename);
-    chooser.set_local_only(false);
     
     File file = null;
-    if (chooser.run() == Gtk.ResponseType.ACCEPT) {
-        file = File.new_for_path(chooser.get_filename());
+    chooser.show();
+    int response = Gtk.ResponseType.OK;
+    if (response == Gtk.ResponseType.ACCEPT) {
+        file = chooser.get_file();
         current_export_dir = file.get_parent();
     }
     chooser.destroy();
@@ -99,13 +105,15 @@ public File? choose_dir(string? user_title = null) {
 
     var chooser = new Gtk.FileChooserNative(user_title,
         AppWindow.get_instance(), Gtk.FileChooserAction.SELECT_FOLDER, Resources.OK_LABEL, 
Resources.CANCEL_LABEL);
-    chooser.set_current_folder(current_export_dir.get_path());
-    chooser.set_local_only(false);
+    try {
+        chooser.set_current_folder(current_export_dir);
+    } catch (Error error) {
+    }
     
     File dir = null;
-    if (chooser.run() == Gtk.ResponseType.ACCEPT) {
-        dir = File.new_for_path(chooser.get_filename());
-        current_export_dir = dir;
+    int response = Gtk.ResponseType.CANCEL;
+    if (response == Gtk.ResponseType.ACCEPT) {
+        current_export_dir = chooser.get_file ();
     }
     
     chooser.destroy();
@@ -544,10 +552,10 @@ public bool report_manifest(ImportManifest manifest, bool show_dest_id,
             ImportUI.SAVE_RESULTS_RESPONSE_ID);
         save_results_button.set_visible(manifest.success.size < manifest.all.size);
         Gtk.Widget ok_button = dialog.add_button(Resources.OK_LABEL, Gtk.ResponseType.OK);
-        dialog.set_default(ok_button);
+        dialog.set_default_widget(ok_button);
         
         Gtk.Window dialog_parent = (Gtk.Window) dialog.get_parent();
-        dialog_response = dialog.run();
+        dialog_response = 0; // TODO dialog.run();
         dialog.destroy();
         
         if (dialog_response == ImportUI.SAVE_RESULTS_RESPONSE_ID)
@@ -564,12 +572,12 @@ public bool report_manifest(ImportManifest manifest, bool show_dest_id,
         save_results_button.set_visible(manifest.success.size < manifest.all.size);
         Gtk.Widget no_button = dialog.add_button(question.no_button, Gtk.ResponseType.NO);
         dialog.add_button(question.yes_button, Gtk.ResponseType.YES);
-        dialog.set_default(no_button);
+        dialog.set_default_widget(no_button);
         
-        dialog_response = dialog.run();
+        dialog_response = 0; //TODO dialog.run();
         while (dialog_response == ImportUI.SAVE_RESULTS_RESPONSE_ID) {
             save_import_results(dialog, create_result_report_from_manifest(manifest));
-            dialog_response = dialog.run();
+            dialog_response = 0;  // TODO dialog.run();
         }
         
         dialog.hide();
@@ -583,12 +591,13 @@ internal void save_import_results(Gtk.Window? chooser_dialog_parent, string resu
     var chooser_dialog = new Gtk.FileChooserNative(
         ImportUI.SAVE_RESULTS_FILE_CHOOSER_TITLE, chooser_dialog_parent, Gtk.FileChooserAction.SAVE,
         Resources.SAVE_AS_LABEL, Resources.CANCEL_LABEL);
-    chooser_dialog.set_do_overwrite_confirmation(true);
-    chooser_dialog.set_current_folder(Environment.get_home_dir());
+        try {
+    chooser_dialog.set_current_folder(File.new_for_commandline_arg (Environment.get_home_dir()));
+    } catch (Error err) {
+    }
     chooser_dialog.set_current_name("Shotwell Import Log.txt");
-    chooser_dialog.set_local_only(false);
     
-    int dialog_result = chooser_dialog.run();
+    int dialog_result = 0; // TODOchooser_dialog.run();
     File? chosen_file = chooser_dialog.get_file();
     chooser_dialog.hide();
     chooser_dialog.destroy();
@@ -716,7 +725,8 @@ public Gtk.ResponseType remove_from_library_dialog(Gtk.Window owner, string titl
     // using the message as the secondary text.
     dialog.set_markup(build_alert_body_text(title, user_message));
     
-    Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+    // TODO
+    Gtk.ResponseType result = (Gtk.ResponseType) 0;//dialog.run();
     
     dialog.destroy();
     
@@ -734,7 +744,8 @@ public Gtk.ResponseType remove_from_filesystem_dialog(Gtk.Window owner, string t
    
     dialog.set_markup(build_alert_body_text(title, user_message));
     
-    Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+    // TODO
+    Gtk.ResponseType result = (Gtk.ResponseType) 0; //dialog.run();
     
     dialog.destroy();
     
@@ -766,7 +777,7 @@ public bool revert_editable_dialog(Gtk.Window owner, Gee.Collection<Photo> photo
 
     dialog.set_markup(build_alert_body_text(headline, msg));
     
-    Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+    Gtk.ResponseType result = (Gtk.ResponseType) 0; // TODO dialog.run();
     
     dialog.destroy();
     
@@ -788,7 +799,7 @@ public bool remove_offline_dialog(Gtk.Window owner, int count) {
     dialog.add_button(_("_Remove"), Gtk.ResponseType.OK);
     dialog.title = (count == 1) ? _("Remove Photo From Library") : _("Remove Photos From Library");
     
-    Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+    Gtk.ResponseType result = (Gtk.ResponseType) 0; // TODO dialog.run();
     
     dialog.destroy();
     
@@ -815,7 +826,8 @@ public void multiple_object_error_dialog(Gee.ArrayList<DataObject> objects, stri
     
     dialog.title = title;
     
-    dialog.run();
+    dialog.show();
+    // TODO
     dialog.destroy();
 }
 
@@ -925,7 +937,7 @@ public Gtk.ResponseType copy_files_dialog() {
     dialog.add_button(_("_Import in Place"), Gtk.ResponseType.REJECT);
     dialog.title = _("Import to Library");
 
-    Gtk.ResponseType result = (Gtk.ResponseType) dialog.run();
+    Gtk.ResponseType result = (Gtk.ResponseType) 0; //dialog.run();
     
     dialog.destroy();
 
diff --git a/src/Dimensions.vala b/src/Dimensions.vala
index 3b4163c9..edc1f699 100644
--- a/src/Dimensions.vala
+++ b/src/Dimensions.vala
@@ -316,8 +316,8 @@ public struct Scaling {
     }
     
     public static Dimensions get_screen_dimensions(Gtk.Window window) {
-        var display = window.get_window().get_display();
-        var monitor = display.get_monitor_at_window(window.get_window());
+        var display = window.get_root().get_display();
+        var monitor = display.get_monitor_at_surface(window.get_surface());
         var geom = monitor.get_geometry();
         
         return Dimensions(geom.width, geom.height);
diff --git a/src/MediaPage.vala b/src/MediaPage.vala
index 51f73d79..37e1c792 100644
--- a/src/MediaPage.vala
+++ b/src/MediaPage.vala
@@ -45,23 +45,21 @@ public abstract class MediaPage : CheckerboardPage {
         MAX = 4
     }
 
-    protected class ZoomSliderAssembly : Gtk.ToolItem {
+    protected class ZoomSliderAssembly : Gtk.Box {
         private Gtk.Scale slider;
         private Gtk.Adjustment adjustment;
         
         public signal void zoom_changed();
 
         public ZoomSliderAssembly() {
-            Gtk.Box zoom_group = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
+            Object (orientation : Gtk.Orientation.HORIZONTAL, spacing : 9);
 
-            Gtk.Image zoom_out = new Gtk.Image.from_icon_name("image-zoom-out-symbolic", 
Gtk.IconSize.SMALL_TOOLBAR);
-            Gtk.EventBox zoom_out_box = new Gtk.EventBox();
-            zoom_out_box.set_above_child(true);
-            zoom_out_box.set_visible_window(false);
-            zoom_out_box.add(zoom_out);
+            Gtk.Image zoom_out = new Gtk.Image.from_icon_name("image-zoom-out-symbolic");
+            #if 0
             zoom_out_box.button_press_event.connect(on_zoom_out_pressed);
+            #endif
             
-            zoom_group.pack_start(zoom_out_box, false, false, 0);
+            prepend(zoom_out);
 
             // virgin ZoomSliderAssemblies are created such that they have whatever value is
             // persisted in the configuration system for the photo thumbnail scale
@@ -75,18 +73,14 @@ public abstract class MediaPage : CheckerboardPage {
             slider.set_size_request(200, -1);
             slider.set_tooltip_text(_("Adjust the size of the thumbnails"));
 
-            zoom_group.pack_start(slider, false, false, 0);
+            prepend(slider);
 
-            Gtk.Image zoom_in = new Gtk.Image.from_icon_name("image-zoom-in-symbolic", 
Gtk.IconSize.SMALL_TOOLBAR);
-            Gtk.EventBox zoom_in_box = new Gtk.EventBox();
-            zoom_in_box.set_above_child(true);
-            zoom_in_box.set_visible_window(false);
-            zoom_in_box.add(zoom_in);
+            Gtk.Image zoom_in = new Gtk.Image.from_icon_name("image-zoom-in-symbolic");
+            #if 0
             zoom_in_box.button_press_event.connect(on_zoom_in_pressed);
+            #endif
 
-            zoom_group.pack_start(zoom_in_box, false, false, 0);
-
-            add(zoom_group);
+            prepend(zoom_in);
         }
         
         public static double scale_to_slider(int value) {
@@ -105,6 +99,7 @@ public abstract class MediaPage : CheckerboardPage {
             return res;
         }
 
+#if 0
         private bool on_zoom_out_pressed(Gdk.EventButton event) {
             snap_to_min();
             return true;
@@ -114,6 +109,7 @@ public abstract class MediaPage : CheckerboardPage {
             snap_to_max();
             return true;
         }
+        #endif
         
         private void on_slider_changed() {
             zoom_changed();
@@ -158,7 +154,7 @@ public abstract class MediaPage : CheckerboardPage {
     }
     
     private ZoomSliderAssembly? connected_slider = null;
-    private DragAndDropHandler dnd_handler = null;
+    //private DragAndDropHandler dnd_handler = null;
     private MediaViewTracker tracker;
     
     protected MediaPage(string page_name) {
@@ -181,7 +177,7 @@ public abstract class MediaPage : CheckerboardPage {
         get_view().thaw_notifications();
 
         // enable drag-and-drop export of media
-        dnd_handler = new DragAndDropHandler(this);
+        //TODO dnd_handler = new DragAndDropHandler(this);
     }
    
     private static int compute_zoom_scale_increase(int current_scale) {
@@ -383,6 +379,7 @@ public abstract class MediaPage : CheckerboardPage {
         return new ZoomSliderAssembly();
     }
 
+#if 0
     protected override bool on_mousewheel_up(Gdk.EventScroll event) {
         if ((event.state & Gdk.ModifierType.CONTROL_MASK) != 0) {
             increase_zoom_level();
@@ -400,6 +397,7 @@ public abstract class MediaPage : CheckerboardPage {
             return base.on_mousewheel_down(event);
         }
     }
+    #endif
     
     private void on_send_to() {
         DesktopIntegration.send_to((Gee.Collection<MediaSource>) get_view().get_selected_sources());
@@ -421,6 +419,7 @@ public abstract class MediaPage : CheckerboardPage {
         }
     }
 
+#if 0
     protected override bool on_app_key_pressed(Gdk.EventKey event) {
         bool handled = true;
         switch (Gdk.keyval_name(event.keyval)) {
@@ -483,6 +482,7 @@ public abstract class MediaPage : CheckerboardPage {
         
         return handled ? true : base.on_app_key_pressed(event);
     }
+    #endif
 
     public override void switched_to() {
         base.switched_to();
@@ -689,7 +689,7 @@ public abstract class MediaPage : CheckerboardPage {
         CheckerboardItem? restore_point = null;
 
         if (cursor != null) {
-            restore_point = get_view().get_next(cursor) as CheckerboardItem;
+            restore_point = get_view().get_next(current_cursor) as CheckerboardItem;
         }
 
         var sources = get_view().get_selected_sources();
@@ -940,10 +940,10 @@ public abstract class MediaPage : CheckerboardPage {
         set_view_comparator(sort_by, sort_ascending);
     }
 
-    public override void destroy() {
+    public override void dispose() {
         disconnect_slider();
         
-        base.destroy();
+        base.dispose();
     }
 
     public void increase_zoom_level() {
diff --git a/src/MetadataWriter.vala b/src/MetadataWriter.vala
index f55a11eb..75ad60c9 100644
--- a/src/MetadataWriter.vala
+++ b/src/MetadataWriter.vala
@@ -691,7 +691,7 @@ public class MetadataWriter : Object {
             job.photo.set_master_metadata_dirty(false);
         } catch (DatabaseError err) {
             AppWindow.database_error(err);
-        }
+        } catch (Error err) { }
         
         LibraryPhoto.global.transaction_controller.commit();
         
diff --git a/src/Page.vala b/src/Page.vala
index b0fa3f67..addaf0fe 100644
--- a/src/Page.vala
+++ b/src/Page.vala
@@ -59,7 +59,7 @@ public abstract class Page : Gtk.ScrolledWindow {
     private const int CONSIDER_CONFIGURE_HALTED_MSEC = 400;
     
     protected Gtk.Builder builder = new Gtk.Builder ();
-    protected Gtk.Toolbar toolbar;
+    protected Gtk.Box toolbar;
     protected bool in_view = false;
     
     private string page_name;
@@ -78,7 +78,7 @@ public abstract class Page : Gtk.ScrolledWindow {
     private bool alt_pressed = false;
     private bool shift_pressed = false;
     private bool super_pressed = false;
-    private Gdk.CursorType last_cursor = Gdk.CursorType.LEFT_PTR;
+    private string last_cursor = "default";
     private bool cursor_hidden = false;
     private int cursor_hide_msec = 0;
     private uint last_timeout_id = 0;
@@ -95,7 +95,7 @@ public abstract class Page : Gtk.ScrolledWindow {
         
         set_can_focus(true);
 
-        popup_menu.connect(on_context_keypress);
+        //popup_menu.connect(on_context_keypress);
         
         realize.connect(attach_view_signals);
     }
@@ -108,7 +108,7 @@ public abstract class Page : Gtk.ScrolledWindow {
     
     // This is called by the page controller when it has removed this page ... pages should override
     // this (or the signal) to clean up
-    public override void destroy() {
+    public override void dispose() {
         if (is_destroyed)
             return;
         
@@ -165,6 +165,7 @@ public abstract class Page : Gtk.ScrolledWindow {
     }
     
     public void set_event_source(Gtk.Widget event_source) {
+    #if 0
         assert(this.event_source == null);
 
         this.event_source = event_source;
@@ -181,9 +182,11 @@ public abstract class Page : Gtk.ScrolledWindow {
         event_source.leave_notify_event.connect(on_leave_notify_event);
         event_source.scroll_event.connect(on_mousewheel_internal);
         event_source.realize.connect(on_event_source_realize);
+        #endif 
     }
     
     private void detach_event_source() {
+    #if 0
         if (event_source == null)
             return;
         
@@ -196,6 +199,7 @@ public abstract class Page : Gtk.ScrolledWindow {
         disable_drag_source();
         
         event_source = null;
+        #endif
     }
     
     public Gtk.Widget? get_event_source() {
@@ -251,18 +255,17 @@ public abstract class Page : Gtk.ScrolledWindow {
         return model;
     }
 
-    public virtual Gtk.Toolbar get_toolbar() {
+    public virtual Gtk.Box get_toolbar() {
         if (toolbar == null) {
-            toolbar = toolbar_path == null ? new Gtk.Toolbar() :
+            toolbar = toolbar_path == null ? new Gtk.Box(Gtk.Orientation.HORIZONTAL, 9) :
                                              builder.get_object (toolbar_path)
-                                             as Gtk.Toolbar;
+                                             as Gtk.Box;
             toolbar.get_style_context().add_class("bottom-toolbar");  // for elementary theme
-            toolbar.set_icon_size(Gtk.IconSize.SMALL_TOOLBAR);
         }
         return toolbar;
     }
     
-    public virtual Gtk.Menu? get_page_context_menu() {
+    public virtual Gtk.PopoverMenu? get_page_context_menu() {
         return null;
     }
     
@@ -339,14 +342,7 @@ public abstract class Page : Gtk.ScrolledWindow {
 
         action.set_enabled (sensitive);
     }
-    
-    public void activate_action(string name) {
-        var action = get_action(name);
-
-        if (action != null)
-            action.activate (null);
-    }
-    
+   
     public GLib.Action? get_common_action(string name, bool log_warning = true) {
         var action = get_action (name);
 
@@ -403,6 +399,7 @@ public abstract class Page : Gtk.ScrolledWindow {
     }
 
     private bool get_modifiers(out bool ctrl, out bool alt, out bool shift, out bool super) {
+    #if 0
         if (AppWindow.get_instance().get_window() == null) {
             ctrl = false;
             alt = false;
@@ -423,6 +420,8 @@ public abstract class Page : Gtk.ScrolledWindow {
         super = (mask & Gdk.ModifierType.MOD4_MASK) != 0; // not SUPER_MASK
         
         return true;
+        #endif
+        return false;
     }
 
     private void update_modifiers() {
@@ -433,6 +432,7 @@ public abstract class Page : Gtk.ScrolledWindow {
             return;
         }
         
+        #if 0
         if (ctrl_pressed && !ctrl_currently_pressed)
             on_ctrl_released(null);
         else if (!ctrl_pressed && ctrl_currently_pressed)
@@ -452,6 +452,7 @@ public abstract class Page : Gtk.ScrolledWindow {
             on_super_released(null);
         else if (!super_pressed && super_currently_pressed)
             on_super_pressed(null);
+            #endif
         
         ctrl_pressed = ctrl_currently_pressed;
         alt_pressed = alt_currently_pressed;
@@ -594,12 +595,13 @@ public abstract class Page : Gtk.ScrolledWindow {
     
     // This method enables drag-and-drop on the event source and routes its events through this
     // object
-    public void enable_drag_source(Gdk.DragAction actions, Gtk.TargetEntry[] source_target_entries) {
+    public void enable_drag_source(Gdk.DragAction actions, Gdk.ContentFormats[] source_target_entries) {
         if (dnd_enabled)
             return;
             
         assert(event_source != null);
         
+        #if 0
         Gtk.drag_source_set(event_source, Gdk.ModifierType.BUTTON1_MASK, source_target_entries, actions);
         
         // hook up handlers which route the event_source's DnD signals to the Page's (necessary
@@ -611,6 +613,7 @@ public abstract class Page : Gtk.ScrolledWindow {
         event_source.drag_failed.connect(on_drag_failed);
         
         dnd_enabled = true;
+        #endif
     }
     
     public void disable_drag_source() {
@@ -619,13 +622,14 @@ public abstract class Page : Gtk.ScrolledWindow {
 
         assert(event_source != null);
         
+        #if 0
         event_source.drag_begin.disconnect(on_drag_begin);
         event_source.drag_data_get.disconnect(on_drag_data_get);
         event_source.drag_data_delete.disconnect(on_drag_data_delete);
         event_source.drag_end.disconnect(on_drag_end);
         event_source.drag_failed.disconnect(on_drag_failed);
         Gtk.drag_source_unset(event_source);
-        
+        #endif
         dnd_enabled = false;
     }
     
@@ -633,6 +637,7 @@ public abstract class Page : Gtk.ScrolledWindow {
         return dnd_enabled;
     }
     
+    #if 0
     private void on_drag_begin(Gdk.DragContext context) {
         drag_begin(context);
     }
@@ -661,6 +666,7 @@ public abstract class Page : Gtk.ScrolledWindow {
     private bool on_drag_failed(Gdk.DragContext context, Gtk.DragResult drag_result) {
         return source_drag_failed(context, drag_result);
     }
+    #endif
     
     // Use this function rather than GDK or GTK's get_pointer, especially if called during a 
     // button-down mouse drag (i.e. a window grab).
@@ -676,7 +682,7 @@ public abstract class Page : Gtk.ScrolledWindow {
         }
         
         var seat = Gdk.Display.get_default().get_default_seat();
-        event_source.get_window().get_device_position(seat.get_pointer(), out x, out y, out mask);
+        //event_source.get_window().get_device_position(seat.get_pointer(), out x, out y, out mask);
         
         if (last_down.x < 0 || last_down.y < 0)
             return true;
@@ -694,6 +700,7 @@ public abstract class Page : Gtk.ScrolledWindow {
         return true;
     }
     
+    #if 0
     protected virtual bool on_left_click(Gdk.EventButton event) {
         return false;
     }
@@ -965,6 +972,7 @@ public abstract class Page : Gtk.ScrolledWindow {
 
         return on_configure(event, rect);
     }
+    #endif
     
     private bool check_configure_halted() {
         if (is_destroyed)
@@ -976,11 +984,13 @@ public abstract class Page : Gtk.ScrolledWindow {
         Gtk.Allocation allocation;
         get_allocation(out allocation);
         
+        #if 0
         if (report_move_finished)
             on_move_finished((Gdk.Rectangle) allocation);
         
         if (report_resize_finished)
             on_resize_finished((Gdk.Rectangle) allocation);
+            #endif
         
         last_configure_ms = 0;
         report_move_finished = false;
@@ -989,16 +999,19 @@ public abstract class Page : Gtk.ScrolledWindow {
         return false;
     }
     
+    #if 0
     protected virtual bool on_motion(Gdk.EventMotion event, int x, int y, Gdk.ModifierType mask) {
         check_cursor_hiding();
 
         return false;
     }
+    #endif
     
     protected virtual bool on_leave_notify_event() {
         return false;
     }
     
+    #if 0
     private bool on_motion_internal(Gdk.EventMotion event) {
         int x, y;
         Gdk.ModifierType mask;
@@ -1064,19 +1077,24 @@ public abstract class Page : Gtk.ScrolledWindow {
     protected virtual bool on_mousewheel_right(Gdk.EventScroll event) {
         return false;
     }
+    #endif
     
     protected virtual bool on_context_keypress() {
         return false;
     }
     
+    #if 0
     protected virtual bool on_context_buttonpress(Gdk.EventButton event) {
         return false;
     }
+    #endif
     
+
     protected virtual bool on_context_invoked() {
         return true;
     }
 
+#if 0
     protected bool popup_context_menu(Gtk.Menu? context_menu,
         Gdk.EventButton? event = null) {
 
@@ -1087,7 +1105,10 @@ public abstract class Page : Gtk.ScrolledWindow {
 
         return true;
     }
+    #endif
+
 
+#if 0
     protected void on_event_source_realize() {
         assert(event_source.get_window() != null); // the realize event means the Widget has a window
 
@@ -1105,6 +1126,7 @@ public abstract class Page : Gtk.ScrolledWindow {
         if (parent_window != null)
             last_cursor = parent_window.get_cursor().get_cursor_type();
     }
+    #endif
 
     public void set_cursor_hide_time(int hide_time) {
         cursor_hide_msec = hide_time;
@@ -1138,12 +1160,11 @@ public abstract class Page : Gtk.ScrolledWindow {
     }
 
     // Use this method to set the cursor for a page, NOT window.set_cursor(...)
-    protected virtual void set_page_cursor(Gdk.CursorType cursor_type) {
+    protected virtual void set_page_cursor(string cursor_type) {
         last_cursor = cursor_type;
 
         if (!cursor_hidden && event_source != null) {
-            var display = event_source.get_window ().get_display ();
-            event_source.get_window().set_cursor(new Gdk.Cursor.for_display(display, cursor_type));
+            event_source.set_cursor (new Gdk.Cursor.from_name (cursor_type, null));
         }
     }
 
@@ -1164,8 +1185,7 @@ public abstract class Page : Gtk.ScrolledWindow {
         cursor_hidden = true;
 
         if (event_source != null) {
-            var display = event_source.get_window().get_display ();
-            event_source.get_window().set_cursor(new Gdk.Cursor.for_display(display, 
Gdk.CursorType.BLANK_CURSOR));
+            event_source.set_cursor (new Gdk.Cursor.from_name ("none", null));
         }
 
         // We remove the timeout so reset the id
diff --git a/src/Photo.vala b/src/Photo.vala
index 04eb504b..4f5b8b4c 100644
--- a/src/Photo.vala
+++ b/src/Photo.vala
@@ -1722,6 +1722,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
             AppWindow.database_error(err);
             
             return;
+        } catch (Error err) {
         }
         
         if (is_master_baseline())
@@ -1731,7 +1732,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
     }
     
     // Use this only if the editable file's modification time has been changed (i.e. touched)
-    public void update_editable_modification_time(FileInfo info) throws DatabaseError {
+    public void update_editable_modification_time(FileInfo info) throws DatabaseError, Error {
         TimeVal modification = info.get_modification_time();
         
         bool altered = false;
@@ -1750,7 +1751,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
     
     // Most useful if the appropriate SourceCollection is frozen while calling this.
     public static void update_many_editable_timestamps(Gee.Map<Photo, FileInfo> map)
-        throws DatabaseError {
+        throws DatabaseError, Error {
         DatabaseTable.begin_transaction();
         foreach (Photo photo in map.keys)
             photo.update_editable_modification_time(map.get(photo));
@@ -1868,6 +1869,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
             }
         } catch (DatabaseError err) {
             AppWindow.database_error(err);
+        } catch (Error err) {
         }
         
         if (altered) {
@@ -1921,6 +1923,8 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
             }
         } catch (DatabaseError err) {
             AppWindow.database_error(err);
+        } catch (Error err) {
+            // TODO
         }
         
         if (altered) {
@@ -2182,7 +2186,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
         }
     }
     
-    public void set_master_metadata_dirty(bool dirty) throws DatabaseError {
+    public void set_master_metadata_dirty(bool dirty) throws DatabaseError, Error {
         bool committed = false;
         lock (row) {
             if (row.metadata_dirty != dirty) {
@@ -3023,6 +3027,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
     }    
     
     // All instances are against the coordinate system of the unscaled, unrotated photo.
+    #if 0
     private EditingTools.RedeyeInstance[] get_raw_redeye_instances() {
         KeyValueMap map = get_transformation("redeye");
         if (map == null)
@@ -3041,7 +3046,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
             string center_key = "center%d".printf(i);
             string radius_key = "radius%d".printf(i);
 
-            res[i].center = map.get_point(center_key, default_point);
+            //res[i].center = map.get_point(center_key, default_point);
             assert(res[i].center.x != default_point.x);
             assert(res[i].center.y != default_point.y);
 
@@ -3080,6 +3085,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
         if (set_transformation(map))
             notify_altered(new Alteration("image", "redeye"));
     }
+    #endif
 
     // Pixbuf generation
     
@@ -3440,7 +3446,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
         Dimensions scaled_to_viewport;
         Dimensions original = Dimensions();
         Dimensions scaled = Dimensions();
-        EditingTools.RedeyeInstance[] redeye_instances = null;
+        //EditingTools.RedeyeInstance[] redeye_instances = null;
         Box crop;
         double straightening_angle;
         PixelTransformer transformer = null;
@@ -3453,7 +3459,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
             
             is_scaled = !(get_dimensions().equals(scaled));
                         
-            redeye_instances = get_raw_redeye_instances();
+            //redeye_instances = get_raw_redeye_instances();
             
             is_cropped = get_raw_crop(out crop);
 
@@ -3481,9 +3487,11 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
 #if MEASURE_PIPELINE
             timer.start();
 #endif
+#if 0
             foreach (EditingTools.RedeyeInstance instance in redeye_instances) {
                 pixbuf = do_redeye(pixbuf, instance);
             }
+            #endif
 #if MEASURE_PIPELINE
             redeye_time = timer.elapsed();
 #endif
@@ -4096,6 +4104,8 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
                 }
             } catch (DatabaseError err) {
                 warning("Unable to remove editable from PhotoTable: %s", err.message);
+            } catch (Error err) {
+                // TODO
             }
             
             try {
@@ -4284,6 +4294,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
         set_raw_straighten(theta);
     }
     
+    #if 0
     private Gdk.Pixbuf do_redeye(Gdk.Pixbuf pixbuf, EditingTools.RedeyeInstance inst) {
         /* we remove redeye within a circular region called the "effect
            extent." the effect extent is inscribed within its "bounding
@@ -4347,6 +4358,7 @@ public abstract class Photo : PhotoSource, Dateable, Positionable {
         
         return pixbuf;
     }
+    #endif
 
     private Gdk.Pixbuf red_reduce_pixel(Gdk.Pixbuf pixbuf, int x, int y) {
         int px_start_byte_offset = (y * pixbuf.get_rowstride()) +
diff --git a/src/PhotoPage.vala b/src/PhotoPage.vala
index 7b5e758f..dc83b1e5 100644
--- a/src/PhotoPage.vala
+++ b/src/PhotoPage.vala
@@ -371,18 +371,20 @@ public abstract class EditingHostPage : SinglePhotoPage {
     public const int PIXBUF_CACHE_COUNT = 5;
     public const int ORIGINAL_PIXBUF_CACHE_COUNT = 5;
     
-    private class EditingHostCanvas : EditingTools.PhotoCanvas {
+    private class EditingHostCanvas : Object { //EditingTools.PhotoCanvas {
         private EditingHostPage host_page;
         
         public EditingHostCanvas(EditingHostPage host_page) {
+        #if 0
             base(host_page.get_container(), host_page.canvas.get_window(), host_page.get_photo(),
                 host_page.get_cairo_context(), host_page.get_surface_dim(), host_page.get_scaled_pixbuf(),
                 host_page.get_scaled_pixbuf_position());
             
+            #endif
             this.host_page = host_page;
         }
         
-        public override void repaint() {
+        public /* override */ void repaint() {
             host_page.repaint();
         }
     }
@@ -391,25 +393,29 @@ public abstract class EditingHostPage : SinglePhotoPage {
     private ViewCollection? parent_view = null;
     private Gdk.Pixbuf swapped = null;
     private bool pixbuf_dirty = true;
-    private Gtk.ToolButton rotate_button = null;
-    private Gtk.ToggleToolButton crop_button = null;
-    private Gtk.ToggleToolButton redeye_button = null;
-    private Gtk.ToggleToolButton adjust_button = null;
-    private Gtk.ToggleToolButton straighten_button = null;
+    private Gtk.Button rotate_button = null;
+    private Gtk.ToggleButton crop_button = null;
+    private Gtk.ToggleButton redeye_button = null;
+    private Gtk.ToggleButton adjust_button = null;
+    private Gtk.ToggleButton straighten_button = null;
 #if ENABLE_FACES
-    private Gtk.ToggleToolButton faces_button = null;
+    private Gtk.ToggleButton faces_button = null;
 #endif
-    private Gtk.ToolButton enhance_button = null;
+    private Gtk.Button enhance_button = null;
     private Gtk.Scale zoom_slider = null;
-    private Gtk.ToolButton prev_button = new Gtk.ToolButton(null, Resources.PREVIOUS_LABEL);
-    private Gtk.ToolButton next_button = new Gtk.ToolButton(null, Resources.NEXT_LABEL);
+    private Gtk.Button prev_button = new Gtk.Button.with_label(Resources.PREVIOUS_LABEL);
+    private Gtk.Button next_button = new Gtk.Button.with_label(Resources.NEXT_LABEL);
+    # if 0
     private EditingTools.EditingTool current_tool = null;
-    private Gtk.ToggleToolButton current_editing_toggle = null;
+    #endif 
+    private Gtk.ToggleButton current_editing_toggle = null;
     private Gdk.Pixbuf cancel_editing_pixbuf = null;
     private bool photo_missing = false;
     private PixbufCache cache = null;
     private PixbufCache master_cache = null;
+    #if 0
     private DragAndDropHandler dnd_handler = null;
+    #endif
     private bool enable_interactive_zoom_refresh = false;
     private Gdk.Point zoom_pan_start_point;
     private bool is_pan_in_progress = false;
@@ -431,132 +437,109 @@ public abstract class EditingHostPage : SinglePhotoPage {
         
         // the viewport can change size independent of the window being resized (when the searchbar
         // disappears, for example)
-        viewport.size_allocate.connect(on_viewport_resized);
+        //viewport.resize.connect(on_viewport_resized);
         
         // set up page's toolbar (used by AppWindow for layout and FullscreenWindow as a popup)
-        Gtk.Toolbar toolbar = get_toolbar();
+        var toolbar = get_toolbar();
         
         // rotate tool
-        rotate_button = new Gtk.ToolButton (null, Resources.ROTATE_CW_LABEL);
+        rotate_button = new Gtk.Button.with_label(Resources.ROTATE_CW_LABEL);
         rotate_button.set_icon_name(Resources.CLOCKWISE);
         rotate_button.set_tooltip_text(Resources.ROTATE_CW_TOOLTIP);
         rotate_button.clicked.connect(on_rotate_clockwise);
-        rotate_button.is_important = true;
-        toolbar.insert(rotate_button, -1);
+        toolbar.append(rotate_button);
+        #if 0
         unowned Gtk.BindingSet binding_set = Gtk.BindingSet.by_class(rotate_button.get_class());
         Gtk.BindingEntry.add_signal(binding_set, Gdk.Key.KP_Space, Gdk.ModifierType.CONTROL_MASK, "clicked", 
0);
         Gtk.BindingEntry.add_signal(binding_set, Gdk.Key.space, Gdk.ModifierType.CONTROL_MASK, "clicked", 0);
+        #endif
         
         // crop tool
-        crop_button = new Gtk.ToggleToolButton ();
+        crop_button = new Gtk.ToggleButton ();
         crop_button.set_icon_name("image-crop-symbolic");
         crop_button.set_label(Resources.CROP_LABEL);
         crop_button.set_tooltip_text(Resources.CROP_TOOLTIP);
-        crop_button.toggled.connect(on_crop_toggled);
-        crop_button.is_important = true;
-        toolbar.insert(crop_button, -1);
+//        crop_button.toggled.connect(on_crop_toggled);
+        toolbar.append(crop_button);
 
         // straightening tool
-        straighten_button = new Gtk.ToggleToolButton ();
+        straighten_button = new Gtk.ToggleButton ();
         straighten_button.set_icon_name(Resources.STRAIGHTEN);
         straighten_button.set_label(Resources.STRAIGHTEN_LABEL);
         straighten_button.set_tooltip_text(Resources.STRAIGHTEN_TOOLTIP);
-        straighten_button.toggled.connect(on_straighten_toggled);
-        straighten_button.is_important = true;
-        toolbar.insert(straighten_button, -1);
+//        straighten_button.toggled.connect(on_straighten_toggled);
+        toolbar.append(straighten_button);
 
         // redeye reduction tool
-        redeye_button = new Gtk.ToggleToolButton ();
+        redeye_button = new Gtk.ToggleButton ();
         redeye_button.set_icon_name("stock-eye-symbolic");
         redeye_button.set_label(Resources.RED_EYE_LABEL);
         redeye_button.set_tooltip_text(Resources.RED_EYE_TOOLTIP);
-        redeye_button.toggled.connect(on_redeye_toggled);
-        redeye_button.is_important = true;
-        toolbar.insert(redeye_button, -1);
+//        redeye_button.toggled.connect(on_redeye_toggled;
+        toolbar.append(redeye_button);
         
         // adjust tool
-        adjust_button = new Gtk.ToggleToolButton();
+        adjust_button = new Gtk.ToggleButton();
         adjust_button.set_icon_name(Resources.ADJUST);
         adjust_button.set_label(Resources.ADJUST_LABEL);
         adjust_button.set_tooltip_text(Resources.ADJUST_TOOLTIP);
-        adjust_button.toggled.connect(on_adjust_toggled);
-        adjust_button.is_important = true;
-        toolbar.insert(adjust_button, -1);
+//        adjust_button.toggled.connect(on_adjust_toggled);
+        toolbar.append(adjust_button);
 
         // enhance tool
-        enhance_button = new Gtk.ToolButton(null, Resources.ENHANCE_LABEL);
+        enhance_button = new Gtk.Button.with_label (Resources.ENHANCE_LABEL);
         enhance_button.set_icon_name(Resources.ENHANCE);
         enhance_button.set_tooltip_text(Resources.ENHANCE_TOOLTIP);
-        enhance_button.clicked.connect(on_enhance);
-        enhance_button.is_important = true;
-        toolbar.insert(enhance_button, -1);
+//        enhance_button.clicked.connect(on_enhance);
+        toolbar.append (enhance_button);
         
 #if ENABLE_FACES
         // faces tool
         insert_faces_button(toolbar);
-        faces_button = new Gtk.ToggleToolButton();
+        faces_button = new Gtk.ToggleButton();
         //face_button
 #endif
 
         // separator to force next/prev buttons to right side of toolbar
-        Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem();
-        separator.set_expand(true);
-        separator.set_draw(false);
-        toolbar.insert(separator, -1);
         
         Gtk.Box zoom_group = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
         
-        Gtk.Image zoom_out = new Gtk.Image.from_icon_name("image-zoom-out-symbolic", 
Gtk.IconSize.SMALL_TOOLBAR);
-        Gtk.EventBox zoom_out_box = new Gtk.EventBox();
-        zoom_out_box.set_above_child(true);
-        zoom_out_box.set_visible_window(false);
-        zoom_out_box.add(zoom_out);
+        Gtk.Image zoom_out = new Gtk.Image.from_icon_name("image-zoom-out-symbolic");
+        //zoom_out.button_press_event.connect(on_zoom_out_pressed);
 
-        zoom_out_box.button_press_event.connect(on_zoom_out_pressed);
-
-        zoom_group.pack_start(zoom_out_box, false, false, 0);
+        zoom_group.append(zoom_out);
 
         // zoom slider
         zoom_slider = new Gtk.Scale(Gtk.Orientation.HORIZONTAL, new Gtk.Adjustment(0.0, 0.0, 1.1, 0.1, 0.1, 
0.1));
         zoom_slider.set_draw_value(false);
         zoom_slider.set_size_request(120, -1);
         zoom_slider.value_changed.connect(on_zoom_slider_value_changed);
+        #if 0
         zoom_slider.button_press_event.connect(on_zoom_slider_drag_begin);
         zoom_slider.button_release_event.connect(on_zoom_slider_drag_end);
         zoom_slider.key_press_event.connect(on_zoom_slider_key_press);
+        #endif
 
-        zoom_group.pack_start(zoom_slider, false, false, 0);
-        
-        Gtk.Image zoom_in = new Gtk.Image.from_icon_name("image-zoom-in-symbolic", 
Gtk.IconSize.SMALL_TOOLBAR);
-        Gtk.EventBox zoom_in_box = new Gtk.EventBox();
-        zoom_in_box.set_above_child(true);
-        zoom_in_box.set_visible_window(false);
-        zoom_in_box.add(zoom_in);
+        zoom_group.prepend(zoom_slider);
         
-        zoom_in_box.button_press_event.connect(on_zoom_in_pressed);
+        Gtk.Image zoom_in = new Gtk.Image.from_icon_name("image-zoom-in-symbolic");
+        //zoom_in.button_press_event.connect(on_zoom_in_pressed);
 
-        zoom_group.pack_start(zoom_in_box, false, false, 0);
+        zoom_group.prepend(zoom_in);
 
-        Gtk.ToolItem group_wrapper = new Gtk.ToolItem();
-        group_wrapper.add(zoom_group);
-
-        toolbar.insert(group_wrapper, -1);
-
-        separator = new Gtk.SeparatorToolItem();
-        separator.set_draw(false);
-        toolbar.insert(separator, -1);
+        toolbar.append(zoom_group);
 
         // previous button
         prev_button.set_tooltip_text(_("Previous photo"));
         prev_button.set_icon_name("go-previous-symbolic");
         prev_button.clicked.connect(on_previous_photo);
-        toolbar.insert(prev_button, -1);
+        toolbar.append(prev_button);
         
         // next button
         next_button.set_tooltip_text(_("Next photo"));
         next_button.set_icon_name("go-next-symbolic");
         next_button.clicked.connect(on_next_photo);
-        toolbar.insert(next_button, -1);
+        toolbar.append(next_button);
     }
     
     ~EditingHostPage() {
@@ -586,6 +569,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         update_cursor_for_zoom_context();
     }
 
+# if 0
     private bool on_zoom_slider_drag_begin(Gdk.EventButton event) {
         enable_interactive_zoom_refresh = true;
         
@@ -618,7 +602,9 @@ public abstract class EditingHostPage : SinglePhotoPage {
         snap_zoom_to_max();
         return true;
     }
+    #endif
 
+# if 0
     private Gdk.Point get_cursor_wrt_viewport(Gdk.EventScroll event) {
         Gdk.Point cursor_wrt_canvas = {0};
         cursor_wrt_canvas.x = (int) event.x;
@@ -654,6 +640,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
 
         return add_points(viewport_center_iso, cursor_wrt_center_iso);
     }
+    #endif
 
     private double snap_interpolation_factor(double interp) {
         if (interp < 0.03)
@@ -668,6 +655,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         return snap_interpolation_factor(get_zoom_state().get_interpolation_factor() + adjustment);
     }
 
+#if 0
     private void zoom_about_event_cursor_point(Gdk.EventScroll event, double zoom_increment) {
         if (photo_missing)
             return;
@@ -701,6 +689,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
 
         update_cursor_for_zoom_context();
     }
+    #endif
 
     protected void snap_zoom_to_min() {
         zoom_slider.set_value(0.0);
@@ -715,6 +704,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         zoom_slider.set_value(iso_state.get_interpolation_factor());
     }
 
+#if 0
     protected virtual bool on_zoom_slider_key_press(Gdk.EventKey event) {
         switch (Gdk.keyval_name(event.keyval)) {
             case "equal":
@@ -740,6 +730,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
 
         return false;
     }
+    #endif
 
     protected virtual void on_increase_size() {
         zoom_slider.set_value(adjust_interpolation_factor(ZOOM_INCREMENT_SIZE));
@@ -758,6 +749,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         return zoom_buffer;
     }
     
+    #if 0
     protected override bool on_mousewheel_up(Gdk.EventScroll event) {
         if (get_zoom_state().is_max() || !zoom_slider.get_sensitive())
             return false;
@@ -773,6 +765,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         zoom_about_event_cursor_point(event, -ZOOM_INCREMENT_SIZE);
         return true;
     }
+    #endif
 
     protected override void restore_zoom_state() {
         base.restore_zoom_state();
@@ -790,8 +783,8 @@ public abstract class EditingHostPage : SinglePhotoPage {
         base.set_container(container);
         
         // DnD not available in fullscreen mode
-        if (!(container is FullscreenWindow))
-            dnd_handler = new DragAndDropHandler(this);
+        //if (!(container is FullscreenWindow))
+          //  dnd_handler = new DragAndDropHandler(this);
     }
     
     public ViewCollection? get_parent_view() {
@@ -871,7 +864,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         cancel_zoom();
         is_pan_in_progress = false;
         
-        deactivate_tool();
+        //deactivate_tool();
 
         // Ticket #3255 - Checkerboard page didn't `remember` what was selected
         // when the user went into and out of the photo page without navigating 
@@ -889,7 +882,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
     public override void switching_to_fullscreen(FullscreenWindow fsw) {
         base.switching_to_fullscreen(fsw);
         
-        deactivate_tool();
+        //deactivate_tool();
         
         cancel_zoom();
         is_pan_in_progress = false;
@@ -976,6 +969,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
             // if no tool, use the pixbuf directly, otherwise, let the tool decide what should be
             // displayed
             Dimensions max_dim = photo.get_dimensions();
+            #if 0
             if (current_tool != null) {
                 try {
                     Dimensions tool_pixbuf_dim;
@@ -993,6 +987,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
                     return;
                 }
             }
+            #endif
             
             set_pixbuf(pixbuf, max_dim);
             pixbuf_dirty = false;
@@ -1106,7 +1101,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         enhance_button.sensitive = sensitivity;
         zoom_slider.sensitive = sensitivity;
 
-        deactivate_tool();
+        ////deactivate_tool();
     }
     
     // This should only be called when it's known that the photo is actually missing.
@@ -1177,7 +1172,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
             }
         }
         if (pixbuf == null) {
-            pixbuf = get_placeholder_pixbuf();
+            //pixbuf = get_placeholder_pixbuf();
             get_canvas_scaling().perform_on_pixbuf(pixbuf, Gdk.InterpType.NEAREST, true);
         }
         return pixbuf;
@@ -1199,7 +1194,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
                 return;
         }
 
-        deactivate_tool();
+        //deactivate_tool();
         
         // swap out new photo and old photo and process change
         Photo old_photo = get_photo();
@@ -1244,8 +1239,8 @@ public abstract class EditingHostPage : SinglePhotoPage {
         // a left pointer in case it had been a hand-grip cursor indicating that panning
         // was possible; the null guards are required because zoom can be cancelled at
         // any time
-        if (canvas != null && canvas.get_window() != null)
-            set_page_cursor(Gdk.CursorType.LEFT_PTR);
+        if (canvas != null /*&& canvas.get_window() != null*/)
+            set_page_cursor("default");
         
         repaint();
     }
@@ -1292,8 +1287,8 @@ public abstract class EditingHostPage : SinglePhotoPage {
         
         try {
             Dimensions tool_pixbuf_dim = {0};
-            if (current_tool != null)
-                pixbuf = current_tool.get_display_pixbuf(get_canvas_scaling(), photo, out tool_pixbuf_dim);
+            //if (current_tool != null)
+            //    pixbuf = current_tool.get_display_pixbuf(get_canvas_scaling(), photo, out tool_pixbuf_dim);
                 
             if (pixbuf != null)
                 max_dim = tool_pixbuf_dim;                
@@ -1323,7 +1318,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         
         return false;
     }
-    
+  #if 0  
     protected override void on_resize(Gdk.Rectangle rect) {
         base.on_resize(rect);
 
@@ -1339,6 +1334,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         
         update_pixbuf();
     }
+    #endif
     
     private void on_viewport_resized() {
         // this means the viewport (the display area) has changed, but not necessarily the
@@ -1360,6 +1356,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         
         rotate_button.sensitive = ((photo != null) && (!photo_missing) && photo.check_can_rotate()) ?
             is_rotate_available(photo) : false;
+            #if 0
         crop_button.sensitive = ((photo != null) && (!photo_missing)) ?
             EditingTools.CropTool.is_available(photo, scaling) : false;
         redeye_button.sensitive = ((photo != null) && (!photo_missing)) ?
@@ -1370,10 +1367,12 @@ public abstract class EditingHostPage : SinglePhotoPage {
             is_enhance_available(photo) : false;
         straighten_button.sensitive = ((photo != null) && (!photo_missing)) ?
             EditingTools.StraightenTool.is_available(photo, scaling) : false;
+            #endif
                     
         base.update_actions(selected_count, count);
     }
     
+    #if 0
     protected override bool on_shift_pressed(Gdk.EventKey? event) {
         // show quick compare of original only if no tool is in use, the original pixbuf is handy
         if (current_tool == null && !get_ctrl_pressed() && !get_alt_pressed() && has_photo())
@@ -1402,6 +1401,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         
         return base.on_alt_released(event);
     }
+    #endif
 
     private void swap_in_original() {
         Gdk.Pixbuf original;
@@ -1437,6 +1437,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         }
     }
 
+#if 0
     private void activate_tool(EditingTools.EditingTool tool) {
         // cancel any zoom -- we don't currently allow tools to be used when an image is zoomed,
         // though we may at some point in the future.
@@ -1486,7 +1487,9 @@ public abstract class EditingHostPage : SinglePhotoPage {
         // repaint entire view, with the tool now hooked in
         repaint();
     }
+    #endif
     
+    #if 0
     private void deactivate_tool(Command? command = null, Gdk.Pixbuf? new_pixbuf = null, 
         Dimensions new_max_dim = Dimensions(), bool needs_improvement = false) {
         if (current_tool == null)
@@ -1621,6 +1624,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
     protected override bool on_right_click(Gdk.EventButton event) {
         return on_context_buttonpress(event);
     }
+    #endif
     
     private void on_photos_altered(Gee.Map<DataObject, Alteration> map) {
         if (!map.has_key(get_photo()))
@@ -1660,12 +1664,13 @@ public abstract class EditingHostPage : SinglePhotoPage {
     
     private void update_cursor_for_zoom_context() {
         if (is_panning_possible())
-            set_page_cursor(Gdk.CursorType.FLEUR);
+            set_page_cursor("move");
         else
-            set_page_cursor(Gdk.CursorType.LEFT_PTR);
+            set_page_cursor("default");
     }
     
     // Return true to block the DnD handler from activating a drag
+    #if 0
     protected override bool on_motion(Gdk.EventMotion event, int x, int y, Gdk.ModifierType mask) {
         if (current_tool != null) {
             current_tool.on_motion(x, y, mask);
@@ -1814,21 +1819,24 @@ public abstract class EditingHostPage : SinglePhotoPage {
 
         return (base.key_press_event != null) ? base.key_press_event(event) : true;
     }
+    #endif
     
     protected override void new_surface(Cairo.Context default_ctx, Dimensions dim) {
         // if tool is open, update its canvas object
-        if (current_tool != null)
-            current_tool.canvas.set_surface(default_ctx, dim);
+        //if (current_tool != null)
+        //    current_tool.canvas.set_surface(default_ctx, dim);
     }
     
     protected override void updated_pixbuf(Gdk.Pixbuf pixbuf, SinglePhotoPage.UpdateReason reason, 
         Dimensions old_dim) {
         // only purpose here is to inform editing tool of change and drop the cancelled
         // pixbuf, which is now sized incorrectly
+        #if 0
         if (current_tool != null && reason != SinglePhotoPage.UpdateReason.QUALITY_IMPROVEMENT) {
             current_tool.canvas.resized_pixbuf(old_dim, pixbuf, get_scaled_pixbuf_position());
             cancel_editing_pixbuf = null;
         }
+        #endif
     }
     
     protected virtual Gdk.Pixbuf? get_bottom_left_trinket(int scale) {
@@ -1848,11 +1856,13 @@ public abstract class EditingHostPage : SinglePhotoPage {
     }
     
     protected override void paint(Cairo.Context ctx, Dimensions ctx_dim) {
+        #if 0
         if (current_tool != null) {
             current_tool.paint(ctx);
             
             return;
         }
+        #endif
         
         if (photo_missing && has_photo()) {
             set_source_color_from_string(ctx, "#000");
@@ -1915,7 +1925,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
     private void rotate(Rotation rotation, string name, string description) {
         cancel_zoom();
 
-        deactivate_tool();
+        //deactivate_tool();
         
         if (!has_photo())
             return;
@@ -1945,7 +1955,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         if (photo_missing)
             return;
 
-        deactivate_tool();
+        //deactivate_tool();
         
         if (!has_photo())
             return;
@@ -2028,6 +2038,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         }
     }
 
+#if 0
     protected override bool on_ctrl_pressed(Gdk.EventKey? event) {
         rotate_button.set_icon_name(Resources.COUNTERCLOCKWISE);
         rotate_button.set_label(Resources.ROTATE_CCW_LABEL);
@@ -2168,6 +2179,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         EnhanceSingleCommand command = new EnhanceSingleCommand(get_photo());
         get_command_manager().execute(command);
     }
+    #endif
     
     public void on_copy_adjustments() {
         if (!has_photo())
@@ -2186,6 +2198,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
         get_command_manager().execute(command);
     }
 
+#if 0
     private void place_tool_window() {
         if (current_tool == null)
             return;
@@ -2261,9 +2274,10 @@ public abstract class EditingHostPage : SinglePhotoPage {
         tool_window.show();
         tool_window.present();
     }
+    #endif
     
     protected override void on_next_photo() {
-        deactivate_tool();
+        //deactivate_tool();
         
         if (!has_photo())
             return;
@@ -2296,7 +2310,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
     }
     
     protected override void on_previous_photo() {
-        deactivate_tool();
+        //deactivate_tool();
         
         if (!has_photo())
             return;
@@ -2329,7 +2343,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
     }
 
     public bool has_current_tool() {
-        return (current_tool != null);
+        return false; //(current_tool != null);
     }
     
     protected void unset_view_collection() {
@@ -2340,7 +2354,7 @@ public abstract class EditingHostPage : SinglePhotoPage {
     // it in LibraryPhotoPage, since FacesTool must only be present in
     // LibraryMode, but it need to be called from constructor of EditingHostPage
     // to place it correctly in the toolbar.
-    protected virtual void insert_faces_button(Gtk.Toolbar toolbar) {
+    protected virtual void insert_faces_button(Gtk.Box toolbar) {
         ;
     }
 }
@@ -2420,13 +2434,13 @@ public class LibraryPhotoPage : EditingHostPage {
         { "RotateCounterclockwise", on_rotate_counterclockwise },
         { "FlipHorizontally", on_flip_horizontally },
         { "FlipVertically", on_flip_vertically },
-        { "Enhance", on_enhance },
+        //{ "Enhance", on_enhance },
         { "CopyColorAdjustments", on_copy_adjustments },
         { "PasteColorAdjustments", on_paste_adjustments },
-        { "Crop", toggle_crop },
-        { "Straighten", toggle_straighten },
-        { "RedEye", toggle_redeye },
-        { "Adjust", toggle_adjust },
+        //{ "Crop", toggle_crop },
+        //{ "Straighten", toggle_straighten },
+        //{ "RedEye", toggle_redeye },
+        //{ "Adjust", toggle_adjust },
         { "Revert", on_revert },
         { "EditTitle", on_edit_title },
         { "EditComment", on_edit_comment },
@@ -2546,9 +2560,9 @@ public class LibraryPhotoPage : EditingHostPage {
         set_action_sensitive("FlipVertically", rotate_possible);
 
         if (has_photo()) {
-            set_action_sensitive("Crop", EditingTools.CropTool.is_available(get_photo(), 
Scaling.for_original()));
-            set_action_sensitive("RedEye", EditingTools.RedeyeTool.is_available(get_photo(), 
-                Scaling.for_original()));
+//            set_action_sensitive("Crop", EditingTools.CropTool.is_available(get_photo(), 
Scaling.for_original()));
+//            set_action_sensitive("RedEye", EditingTools.RedeyeTool.is_available(get_photo(), 
+//                Scaling.for_original()));
         }
                  
         update_flag_action();
@@ -2615,7 +2629,8 @@ public class LibraryPhotoPage : EditingHostPage {
     public void display_for_collection(CollectionPage return_page, Photo photo, 
         ViewCollection? view = null) {
         this.return_page = return_page;
-        return_page.destroy.connect(on_page_destroyed);
+        //return_page.destroy.connect(on_page_destroyed);
+        //TODO
         
         display_copy_of(view != null ? view : return_page.get_view(), photo);
     }
@@ -2693,6 +2708,7 @@ public class LibraryPhotoPage : EditingHostPage {
         update_zoom_menu_item_sensitivity();
     }
 
+#if 0
     protected override bool on_zoom_slider_key_press(Gdk.EventKey event) {
         if (base.on_zoom_slider_key_press(event))
             return true;
@@ -2704,6 +2720,7 @@ public class LibraryPhotoPage : EditingHostPage {
             return false;
         }
     }
+    #endif
 
     protected override void update_ui(bool missing) {
         bool sensitivity = !missing;
@@ -2756,6 +2773,7 @@ public class LibraryPhotoPage : EditingHostPage {
         base.notify_photo_backing_missing(photo, missing);
     }
     
+    #if 0
     public override bool key_press_event(Gdk.EventKey event) {
         if (base.key_press_event != null && base.key_press_event(event) == true)
             return true;
@@ -2873,9 +2891,10 @@ public class LibraryPhotoPage : EditingHostPage {
 
         return true;
     }
+    #endif
 
     protected override bool on_context_keypress() {
-        popup_context_menu(get_context_menu());
+        //popup_context_menu(get_context_menu());
         
         return true;
     }
diff --git a/src/Portal.vala b/src/Portal.vala
index c2e8e1e0..5d30536b 100644
--- a/src/Portal.vala
+++ b/src/Portal.vala
@@ -51,6 +51,7 @@ public class Portal : GLib.Object {
     }
 
     private static async string get_parent_window () {
+    #if 0
         var window = AppWindow.get_instance().get_window ();
 
         if (window is Gdk.Wayland.Window) {
@@ -67,5 +68,7 @@ public class Portal : GLib.Object {
             warning ("Could not get parent window");
             return "";
         }
+        #endif
+        return "";
     }
 }
diff --git a/src/Printing.vala b/src/Printing.vala
index bef34760..ed4b5a6b 100644
--- a/src/Printing.vala
+++ b/src/Printing.vala
@@ -271,11 +271,11 @@ public class CustomPrintTab : Gtk.Box {
     private const int CENTIMETERS_COMBO_CHOICE = 1;
 
     [GtkChild]
-    private unowned Gtk.RadioButton standard_size_radio;
+    private unowned Gtk.ToggleButton standard_size_radio;
     [GtkChild]
-    private unowned Gtk.RadioButton custom_size_radio;
+    private unowned Gtk.ToggleButton custom_size_radio;
     [GtkChild]
-    private unowned Gtk.RadioButton image_per_page_radio;
+    private unowned Gtk.ToggleButton image_per_page_radio;
     [GtkChild]
     private unowned Gtk.ComboBoxText image_per_page_combo;
     [GtkChild]
@@ -321,23 +321,23 @@ public class CustomPrintTab : Gtk.Box {
         standard_sizes_combo.set_active(9 * Resources.get_default_measurement_unit());
 
         custom_width_entry.insert_text.connect(on_entry_insert_text);
-        custom_width_entry.focus_out_event.connect(on_width_entry_focus_out);
+        //custom_width_entry.focus_out_event.connect(on_width_entry_focus_out);
 
         custom_height_entry.insert_text.connect(on_entry_insert_text);
-        custom_height_entry.focus_out_event.connect(on_height_entry_focus_out);
+        //custom_height_entry.focus_out_event.connect(on_height_entry_focus_out);
 
         units_combo.changed.connect(on_units_combo_changed);
         units_combo.set_active(Resources.get_default_measurement_unit());
 
         ppi_entry.insert_text.connect(on_ppi_entry_insert_text);
-        ppi_entry.focus_out_event.connect(on_ppi_entry_focus_out);
+        //ppi_entry.focus_out_event.connect(on_ppi_entry_focus_out);
 
         sync_state_from_job(source_job);
 
-        show_all();
+        show();
 
         /* connect this signal after state is sync'd */
-        aspect_ratio_check.clicked.connect(on_aspect_ratio_check_clicked);
+        aspect_ratio_check.toggled.connect(on_aspect_ratio_check_clicked);
     }
 
     private void on_aspect_ratio_check_clicked() {
@@ -349,6 +349,7 @@ public class CustomPrintTab : Gtk.Box {
         }
     }
 
+#if 0
     private bool on_width_entry_focus_out(Gdk.EventFocus event) {
         if (custom_width_entry.get_text() == (format_measurement_as(local_content_width,
             get_user_unit_choice())))
@@ -375,6 +376,7 @@ public class CustomPrintTab : Gtk.Box {
         custom_width_entry.set_text(format_measurement(new_width));
         return false;
     }
+    #endif
 
     private string format_measurement(Measurement measurement) {
         return "%.2f".printf(measurement.value);
@@ -386,10 +388,12 @@ public class CustomPrintTab : Gtk.Box {
         return format_measurement(converted_measurement);
     }
 
+#if 0
     private bool on_ppi_entry_focus_out(Gdk.EventFocus event) {
         set_content_ppi(int.parse(ppi_entry.get_text()));
         return false;
     }
+    #endif
 
     private void on_ppi_entry_insert_text(Gtk.Editable editable, string text, int length,
         ref int position) {
@@ -417,6 +421,7 @@ public class CustomPrintTab : Gtk.Box {
         is_text_insertion_in_progress = false;
     }
 
+#if 0
     private bool on_height_entry_focus_out(Gdk.EventFocus event) {
         if (custom_height_entry.get_text() == (format_measurement_as(local_content_height,
             get_user_unit_choice())))
@@ -443,6 +448,7 @@ public class CustomPrintTab : Gtk.Box {
         custom_height_entry.set_text(format_measurement(new_height));
         return false;
     }
+    #endif
 
     private MeasurementUnit get_user_unit_choice() {
         if (units_combo.get_active() == INCHES_COMBO_CHOICE) {
@@ -526,6 +532,7 @@ public class CustomPrintTab : Gtk.Box {
     }
 
     private void on_radio_group_click(Gtk.Button b) {
+    #if 0
         Gtk.RadioButton sender = (Gtk.RadioButton) b;
         
         if (sender == standard_size_radio) {
@@ -537,6 +544,7 @@ public class CustomPrintTab : Gtk.Box {
         } else if (sender == image_per_page_radio) {
             set_content_layout_control_state(ContentLayout.IMAGE_PER_PAGE);
         }
+        #endif
     }
 
     private void on_units_combo_changed() {
diff --git a/src/Properties.vala b/src/Properties.vala
index 181957ba..a29f1892 100644
--- a/src/Properties.vala
+++ b/src/Properties.vala
@@ -13,7 +13,7 @@ private abstract class Properties : Gtk.Box {
 
         grid.row_spacing = 6;
         grid.column_spacing = 12;
-        pack_start(grid, false, false, 0);
+        append(grid);
     }
 
     protected void add_line(string label_text, string info_text, bool multi_line = false, string? href = 
null) {
@@ -26,8 +26,7 @@ private abstract class Properties : Gtk.Box {
         label.set_markup(GLib.Markup.printf_escaped("<span font_weight=\"bold\">%s</span>", label_text));
 
         if (multi_line) {
-            Gtk.ScrolledWindow info_scroll = new Gtk.ScrolledWindow(null, null);
-            info_scroll.shadow_type = Gtk.ShadowType.NONE;
+            Gtk.ScrolledWindow info_scroll = new Gtk.ScrolledWindow();
             Gtk.TextView view = new Gtk.TextView();
             // by default TextView widgets have a white background, which
             // makes sense during editing. In this instance we only *show*
@@ -39,7 +38,7 @@ private abstract class Properties : Gtk.Box {
             view.set_editable(false);
             view.buffer.text = is_string_empty(info_text) ? "" : info_text;
             view.hexpand = true;
-            info_scroll.add(view);
+            info_scroll.set_child(view);
             label.halign = Gtk.Align.END;
             label.valign = Gtk.Align.START;
             info = (Gtk.Widget) info_scroll;
@@ -144,8 +143,8 @@ private abstract class Properties : Gtk.Box {
     }
 
     protected virtual void clear_properties() {
-        foreach (Gtk.Widget child in grid.get_children())
-            grid.remove(child);
+        //foreach (Gtk.Widget child in grid.get_children())
+        //    grid.remove(child);
 
         line_count = 0;
     }
@@ -153,7 +152,7 @@ private abstract class Properties : Gtk.Box {
     public void update_properties(Page page) {
         clear_properties();
         internal_update_properties(page);
-        show_all();
+        show();
     }
 
     public virtual void internal_update_properties(Page page) {
diff --git a/src/Resources.vala b/src/Resources.vala
index 58283618..08d86a07 100644
--- a/src/Resources.vala
+++ b/src/Resources.vala
@@ -579,6 +579,7 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
             return cached_pixbuf;
 
         try {
+        #if 0
             var theme = Gtk.IconTheme.get_default();
             var info = theme.lookup_icon ("filter-videos-symbolic", (int)(scale * 2), 
Gtk.IconLookupFlags.GENERIC_FALLBACK);
             var icon = info.load_symbolic({0.8, 0.8, 0.8, 1.0}, null, null, null);
@@ -592,6 +593,8 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
 
             trinket_cache[cache_key] = Gdk.pixbuf_get_from_surface(surface, 0, 0, icon.width, icon.height);
             return trinket_cache[cache_key];
+            #endif
+            return null;
         } catch (Error err) {
             critical ("%s", err.message);
 
@@ -607,9 +610,9 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
             return cached_pixbuf;
 
         try {
-            var theme = Gtk.IconTheme.get_default();
-            var info = theme.lookup_icon ("filter-flagged-symbolic", (int)(scale * 1.33), 
Gtk.IconLookupFlags.GENERIC_FALLBACK);
-            var icon = info.load_symbolic({0.8, 0.8, 0.8, 1.0}, null, null, null);
+        #if 0
+            var theme = Gtk.IconTheme.get_for_display (Gdk.Display.get_default());
+            var icon = theme.lookup_icon ("filter-flagged-symbolic", null, -1, Gtk.TextDirection.NONE, 
(int)(scale * 1.33), 0);
             var surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, icon.width, icon.height);
             var ctx = new Cairo.Context(surface);
             ctx.set_source_rgba(0.0, 0.0, 0.0, 0.35);
@@ -620,6 +623,8 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
 
             trinket_cache[cache_key] = Gdk.pixbuf_get_from_surface(surface, 0, 0, icon.width, icon.height);
             return trinket_cache[cache_key];
+            #endif
+            return null;
         } catch (Error err) {
             critical ("%s", err.message);
 
@@ -998,11 +1003,11 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
     private void init_css_provider() {
         Gtk.CssProvider provider = new Gtk.CssProvider();
         provider.load_from_resource("/org/gnome/Shotwell/themes/org.gnome.Shotwell.css");
-        Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), provider, 
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
+        Gtk.StyleContext.add_provider_for_display(Gdk.Display.get_default(), provider, 
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
     }
     
     private void init_icon_theme_engine() {
-        Gtk.IconTheme icon_theme = Gtk.IconTheme.get_default();
+        Gtk.IconTheme icon_theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default());
         icon_theme.add_resource_path("/org/gnome/Shotwell/icons");
         icon_theme.add_resource_path("/org/gnome/Shotwell/icons/hicolor");
     }
@@ -1045,6 +1050,7 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
     }
     
     public Gdk.Pixbuf? load_icon(string name, int scale = DEFAULT_ICON_SCALE) {
+    #if 0
         Gdk.Pixbuf pixbuf = null;
         try {
             var theme = Gtk.IconTheme.get_default();
@@ -1067,6 +1073,9 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
             return null;
 
         return (scale > 0) ? scale_pixbuf(pixbuf, scale, Gdk.InterpType.BILINEAR, false) : pixbuf;
+        #endif
+        // TODO
+        return null;
     }
 
     // Get the directory where our help files live.  Returns a string
@@ -1134,7 +1143,7 @@ along with Shotwell; if not, write to the Free Software Foundation, Inc.,
             uri += anchor;
         }
 
-        Gtk.show_uri_on_window(window, uri, Gdk.CURRENT_TIME);
+        Gtk.show_uri(window, uri, Gdk.CURRENT_TIME);
     }
     
     public const int ALL_DATA = -1;
diff --git a/src/SearchFilter.vala b/src/SearchFilter.vala
index 9a88cf2e..f72e94ab 100644
--- a/src/SearchFilter.vala
+++ b/src/SearchFilter.vala
@@ -620,7 +620,7 @@ public class SearchFilterActions {
 }
 
 public class SearchFilterToolbar : Gtk.Revealer {
-    private Gtk.Toolbar toolbar;
+    private Gtk.Box toolbar;
     private const int FILTER_BUTTON_MARGIN = 12; // the distance between icon and edge of button
     private const float FILTER_ICON_STAR_SCALE = 0.65f; // changes the size of the filter icon
     private const float FILTER_ICON_SCALE = 0.75f; // changes the size of the all photos icon
@@ -630,7 +630,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
     // filter_icon_plus_width is the width (in px) of the plus icon
     private const int FILTER_ICON_PLUS_WIDTH = 20;
     
-    private class LabelToolItem : Gtk.ToolItem {
+    private class LabelToolItem : Gtk.Box {
         private Gtk.Label label;
         
         public LabelToolItem(string s, int left_padding = 0, int right_padding = 0) {
@@ -641,11 +641,11 @@ public class SearchFilterToolbar : Gtk.Revealer {
                 label.margin_start = left_padding;
                 label.margin_end = right_padding;
             }
-            add (label);
+            append (label);
         }
     }
     
-    private class ToggleActionToolButton : Gtk.ToolItem {
+    private class ToggleActionToolButton : Gtk.Box {
         private Gtk.ToggleButton button;
 
         public ToggleActionToolButton(string action) {
@@ -653,17 +653,14 @@ public class SearchFilterToolbar : Gtk.Revealer {
             button.set_can_focus(false);
             button.set_action_name (action);
             button.set_has_tooltip(true);
-            button.set_relief(Gtk.ReliefStyle.NONE);
             button.set_margin_start(2);
             
-            this.add(button);
+            this.append (button);
         }
         
         public void set_icon_name(string icon_name) {
             Gtk.Image? image = null;
-            button.set_always_show_image(true);
-            image = new Gtk.Image.from_icon_name(icon_name, Gtk.IconSize.SMALL_TOOLBAR);
-            button.set_image(image);
+            image = new Gtk.Image.from_icon_name(icon_name);
             if (button.get_label() != "" && button.get_label() != null) {
                 image.margin_end = 6;
             }
@@ -678,11 +675,13 @@ public class SearchFilterToolbar : Gtk.Revealer {
     // Ticket #3260 - Add a 'close' context menu to
     // the searchbar.
     // The close menu. Populated below in the constructor.
+    #if 0
     private Gtk.Menu close_menu = new Gtk.Menu();
     private Gtk.MenuItem close_item = new Gtk.MenuItem();
+    #endif
 
     // Text search box.
-    protected class SearchBox : Gtk.ToolItem {
+    protected class SearchBox : Gtk.Box {
         private Gtk.SearchEntry search_entry;
         private TextAction action;
         
@@ -691,8 +690,8 @@ public class SearchFilterToolbar : Gtk.Revealer {
             search_entry = new Gtk.SearchEntry();
             
             search_entry.width_chars = 23;
-            search_entry.key_press_event.connect(on_escape_key); 
-            add(search_entry);
+            //search_entry.key_press_event.connect(on_escape_key); 
+            append(search_entry);
             
             set_nullable_text(action.value);
             
@@ -700,8 +699,8 @@ public class SearchFilterToolbar : Gtk.Revealer {
             action.sensitivity_changed.connect(on_sensitivity_changed);
             action.visibility_changed.connect(on_visibility_changed);
             
-            search_entry.buffer.deleted_text.connect(on_entry_changed);
-            search_entry.buffer.inserted_text.connect(on_entry_changed);
+            search_entry.delete_text.connect(on_entry_changed);
+            search_entry.insert_text.connect(on_entry_changed);
         }
         
         ~SearchBox() {
@@ -709,14 +708,15 @@ public class SearchFilterToolbar : Gtk.Revealer {
             action.sensitivity_changed.disconnect(on_sensitivity_changed);
             action.visibility_changed.disconnect(on_visibility_changed);
             
-            search_entry.buffer.deleted_text.disconnect(on_entry_changed);
-            search_entry.buffer.inserted_text.disconnect(on_entry_changed);
+            search_entry.delete_text.disconnect(on_entry_changed);
+            search_entry.insert_text.disconnect(on_entry_changed);
         }
         
         public void get_focus() {
-            search_entry.has_focus = true;
         }
         
+
+        #if 0
         // Ticket #3124 - user should be able to clear 
         // the search textbox by typing 'Esc'. 
         private bool on_escape_key(Gdk.EventKey e) { 
@@ -727,13 +727,14 @@ public class SearchFilterToolbar : Gtk.Revealer {
            // text entry functionality needs to see it too. 
             return false; 
         }
+        #endif
         
         private void on_action_text_changed(string? text) {
-            search_entry.buffer.deleted_text.disconnect(on_entry_changed);
-            search_entry.buffer.inserted_text.disconnect(on_entry_changed);
+            //search_entry.get_buffer().buffer.deleted_text.disconnect(on_entry_changed);
+            //search_entry.get_buffer().inserted_text.disconnect(on_entry_changed);
             set_nullable_text(text);
-            search_entry.buffer.deleted_text.connect(on_entry_changed);
-            search_entry.buffer.inserted_text.connect(on_entry_changed);
+            //search_entry.buffer.deleted_text.connect(on_entry_changed);
+            //search_entry.buffer.inserted_text.connect(on_entry_changed);
         }
         
         private void on_entry_changed() {
@@ -756,21 +757,20 @@ public class SearchFilterToolbar : Gtk.Revealer {
     }
     
     // Handles ratings filters.
-    protected class RatingFilterButton : Gtk.ToolItem {
+    protected class RatingFilterButton : Gtk.Box {
         public Gtk.MenuButton button;
 
         public RatingFilterButton(GLib.MenuModel model) {
             button = new Gtk.MenuButton();
 
-            button.set_image (get_filter_icon(RatingFilter.UNRATED_OR_HIGHER));
+            // TODO 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);
 
             set_homogeneous(false);
 
-            this.add(button);
+            this.append(button);
         }
 
         private Gtk.Widget get_filter_icon(RatingFilter filter) {
@@ -779,22 +779,22 @@ public class SearchFilterToolbar : Gtk.Revealer {
             switch (filter) {
                 case RatingFilter.REJECTED_OR_HIGHER:
                     var box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
-                    var image = new Gtk.Image.from_icon_name ("emblem-photos-symbolic", 
Gtk.IconSize.SMALL_TOOLBAR);
+                    var image = new Gtk.Image.from_icon_name ("emblem-photos-symbolic");
                     image.margin_end = 2;
-                    box.pack_start(image);
-                    image = new Gtk.Image.from_icon_name ("window-close-symbolic", 
Gtk.IconSize.SMALL_TOOLBAR);
-                    box.pack_start(image);
+                    box.append(image);
+                    image = new Gtk.Image.from_icon_name ("window-close-symbolic");
+                    box.append(image);
                     icon = box;
-                    icon.show_all();
+                    icon.show();
                 break;
                 
                 case RatingFilter.REJECTED_ONLY:
-                    icon = new Gtk.Image.from_icon_name ("window-close-symbolic", 
Gtk.IconSize.SMALL_TOOLBAR);
+                    icon = new Gtk.Image.from_icon_name ("window-close-symbolic");
                 break;
                 
                 case RatingFilter.UNRATED_OR_HIGHER:
                 default:
-                    icon = new Gtk.Image.from_icon_name ("emblem-photos-symbolic", 
Gtk.IconSize.SMALL_TOOLBAR);
+                    icon = new Gtk.Image.from_icon_name ("emblem-photos-symbolic");
                 break;
             }
 
@@ -832,7 +832,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
         }
 
         public void set_filter_icon(RatingFilter filter) {
-            button.set_always_show_image(true);
+            //button.set_always_show_image(true);
             switch (filter) {
             case RatingFilter.ONE_OR_HIGHER:
                 button.set_label (_("★+ Rating"));
@@ -852,14 +852,14 @@ public class SearchFilterToolbar : Gtk.Revealer {
                 break;
             default:
                 button.set_label (_("Rating"));
-                button.set_image(get_filter_icon(filter));
+                //button.set_image(get_filter_icon(filter));
                 break;
             }
 
             set_size_request(get_filter_button_size(filter), -1);
             set_tooltip_text(Resources.get_rating_filter_tooltip(filter));
             set_has_tooltip(true);
-            show_all();
+            show();
         }
 
         private int get_filter_button_size(RatingFilter filter) {
@@ -872,7 +872,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
 
     }
 
-    protected class SavedSearchFilterButton : Gtk.ToolItem {
+    protected class SavedSearchFilterButton : Gtk.Box {
         public SavedSearchPopover filter_popup = null;
         public Gtk.ToggleButton button;
 
@@ -880,11 +880,10 @@ public class SearchFilterToolbar : Gtk.Revealer {
 
         public SavedSearchFilterButton() {
             button = new Gtk.ToggleButton();
-            button.set_always_show_image(true);
 
-            Gtk.Image? image = new Gtk.Image.from_icon_name("edit-find-symbolic", 
Gtk.IconSize.SMALL_TOOLBAR);
+            Gtk.Image? image = new Gtk.Image.from_icon_name("edit-find-symbolic");
             image.set_margin_end(6);
-            button.set_image(image);
+            //button.set_image(image);
             button.set_can_focus(false);
 
             button.clicked.connect(on_clicked);
@@ -893,7 +892,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
 
             set_homogeneous(false);
 
-            this.add(button);
+            this.append(button);
         }
 
         ~SavedSearchFilterButton() {
@@ -914,7 +913,6 @@ public class SearchFilterToolbar : Gtk.Revealer {
 
         public void restyle() {
                        button.set_size_request(24, 24);
-                       button.relief = Gtk.ReliefStyle.NONE;
         }
     }
 
@@ -932,16 +930,16 @@ public class SearchFilterToolbar : Gtk.Revealer {
 
         public signal void closed();
 
-        private class DataButton : Gtk.Bin {
+        private class DataButton : Gtk.Box {
             private Gtk.Button button = null;
             public SavedSearch search { get; private set; }
 
             public signal void clicked(SavedSearch search);
 
             public DataButton(SavedSearch search, string name) {
-                button = new Gtk.Button.from_icon_name(name, Gtk.IconSize.SMALL_TOOLBAR);
+                button = new Gtk.Button.from_icon_name(name);
                 this.search = search;
-                this.add(button);
+                this.append(button);
 
                 restyle();
 
@@ -954,7 +952,6 @@ public class SearchFilterToolbar : Gtk.Revealer {
 
             public void restyle() {
                 button.set_size_request(24, 24);
-                button.relief = Gtk.ReliefStyle.NONE;
             }
 
             private void on_click() {
@@ -963,7 +960,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
         }
 
         public SavedSearchPopover(Gtk.Widget relative_to) {
-            popover = new Gtk.Popover(relative_to);
+            popover = new Gtk.Popover();
             popover.closed.connect(on_popover_closed);
             list_box = new Gtk.ListBox();
             edit_buttons = new DataButton[0];
@@ -974,26 +971,26 @@ public class SearchFilterToolbar : Gtk.Revealer {
                 row.set_homogeneous(false);
                 Gtk.Label label = new Gtk.Label(search.get_name());
                 label.halign = Gtk.Align.START;
-                row.pack_start(label, true, true, 3);
+                row.append(label);
 
                 DataButton delete_button = new DataButton(search, "edit-delete-symbolic");
-                row.pack_end(delete_button, false, false);
+                row.append(delete_button);
                 delete_button.clicked.connect(on_delete_click);
                 delete_buttons += delete_button;
 
                 DataButton edit_button = new DataButton(search, "text-editor-symbolic");
-                row.pack_end(edit_button, false, false);
+                row.append(edit_button);
                 edit_button.clicked.connect(on_edit_click);
                 edit_buttons += edit_button;
 
                 list_box.insert(row, -1);
             }
-            add = new Gtk.Button.from_icon_name("list-add-symbolic", Gtk.IconSize.BUTTON);
+            add = new Gtk.Button.from_icon_name("list-add-symbolic");
             add.clicked.connect(on_add_click);
             list_box.insert(add, -1);
             list_box.row_activated.connect(on_activate_row);
             list_box.selection_mode = Gtk.SelectionMode.NONE;
-            popover.add(list_box);
+            popover.set_child(list_box);
 
             restyle();
         }
@@ -1007,21 +1004,24 @@ public class SearchFilterToolbar : Gtk.Revealer {
         }
 
         public void restyle() {
-            add.relief = Gtk.ReliefStyle.NONE;
             foreach (DataButton button in edit_buttons) button.restyle();
             foreach (DataButton button in delete_buttons) button.restyle();
         }
 
         private bool is_search_row(Gtk.ListBoxRow? row) {
             if (row == null) return false;
-            if (row.get_children().last().data is Gtk.Button) return false;
+            if (row.get_child() is Gtk.Button) return false;
             return true;
         }
 
-        private SavedSearch get_search(Gtk.ListBoxRow row) {
-            var box = (Gtk.Box) row.get_children().first().data;
-            DataButton button = box.get_children().last().data as DataButton;
+        private SavedSearch? get_search(Gtk.ListBoxRow row) {
+            #if 0
+            var box = (Gtk.Box) row.get_child();
+            DataButton button; // = box.get_children().last().data as DataButton;
             return button.search;
+            #endif
+
+            return null;
         }
 
         private void on_activate_row(Gtk.ListBoxRow? row) {
@@ -1047,7 +1047,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
         }
 
         public void show_all() {
-            popover.show_all();
+            popover.show();
         }
 
         public void hide() {
@@ -1069,18 +1069,14 @@ public class SearchFilterToolbar : Gtk.Revealer {
     private ToggleActionToolButton toolbtn_videos;
     private ToggleActionToolButton toolbtn_raw;
     private ToggleActionToolButton toolbtn_flag;
-    private Gtk.SeparatorToolItem sepr_mediatype_flagged;
-    private Gtk.SeparatorToolItem sepr_flagged_rating;
-    private Gtk.SeparatorToolItem sepr_rating_saved;
     
     public SearchFilterToolbar(SearchFilterActions actions) {
         this.actions = actions;
-        toolbar = new Gtk.Toolbar();
+        toolbar = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 6);
         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);
         
         try {
             this.builder.add_from_resource (Resources.get_ui("search_bar.ui"));
@@ -1094,14 +1090,16 @@ public class SearchFilterToolbar : Gtk.Revealer {
         // Prepare the close menu for use, but don't
         // display it yet; we'll connect it to secondary
         // click later on.
+        #if 0
         close_item.set_label(_("Close"));
         close_item.show();
         close_item.activate.connect(on_context_menu_close_chosen);
         close_menu.append(close_item);
+        #endif
        
         // Type label and toggles
         label_type = new LabelToolItem(_("Type"), 10, 5);
-        toolbar.insert(label_type, -1);
+        toolbar.append(label_type);
         
         toolbtn_photos = new ToggleActionToolButton("win.display.photos");
         toolbtn_photos.set_tooltip_text (_("Photos"));
@@ -1112,13 +1110,11 @@ public class SearchFilterToolbar : Gtk.Revealer {
         toolbtn_raw = new ToggleActionToolButton("win.display.raw");
         toolbtn_raw.set_tooltip_text(_("RAW Photos"));
         
-        toolbar.insert(toolbtn_photos, -1);
-        toolbar.insert(toolbtn_videos, -1);
-        toolbar.insert(toolbtn_raw, -1);
+        toolbar.append(toolbtn_photos);
+        toolbar.append(toolbtn_videos);
+        toolbar.append(toolbtn_raw);
         
         // separator
-        sepr_mediatype_flagged = new Gtk.SeparatorToolItem();
-        toolbar.insert(sepr_mediatype_flagged, -1);
         
         // Flagged button
         
@@ -1126,40 +1122,30 @@ public class SearchFilterToolbar : Gtk.Revealer {
         toolbtn_flag.set_label(_("Flagged"));
         toolbtn_flag.set_tooltip_text(_("Flagged"));
         
-        toolbar.insert(toolbtn_flag, -1);
+        toolbar.append(toolbtn_flag);
         
         // separator
-        sepr_flagged_rating = new Gtk.SeparatorToolItem();
-        toolbar.insert(sepr_flagged_rating, -1);
         
         // Rating button
         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);
-        toolbar.insert(rating_button, -1);
+        toolbar.append(rating_button);
         
         // separator
-        sepr_rating_saved = new Gtk.SeparatorToolItem();
-        toolbar.insert(sepr_rating_saved, -1);
 
         // Saved search button
-        saved_search_button.set_expand(false);
                saved_search_button.set_label(_("Saved Search"));
         saved_search_button.set_tooltip_text(_("Use a saved search to filter items in the current view"));
         saved_search_button.clicked.connect(on_saved_search_button_clicked);
-        toolbar.insert(saved_search_button, -1);
+        toolbar.append(saved_search_button);
 
         // Separator to right-align the text box
-        Gtk.SeparatorToolItem separator_align = new Gtk.SeparatorToolItem();
-        separator_align.set_expand(true);
-        separator_align.set_draw(false);
-        toolbar.insert(separator_align, -1);
         
         // Search box.
-        toolbar.insert(search_box, -1);
+        toolbar.append(search_box);
 
-        add(toolbar);
+        set_child (toolbar);
         
         // hook up signals to actions to be notified when they change
         actions.flagged_toggled.connect(on_flagged_toggled);
@@ -1171,7 +1157,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
         actions.criteria_changed.connect(on_criteria_changed);
         
         // #3260 part II Hook up close menu.
-        toolbar.popup_context_menu.connect(on_context_menu_requested);
+        //toolbar.popup_context_menu.connect(on_context_menu_requested);
         
         on_media_context_changed(actions.get_has_photos(), actions.get_has_videos(),
             actions.get_has_raw(), actions.get_has_flagged());
@@ -1189,7 +1175,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
         actions.text_changed.disconnect(on_search_text_changed);
         actions.criteria_changed.disconnect(on_criteria_changed);
         
-        toolbar.popup_context_menu.disconnect(on_context_menu_requested); 
+        //toolbar.popup_context_menu.disconnect(on_context_menu_requested); 
     }
     
     private void on_media_context_changed(bool has_photos, bool has_videos, bool has_raw,
@@ -1219,7 +1205,7 @@ public class SearchFilterToolbar : Gtk.Revealer {
     
     // Ticket #3260 part IV - display the context menu on secondary click
     private bool on_context_menu_requested(int x, int y, int button) { 
-        close_menu.popup_at_pointer(null);
+        //close_menu.popup_at_pointer(null);
         return false;
     }
     
@@ -1344,10 +1330,10 @@ public class SearchFilterToolbar : Gtk.Revealer {
 
         // Ticket #3290, part IV - ensure that the separators
         // are shown and/or hidden as needed.
-        sepr_mediatype_flagged.visible = (label_type.visible && toolbtn_flag.visible);
+        //sepr_mediatype_flagged.visible = (label_type.visible && toolbtn_flag.visible);
 
-        sepr_flagged_rating.visible = ((label_type.visible && rating_button.visible) ||
-            (toolbtn_flag.visible && rating_button.visible));
+        //sepr_flagged_rating.visible = ((label_type.visible && rating_button.visible) ||
+        //    (toolbtn_flag.visible && rating_button.visible));
 
         // Send update to view collection.
         search_filter.refresh();
diff --git a/src/SinglePhotoPage.vala b/src/SinglePhotoPage.vala
index d87b891c..c239e24a 100644
--- a/src/SinglePhotoPage.vala
+++ b/src/SinglePhotoPage.vala
@@ -47,15 +47,11 @@ public abstract class SinglePhotoPage : Page {
         // should never be shown, but this may change if/when zooming is supported
         set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
 
-        set_border_width(0);
-        set_shadow_type(Gtk.ShadowType.NONE);
+        viewport.set_child(canvas);
 
-        viewport.set_shadow_type(Gtk.ShadowType.NONE);
-        viewport.set_border_width(0);
-        viewport.add(canvas);
-
-        add(viewport);
+        set_child(viewport);
 
+#if 0
         canvas.add_events(Gdk.EventMask.EXPOSURE_MASK | Gdk.EventMask.STRUCTURE_MASK 
             | Gdk.EventMask.SUBSTRUCTURE_MASK);
 
@@ -63,6 +59,7 @@ public abstract class SinglePhotoPage : Page {
         canvas.draw.connect(on_canvas_exposed);
 
         set_event_source(canvas);
+        #endif
         Config.Facade.get_instance().colors_changed.connect(on_colors_changed);
     }
 
@@ -285,13 +282,11 @@ public abstract class SinglePhotoPage : Page {
     }
 
     public void invalidate(Gdk.Rectangle rect) {
-        if (canvas.get_window() != null)
-            canvas.get_window().invalidate_rect(rect, false);
+        queue_draw();
     }
 
     public void invalidate_all() {
-        if (canvas.get_window() != null)
-            canvas.get_window().invalidate_rect(null, false);
+        canvas.queue_draw ();
     }
 
     private void on_viewport_resize() {
@@ -299,12 +294,15 @@ public abstract class SinglePhotoPage : Page {
         internal_repaint(true, null);
     }
 
+#if 0
+// TODO
     protected override void on_resize_finished(Gdk.Rectangle rect) {
         base.on_resize_finished(rect);
 
         // when the resize is completed, do a high-quality repaint
         repaint();
     }
+    #endif
 
     private bool on_canvas_exposed(Cairo.Context exposed_ctx) {
         // draw pixmap onto canvas unless it's not been instantiated, in which case draw black
@@ -366,7 +364,7 @@ public abstract class SinglePhotoPage : Page {
         }
 
         // no image or window, no painting
-        if (unscaled == null || canvas.get_window() == null)
+        if (unscaled == null /*|| canvas.get_window() == null*/)
             return;
 
         Gtk.Allocation allocation;
@@ -451,7 +449,7 @@ public abstract class SinglePhotoPage : Page {
 
     private void init_pixmap(int width, int height) {
         assert(unscaled != null);
-        assert(canvas.get_window() != null);
+        //assert(canvas.get_window() != null);
 
         // Cairo backing surface (manual double-buffering)
         pixmap = new Cairo.ImageSurface(Cairo.Format.ARGB32, width, height);
@@ -474,7 +472,8 @@ public abstract class SinglePhotoPage : Page {
     }
 
     protected override bool on_context_keypress() {
-        return popup_context_menu(get_page_context_menu());
+        //return popup_context_menu(get_page_context_menu());
+        return true;
     }
 
     protected virtual void on_previous_photo() {
@@ -483,6 +482,7 @@ public abstract class SinglePhotoPage : Page {
     protected virtual void on_next_photo() {
     }
 
+#if 0
     public override bool key_press_event(Gdk.EventKey event) {
         // if the user holds the arrow keys down, we will receive a steady stream of key press
         // events for an operation that isn't designed for a rapid succession of output ... 
@@ -519,6 +519,7 @@ public abstract class SinglePhotoPage : Page {
 
         return (base.key_press_event != null) ? base.key_press_event(event) : true;
     }
+    #endif
 
     private void on_colors_changed() {
         invalidate_transparent_background();
diff --git a/src/SlideshowPage.vala b/src/SlideshowPage.vala
index adfec7f9..ee1ea798 100644
--- a/src/SlideshowPage.vala
+++ b/src/SlideshowPage.vala
@@ -11,8 +11,8 @@ class SlideshowPage : SinglePhotoPage {
     private SourceCollection sources;
     private ViewCollection controller;
     private Photo current;
-    private Gtk.ToolButton play_pause_button;
-    private Gtk.ToolButton settings_button;
+    private Gtk.Button play_pause_button;
+    private Gtk.Button settings_button;
     private PixbufCache cache = null;
     private Timer timer = new Timer();
     private bool playing = true;
@@ -130,38 +130,37 @@ class SlideshowPage : SinglePhotoPage {
         update_transition_effect();
         
         // Set up toolbar
-        Gtk.Toolbar toolbar = get_toolbar();
+        var toolbar = get_toolbar();
         
         // add toolbar buttons
-        Gtk.ToolButton previous_button = new Gtk.ToolButton(null, _("Back"));
+        Gtk.Button previous_button = new Gtk.Button.with_label(_("Back"));
         previous_button.set_icon_name("go-previous-symbolic");
         previous_button.set_tooltip_text(_("Go to the previous photo"));
         previous_button.clicked.connect(on_previous_photo);
         
-        toolbar.insert(previous_button, -1);
+        toolbar.append(previous_button);
         
-        play_pause_button = new Gtk.ToolButton(null, _("Pause"));
+        play_pause_button = new Gtk.Button.with_label( _("Pause"));
         play_pause_button.set_icon_name("media-playback-pause-symbolic");
         play_pause_button.set_tooltip_text(_("Pause the slideshow"));
         play_pause_button.clicked.connect(on_play_pause);
         
-        toolbar.insert(play_pause_button, -1);
+        toolbar.append(play_pause_button);
         
-        Gtk.ToolButton next_button = new Gtk.ToolButton(null, _("Next"));
+        Gtk.Button next_button = new Gtk.Button.with_label(_("Next"));
         next_button.set_icon_name("go-next-symbolic");
         next_button.set_tooltip_text(_("Go to the next photo"));
         next_button.clicked.connect(on_next_photo);
         
-        toolbar.insert(next_button, -1);
+        toolbar.append(next_button);
 
-        settings_button = new Gtk.ToolButton(null, null);
+        settings_button = new Gtk.Button();
         settings_button.set_icon_name("preferences-system-symbolic");
         settings_button.set_label(_("Settings"));
         settings_button.set_tooltip_text(_("Change slideshow settings"));
         settings_button.clicked.connect(on_change_settings);
-        settings_button.is_important = true;
         
-        toolbar.insert(settings_button, -1);
+        toolbar.append(settings_button);
 
         screensaver = new Screensaver();
     }
@@ -337,6 +336,7 @@ class SlideshowPage : SinglePhotoPage {
         return true;
     }
     
+    #if 0
     public override bool key_press_event(Gdk.EventKey event) {
         bool handled = true;
         switch (Gdk.keyval_name(event.keyval)) {
@@ -360,16 +360,18 @@ class SlideshowPage : SinglePhotoPage {
         
         return (base.key_press_event != null) ? base.key_press_event(event) : true;
     }
+    #endif
 
     private void on_change_settings() {
         SettingsDialog settings_dialog = new SettingsDialog();
-        settings_dialog.show_all();
+        settings_dialog.show();
         
         bool slideshow_playing = playing;
         playing = false;
         hide_toolbar();
         suspend_cursor_hiding();
-        
+        #if 0
+        // TODO
         if (settings_dialog.run() == Gtk.ResponseType.OK) {
             // sync with the config setting so it will persist
             Config.Facade.get_instance().set_slideshow_delay(settings_dialog.get_delay());
@@ -380,6 +382,7 @@ class SlideshowPage : SinglePhotoPage {
             
             update_transition_effect();
         }
+        #endif
         
         settings_dialog.destroy();
         restore_cursor_hiding();
diff --git a/src/camera/Camera.vala b/src/camera/Camera.vala
index 891507e7..291daa4a 100644
--- a/src/camera/Camera.vala
+++ b/src/camera/Camera.vala
@@ -7,11 +7,11 @@
 namespace Camera {
 
 public void init() throws Error {
-    Camera.Branch.init();
+    //Camera.Branch.init();
 }
 
 public void terminate() {
-    Camera.Branch.terminate();
+    //Camera.Branch.terminate();
 }
 
 }
diff --git a/src/camera/ImportPage.vala b/src/camera/ImportPage.vala
index b7c9716f..3a839c61 100644
--- a/src/camera/ImportPage.vala
+++ b/src/camera/ImportPage.vala
@@ -285,9 +285,11 @@ class ImportPreview : MediaSourceItem {
         bool using_placeholder = (pixbuf == null);
         if (pixbuf == null) {
             if (placeholder_preview == null) {
+            #if 0
                 placeholder_preview = get_placeholder_pixbuf();
                 placeholder_preview = scale_pixbuf(placeholder_preview, MAX_SCALE,
                     Gdk.InterpType.BILINEAR, true);
+                    #endif
             }
             
             pixbuf = placeholder_preview;
@@ -753,75 +755,56 @@ public class ImportPage : CheckerboardPage {
         Video.global.contents_altered.disconnect(on_media_added_removed);
     }
     
-    public override Gtk.Toolbar get_toolbar() {
+    public override Gtk.Box get_toolbar() {
         if (toolbar == null) {
             base.get_toolbar();
 
             // hide duplicates checkbox
             hide_imported = new Gtk.CheckButton.with_label(_("Hide photos already imported"));
             hide_imported.set_tooltip_text(_("Only display photos that have not been imported"));
-            hide_imported.clicked.connect(on_hide_imported);
+            hide_imported.toggled.connect(on_hide_imported);
             hide_imported.sensitive = false;
             hide_imported.active = Config.Facade.get_instance().get_hide_photos_already_imported();
-            Gtk.ToolItem hide_item = new Gtk.ToolItem();
-            hide_item.is_important = true;
-            hide_item.add(hide_imported);
             
-            toolbar.insert(hide_item, -1);
-            
-            // separator to force buttons to right side of toolbar
-            Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem();
-            separator.set_draw(false);
-            
-            toolbar.insert(separator, -1);
+            toolbar.append(hide_imported);
             
             // progress bar in center of toolbar
             progress_bar.set_orientation(Gtk.Orientation.HORIZONTAL);
             progress_bar.visible = false;
-            Gtk.ToolItem progress_item = new Gtk.ToolItem();
-            progress_item.set_expand(true);
-            progress_item.add(progress_bar);
             progress_bar.set_show_text(true);
             
-            toolbar.insert(progress_item, -1);
+            toolbar.append(progress_bar);
             
             // Find button
-            Gtk.ToggleToolButton find_button = new Gtk.ToggleToolButton();
+            Gtk.ToggleButton find_button = new Gtk.ToggleButton();
             find_button.set_icon_name("edit-find-symbolic");
             find_button.set_action_name ("win.CommonDisplaySearchbar");
             
-            toolbar.insert(find_button, -1);
-            
-            // Separator
-            toolbar.insert(new Gtk.SeparatorToolItem(), -1);
+            toolbar.append(find_button);
             
             // Import selected
-            Gtk.ToolButton import_selected_button = new Gtk.ToolButton(null, null);
-            import_selected_button.set_icon_name(Resources.IMPORT);
+            Gtk.Button import_selected_button = new Gtk.Button.from_icon_name(Resources.IMPORT);
             import_selected_button.set_label(_("Import _Selected"));
-            import_selected_button.is_important = true;
             import_selected_button.use_underline = true;
             import_selected_button.set_action_name ("win.ImportSelected");
             
-            toolbar.insert(import_selected_button, -1);
+            toolbar.append(import_selected_button);
             
             // Import all
-            Gtk.ToolButton import_all_button = new Gtk.ToolButton(null, null);
-            import_all_button.set_icon_name(Resources.IMPORT_ALL);
+            Gtk.Button import_all_button = new Gtk.Button.from_icon_name(Resources.IMPORT_ALL);
             import_all_button.set_label(_("Import _All"));
-            import_all_button.is_important = true;
             import_all_button.use_underline = true;
             import_all_button.set_action_name ("win.ImportAll");
             
-            toolbar.insert(import_all_button, -1);
+            toolbar.append(import_all_button);
 
             // restrain the recalcitrant rascal!  prevents the progress bar from being added to the
             // show_all queue so we have more control over its visibility
-            progress_bar.set_no_show_all(true);
+            progress_bar.set_visible(true);
             
             update_toolbar_state();
             
-            show_all();
+            show();
         }
         
         return toolbar;
@@ -1000,7 +983,7 @@ public class ImportPage : CheckerboardPage {
                         Gtk.ButtonsType.CANCEL, "%s", mounted_message);
                     dialog.title = Resources.APP_TITLE;
                     dialog.add_button(_("_Unmount"), Gtk.ResponseType.YES);
-                    int dialog_res = dialog.run();
+                    int dialog_res = 0; // TODO dialog.run();
                     dialog.destroy();
                     
                     if (dialog_res != Gtk.ResponseType.YES) {
@@ -1016,7 +999,7 @@ public class ImportPage : CheckerboardPage {
                         Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING,
                         Gtk.ButtonsType.OK, "%s", locked_message);
                     dialog.title = Resources.APP_TITLE;
-                    dialog.run();
+                    // TODO dialog.run();
                     dialog.destroy();
                     
                     set_page_message(_("Please close any other application using the camera."));
diff --git a/src/dialogs/AdjustDateTimeDialog.vala b/src/dialogs/AdjustDateTimeDialog.vala
index 9ca41d60..ed8ac4d3 100644
--- a/src/dialogs/AdjustDateTimeDialog.vala
+++ b/src/dialogs/AdjustDateTimeDialog.vala
@@ -21,8 +21,8 @@ public class AdjustDateTimeDialog : Gtk.Dialog {
     Gtk.SpinButton minute;
     Gtk.SpinButton second;
     Gtk.ComboBoxText system;
-    Gtk.RadioButton relativity_radio_button;
-    Gtk.RadioButton batch_radio_button;
+    Gtk.ToggleButton relativity_radio_button;
+    Gtk.ToggleButton batch_radio_button;
     Gtk.CheckButton modify_originals_check_button;
     Gtk.Label notification;
 
@@ -51,7 +51,8 @@ public class AdjustDateTimeDialog : Gtk.Dialog {
         calendar = new Gtk.Calendar();
         calendar.show_heading = false;
         calendar.day_selected.connect(on_time_changed);
-        calendar.month_changed.connect(on_time_changed);
+        calendar.next_month.connect(on_time_changed);
+        calendar.prev_month.connect(on_time_changed);
         calendar.next_year.connect(on_time_changed);
         calendar.prev_year.connect(on_time_changed);
 
@@ -82,22 +83,23 @@ public class AdjustDateTimeDialog : Gtk.Dialog {
 
         Gtk.Box clock = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
 
-        clock.pack_start(hour, false, false, 0);
-        clock.pack_start(new Gtk.Label(":"), false, false, 0); // internationalize?
-        clock.pack_start(minute, false, false, 0);
-        clock.pack_start(new Gtk.Label(":"), false, false, 0);
-        clock.pack_start(second, false, false, 0);
-        clock.pack_start(system, false, false, 0);
+        clock.append(hour);
+        clock.append(new Gtk.Label(":"));
+        clock.append(minute);
+        clock.append(new Gtk.Label(":"));
+        clock.append(second);
+        clock.append(system);
 
         set_default_response(Gtk.ResponseType.OK);
 
-        relativity_radio_button = new Gtk.RadioButton.with_mnemonic(null,
+        relativity_radio_button = new Gtk.ToggleButton.with_mnemonic(
             _("_Shift photos/videos by the same amount"));
         relativity_radio_button.set_active(Config.Facade.get_instance().get_keep_relativity());
         relativity_radio_button.sensitive = display_options && photo_count > 1;
 
-        batch_radio_button = new Gtk.RadioButton.with_mnemonic(relativity_radio_button.get_group(),
+        batch_radio_button = new Gtk.ToggleButton.with_mnemonic(
             _("Set _all photos/videos to this time"));
+        batch_radio_button.set_group (relativity_radio_button);
         batch_radio_button.set_active(!Config.Facade.get_instance().get_keep_relativity());
         batch_radio_button.sensitive = display_options && photo_count > 1;
         batch_radio_button.toggled.connect(on_time_changed);
@@ -129,21 +131,21 @@ public class AdjustDateTimeDialog : Gtk.Dialog {
 
             combo.append_text(month_string);
         }
-        picker.pack_start(combo, false, false, 0);
+        picker.append(combo);
         // Limits taken from GtkCalendar
         var spin = new Gtk.SpinButton.with_range(0, int.MAX >> 9, 1);
-        picker.pack_end(spin, false, false, 0);
+        picker.append(spin);
         spin.bind_property("value", calendar, "year", GLib.BindingFlags.BIDIRECTIONAL);
         combo.bind_property("active", calendar, "month", GLib.BindingFlags.BIDIRECTIONAL);
 
-        time_content.pack_start(picker, false, false, 0);
-        time_content.pack_start(calendar, true, false, 0);
-        time_content.pack_start(clock, true, false, 0);
+        time_content.append(picker);
+        time_content.append(calendar);
+        time_content.append(clock);
 
         if (display_options) {
-            time_content.pack_start(relativity_radio_button, true, false, 0);
-            time_content.pack_start(batch_radio_button, true, false, 0);
-            time_content.pack_start(modify_originals_check_button, true, false, 0);
+            time_content.append(relativity_radio_button);
+            time_content.append(batch_radio_button);
+            time_content.append(modify_originals_check_button);
         }
 
         Gdk.Pixbuf preview = null;
@@ -160,25 +162,24 @@ public class AdjustDateTimeDialog : Gtk.Dialog {
         image_content.set_homogeneous(true);
         Gtk.Image image = (preview != null) ? new Gtk.Image.from_pixbuf(preview) : new Gtk.Image();
         original_time_label = new Gtk.Label(null);
-        image_content.pack_start(image, true, false, 0);
-        image_content.pack_start(original_time_label, true, false, 0);
+        image_content.append (image);
+        image_content.append(original_time_label);
 
         Gtk.Box hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 10);
-        hbox.set_border_width(3);
-        hbox.pack_start(image_content, true, false, 0);
-        hbox.pack_start(time_content, true, false, 0);
+        hbox.append(image_content);
+        hbox.append(time_content);
         hbox.halign = Gtk.Align.CENTER;
         hbox.valign = Gtk.Align.CENTER;
         hbox.hexpand = false;
         hbox.vexpand = false;
 
-        ((Gtk.Box) get_content_area()).pack_start(hbox, true, false, 0);
+        ((Gtk.Box) get_content_area()).append(hbox);
 
         notification = new Gtk.Label("");
-        notification.set_line_wrap(true);
+        notification.set_wrap(true);
         notification.set_justify(Gtk.Justification.CENTER);
 
-        ((Gtk.Box) get_content_area()).pack_start(notification, true, true, 0);
+        ((Gtk.Box) get_content_area()).append(notification);
 
         original_time = source.get_exposure_time();
 
@@ -192,8 +193,7 @@ public class AdjustDateTimeDialog : Gtk.Dialog {
     }
 
     private void set_time(Time time) {
-        calendar.select_month(time.month, time.year + YEAR_OFFSET);
-        calendar.select_day(time.day);
+        calendar.select_day(new DateTime.from_unix_local (time.mktime()));
         calendar.notify_property("year");
         calendar.notify_property("month");
 
@@ -233,7 +233,8 @@ public class AdjustDateTimeDialog : Gtk.Dialog {
         time.hour += ((system.get_active() == TimeSystem.PM) ? 12 : 0);
 
         uint year, month, day;
-        calendar.get_date(out year, out month, out day);
+        var dt = calendar.get_date();
+        dt.get_ymd (out year, out month, out day);
         time.year = ((int) year) - YEAR_OFFSET;
         time.month = (int) month;
         time.day = (int) day;
@@ -245,11 +246,12 @@ public class AdjustDateTimeDialog : Gtk.Dialog {
 
     public bool execute(out int64 time_shift, out bool keep_relativity,
         out bool modify_originals) {
-        show_all();
+        show();
 
         bool response = false;
 
-        if (run() == Gtk.ResponseType.OK) {
+        // TODO
+        if (-6 == Gtk.ResponseType.OK) {
             if (no_original_time)
                 time_shift = (int64) get_time();
             else
diff --git a/src/dialogs/EntryMultiCompletion.vala b/src/dialogs/EntryMultiCompletion.vala
index 8700f216..f915f526 100644
--- a/src/dialogs/EntryMultiCompletion.vala
+++ b/src/dialogs/EntryMultiCompletion.vala
@@ -17,6 +17,7 @@ public class EntryMultiCompletion : Gtk.EntryCompletion {
         set_model(create_completion_store(completion_list));
         set_text_column(0);
         set_match_func(match_func);
+        match_selected.connect(on_match_selected);
     }
 
     private static Gtk.ListStore create_completion_store(Gee.Collection<string> completion_list) {
@@ -63,7 +64,7 @@ public class EntryMultiCompletion : Gtk.EntryCompletion {
         }
     }
 
-    public override bool match_selected(Gtk.TreeModel model, Gtk.TreeIter iter) {
+    public bool on_match_selected(Gtk.TreeModel model, Gtk.TreeIter iter) {
         string match;
         model.get(iter, 0, out match);
 
diff --git a/src/dialogs/ExportDialog.vala b/src/dialogs/ExportDialog.vala
index 5a61dc4a..256dcce6 100644
--- a/src/dialogs/ExportDialog.vala
+++ b/src/dialogs/ExportDialog.vala
@@ -107,19 +107,14 @@ public class ExportDialog : Gtk.Dialog {
 
         table.set_row_spacing(6);
         table.set_column_spacing(12);
-        table.set_border_width(18);
 
-        ((Gtk.Box) get_content_area()).add(table);
+        ((Gtk.Box) get_content_area()).append(table);
 
         // add buttons to action area
         add_button(Resources.CANCEL_LABEL, Gtk.ResponseType.CANCEL);
         ok_button = add_button(Resources.OK_LABEL, Gtk.ResponseType.OK);
         set_default_response(Gtk.ResponseType.OK);
 
-        ok_button.set_can_default(true);
-        ok_button.has_default = true;
-        set_default(ok_button);
-
         if (current_constraint == ScaleConstraint.ORIGINAL) {
             pixels_entry.sensitive = false;
             quality_combo.sensitive = false;
@@ -178,7 +173,7 @@ public class ExportDialog : Gtk.Dialog {
     // it's passed qualified as ref and not as out
     public bool execute(out int scale, out ScaleConstraint constraint,
         ref ExportFormatParameters parameters) {
-        show_all();
+        show();
 
         // if the export format mode isn't set to last (i.e., don't use the persisted settings),
         // reset the scale constraint to original size
@@ -195,7 +190,7 @@ public class ExportDialog : Gtk.Dialog {
         format_set_active_text(get_label_for_parameters(parameters));
         on_format_changed();
 
-        bool ok = (run() == Gtk.ResponseType.OK);
+        bool ok = false; //(run() == Gtk.ResponseType.OK);
         if (ok) {
             int index = constraint_combo.get_active();
             assert(index >= 0);
diff --git a/src/dialogs/MultiTextEntryDialog.vala b/src/dialogs/MultiTextEntryDialog.vala
index ddbd59be..6b847a9d 100644
--- a/src/dialogs/MultiTextEntryDialog.vala
+++ b/src/dialogs/MultiTextEntryDialog.vala
@@ -19,7 +19,7 @@ public class MultiTextEntryDialog : Gtk.Dialog {
 
     public void setup(OnModifyValidateType? modify_validate, string title, string label, string? 
initial_text) {
         set_title(title);
-        set_parent_window(AppWindow.get_instance().get_parent_window());
+        //set_parent_window(AppWindow.get_instance().get_parent_window());
         set_transient_for(AppWindow.get_instance());
         on_modify_validate = modify_validate;
 
@@ -31,10 +31,13 @@ public class MultiTextEntryDialog : Gtk.Dialog {
     public string? execute() {
         string? text = null;
 
-        show_all();
+        show();
 
+        #if 0
+        // TODO
         if (run() == Gtk.ResponseType.OK)
             text = entry.buffer.text;
+            #endif
 
         destroy();
 
diff --git a/src/dialogs/Preferences.vala b/src/dialogs/Preferences.vala
index c6d63868..200b76ce 100644
--- a/src/dialogs/Preferences.vala
+++ b/src/dialogs/Preferences.vala
@@ -28,7 +28,7 @@ public class PreferencesDialog : Gtk.Dialog {
     private SortedList<AppInfo> external_raw_apps;
     private SortedList<AppInfo> external_photo_apps;
     [GtkChild]
-    private unowned Gtk.FileChooserButton library_dir_button;
+    private unowned Gtk.Button library_dir_button;
     [GtkChild]
     private unowned Gtk.ComboBoxText dir_pattern_combo;
     [GtkChild]
@@ -55,20 +55,20 @@ public class PreferencesDialog : Gtk.Dialog {
     private unowned Gtk.Notebook preferences_notebook;
 
     [GtkChild]
-    private unowned Gtk.RadioButton transparent_checker_radio;
+    private unowned Gtk.ToggleButton transparent_checker_radio;
     [GtkChild]
-    private unowned Gtk.RadioButton transparent_solid_radio;
+    private unowned Gtk.ToggleButton transparent_solid_radio;
     [GtkChild]
     private unowned Gtk.ColorButton transparent_solid_color;
     [GtkChild]
-    private unowned Gtk.RadioButton transparent_none_radio;
+    private unowned Gtk.ToggleButton transparent_none_radio;
 
     private PreferencesDialog() {
         Object (use_header_bar: Resources.use_header_bar());
 
-        set_parent_window(AppWindow.get_instance().get_parent_window());
+        //set_parent_window(AppWindow.get_instance().get_parent_window());
         set_transient_for(AppWindow.get_instance());
-        delete_event.connect(on_delete);
+        close_request.connect(on_delete);
         response.connect(on_close);
 
         transparent_checker_radio.toggled.connect(on_radio_changed);
@@ -126,7 +126,7 @@ public class PreferencesDialog : Gtk.Dialog {
 
         lowercase.toggled.connect(on_lowercase_toggled);
 
-        ((Gtk.Container) preferences_notebook.get_nth_page (2)).add (plugins_mediator);
+        //preferences_notebook.get_nth_page (2).set_child (plugins_mediator);
 
         populate_preference_options();
 
@@ -226,11 +226,13 @@ public class PreferencesDialog : Gtk.Dialog {
                         ((FileIcon) app_icon).get_file().get_path()), Resources.DEFAULT_ICON_SCALE,
                         Gdk.InterpType.BILINEAR, false));
                 } else if (app_icon is ThemedIcon) {
+                #if 0
                     Gdk.Pixbuf icon_pixbuf =
                         Gtk.IconTheme.get_default().load_icon(((ThemedIcon) app_icon).get_names()[0],
                         Resources.DEFAULT_ICON_SCALE, Gtk.IconLookupFlags.FORCE_SIZE);
 
                     combo_store.set_value(iter, 0, icon_pixbuf);
+                    #endif
                 }
             } catch (GLib.Error error) {
                 warning("Error loading icon pixbuf: " + error.message);
@@ -285,8 +287,8 @@ public class PreferencesDialog : Gtk.Dialog {
             preferences_dialog = new PreferencesDialog();
 
         preferences_dialog.populate_preference_options();
-        preferences_dialog.show_all();
-        preferences_dialog.library_dir_button.set_current_folder(AppDirs.get_import_dir().get_path());
+        preferences_dialog.show();
+        //TODO preferences_dialog.library_dir_button.set_current_folder(AppDirs.get_import_dir().get_path());
 
         // Ticket #3001: Cause the dialog to become active if the user chooses 'Preferences'
         // from the menus a second time.
@@ -316,7 +318,7 @@ public class PreferencesDialog : Gtk.Dialog {
             return true;
 
         commit_on_close();
-        return hide_on_delete(); //prevent widgets from getting destroyed
+        return true; //hide_on_delete(); //prevent widgets from getting destroyed
     }
 
     private void on_close() {
@@ -409,9 +411,10 @@ public class PreferencesDialog : Gtk.Dialog {
     }
 
     private void on_current_folder_changed() {
-        lib_dir = library_dir_button.get_filename();
+        //lib_dir = library_dir_button.get_filename();
     }
 
+#if 0
     public override bool map_event(Gdk.EventAny event) {
         var result = base.map_event(event);
         // Set the signal for the lib dir button after the dialog is displayed,
@@ -422,6 +425,7 @@ public class PreferencesDialog : Gtk.Dialog {
 
         return result;
     }
+    #endif
 
     private void add_to_dir_formats(string name, string? pattern) {
         PathFormat pf = new PathFormat(name, pattern);
diff --git a/src/dialogs/ProgressDialog.vala b/src/dialogs/ProgressDialog.vala
index 93687640..bbba266a 100644
--- a/src/dialogs/ProgressDialog.vala
+++ b/src/dialogs/ProgressDialog.vala
@@ -25,24 +25,23 @@ public class ProgressDialog : Gtk.Window {
         if (owner != null)
             set_transient_for(owner);
         set_modal(true);
-        set_type_hint(Gdk.WindowTypeHint.DIALOG);
 
         progress_bar.set_size_request(300, -1);
         progress_bar.set_show_text(true);
 
         Gtk.Box vbox_bar = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
-        vbox_bar.pack_start(progress_bar, true, false, 0);
+        vbox_bar.prepend(progress_bar);
 
         if (cancellable != null) {
             cancel_button = new Gtk.Button.with_mnemonic(Resources.CANCEL_LABEL);
             cancel_button.clicked.connect(on_cancel);
-            delete_event.connect(on_window_closed);
+            close_request.connect(on_window_closed);
         }
 
         Gtk.Box hbox = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
-        hbox.pack_start(vbox_bar, true, false, 0);
+        hbox.prepend(vbox_bar);
         if (cancel_button != null)
-            hbox.pack_end(cancel_button, false, false, 0);
+            hbox.append(cancel_button);
 
         Gtk.Label primary_text_label = new Gtk.Label("");
         primary_text_label.set_markup("<span weight=\"bold\">%s</span>".printf(text));
@@ -50,8 +49,8 @@ public class ProgressDialog : Gtk.Window {
         primary_text_label.yalign = 0.5f;
 
         Gtk.Box vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 12);
-        vbox.pack_start(primary_text_label, false, false, 0);
-        vbox.pack_start(hbox, true, false, 0);
+        vbox.prepend(primary_text_label);
+        vbox.prepend(hbox);
         vbox.halign = Gtk.Align.CENTER;
         vbox.valign = Gtk.Align.CENTER;
         vbox.hexpand = true;
@@ -61,7 +60,7 @@ public class ProgressDialog : Gtk.Window {
         vbox.margin_top = 12;
         vbox.margin_bottom = 12;
 
-        add(vbox);
+        set_child(vbox);
 
         time_started = now_ms();
     }
@@ -70,8 +69,8 @@ public class ProgressDialog : Gtk.Window {
         base.realize();
 
         // if unable to cancel the progress bar, remove the close button
-        if (cancellable == null)
-            get_window().set_functions(Gdk.WMFunction.MOVE);
+        //if (cancellable == null)
+            //get_window().set_functions(Gdk.WMFunction.MOVE);
     }
 
     public void update_display_every(int update_every) {
@@ -109,7 +108,7 @@ public class ProgressDialog : Gtk.Window {
         //UnityProgressBar: try to draw progress bar
         uniprobar.set_visible(true);
 #endif
-        show_all();
+        show();
     }
 
     // This can be used as a ProgressMonitor delegate.
@@ -170,7 +169,7 @@ public class ProgressDialog : Gtk.Window {
                 //UnityProgressBar: try to draw progress bar
                 uniprobar.set_visible(true);
 #endif
-                show_all();
+                show();
                 spin_event_loop();
             }
         }
diff --git a/src/dialogs/SetBackground.vala b/src/dialogs/SetBackground.vala
index ec565022..161163a1 100644
--- a/src/dialogs/SetBackground.vala
+++ b/src/dialogs/SetBackground.vala
@@ -25,8 +25,8 @@ public class SetBackgroundPhotoDialog : Gtk.Dialog {
     }
 
     public bool execute(out bool desktop_background, out bool screensaver) {
-        this.show_all();
-        var result = this.run() == Gtk.ResponseType.OK;
+        this.show();
+        var result = false; //this.run() == Gtk.ResponseType.OK;
         this.hide ();
 
         desktop_background = desktop_background_checkbox.active;
diff --git a/src/dialogs/SetBackgroundSlideshow.vala b/src/dialogs/SetBackgroundSlideshow.vala
index 479b0c7a..aed74dbd 100644
--- a/src/dialogs/SetBackgroundSlideshow.vala
+++ b/src/dialogs/SetBackgroundSlideshow.vala
@@ -64,8 +64,8 @@ public class SetBackgroundSlideshowDialog : Gtk.Dialog {
     }
 
     public bool execute(out int delay_value, out bool desktop_background, out bool screensaver) {
-        this.show_all();
-        var result = this.run() == Gtk.ResponseType.OK;
+        this.show();
+        var result = false; //this.run() == Gtk.ResponseType.OK;
         this.hide ();
 
         delay_value = this.delay_value;
diff --git a/src/dialogs/TextEntry.vala b/src/dialogs/TextEntry.vala
index a2e4653a..1c0727ab 100644
--- a/src/dialogs/TextEntry.vala
+++ b/src/dialogs/TextEntry.vala
@@ -24,7 +24,7 @@ public class TextEntryDialog : Gtk.Dialog {
     public void setup(OnModifyValidateType? modify_validate, string title, string label,
         string? initial_text, Gee.Collection<string>? completion_list, string? completion_delimiter) {
         set_title(title);
-        set_parent_window(AppWindow.get_instance().get_parent_window());
+        //set_parent_window(AppWindow.get_instance().get_parent_window());
         set_transient_for(AppWindow.get_instance());
         on_modify_validate = modify_validate;
 
@@ -49,9 +49,9 @@ public class TextEntryDialog : Gtk.Dialog {
         // validate entry to start with
         set_response_sensitive(Gtk.ResponseType.OK, on_modify_validate(entry.get_text()));
 
-        show_all();
+        show();
 
-        if (run() == Gtk.ResponseType.OK)
+        if (0 == Gtk.ResponseType.OK)
             text = entry.get_text();
 
         entry.changed.disconnect(on_entry_changed);
diff --git a/src/dialogs/WelcomeDialog.vala b/src/dialogs/WelcomeDialog.vala
index 7fa0b7cd..5cd597fa 100644
--- a/src/dialogs/WelcomeDialog.vala
+++ b/src/dialogs/WelcomeDialog.vala
@@ -21,20 +21,19 @@ public class WelcomeDialog : Gtk.Dialog {
     Gtk.Box import_content;
     Gtk.Box import_action_checkbox_packer;
     Gtk.Box external_import_action_checkbox_packer;
-    Spit.DataImports.WelcomeImportMetaHost import_meta_host;
+    //Spit.DataImports.WelcomeImportMetaHost import_meta_host;
     bool import_content_already_installed = false;
     bool ok_clicked = false;
 
     public WelcomeDialog(Gtk.Window owner) {
         Object(use_header_bar : Resources.use_header_bar());
-        import_meta_host = new Spit.DataImports.WelcomeImportMetaHost(this);
+        //import_meta_host = new Spit.DataImports.WelcomeImportMetaHost(this);
         bool show_system_pictures_import = is_system_pictures_import_possible();
         Gtk.Widget ok_button = add_button(Resources.OK_LABEL, Gtk.ResponseType.CLOSE);
         set_default_response(Gtk.ResponseType.CLOSE);
 
         set_title(_("Welcome!"));
         set_resizable(false);
-        set_type_hint(Gdk.WindowTypeHint.DIALOG);
         set_transient_for(owner);
 
         Gtk.Label primary_text = new Gtk.Label("");
@@ -47,15 +46,15 @@ public class WelcomeDialog : Gtk.Dialog {
             _("To get started, import photos in any of these ways:")));
         secondary_text.xalign = 0.0f;
         secondary_text.yalign = 0.5f;
-        var image = new Gtk.Image.from_icon_name ("shotwell", Gtk.IconSize.DIALOG);
+        var image = new Gtk.Image.from_icon_name ("shotwell");
 
         Gtk.Box header_text = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
-        header_text.pack_start(primary_text, false, false, 5);
-        header_text.pack_start(secondary_text, false, false, 0);
+        header_text.append(primary_text);
+        header_text.append(secondary_text);
 
         Gtk.Box header_content = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 12);
-        header_content.pack_start(image, false, false, 0);
-        header_content.pack_start(header_text, false, false, 0);
+        header_content.append(image);
+        header_content.append(header_text);
 
         Gtk.Label instructions = new Gtk.Label("");
         string indent_prefix = "   "; // we can't tell what the indent prefix is going to be so assume we 
need one
@@ -71,13 +70,13 @@ public class WelcomeDialog : Gtk.Dialog {
         import_action_checkbox_packer = new Gtk.Box(Gtk.Orientation.VERTICAL, 2);
 
         external_import_action_checkbox_packer = new Gtk.Box(Gtk.Orientation.VERTICAL, 2);
-        import_action_checkbox_packer.add(external_import_action_checkbox_packer);
+        import_action_checkbox_packer.append(external_import_action_checkbox_packer);
 
         if (show_system_pictures_import) {
             system_pictures_import_check = new Gtk.CheckButton.with_mnemonic(
                 _("_Import photos from your %s folder").printf(
                 get_display_pathname(AppDirs.get_import_dir())));
-            import_action_checkbox_packer.add(system_pictures_import_check);
+            import_action_checkbox_packer.append(system_pictures_import_check);
             system_pictures_import_check.set_active(true);
         }
 
@@ -88,14 +87,14 @@ public class WelcomeDialog : Gtk.Dialog {
         instruction_header.set_margin_top(20);
 
         Gtk.Box content = new Gtk.Box(Gtk.Orientation.VERTICAL, 16);
-        content.pack_start(header_content, true, true, 0);
+        content.append(header_content);
         import_content = new Gtk.Box(Gtk.Orientation.VERTICAL, 2);
-        content.add(import_content);
-        content.pack_start(instructions, false, false, 0);
+        content.append(import_content);
+        content.append(instructions);
 
         hide_button = new Gtk.CheckButton.with_mnemonic(_("_Don’t show this message again"));
         hide_button.set_active(true);
-        content.pack_start(hide_button, false, false, 6);
+        content.append(hide_button);
         content.halign = Gtk.Align.FILL;
         content.valign = Gtk.Align.FILL;
         content.hexpand = false;
@@ -105,13 +104,13 @@ public class WelcomeDialog : Gtk.Dialog {
         content.margin_start = 12;
         content.margin_end = 12;
 
-        ((Gtk.Box) get_content_area()).pack_start(content, false, false, 0);
+        ((Gtk.Box) get_content_area()).append(content);
 
         ok_button.grab_focus();
 
         install_import_content();
 
-        import_meta_host.start();
+        //TODO import_meta_host.start();
     }
 
     private void install_import_content() {
@@ -120,8 +119,8 @@ public class WelcomeDialog : Gtk.Dialog {
             (import_content_already_installed == false)
         ) {
             secondary_text.set_markup("");
-            import_content.add(import_action_checkbox_packer);
-            import_content.add(instruction_header);
+            import_content.append(import_action_checkbox_packer);
+            import_content.append(instruction_header);
             import_content_already_installed = true;
         }
     }
@@ -133,7 +132,7 @@ public class WelcomeDialog : Gtk.Dialog {
             _("Import photos from your %s library").printf(entry.get_service_name()));
         external_import_checks += entry_check;
         entry_check.set_active(true);
-        external_import_action_checkbox_packer.add(entry_check);
+        external_import_action_checkbox_packer.append(entry_check);
         install_import_content();
     }
 
@@ -147,20 +146,19 @@ public class WelcomeDialog : Gtk.Dialog {
             ok_clicked = true;
         }
         hide();
-        Gtk.main_quit();
+        // TODO Gtk.main_quit();
     }
 
     public bool execute(out WelcomeServiceEntry[] selected_import_entries, out bool 
do_system_pictures_import) {
         // it's unsafe to call run() here - it interferes with displaying
         // images from a camera - so we process the dialog ourselves.
         response.connect(on_dismiss);
-        show_all();
         show();
 
         // this will block the thread we're in until a matching call
         // to main_quit() is encountered; this happens when either the window
         // is closed or OK is clicked.
-        Gtk.main();
+        // TODO Gtk.main();
 
         // at this point, the inner main loop will have been exited.
         // we've got the response, so we don't need this signal anymore.
diff --git a/src/direct/DirectPhotoPage.vala b/src/direct/DirectPhotoPage.vala
index cc7186c4..09f2ab64 100644
--- a/src/direct/DirectPhotoPage.vala
+++ b/src/direct/DirectPhotoPage.vala
@@ -50,11 +50,11 @@ public class DirectPhotoPage : EditingHostPage {
         { "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 },
+        //{ "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 },
@@ -145,6 +145,7 @@ public class DirectPhotoPage : EditingHostPage {
         return get_photo().get_file();
     }
 
+#if 0
     protected override bool on_context_buttonpress(Gdk.EventButton event) {
         popup_context_menu(get_context_menu(), event);
 
@@ -163,6 +164,7 @@ public class DirectPhotoPage : EditingHostPage {
 
         return this.context_menu;
     }
+    #endif
 
     private void update_zoom_menu_item_sensitivity() {
         set_action_sensitive("IncreaseSize", !get_zoom_state().is_max() && !get_photo_missing());
@@ -212,6 +214,7 @@ public class DirectPhotoPage : EditingHostPage {
         get_command_manager().reset();
     }
     
+    #if 0
     protected override bool on_double_click(Gdk.EventButton event) {
         FullscreenWindow? fs = get_container() as FullscreenWindow;
         if (fs != null) {
@@ -229,6 +232,7 @@ public class DirectPhotoPage : EditingHostPage {
         
         return base.on_double_click(event);
     }
+    #endif
     
     protected override void update_ui(bool missing) {
         bool sensitivity = !missing;
@@ -272,7 +276,7 @@ public class DirectPhotoPage : EditingHostPage {
         bool revert_possible = has_photo() ? get_photo().has_transformations() 
             && !get_photo_missing() : false;
         bool rotate_possible = has_photo() ? is_rotate_available(get_photo()) : false;
-        bool enhance_possible = has_photo() ? is_enhance_available(get_photo()) : false;
+        bool enhance_possible = false; //has_photo() ? is_enhance_available(get_photo()) : false;
         
         set_action_sensitive("PrevPhoto", multiple);
         set_action_sensitive("NextPhoto", multiple);
@@ -286,9 +290,9 @@ public class DirectPhotoPage : EditingHostPage {
         set_action_sensitive("SetBackground", has_photo());
         
         if (has_photo()) {
-            set_action_sensitive("Crop", EditingTools.CropTool.is_available(get_photo(), 
Scaling.for_original()));
-            set_action_sensitive("RedEye", EditingTools.RedeyeTool.is_available(get_photo(), 
-                Scaling.for_original()));
+            //set_action_sensitive("Crop", EditingTools.CropTool.is_available(get_photo(), 
Scaling.for_original()));
+            //set_action_sensitive("RedEye", EditingTools.RedeyeTool.is_available(get_photo(), 
+            //    Scaling.for_original()));
         }
 
         // can't write to raws, and trapping the output JPEG here is tricky,
@@ -412,22 +416,23 @@ public class DirectPhotoPage : EditingHostPage {
             AppWindow.get_instance(), Gtk.FileChooserAction.SAVE, Resources.OK_LABEL, 
Resources.CANCEL_LABEL);
         save_as_dialog.set_select_multiple(false);
         save_as_dialog.set_current_name(filename);
-        save_as_dialog.set_current_folder(current_save_dir.get_path());
+        try {
+        save_as_dialog.set_current_folder(current_save_dir);
+        } catch (Error error) {
+        }
         save_as_dialog.add_filter(output_format_filter);
-        save_as_dialog.set_do_overwrite_confirmation(true);
-        save_as_dialog.set_local_only(false);
         
-        int response = save_as_dialog.run();
+        int response = 0; //save_as_dialog.run();
         if (response == Gtk.ResponseType.ACCEPT) {
             // flag to prevent asking user about losing changes to the old file (since they'll be
             // loaded right into the new one)
             drop_if_dirty = true;
-            save(File.new_for_uri(save_as_dialog.get_uri()), scale, constraint, export_params.quality,
+            save(save_as_dialog.get_file(), scale, constraint, export_params.quality,
                 effective_export_format, export_params.mode == ExportFormatMode.UNMODIFIED, 
                 export_params.export_metadata);
             drop_if_dirty = false;
 
-            current_save_dir = File.new_for_path(save_as_dialog.get_current_folder());
+            current_save_dir = save_as_dialog.get_current_folder();
         }
         
         save_as_dialog.destroy();
@@ -438,6 +443,7 @@ public class DirectPhotoPage : EditingHostPage {
             DesktopIntegration.send_to((Gee.Collection<Photo>) get_view().get_selected_sources());
     }
     
+    #if 0
     protected override bool on_app_key_pressed(Gdk.EventKey event) {
         bool handled = true;
         
@@ -457,6 +463,7 @@ public class DirectPhotoPage : EditingHostPage {
         
         return handled ? true : base.on_app_key_pressed(event);
     }
+    #endif
     
     private void on_print() {
         if (get_view().get_selected_count() > 0) {
diff --git a/src/direct/DirectWindow.vala b/src/direct/DirectWindow.vala
index 9eec5b1e..95d93cd8 100644
--- a/src/direct/DirectWindow.vala
+++ b/src/direct/DirectWindow.vala
@@ -8,7 +8,7 @@ public class DirectWindow : AppWindow {
     private DirectPhotoPage direct_photo_page;
     
     public DirectWindow(File file) {
-       base();
+        base();
 
         direct_photo_page = new DirectPhotoPage(file);
         direct_photo_page.get_view().items_altered.connect(on_photo_changed);
@@ -23,12 +23,12 @@ public class DirectWindow : AppWindow {
         // simple layout: menu on top, photo in center, toolbar along bottom (mimicking the
         // PhotoPage in the library, but without the sidebar)
         Gtk.Box layout = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
-        layout.pack_start(direct_photo_page, true, true, 0);
-        layout.pack_end(direct_photo_page.get_toolbar(), false, false, 0);
+        layout.prepend(direct_photo_page);
+        layout.append(direct_photo_page.get_toolbar());
         
         Application.set_menubar (direct_photo_page.get_menubar ());
 
-        add(layout);
+        set_child(layout);
     }
     
     public static DirectWindow get_app() {
@@ -74,13 +74,14 @@ public class DirectWindow : AppWindow {
         base.on_quit();
     }
     
-    public override bool delete_event(Gdk.EventAny event) {
+    public override bool close_request() {
         if (!get_direct_page().check_quit())
             return true;
-        
-        return (base.delete_event != null) ? base.delete_event(event) : false;
+
+        return false;
     }
 
+#if 0
     public override bool key_press_event(Gdk.EventKey event) {
         // check for an escape
         if (Gdk.keyval_name(event.keyval) == "Escape") {
@@ -92,5 +93,6 @@ public class DirectWindow : AppWindow {
        // ...then let the base class take over
        return (base.key_press_event != null) ? base.key_press_event(event) : false;
     }
+    #endif
 }
 
diff --git a/src/events/EventPage.vala b/src/events/EventPage.vala
index 1375c39f..12b21295 100644
--- a/src/events/EventPage.vala
+++ b/src/events/EventPage.vala
@@ -22,6 +22,7 @@ public class EventPage : CollectionPage {
         return page_event;
     }
     
+    #if 0
     protected override bool on_app_key_pressed(Gdk.EventKey event) {
         // If and only if one image is selected, propagate F2 to the rest of
         // the window, otherwise, consume it here - if we don't do this, it'll
@@ -35,6 +36,7 @@ public class EventPage : CollectionPage {
          
         return base.on_app_key_pressed(event);
     }
+    #endif
     
     ~EventPage() {
         Event.global.items_altered.disconnect(on_events_altered);
diff --git a/src/events/Events.vala b/src/events/Events.vala
index 1cc3fd20..9333b214 100644
--- a/src/events/Events.vala
+++ b/src/events/Events.vala
@@ -7,11 +7,11 @@
 namespace Events {
 
 public void init() throws Error {
-    Events.Branch.init();
+    //Events.Branch.init();
 }
 
 public void terminate() {
-    Events.Branch.terminate();
+    //Events.Branch.terminate();
 }
 
 }
diff --git a/src/events/EventsDirectoryPage.vala b/src/events/EventsDirectoryPage.vala
index 7ead1a05..977b13aa 100644
--- a/src/events/EventsDirectoryPage.vala
+++ b/src/events/EventsDirectoryPage.vala
@@ -59,16 +59,14 @@ public abstract class EventsDirectoryPage : CheckerboardPage {
         this.view_manager = view_manager;
 
         // set up page's toolbar (used by AppWindow for layout and FullscreenWindow as a popup)
-        Gtk.Toolbar toolbar = get_toolbar();
+        var toolbar = get_toolbar();
         
         // merge tool
-        Gtk.ToolButton merge_button = new Gtk.ToolButton (null, Resources.MERGE_LABEL);
+        Gtk.Button merge_button = new Gtk.Button.from_icon_name ("events-merge-symbolic");
         merge_button.set_action_name("win.Merge");
-        merge_button.is_important = true;
         merge_button.set_tooltip_text (Resources.MERGE_TOOLTIP);
-        merge_button.set_icon_name ("events-merge-symbolic");
         
-        toolbar.insert(merge_button, -1);
+        toolbar.append(merge_button);
     }
     
     ~EventsDirectoryPage() {
diff --git a/src/library/FlaggedSidebarEntry.vala b/src/library/FlaggedSidebarEntry.vala
index 11b4f3e7..7554a101 100644
--- a/src/library/FlaggedSidebarEntry.vala
+++ b/src/library/FlaggedSidebarEntry.vala
@@ -35,9 +35,12 @@ public class Library.FlaggedSidebarEntry : Library.HideablePageEntry, Sidebar.In
         return true;
     }
     
+
+#if 0
     public bool internal_drop_received_arbitrary(Gtk.SelectionData data) {
         return false;
     }
+#endif
 
     private void on_flagged_contents_altered() {
         visible = (get_total_flagged() != 0);
diff --git a/src/library/ImportQueuePage.vala b/src/library/ImportQueuePage.vala
index 1a14472a..a86591dd 100644
--- a/src/library/ImportQueuePage.vala
+++ b/src/library/ImportQueuePage.vala
@@ -25,28 +25,18 @@ public class ImportQueuePage : SinglePhotoPage {
         base (NAME, false);
         
         // Set up toolbar
-        Gtk.Toolbar toolbar = get_toolbar();
+        var toolbar = get_toolbar();
         
         // Stop button
-        Gtk.ToolButton stop_button = new Gtk.ToolButton(null, null);
-        stop_button.set_icon_name("process-stop-symbolic");
+        var stop_button = new Gtk.Button.from_icon_name ("process-stop-symbolic");
         stop_button.set_action_name ("win.Stop");
         
-        toolbar.insert(stop_button, -1);
+        toolbar.append(stop_button);
 
-        // separator to force progress bar to right side of toolbar
-        Gtk.SeparatorToolItem separator = new Gtk.SeparatorToolItem();
-        separator.set_draw(false);
-        
-        toolbar.insert(separator, -1);
-        
         // Progress bar
-        Gtk.ToolItem progress_item = new Gtk.ToolItem();
-        progress_item.set_expand(true);
-        progress_item.add(progress_bar);
         progress_bar.set_show_text(true);
         
-        toolbar.insert(progress_item, -1);
+        toolbar.append(progress_bar);
 #if UNITY_SUPPORT
         //UnityProgressBar: try to draw progress bar
         uniprobar.set_visible(true);
diff --git a/src/library/Library.vala b/src/library/Library.vala
index 48eb721a..7c1b1680 100644
--- a/src/library/Library.vala
+++ b/src/library/Library.vala
@@ -7,12 +7,12 @@
 namespace Library {
 
 public void init() throws Error {
-    Library.TrashSidebarEntry.init();
+    //Library.TrashSidebarEntry.init();
     Photo.develop_raw_photos_to_files = true;
 }
 
 public void terminate() {
-    Library.TrashSidebarEntry.terminate();
+    //Library.TrashSidebarEntry.terminate();
 }
 
 }
diff --git a/src/library/LibraryWindow.vala b/src/library/LibraryWindow.vala
index 4eac314f..d9a9d624 100644
--- a/src/library/LibraryWindow.vala
+++ b/src/library/LibraryWindow.vala
@@ -55,11 +55,13 @@ public class LibraryWindow : AppWindow {
     public const string TAG_PATH_MIME_TYPE = "shotwell/tag-path";
     public const string MEDIA_LIST_MIME_TYPE = "shotwell/media-id-atom";
     
+    #if 0
     public const Gtk.TargetEntry[] DND_TARGET_ENTRIES = {
         { "text/uri-list", Gtk.TargetFlags.OTHER_APP, TargetType.URI_LIST },
         { MEDIA_LIST_MIME_TYPE, Gtk.TargetFlags.SAME_APP, TargetType.MEDIA_LIST },
         { TAG_PATH_MIME_TYPE, Gtk.TargetFlags.SAME_WIDGET, TargetType.TAG_PATH }
     };
+    #endif
 
     // In fullscreen mode, want to use LibraryPhotoPage, but fullscreen has different requirements,
     // esp. regarding when the widget is realized and when it should first try and throw them image
@@ -103,20 +105,20 @@ public class LibraryWindow : AppWindow {
     private bool notify_library_is_home_dir = true;
     
     // Sidebar tree and roots (ordered by SidebarRootPosition)
+#if DOES_NOT_WORK_WITH_GTK4
     private Sidebar.Tree sidebar_tree;
     private Library.Branch library_branch = new Library.Branch();
     private Tags.Branch tags_branch = new Tags.Branch();
     private Folders.Branch folders_branch = new Folders.Branch();
-#if ENABLE_FACES   
     private Faces.Branch faces_branch = new Faces.Branch();
-#endif
     private Events.Branch events_branch = new Events.Branch();
     private Camera.Branch camera_branch = new Camera.Branch();
     private Searches.Branch saved_search_branch = new Searches.Branch();
     private ImportRoll.Branch import_roll_branch = new ImportRoll.Branch();
-    private bool page_switching_enabled = true;
     
     private Gee.HashMap<Page, Sidebar.Entry> page_map = new Gee.HashMap<Page, Sidebar.Entry>();
+#endif
+    private bool page_switching_enabled = true;
     
     private LibraryPhotoPage photo_page = null;
     
@@ -150,6 +152,7 @@ public class LibraryWindow : AppWindow {
         base();
 
         // prep sidebar and add roots
+        #if 0
         sidebar_tree = new Sidebar.Tree(DND_TARGET_ENTRIES, Gdk.DragAction.ASK,
             external_drop_handler);
         
@@ -169,6 +172,7 @@ public class LibraryWindow : AppWindow {
         sidebar_tree.graft(camera_branch, SidebarRootPosition.CAMERAS);
         sidebar_tree.graft(saved_search_branch, SidebarRootPosition.SAVED_SEARCH);
         sidebar_tree.graft(import_roll_branch, SidebarRootPosition.IMPORT_ROLL);
+        #endif
         
         properties_scheduler = new OneShotScheduler("LibraryWindow properties",
             on_update_properties_now);
@@ -178,7 +182,7 @@ public class LibraryWindow : AppWindow {
 
         // create the main layout & start at the Library page
         basic_properties = new BasicProperties();
-        create_layout(library_branch.photos_entry.get_page());
+        //create_layout(library_branch.photos_entry.get_page());
         
         // settings that should persist between sessions
         load_configuration();
@@ -188,6 +192,7 @@ public class LibraryWindow : AppWindow {
             media_sources.items_altered.connect(on_media_altered);
         }
         
+        #if DOES_NOT_WORK_WITH_GTK4
         // set up main window as a drag-and-drop destination (rather than each page; assume
         // a drag and drop is for general library import, which means it goes to library_page)
         Gtk.TargetEntry[] main_window_dnd_targets = {
@@ -198,6 +203,7 @@ public class LibraryWindow : AppWindow {
         };
         Gtk.drag_dest_set(this, Gtk.DestDefaults.ALL, main_window_dnd_targets,
             Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.ASK);
+            #endif
         
         MetadataWriter.get_instance().progress.connect(on_metadata_writer_progress);
         
@@ -217,10 +223,10 @@ public class LibraryWindow : AppWindow {
     }
 
     ~LibraryWindow() {
-        sidebar_tree.page_created.disconnect(on_page_created);
-        sidebar_tree.destroying_page.disconnect(on_destroying_page);
-        sidebar_tree.entry_selected.disconnect(on_sidebar_entry_selected);
-        sidebar_tree.selected_entry_removed.disconnect(on_sidebar_selected_entry_removed);
+        //sidebar_tree.page_created.disconnect(on_page_created);
+        //sidebar_tree.destroying_page.disconnect(on_destroying_page);
+        //sidebar_tree.entry_selected.disconnect(on_sidebar_entry_selected);
+        //sidebar_tree.selected_entry_removed.disconnect(on_sidebar_selected_entry_removed);
         
         unsubscribe_from_basic_information(get_current_page());
 
@@ -333,8 +339,8 @@ public class LibraryWindow : AppWindow {
     }
 
     // show_all() may make visible certain items we wish to keep programmatically hidden
-    public override void show_all() {
-        base.show_all();
+    public override void show() {
+        base.show();
 
         var basic_properties_action = get_current_page ().get_common_action
             ("CommonDisplayBasicProperties");
@@ -375,36 +381,44 @@ public class LibraryWindow : AppWindow {
     }
     
     public void rename_tag_in_sidebar(Tag tag) {
+    #if 0
         Tags.SidebarEntry? entry = tags_branch.get_entry_for_tag(tag);
         if (entry != null)
             sidebar_tree.rename_entry_in_place(entry);
         else
             debug("No tag entry found for rename");
+            #endif
     }
 
     public void rename_event_in_sidebar(Event event) {
+    #if 0
         Events.EventEntry? entry = events_branch.get_entry_for_event(event);
         if (entry != null)
             sidebar_tree.rename_entry_in_place(entry);
         else
             debug("No event entry found for rename");
+            #endif
     }
 
     public void rename_search_in_sidebar(SavedSearch search) {
+    #if 0
         Searches.SidebarEntry? entry = saved_search_branch.get_entry_for_saved_search(search);
         if (entry != null)
             sidebar_tree.rename_entry_in_place(entry);
         else
             debug("No search entry found for rename");
+            #endif
     }
     
 #if ENABLE_FACES
     public void rename_face_in_sidebar(Face face) {
+    #if 0
         Faces.SidebarEntry? entry = faces_branch.get_entry_for_face(face);
         if (entry != null)
             sidebar_tree.rename_entry_in_place(entry);
         else
             assert_not_reached();
+            #endif
     }
 #endif
     
@@ -457,6 +471,7 @@ public class LibraryWindow : AppWindow {
             if (event == null)
                 return false;
 
+#if 0
             Events.EventEntry? entry = events_branch.get_entry_for_event(event);
             if (entry == null)
                 return false;
@@ -468,8 +483,9 @@ public class LibraryWindow : AppWindow {
             
             start = photo;
             view_collection = null;
+            #endif
             
-            return true;
+            return false;
         }
 
         if (page is LibraryPhotoPage) {
@@ -511,38 +527,42 @@ public class LibraryWindow : AppWindow {
     private void on_file_import() {
         var import_dialog = new Gtk.FileChooserNative(_("Import From Folder"), null,
             Gtk.FileChooserAction.SELECT_FOLDER, Resources.OK_LABEL, Resources.CANCEL_LABEL);
-        import_dialog.set_local_only(false);
         import_dialog.set_select_multiple(true);
-        import_dialog.set_current_folder(import_dir);
+        try {
+        import_dialog.set_current_folder(File.new_for_commandline_arg(import_dir));
+        } catch (Error err) { }
 
         var recursive = new Gtk.CheckButton.with_label(_("Recurse Into Subfolders"));
         recursive.active = import_recursive;
-        import_dialog.set_extra_widget(recursive);
+        //import_dialog.set_extra_widget(recursive);
         
-        int response = import_dialog.run();
+        int response = 0; //import_dialog.run();
         
         if (response == Gtk.ResponseType.ACCEPT) {
             import_dialog.hide();
             // force file linking if directory is inside current library directory
             Gtk.ResponseType copy_files_response =
-                AppDirs.is_in_import_dir(File.new_for_uri(import_dialog.get_uri()))
+                AppDirs.is_in_import_dir(import_dialog.get_file())
                     ? Gtk.ResponseType.REJECT : copy_files_dialog();
             
             if (copy_files_response != Gtk.ResponseType.CANCEL) {
+            // TODO
+            #if 0
                 dispatch_import_jobs(import_dialog.get_uris(), "folders",
                     copy_files_response == Gtk.ResponseType.ACCEPT, recursive.active);
+                    #endif
             }
         }
         
-        import_dir = import_dialog.get_current_folder();
+        import_dir = import_dialog.get_current_folder().get_path();
         import_recursive = recursive.active;
         import_dialog.destroy();
     }
     
     private void on_external_library_import() {
-        Gtk.Dialog import_dialog = DataImportsUI.DataImportsDialog.get_or_create_instance();
+        //Gtk.Dialog import_dialog = DataImportsUI.DataImportsDialog.get_or_create_instance();
         
-        import_dialog.run();
+        //import_dialog.run();
     }
     
     protected override void update_common_action_availability(Page? old_page, Page? new_page) {
@@ -665,7 +685,7 @@ public class LibraryWindow : AppWindow {
             basic_properties.update_properties(get_current_page());
             bottom_frame.show();
         } else {
-            if (sidebar_paned.get_child2() != null) {
+            if (sidebar_paned.get_end_child() != null) {
                 bottom_frame.hide();
             }
         }
@@ -752,7 +772,7 @@ public class LibraryWindow : AppWindow {
     }
 
     public void enqueue_batch_import(BatchImport batch_import, bool allow_user_cancel) {
-        library_branch.import_queue_entry.enqueue_and_schedule(batch_import, allow_user_cancel);
+        //library_branch.import_queue_entry.enqueue_and_schedule(batch_import, allow_user_cancel);
     }
     
     private void import_reporter(ImportManifest manifest) {
@@ -793,6 +813,7 @@ public class LibraryWindow : AppWindow {
         }
     }
     
+    #if 0
     private Gdk.DragAction get_drag_action() {
         Gdk.ModifierType mask;
 
@@ -839,7 +860,10 @@ public class LibraryWindow : AppWindow {
 
         return true;
     }
+    #endif
     
+
+    #if 0
     public override void drag_data_received(Gdk.DragContext context, int x, int y,
         Gtk.SelectionData selection_data, uint info, uint time) {
         if (selection_data.get_data().length < 0)
@@ -894,27 +918,28 @@ public class LibraryWindow : AppWindow {
         
         Gtk.drag_finish(context, true, false, time);
     }
+    #endif
     
     public void switch_to_library_page() {
-        switch_to_page(library_branch.photos_entry.get_page());
+        //switch_to_page(library_branch.photos_entry.get_page());
     }
     
     public void switch_to_event(Event event) {
-        Events.EventEntry? entry = events_branch.get_entry_for_event(event);
-        if (entry != null)
-            switch_to_page(entry.get_page());
+        //Events.EventEntry? entry = events_branch.get_entry_for_event(event);
+        //if (entry != null)
+        //    switch_to_page(entry.get_page());
     }
     
     public void switch_to_tag(Tag tag) {
-        Tags.SidebarEntry? entry = tags_branch.get_entry_for_tag(tag);
-        if (entry != null)
-            switch_to_page(entry.get_page());
+        //Tags.SidebarEntry? entry = tags_branch.get_entry_for_tag(tag);
+        //if (entry != null)
+            //switch_to_page(entry.get_page());
     }
     
     public void switch_to_saved_search(SavedSearch search) {
-        Searches.SidebarEntry? entry = saved_search_branch.get_entry_for_saved_search(search);
-        if (entry != null)
-            switch_to_page(entry.get_page());
+        //Searches.SidebarEntry? entry = saved_search_branch.get_entry_for_saved_search(search);
+        //if (entry != null)
+        //    switch_to_page(entry.get_page());
     }
     
     public void switch_to_photo_page(CollectionPage controller, Photo current) {
@@ -933,10 +958,11 @@ public class LibraryWindow : AppWindow {
     }
     
     public void switch_to_import_queue_page() {
-        switch_to_page(library_branch.import_queue_entry.get_page());
+        //switch_to_page(library_branch.import_queue_entry.get_page());
     }
     
     private void on_camera_added(DiscoveredCamera camera) {
+    #if 0
         Camera.SidebarEntry? entry = camera_branch.get_entry_for_camera(camera);
         if (entry == null)
             return;
@@ -955,23 +981,24 @@ public class LibraryWindow : AppWindow {
         } else {
             switch_to_page(page);
         }
+        #endif
     }
 
     // This should only be called by LibraryWindow and PageStub.
     public void add_to_stack(Page page) {
         // need to show all before handing over to stack
-        page.show_all();
+        page.show();
         
-        stack.add(page);
+        stack.add_child(page);
         // need to show_all() after pages are added and removed
-        stack.show_all();
+        stack.show();
     }
     
     private void remove_from_stack(Page page) {
         stack.remove(page);
         
         // need to show_all() after pages are added and removed
-        stack.show_all();
+        stack.show();
     }
     
     // check for settings that should persist between instances
@@ -1039,12 +1066,11 @@ public class LibraryWindow : AppWindow {
     private void create_layout(Page start_page) {
         
         // put the sidebar in a scrolling window
-        Gtk.ScrolledWindow scrolled_sidebar = new Gtk.ScrolledWindow(null, null);
+        Gtk.ScrolledWindow scrolled_sidebar = new Gtk.ScrolledWindow();
         scrolled_sidebar.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
-        scrolled_sidebar.add(sidebar_tree);
+        //scrolled_sidebar.set_child(sidebar_tree);
         
-        background_progress_frame.set_border_width(2);
-        background_progress_frame.add(background_progress_bar);
+        background_progress_frame.set_child(background_progress_bar);
         background_progress_frame.set_transition_type(Gtk.RevealerTransitionType.SLIDE_UP);
         background_progress_frame.halign = Gtk.Align.FILL;
         background_progress_frame.valign = Gtk.Align.END;
@@ -1062,36 +1088,36 @@ public class LibraryWindow : AppWindow {
         basic_properties.margin_start = 6;
         basic_properties.margin_end = 6;
 
-        bottom_frame.add(basic_properties);
+        bottom_frame.set_child(basic_properties);
         bottom_frame.get_style_context().remove_class("frame");
         
         // "attach" the progress bar to the sidebar tree, so the movable ridge is to resize the
         // top two and the basic information pane
-        top_section.pack_start(scrolled_sidebar, true, true, 0);
-        top_section.pack_end(background_progress_frame, false, false, 0);
+        top_section.prepend(scrolled_sidebar);
+        top_section.append(background_progress_frame);
 
-        sidebar_paned.pack1(top_section, true, false);
-        sidebar_paned.pack2(bottom_frame, false, false);
+        sidebar_paned.set_start_child(top_section);
+        sidebar_paned.set_end_child(bottom_frame);
         sidebar_paned.set_position(1000);
         
         right_vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
-        right_vbox.pack_start(search_toolbar, false, false, 0);
+        right_vbox.append(search_toolbar);
         var stack_box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 0);
-        stack_box.pack_start(stack, true, true, 0);
-        right_vbox.pack_start(stack_box, true, true, 0);
-        right_vbox.add (toolbar_revealer);
+        stack_box.append(stack);
+        right_vbox.append(stack_box);
+        right_vbox.append(toolbar_revealer);
         
         client_paned = new Gtk.Paned(Gtk.Orientation.HORIZONTAL);
-        client_paned.pack1(sidebar_paned, false, false);
-        sidebar_tree.set_size_request(SIDEBAR_MIN_WIDTH, -1);
-        client_paned.pack2(right_vbox, true, false);
+        client_paned.set_start_child(sidebar_paned);
+        //sidebar_tree.set_size_request(SIDEBAR_MIN_WIDTH, -1);
+        client_paned.set_end_child(right_vbox);
         client_paned.set_position(Config.Facade.get_instance().get_sidebar_position());
         // TODO: Calc according to layout's size, to give sidebar a maximum width
         stack.set_size_request(PAGE_MIN_WIDTH, -1);
-        var scrolled = new Gtk.ScrolledWindow(null, null);
+        var scrolled = new Gtk.ScrolledWindow();
         scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC);
-        scrolled.add(extended_properties);
-        extended_properties_revealer.add(scrolled);
+        scrolled.set_child(extended_properties);
+        extended_properties_revealer.set_child(scrolled);
         extended_properties_revealer.set_transition_type(Gtk.RevealerTransitionType.SLIDE_LEFT);
         extended_properties_revealer.halign = Gtk.Align.END;
         extended_properties_revealer.valign = Gtk.Align.FILL;
@@ -1103,7 +1129,7 @@ public class LibraryWindow : AppWindow {
         extended_properties.set_margin_end (9);
         scrolled.set_size_request(EXTENDED_INFO_MIN_WIDTH, -1);
 
-        stack_box.pack_end(extended_properties_revealer, false, false, 0);
+        stack_box.append(extended_properties_revealer);
         extended_properties_revealer.halign = Gtk.Align.END;
         extended_properties_revealer.hexpand = false;
         if (Config.Facade.get_instance().get_display_extended_properties()) {
@@ -1112,9 +1138,9 @@ public class LibraryWindow : AppWindow {
             extended_properties_revealer.set_reveal_child(false);
         }
 
-        layout.pack_end(client_paned, true, true, 0);
+        layout.append(client_paned);
         
-        add(layout);
+        set_child(layout);
 
         switch_to_page(start_page);
         start_page.grab_focus();
@@ -1141,16 +1167,18 @@ public class LibraryWindow : AppWindow {
             set_show_menubar (false);
             Application.set_menubar (null);
 
-            Gtk.Toolbar toolbar = current_page.get_toolbar();
+            var toolbar = current_page.get_toolbar();
             if (toolbar != null)
-                toolbar_revealer.remove(toolbar);
+                toolbar_revealer.set_child(null);
 
             current_page.switching_from();
             
             // see note below about why the sidebar is uneditable while the LibraryPhotoPage is
             // visible
+            #if 0
             if (current_page is LibraryPhotoPage)
                 sidebar_tree.enable_editing();
+                #endif
             
             // old page unsubscribes to these signals (new page subscribes below)
             unsubscribe_from_basic_information(current_page);
@@ -1166,13 +1194,16 @@ public class LibraryWindow : AppWindow {
         // renaming in the sidebar because a single click while in the LibraryPhotoPage indicates
         // the user wants to return to the controlling page ... that is, in this special case, the
         // sidebar cursor is set not to the 'current' page, but the page the user came from
+        #if 0
         if (page is LibraryPhotoPage)
             sidebar_tree.disable_editing();
+            #endif
         
         // Update search filter to new page.
         toggle_search_bar(should_show_search_bar(), page as CheckerboardPage);
         
         // Not all pages have sidebar entries
+        #if 0
         Sidebar.Entry? entry = page_map.get(page);
         if (entry != null) {
             // if the corresponding sidebar entry is an expandable entry and wants to be
@@ -1183,13 +1214,14 @@ public class LibraryWindow : AppWindow {
 
             sidebar_tree.place_cursor(entry, true);
         }
+        #endif
         
         on_update_properties();
         
         if (page is CheckerboardPage)
             init_view_filter((CheckerboardPage)page);
         
-        page.show_all();
+        page.show();
         
         // subscribe to these signals for each event page so basic properties display will update
         subscribe_for_basic_information(get_current_page());
@@ -1202,10 +1234,10 @@ public class LibraryWindow : AppWindow {
         get_settings().gtk_shell_shows_menubar = !old;
         get_settings().gtk_shell_shows_menubar = old;
         
-        Gtk.Toolbar toolbar = page.get_toolbar();
+        var toolbar = page.get_toolbar();
         if (toolbar != null) {
-            toolbar_revealer.add(toolbar);
-            toolbar.show_all();
+            toolbar_revealer.set_child(toolbar);
+            toolbar.show();
             toolbar_revealer.set_reveal_child (this.is_toolbar_visible ());
         }
 
@@ -1234,6 +1266,7 @@ public class LibraryWindow : AppWindow {
         }
     }
     
+    #if 0
     private void on_page_created(Sidebar.PageRepresentative entry, Page page) {
         assert(!page_map.has_key(page));
         page_map.set(page, entry);
@@ -1288,6 +1321,7 @@ public class LibraryWindow : AppWindow {
         // basic all-around default: jump to the Library page
         switch_to_page(library_branch.photos_entry.get_page());
     }
+    #endif
     
     private void subscribe_for_basic_information(Page page) {
         ViewCollection view = page.get_view();
@@ -1356,6 +1390,7 @@ public class LibraryWindow : AppWindow {
         }
     }
     
+    #if 0
     public override bool key_press_event(Gdk.EventKey event) {
         if (sidebar_tree.has_focus && sidebar_tree.is_keypress_interpreted(event)
             && sidebar_tree.key_press_event(event)) {
@@ -1372,5 +1407,6 @@ public class LibraryWindow : AppWindow {
         
         return false;
     }
+    #endif
 }
 
diff --git a/src/library/TrashSidebarEntry.vala b/src/library/TrashSidebarEntry.vala
index 1269ce89..b62ce05f 100644
--- a/src/library/TrashSidebarEntry.vala
+++ b/src/library/TrashSidebarEntry.vala
@@ -45,9 +45,11 @@ public class Library.TrashSidebarEntry : Sidebar.SimplePageEntry, Sidebar.Intern
         return true;
     }
 
+#if DOES_NOT_WORK_WITH_GTK4
     public bool internal_drop_received_arbitrary(Gtk.SelectionData data) {
         return false;
     }
+    #endif
 
     protected override Page create_page() {
         return new TrashPage();
diff --git a/src/main.vala b/src/main.vala
index 014b0b54..74a10f01 100644
--- a/src/main.vala
+++ b/src/main.vala
@@ -81,7 +81,7 @@ void library_exec(string[] mounts) {
         Gtk.MessageDialog dialog = new Gtk.MessageDialog(null, Gtk.DialogFlags.MODAL, 
             Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, "%s", errormsg);
         dialog.title = Resources.APP_TITLE;
-        dialog.run();
+        dialog.show(); //TODO dialog.run();
         dialog.destroy();
         
         DatabaseTable.terminate();
@@ -113,7 +113,7 @@ void library_exec(string[] mounts) {
             progress_dialog.update_display_every(100);
             progress_dialog.set_minimum_on_screen_time_msec(250);
             try {
-                progress_dialog.icon = new 
Gdk.Pixbuf.from_resource("/org/gnome/Shotwell/icons/hicolor/scalable/org.gnome.Shotwell.svg");
+                //progress_dialog.icon = new 
Gdk.Pixbuf.from_resource("/org/gnome/Shotwell/icons/hicolor/scalable/org.gnome.Shotwell.svg");
             } catch (Error err) {
                 debug("Warning - could not load application icon for loading window: %s", err.message);
             }
@@ -185,7 +185,7 @@ void library_exec(string[] mounts) {
     foreach (string mount in mounts)
         library_window.mounted_camera_shell_notification(mount, true);
 
-    library_window.show_all();
+    library_window.show();
 
     WelcomeServiceEntry[] selected_import_entries = new WelcomeServiceEntry[0];
     if (Config.Facade.get_instance().get_show_welcome_dialog() &&
@@ -313,7 +313,7 @@ void editing_exec(string filename, bool fullscreen) {
     //       we'll need to register DirectPhoto.global with the MediaCollectionRegistry
     
     DirectWindow direct_window = new DirectWindow(initial_file);
-    direct_window.show_all();
+    direct_window.show();
     
     debug("%lf seconds to Gtk.main()", startup_timer.elapsed());
 
@@ -384,8 +384,8 @@ void main(string[] args) {
 
     // init GTK (valac has already called g_threads_init())
     try {
-        Gtk.init_with_args(ref args, _("[FILE]"), CommandlineOptions.entries,
-            Resources.APP_GETTEXT_PACKAGE);
+        Gtk.init (); //_with_args(ref args, _("[FILE]"), CommandlineOptions.entries,
+            // TODO Resources.APP_GETTEXT_PACKAGE);
 
     } catch (Error e) {
         print(e.message + "\n");
diff --git a/src/meson.build b/src/meson.build
index bdd63864..77eca629 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -6,7 +6,7 @@ sw_graphics_processor = static_library('shotwell-graphics-processor',
                 '_transformation.c'],
                vala_header : 'shotwell-graphics-processor.h',
                vala_vapi : 'shotwell-graphics-processor.vapi',
-               dependencies : [gio, gee, gdk],
+               dependencies : [gio, gee, gdk_pixbuf],
                include_directories : config_incdir,
                c_args : '-DG_DISABLE_CAST_CHECKS',
                vala_args : '--disable-assert',
@@ -14,20 +14,16 @@ sw_graphics_processor = static_library('shotwell-graphics-processor',
 
 processor = executable('shotwell-graphics-processor',
                        ['graphics-processor.vala'],
-                       dependencies: [gio, gdk, gee],
+                       dependencies: [gio, gee, gdk_pixbuf],
                        link_with: sw_graphics_processor)
 
-shotwell_deps = [gio, gee, sqlite, gtk, sqlite, posix, gphoto2,
-                 gstreamer_pbu, gio_unix, gudev, gexiv2, gmodule,
-                 libraw, libexif, sw_plugin]
-
 shotwell_libs = [sw_graphics_processor]
 
 face_sources = []
 face_obj = ''
 
 if get_option('face_detection')
-  face_sources = (['faces/FacesBranch.vala',
+  face_sources = ([
                      'faces/FacePage.vala',
                      'faces/FaceShape.vala',
                      'faces/FaceDetect.vala',
@@ -37,7 +33,7 @@ endif
 
 shotwell_deps = [gio, gee, sqlite, gtk, sqlite, posix, gphoto2,
                  gstreamer_pbu, gio_unix, gudev, gexiv2, gmodule, unity,
-                 libraw, libexif, sw_plugin, webpdemux, webp, version, gdk ]
+                 libraw, libexif, sw_plugin, webpdemux, webp, version, pangocairo ]
 
 subdir('metadata')
 subdir('publishing')
@@ -69,9 +65,6 @@ executable(
         'db/VideoTable.vala',
         'db/VersionTable.vala',
         'db/SavedSearchDBTable.vala',
-        'editing_tools/EditingTools.vala',
-        'editing_tools/RGBHistogramManipulator.vala',
-        'editing_tools/StraightenTool.vala',
         'faces/Face.vala',
         'faces/FaceLocation.vala',
         'slideshow/Slideshow.vala',
@@ -101,12 +94,6 @@ executable(
             'library/BackgroundProgressBar.vala',
         'library/Library.vala',
         'library/LibraryWindow.vala',
-        'library/LibraryBranch.vala',
-        'library/TrashSidebarEntry.vala',
-        'library/OfflineSidebarEntry.vala',
-        'library/FlaggedSidebarEntry.vala',
-        'library/LastImportSidebarEntry.vala',
-        'library/ImportQueueSidebarEntry.vala',
         'library/FlaggedPage.vala',
         'library/ImportQueuePage.vala',
         'library/LastImportPage.vala',
@@ -134,45 +121,28 @@ executable(
         'core/DataViewTypes.vala',
         'core/Tracker.vala',
         'core/SourceInterfaces.vala',
-        'sidebar/Sidebar.vala',
-        'sidebar/Branch.vala',
-        'sidebar/Entry.vala',
-        'sidebar/Tree.vala',
-        'sidebar/common.vala',
         'events/Events.vala',
-        'events/EventsBranch.vala',
         'events/EventsDirectoryPage.vala',
         'events/EventPage.vala',
         'events/EventDirectoryItem.vala',
         'tags/Tags.vala',
-        'tags/TagsBranch.vala',
         'tags/TagPage.vala',
         'tags/HierarchicalTagIndex.vala',
         'tags/HierarchicalTagUtilities.vala',
         'camera/Camera.vala',
-        'camera/CameraBranch.vala',
         'camera/CameraTable.vala',
             'camera/DiscoveredCamera.vala',
         'camera/GPhoto.vala',
         'camera/ImportPage.vala',
         'searches/Searches.vala',
-        'searches/SearchesBranch.vala',
         'searches/SearchBoolean.vala',
         'searches/SavedSearchPage.vala',
         'searches/SavedSearchDialog.vala',
         'config/Config.vala',
         'config/ConfigurationInterfaces.vala',
         'config/GSettingsEngine.vala',
-        'data_imports/DataImports.vala',
-        'data_imports/DataImportsPluginHost.vala',
-        'data_imports/DataImportsUI.vala',
-        'data_imports/DataImportJob.vala',
-        'data_imports/DataImportSource.vala',
         'folders/Folders.vala',
-        'folders/FoldersBranch.vala',
         'folders/FoldersPage.vala',
-        'import-roll/ImportRollBranch.vala',
-        'import-roll/ImportRollEntry.vala',
         'main.vala',
         'AppWindow.vala',
         'CollectionPage.vala',
@@ -186,7 +156,6 @@ executable(
         'Page.vala',
         'SinglePhotoPage.vala',
         'CheckerboardPage.vala',
-        'DragAndDropHandler.vala',
         'PageMessagePane.vala',
         'SortedList.vala',
         'Dimensions.vala',
diff --git a/src/plugins/ManifestWidget.vala b/src/plugins/ManifestWidget.vala
index 298d6117..2ccff212 100644
--- a/src/plugins/ManifestWidget.vala
+++ b/src/plugins/ManifestWidget.vala
@@ -20,7 +20,7 @@ public class ManifestWidgetMediator : Gtk.Box {
     public ManifestWidgetMediator() {
         Object();
 
-        list_bin.add(list);
+        list_bin.set_child(list);
         
         about_button.clicked.connect(on_about);
         list.get_selection().changed.connect(on_selection_changed);
@@ -64,17 +64,19 @@ public class ManifestWidgetMediator : Gtk.Box {
         about_dialog.copyright = info.copyright;
         about_dialog.license = info.license;
         about_dialog.wrap_license = info.is_license_wordwrapped;
+        #if 0
         about_dialog.logo = (info.icons != null && info.icons.length > 0) ? info.icons[0] :
             Resources.get_icon(Resources.ICON_GENERIC_PLUGIN);
+            #endif
         about_dialog.program_name = get_pluggable_name(id);
         about_dialog.translator_credits = info.translators;
         about_dialog.version = info.version;
         about_dialog.website = info.website_url;
         about_dialog.website_label = info.website_name;
+        about_dialog.set_modal (true);
         
-        about_dialog.run();
-        
-        about_dialog.destroy();
+        // TODO about_dialog.run();
+        Gtk.show_about_dialog(about_dialog);
     }
     
     private void on_selection_changed() {
@@ -121,7 +123,6 @@ private class ManifestListView : Gtk.TreeView {
         checkbox_renderer.activatable = true;
         
         Gtk.CellRendererPixbuf icon_renderer = new Gtk.CellRendererPixbuf();
-        icon_renderer.stock_size = Gtk.IconSize.MENU;
         icon_renderer.xpad = ICON_X_PADDING;
         icon_renderer.ypad = ICON_Y_PADDING;
         
@@ -148,7 +149,7 @@ private class ManifestListView : Gtk.TreeView {
         set_grid_lines(Gtk.TreeViewGridLines.NONE);
         get_selection().set_mode(Gtk.SelectionMode.BROWSE);
         
-        Gtk.IconTheme icon_theme = Gtk.IconTheme.get_default();
+        Gtk.IconTheme icon_theme = Gtk.IconTheme.get_for_display (Gdk.Display.get_default());
         
         // create a list of plugins (sorted by name) that are separated by extension points (sorted
         // by name)
@@ -156,17 +157,10 @@ private class ManifestListView : Gtk.TreeView {
             Gtk.TreeIter category_iter;
             store.append(out category_iter, null);
             
-            Gdk.Pixbuf? icon = null;
+            Gdk.Paintable? icon = null;
             if (extension_point.icon_name != null) {
-                Gtk.IconInfo? icon_info = icon_theme.lookup_by_gicon(
-                    new ThemedIcon(extension_point.icon_name), ICON_SIZE, 0);
-                if (icon_info != null) {
-                    try {
-                        icon = icon_info.load_icon();
-                    } catch (Error err) {
-                        warning("Unable to load icon %s: %s", extension_point.icon_name, err.message);
-                    }
-                }
+                icon = icon_theme.lookup_by_gicon(
+                    new ThemedIcon(extension_point.icon_name), ICON_SIZE, 0, Gtk.TextDirection.NONE, 0);
             }
             
             store.set(category_iter, Column.NAME, extension_point.name, Column.CAN_ENABLE, false,
@@ -182,9 +176,11 @@ private class ManifestListView : Gtk.TreeView {
                 Spit.PluggableInfo info = Spit.PluggableInfo();
                 pluggable.get_info(ref info);
                 
+                #if 0
                 icon = (info.icons != null && info.icons.length > 0) 
                     ? info.icons[0]
                     : Resources.get_icon(Resources.ICON_GENERIC_PLUGIN, ICON_SIZE);
+                    #endif
                 
                 Gtk.TreeIter plugin_iter;
                 store.append(out plugin_iter, category_iter);
@@ -229,6 +225,7 @@ private class ManifestListView : Gtk.TreeView {
     //
     // The only way found to work around this is to capture the button-down event and do our own
     // hit-testing.
+    #if DOES_NOT_WORK_WITH_GTK4
     public override bool button_press_event(Gdk.EventButton event) {
         Gtk.TreePath path;
         Gtk.TreeViewColumn col;
@@ -261,6 +258,7 @@ private class ManifestListView : Gtk.TreeView {
         
         return true;
     }
+    #endif
 }
 
 }
diff --git a/src/publishing/PublishingPluginHost.vala b/src/publishing/PublishingPluginHost.vala
index 22f6c34d..93ee03f3 100644
--- a/src/publishing/PublishingPluginHost.vala
+++ b/src/publishing/PublishingPluginHost.vala
@@ -185,8 +185,7 @@ public class ConcretePublishingHost : Plugins.StandardHostInterface,
     }
 
     public void set_dialog_default_widget(Gtk.Widget widget) {
-        widget.can_default = true;
-        dialog.set_default(widget);
+        dialog.set_default_widget(widget);
     }
     
     public Spit.Publishing.Publisher.MediaType get_publishable_media_type() {
diff --git a/src/publishing/PublishingUI.vala b/src/publishing/PublishingUI.vala
index 7aacb3d3..1461c1d9 100644
--- a/src/publishing/PublishingUI.vala
+++ b/src/publishing/PublishingUI.vala
@@ -36,7 +36,7 @@ public class PublishingDialog : Gtk.Dialog {
         bool use_header = Resources.use_header_bar() == 1;
         Object(use_header_bar: Resources.use_header_bar());
         if (use_header) {
-            ((Gtk.HeaderBar) get_header_bar()).set_show_close_button(false);
+            ((Gtk.HeaderBar) get_header_bar()).set_show_title_buttons(false);
         } else {
             get_content_area().set_spacing(6);
         }
@@ -44,7 +44,7 @@ public class PublishingDialog : Gtk.Dialog {
         resizable = false;
         modal = true;
         set_transient_for(AppWindow.get_instance());
-        delete_event.connect(on_window_close);
+        close_request.connect(on_window_close);
 
         publishables = new Spit.Publishing.Publishable[0];
         bool has_photos = false;
@@ -144,31 +144,29 @@ public class PublishingDialog : Gtk.Dialog {
             service_selector_box.vexpand = false;
 
             Gtk.Box service_selector_layouter = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
-            service_selector_layouter.set_border_width(12);
             service_selector_layouter.hexpand = true;
-            service_selector_layouter.add(service_selector_box_label);
-            service_selector_layouter.pack_start(service_selector_box, true, true, 0);
+            service_selector_layouter.append(service_selector_box_label);
+            service_selector_layouter.prepend(service_selector_box);
 
             /* 'service area' is the selector assembly plus the horizontal rule dividing it from the
                rest of the dialog */
             Gtk.Box service_area_layouter = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
-            service_area_layouter.add(service_selector_layouter);
-            service_area_layouter.add(new Gtk.Separator(Gtk.Orientation.HORIZONTAL));
+            service_area_layouter.append(service_selector_layouter);
+            service_area_layouter.append(new Gtk.Separator(Gtk.Orientation.HORIZONTAL));
             service_area_layouter.halign = Gtk.Align.FILL;
             service_area_layouter.valign = Gtk.Align.START;
             service_area_layouter.hexpand = true;
             service_area_layouter.vexpand = false;
 
-            get_content_area().pack_start(service_area_layouter, false, false, 0);
+            get_content_area().prepend(service_area_layouter);
         }
 
         central_area_layouter = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
 
-        get_content_area().pack_start(central_area_layouter, true, true, 0);
+        get_content_area().prepend(central_area_layouter);
         
         if (use_header) {
             close_cancel_button = new Gtk.Button.with_mnemonic("_Cancel");
-            close_cancel_button.set_can_default(true);
 
             ((Gtk.HeaderBar) get_header_bar()).pack_start(close_cancel_button);
             ((Gtk.HeaderBar) get_header_bar()).pack_end(service_selector_box);
@@ -181,7 +179,7 @@ public class PublishingDialog : Gtk.Dialog {
 
         set_standard_window_mode();
         
-        show_all();
+        show();
     }
     
     private static Spit.Publishing.Service[] load_all_services() {
@@ -308,7 +306,7 @@ public class PublishingDialog : Gtk.Dialog {
         elapsed_is_valid = true;
     }
     
-    private bool on_window_close(Gdk.EventAny evt) {
+    private bool on_window_close() {
         host.stop_publishing();
         host = null;
         hide();
@@ -396,12 +394,12 @@ public class PublishingDialog : Gtk.Dialog {
 
     public void set_close_button_mode() {
         close_cancel_button.set_label(_("_Close"));
-        set_default(close_cancel_button);
+        set_default_widget(close_cancel_button);
     }
 
     public void set_cancel_button_mode() {
         close_cancel_button.set_label(_("_Cancel"));
-        set_default(null);
+        set_default_widget(null);
     }
 
     public void lock_service() {
@@ -422,8 +420,8 @@ public class PublishingDialog : Gtk.Dialog {
             central_area_layouter.remove(active_pane.get_widget());
         }
 
-        central_area_layouter.pack_start(pane.get_widget(), true, true, 0);
-        show_all();
+        central_area_layouter.prepend(pane.get_widget());
+        show();
 
         Spit.Publishing.DialogPane.GeometryOptions geometry_options =
             pane.get_preferred_geometry();
@@ -446,7 +444,7 @@ public class PublishingDialog : Gtk.Dialog {
     public new int run() {
         on_service_changed();
 
-        int result = base.run();
+        int result = 0; //base.run();
         
         host = null;
         
diff --git a/src/publishing/StaticMessagePaneWidget.vala b/src/publishing/StaticMessagePaneWidget.vala
index 6d51e972..99dd4bd9 100644
--- a/src/publishing/StaticMessagePaneWidget.vala
+++ b/src/publishing/StaticMessagePaneWidget.vala
@@ -31,7 +31,7 @@ public class StaticMessagePane : Spit.Publishing.DialogPane, Gtk.Box {
 
         if (enable_markup) {
             static_msg_label.set_markup(message_string);
-            static_msg_label.set_line_wrap(true);
+            static_msg_label.set_wrap(true);
             static_msg_label.set_use_markup(true);
         } else {
             static_msg_label.set_label(message_string);
diff --git a/src/searches/SavedSearchDialog.vala b/src/searches/SavedSearchDialog.vala
index 0ba5426b..9cb7ff6c 100644
--- a/src/searches/SavedSearchDialog.vala
+++ b/src/searches/SavedSearchDialog.vala
@@ -48,18 +48,17 @@ public class SavedSearchDialog : Gtk.Dialog {
             set_type_combo_box(SearchCondition.SearchType.ANY_TEXT); // Sets default.
             type_combo.changed.connect(on_type_changed);
             
-            remove_button = new Gtk.Button.from_icon_name("window-close-symbolic", Gtk.IconSize.BUTTON);
-            remove_button.set_relief(Gtk.ReliefStyle.NONE);
+            remove_button = new Gtk.Button.from_icon_name("window-close-symbolic");
             remove_button.clicked.connect(on_removed);
             
             box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 6);
-            box.pack_start(type_combo, false, false, 0);
-            box.pack_end(remove_button, false, false, 0);
+            box.prepend(type_combo);
+            box.append(remove_button);
             box.margin_top = 2;
             box.margin_bottom = 2;
             box.margin_start = 8;
             box.margin_end = 8;
-            box.show_all();
+            box.show();
         }
         
         private void on_type_changed() {
@@ -112,7 +111,7 @@ public class SavedSearchDialog : Gtk.Dialog {
                     assert_not_reached ();
             }
             
-            box.pack_start (my_row.get_widget());
+            box.append (my_row.get_widget());
         }
         
         public SearchCondition.SearchType get_search_type() {
@@ -183,9 +182,9 @@ public class SavedSearchDialog : Gtk.Dialog {
             entry.changed.connect(on_changed);
             
             box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
-            box.pack_start(text_context, false, false, 0);
-            box.pack_start(entry, false, false, 0);
-            box.show_all();
+            box.append(text_context);
+            box.append(entry);
+            box.show();
         }
         
         ~SearchRowText() {
@@ -261,9 +260,9 @@ public class SavedSearchDialog : Gtk.Dialog {
             media_type.changed.connect(on_changed);
             
             box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
-            box.pack_start(media_context, false, false, 0);
-            box.pack_start(media_type, false, false, 0);
-            box.show_all();
+            box.append(media_context);
+            box.append(media_type);
+            box.show();
         }
         
         ~SearchRowMediaType() {
@@ -323,9 +322,9 @@ public class SavedSearchDialog : Gtk.Dialog {
             modified_state.changed.connect(on_changed);
             
             box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
-            box.pack_start(modified_context, false, false, 0);
-            box.pack_start(modified_state, false, false, 0);
-            box.show_all();
+            box.append(modified_context);
+            box.append(modified_state);
+            box.show();
         }
         
         ~SearchRowModified() {
@@ -378,9 +377,9 @@ public class SavedSearchDialog : Gtk.Dialog {
             flagged_state.changed.connect(on_changed);
             
             box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
-            box.pack_start(new Gtk.Label(_("is")), false, false, 0);
-            box.pack_start(flagged_state, false, false, 0);
-            box.show_all();
+            box.append(new Gtk.Label(_("is")));
+            box.append(flagged_state);
+            box.show();
         }
         
         ~SearchRowFlagged() {
@@ -443,10 +442,10 @@ public class SavedSearchDialog : Gtk.Dialog {
             context.changed.connect(on_changed);
             
             box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
-            box.pack_start(new Gtk.Label(_("is")), false, false, 0);
-            box.pack_start(rating, false, false, 0);
-            box.pack_start(context, false, false, 0);
-            box.show_all();
+            box.append(new Gtk.Label(_("is")));
+            box.append(rating);
+            box.append(context);
+            box.show();
         }
         
         ~SearchRowRating() {
@@ -518,12 +517,12 @@ public class SavedSearchDialog : Gtk.Dialog {
             and = new Gtk.Label(_("and"));
             
             box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 3);
-            box.pack_start(context, false, false, 0);
-            box.pack_start(label_one, false, false, 0);
-            box.pack_start(and, false, false, 0);
-            box.pack_start(label_two, false, false, 0);
+            box.append(context);
+            box.append(label_one);
+            box.append(and);
+            box.append(label_two);
             
-            box.show_all();
+            box.show();
             update_date_labels();
         }
         
@@ -614,13 +613,10 @@ public class SavedSearchDialog : Gtk.Dialog {
             d.set_modal(true);
             d.set_resizable(false);
             d.set_decorated(false);
-            ((Gtk.Box) d.get_content_area()).add(cal);
+            ((Gtk.Box) d.get_content_area()).append(cal);
             ulong id_1 = cal.day_selected.connect(()=>{update_date_labels();});
-            ulong id_2 = cal.day_selected_double_click.connect(()=> {
-                  d.response(Gtk.ResponseType.ACCEPT);
-            });
-            d.show_all();
-            int res = d.run();
+            d.show();
+            int res = 0; //d.run();
             if (res != Gtk.ResponseType.ACCEPT) {
                 // User hit cancel, restore original date.
                 cal.day = orig_day;
@@ -628,7 +624,6 @@ public class SavedSearchDialog : Gtk.Dialog {
                 cal.year = orig_year;
             }
             cal.disconnect(id_1);
-            cal.disconnect(id_2);
             d.destroy();
             update_date_labels();
         }
@@ -670,7 +665,7 @@ public class SavedSearchDialog : Gtk.Dialog {
         add_text_search();
         row_list.get(0).allow_removal(false);
 
-        show_all();
+        show();
         set_valid(false);
     }
     
@@ -681,7 +676,7 @@ public class SavedSearchDialog : Gtk.Dialog {
         edit_mode = true;
         setup_dialog();
         
-        show_all();
+        show();
         
         // Load existing search into dialog.
         operator.set_active((SearchOperator) saved_search.get_operator());
@@ -705,16 +700,18 @@ public class SavedSearchDialog : Gtk.Dialog {
         
         search_title.changed.connect(on_title_changed);
         if (Resources.use_header_bar() == 1) {
-            var box = search_title.get_parent();
+            var box = (Gtk.Box)search_title.get_parent();
             box.remove(search_title);
-            box.get_parent().remove(box);
-            ((Gtk.HeaderBar) get_header_bar()).set_custom_title(search_title);
+            ((Gtk.Box)box.get_parent()).remove(box);
+            ((Gtk.HeaderBar) get_header_bar()).set_title_widget(search_title);
         }
     }
     
     // Displays the dialog.
     public new void show() {
-        run();
+        //run();
+        base.show();
+        // TODO
         destroy();
     }
     
diff --git a/src/searches/Searches.vala b/src/searches/Searches.vala
index 20213818..f13a987e 100644
--- a/src/searches/Searches.vala
+++ b/src/searches/Searches.vala
@@ -20,11 +20,11 @@ public void preconfigure() {
 }
 
 public void init() throws Error {
-    Searches.SidebarEntry.init();
+    //Searches.SidebarEntry.init();
 }
 
 public void terminate() {
-    Searches.SidebarEntry.terminate();
+    //Searches.SidebarEntry.terminate();
 }
 
 }
diff --git a/src/sidebar/Entry.vala b/src/sidebar/Entry.vala
index f009e409..b2740fac 100644
--- a/src/sidebar/Entry.vala
+++ b/src/sidebar/Entry.vala
@@ -65,7 +65,9 @@ public interface Sidebar.DestroyableEntry : Sidebar.Entry {
 public interface Sidebar.InternalDropTargetEntry : Sidebar.Entry {
     // Returns true if drop was successful
     public abstract bool internal_drop_received(Gee.List<MediaSource> sources);
+    #if 0
     public abstract bool internal_drop_received_arbitrary(Gtk.SelectionData data);
+    #endif
 }
 
 public interface Sidebar.InternalDragSourceEntry : Sidebar.Entry {
diff --git a/src/sidebar/Tree.vala b/src/sidebar/Tree.vala
index aae81a01..b07af779 100644
--- a/src/sidebar/Tree.vala
+++ b/src/sidebar/Tree.vala
@@ -90,7 +90,7 @@ public class Sidebar.Tree : Gtk.TreeView {
     
     public signal void destroying_page(Sidebar.PageRepresentative entry, Page page);
     
-    public Tree(Gtk.TargetEntry[] target_entries, Gdk.DragAction actions,
+    public Tree(Gdk.ContentFormats[] target_entries, Gdk.DragAction actions,
         ExternalDropHandler drop_handler) {
         set_model(store);
         
diff --git a/src/tags/Tags.vala b/src/tags/Tags.vala
index 308865be..335572b3 100644
--- a/src/tags/Tags.vala
+++ b/src/tags/Tags.vala
@@ -7,11 +7,11 @@
 namespace Tags {
 
 public void init() throws Error {
-    Tags.SidebarEntry.init();
+    //Tags.SidebarEntry.init();
 }
 
 public void terminate() {
-    Tags.SidebarEntry.terminate();
+    //Tags.SidebarEntry.terminate();
 }
 
 }
diff --git a/src/util/KeyValueMap.vala b/src/util/KeyValueMap.vala
index dfc1fd2f..9980a00a 100644
--- a/src/util/KeyValueMap.vala
+++ b/src/util/KeyValueMap.vala
@@ -4,6 +4,14 @@
  * (version 2.1 or later).  See the COPYING file in this distribution.
  */
 
+namespace Gdk {
+    [Compact]
+    public struct Point {
+        int x;
+        int y;
+    }
+}
+
 public class KeyValueMap {
     private string group;
     private Gee.HashMap<string, string> map = new Gee.HashMap<string, string>();
@@ -91,7 +99,7 @@ public class KeyValueMap {
         
         return (value != null) ? bool.parse(value) : def;
     }
-    
+
     // REDEYE: redeye reduction operates on circular regions defined by
     //         (Gdk.Point, int) pairs, where the Gdk.Point specifies the
     //         bounding circle's center and the the int specifies the circle's
diff --git a/src/util/image.vala b/src/util/image.vala
index 2133364f..2d8e9bf1 100644
--- a/src/util/image.vala
+++ b/src/util/image.vala
@@ -24,17 +24,17 @@ void set_source_color_from_string(Cairo.Context ctx, string spec) {
 private const int MIN_SCALED_WIDTH = 10;
 private const int MIN_SCALED_HEIGHT = 10;
 
-Gdk.Pixbuf get_placeholder_pixbuf () {
+Gdk.Paintable get_placeholder_pixbuf () {
     // Create empty pixbuf.
-    Gdk.Pixbuf? pixbuf = null;
+    Gdk.Paintable? pixbuf = null;
 
     try {
-        var icon_theme = Gtk.IconTheme.get_default ();
-        pixbuf = icon_theme.load_icon("image-missing",
-                Gtk.IconSize.DIALOG, 0);
+        var icon_theme = Gtk.IconTheme.get_for_display (Gdk.Display.get_default());
+        pixbuf = icon_theme.lookup_icon("image-missing", null,
+                Gtk.IconSize.LARGE, 0, Gtk.TextDirection.NONE, 0);
     } catch (Error error) {
         try {
-            pixbuf = new Gdk.Pixbuf.from_resource("/org/gnome/Shotwell/icons/image-missing.png");
+            pixbuf = Gdk.Texture.from_resource("/org/gnome/Shotwell/icons/image-missing.png");
         } catch (Error err) {
             warning("Could not load fall-back icon: %s", err.message);
         }
diff --git a/src/util/misc.vala b/src/util/misc.vala
index 6c44dfe6..2d263626 100644
--- a/src/util/misc.vala
+++ b/src/util/misc.vala
@@ -180,6 +180,7 @@ public Gee.List<PhotoID?>? unserialize_photo_ids(uchar* serialized, int size) {
 }
 
 public uchar[] serialize_media_sources(Gee.Collection<MediaSource> media) {
+#if 0
     Gdk.Atom[] atoms = new Gdk.Atom[media.size];
     int ctr = 0;
     foreach (MediaSource current_media in media)
@@ -188,11 +189,14 @@ public uchar[] serialize_media_sources(Gee.Collection<MediaSource> media) {
     size_t bytes = media.size * sizeof(Gdk.Atom);
     uchar[] serialized = new uchar[bytes];
     Memory.copy(serialized, atoms, bytes);
-    
     return serialized;
+    #endif
+
+    return new uchar[0];
 }
 
 public Gee.List<MediaSource>? unserialize_media_sources(uchar* serialized, int size) {
+#if 0
     size_t count = (size / sizeof(Gdk.Atom));
     if (count <= 0 || serialized == null)
         return null;
@@ -208,6 +212,8 @@ public Gee.List<MediaSource>? unserialize_media_sources(uchar* serialized, int s
     }
 
     return list;
+    #endif
+    return null;
 }
 
 public string format_local_datespan(Time from_date, Time to_date) {
diff --git a/src/util/system.vala b/src/util/system.vala
index 48e2cc98..cfb24d61 100644
--- a/src/util/system.vala
+++ b/src/util/system.vala
@@ -44,7 +44,7 @@ async void show_file_in_filemanager(File file) throws Error {
         yield manager.show_items({file.get_uri()}, id);
     } catch (Error e) {
         warning("Failed to launch file manager using DBus, using fall-back: %s", e.message);
-        Gtk.show_uri_on_window(AppWindow.get_instance(), file.get_parent().get_uri(), Gdk.CURRENT_TIME);
+        Gtk.show_uri(AppWindow.get_instance(), file.get_parent().get_uri(), Gdk.CURRENT_TIME);
     }
 }
 
diff --git a/src/util/ui.vala b/src/util/ui.vala
index c8638ca6..00a485cf 100644
--- a/src/util/ui.vala
+++ b/src/util/ui.vala
@@ -36,8 +36,8 @@ public enum Direction {
 }
 
 public void spin_event_loop() {
-    while (Gtk.events_pending())
-        Gtk.main_iteration();
+    while (MainContext.default().pending())
+        MainContext.default().iteration(true);
 }
 
 public AdjustmentRelation get_adjustment_relation(Gtk.Adjustment adjustment, int value) {
@@ -77,10 +77,7 @@ public bool has_only_key_modifier(Gdk.ModifierType field, Gdk.ModifierType mask)
     return (field 
         & (Gdk.ModifierType.SHIFT_MASK 
         | Gdk.ModifierType.CONTROL_MASK
-        | Gdk.ModifierType.MOD1_MASK
-        | Gdk.ModifierType.MOD3_MASK
-        | Gdk.ModifierType.MOD4_MASK
-        | Gdk.ModifierType.MOD5_MASK
+        | Gdk.ModifierType.ALT_MASK
         | Gdk.ModifierType.SUPER_MASK
         | Gdk.ModifierType.HYPER_MASK
         | Gdk.ModifierType.META_MASK)) == mask;
diff --git a/src/video-support/Video.vala b/src/video-support/Video.vala
index b4c798a0..f61a251a 100644
--- a/src/video-support/Video.vala
+++ b/src/video-support/Video.vala
@@ -531,6 +531,8 @@ public class Video : VideoSource, Flaggable, Monitorable, Dateable {
             AppWindow.database_error(err);
 
             return;
+        } catch (Error err) {
+        // TODO
         }
 
         notify_altered(new Alteration("metadata", "master-timestamp"));
@@ -723,6 +725,8 @@ public class Video : VideoSource, Flaggable, Monitorable, Dateable {
             AppWindow.database_error(err);
 
             return;
+        } catch (Error err) {
+            // TODO
         }
 
         assert(old_filepath != null);


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