Description: Port to GTK+ 3 and GIO.
 Known regressions:
   * Due to the migration from EggRecent to GtkRecentChooser, users
     will lose their recent files.
   * Tooltips for the toolbar items are no longer configurable (although
     this particular functionality doesn't seem to work either in the
     GTK+ 2 version).
   * Tooltips for the menu items are no longer shown in the statusbar;
     there is no statusbar at all.  Mimicking this libgnomeui behavior
     is possible but would make the code more complex.
   * Session management is gone; TTBOMK there is no proper replacement.
 .
 This patch also restores the printing functionality which was removed
 in 2.0.3-1.
Bug-Debian: https://bugs.debian.org/868413
Author: Yavor Doganov <yavor@gnu.org>
Forwarded: no
Last-Update: 2018-12-18
---


--- a/configure.in
+++ b/configure.in
@@ -24,21 +24,14 @@
 dnl * Check for required package and version
 dnl *******************************************************************
 dnl Minimum versions of libraries
-GTK_REQUIRED=2.2.1
-LIBGNOMEUI_REQUIRED=2.0.1
-LIBBONOBO_REQUIRED=2.0.0
+GTK_REQUIRED=3.21.4
 LIBXML_REQUIRED=2.4.23
 LIBGNOMEPRINT_REQUIRED=2.2.0
 LIBGNOMEPRINTUI_REQUIRED=2.2.0
-GNOMEVFS_REQUIRED=2.2.2
                
-PKG_CHECK_MODULES(GBONDS, gtk+-2.0 >= $GTK_REQUIRED \
-libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED \
-libbonobo-2.0 >= $LIBBONOBO_REQUIRED \
+PKG_CHECK_MODULES(GBONDS, gtk+-3.0 >= $GTK_REQUIRED \
+gconf-2.0 \
 libxml-2.0 >= $LIBXML_REQUIRED \
-libgnomeprint-2.2 >= $LIBGNOMEPRINT_REQUIRED \
-libgnomeprintui-2.2 >= $LIBGNOMEPRINTUI_REQUIRED \
-gnome-vfs-2.0 >= $GNOMEVFS_REQUIRED \
 )
 
 AC_SUBST(GBONDS_CFLAGS)
@@ -46,15 +39,6 @@
 
 
 dnl ---------------------------------------------------------------------------
-dnl - Is the new file chooser available?
-dnl ---------------------------------------------------------------------------
-PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.3.2,
-                  HAVE_FILE_CHOOSER="-DHAVE_FILE_CHOOSER",
-                  HAVE_FILE_CHOOSER="-UHAVE_FILE_CHOOSER")
-AC_SUBST(HAVE_FILE_CHOOSER)
-
-
-dnl ---------------------------------------------------------------------------
 dnl - Is freedesktop mime dbase available?
 dnl ---------------------------------------------------------------------------
 AC_PATH_PROG(UPDATE_MIME_DATABASE, update-mime-database, no)
@@ -81,7 +65,6 @@
 AC_OUTPUT([
 Makefile
 src/Makefile
-src/recent-files/Makefile
 pixmaps/Makefile
 data/Makefile
 po/Makefile.in
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,5 @@
 ## Process this file with automake to produce Makefile.in
 
-SUBDIRS= recent-files
-
 INCLUDES = \
         -I$(top_srcdir)                                 \
         -I$(top_builddir)                               \
@@ -76,13 +74,12 @@
 gbonds_LDFLAGS = 
 
 gbonds_LDADD =  \
-	$(GBONDS_LIBS) -lm		\
-	recent-files/librecent.la
+	$(GBONDS_LIBS) -lm
 
 
 uidir = $(datadir)/gbonds/ui/
 
-ui_DATA = gbonds-ui.xml
+ui_DATA = gbonds.ui
 
 EXTRA_DIST = \
 	$(ui_DATA)			\
--- a/src/gbonds.c
+++ b/src/gbonds.c
@@ -23,9 +23,8 @@
 
 #include <config.h>
 
-#include <libgnome/libgnome.h>
-#include <libgnomeui/libgnomeui.h>
-#include <libgnomeui/gnome-window-icon.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
 
 #include "splash.h"
 #include "prefs.h"
@@ -34,17 +33,12 @@
 #include "hig.h"
 #include "window.h"
 #include "file.h"
-#include "libbonoboui.h"
 #include "update.h"
 #include "debug.h"
 
 /*========================================================*/
 /* Private macros and constants.                          */
 /*========================================================*/
-#define ICON_PIXMAP gnome_program_locate_file (NULL,\
-					       GNOME_FILE_DOMAIN_APP_PIXMAP,\
-					       "gbonds.png",\
-					       FALSE, NULL)
 
 /*========================================================*/
 /* Private globals                                        */
@@ -53,17 +47,6 @@
 /*========================================================*/
 /* Local function prototypes                              */
 /*========================================================*/
-gint save_session_cb (GnomeClient        *client,
-                      gint                phase,
-                      GnomeRestartStyle   save_style,
-                      gint                shutdown,
-                      GnomeInteractStyle  interact_style,
-                      gint                fast,
-                      gpointer            client_data);
-
-void client_die_cb   (GnomeClient        *client,
-                      gpointer            client_data);
-
 
 /****************************************************************************/
 /* main program                                                             */
@@ -71,11 +54,9 @@
 int
 main (int argc, char **argv)
 {
-        GnomeProgram  *program;
-	GnomeClient   *client;
-        GValue         value = { 0, };
-	poptContext    ctx;
+	GOptionContext *ctx;
         char         **args;
+        GError        *error = NULL;
         GList         *file_list = NULL, *p;
 	gint           i;
 	GtkWidget     *win;
@@ -87,28 +68,39 @@
         bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
         textdomain (GETTEXT_PACKAGE);
 
-        /* Initialize gnome program */
-        program = gnome_program_init ("gbonds", VERSION,
-                                      LIBGNOMEUI_MODULE, argc, argv,
-                                      GNOME_PROGRAM_STANDARD_PROPERTIES,
-                                      NULL);
+	/* Parse args and build the list of files to be loaded at startup */
+        ctx = g_option_context_new (_("[FILE…]"));
+        g_option_context_set_translation_domain (ctx, GETTEXT_PACKAGE);
+        g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
+#ifdef G_OS_WIN32
+        args = g_win32_get_command_line ();
+#else
+        args = g_strdupv (argv);
+#endif
+        if (!g_option_context_parse_strv (ctx, &args, &error))
+        {
+                g_print (_("Option parsing failed: %s\n"), error->message);
+                return -1;
+        }
+
+        gtk_init (&argc, &argv);
 
 	/* Splash screen */
         gb_splash ();
 
 	/* Set default icon */
-	if (!g_file_test (ICON_PIXMAP, G_FILE_TEST_EXISTS))
-	{
-		g_warning ("Could not find %s", ICON_PIXMAP);
-	}
-	else
-	{
-		gnome_window_icon_set_default_from_file (ICON_PIXMAP);
-	}
-	
-        if (bonobo_ui_init ("gbonds", VERSION, &argc, argv) == FALSE) {
-                g_error (_("Could not initialize Bonobo!\n"));
+        utf8_filename = g_build_filename (DATADIR, G_DIR_SEPARATOR_S,
+                                          "pixmaps", G_DIR_SEPARATOR_S,
+                                          "gbonds.png", NULL);
+        if (!g_file_test (utf8_filename, G_FILE_TEST_EXISTS))
+        {
+		g_warning ("Could not find %s", utf8_filename);
+        }
+        else
+        {
+		gtk_window_set_default_icon_from_file (utf8_filename, NULL);
         }
+        g_free (utf8_filename);
 
         /* Load user preferences */
 	gb_debug_init ();
@@ -117,14 +109,6 @@
 	gb_recent_init ();
 	gb_table_init ();
 
-	/* Handle session management */
-	client = gnome_master_client();
-        g_signal_connect (G_OBJECT (client), "save_yourself",
-                          G_CALLBACK (save_session_cb),
-                          (gpointer)argv[0]);
-        g_signal_connect (G_OBJECT (client), "die",
-                          G_CALLBACK (client_die_cb), NULL);
-
 	/* Make sure we are configured with some redemption data */
 	table_model = gb_table_get_model ();
 	dates = gb_table_model_get_rdate_list (table_model, 1);
@@ -143,20 +127,16 @@
 	}
 	gb_table_model_free_rdate_list (dates);
 
-	/* Parse args and build the list of files to be loaded at startup */
-        g_value_init (&value, G_TYPE_POINTER);
-        g_object_get_property (G_OBJECT (program),
-                               GNOME_PARAM_POPT_CONTEXT, &value);
-        ctx = g_value_get_pointer (&value);
-        g_value_unset (&value);
-        args = (char**) poptGetArgs(ctx);
-        for (i = 0; args && args[i]; i++)
+        for (i = 1; args && args[i]; i++)
         {
 		utf8_filename = g_filename_to_utf8 (args[i], -1, NULL, NULL, NULL);
 		if (utf8_filename)
 			file_list = g_list_append (file_list, utf8_filename);
         }
 
+        g_strfreev (args);
+        g_option_context_free (ctx);
+
 	/* Any files on command line? */
 	for (p = file_list; p; p = p->next) {
 		win = gb_window_new_from_file (p->data);
@@ -177,17 +157,39 @@
 
 		case GB_PREFS_STARTUP_RECENT:
 		{
-			EggRecentModel *recent_model;
-			GList          *recent_list;
+			GtkRecentManager *recent_model;
+	                GList            *recent_list, *l;
+	                const gchar      *mime, *uri;
+	                gchar            *file = NULL;
 
 			recent_model = gb_recent_get_model ();
-			recent_list = egg_recent_model_get_list (recent_model);
+			recent_list = gtk_recent_manager_get_items (recent_model);
 			if ( recent_list != NULL ) {
-				if ( !gb_file_open_real (recent_list->data, GTK_WINDOW (win)) ) {
-					gb_file_new (GTK_WINDOW (win));
-				}
-			}
-		}
+	                        for (l = recent_list; l; l = l->next) {
+	                                mime = gtk_recent_info_get_mime_type
+	                                        (l->data);
+	                                if (!g_strcmp0 ("application/x-gbonds",
+	                                                mime)) {
+	                                        uri = gtk_recent_info_get_uri
+	                                                (l->data);
+	                                        file = g_filename_from_uri
+	                                                (uri, NULL, NULL);
+	                                        break;
+	                                }
+	                        }
+
+	                        if (!file
+	                            || !gb_file_open_real (file, GTK_WINDOW (win)))
+	                                gb_file_new (GTK_WINDOW (win));
+
+	                        g_list_free_full (recent_list,
+	                                          (GDestroyNotify)
+	                                          gtk_recent_info_unref);
+	                        if (file)
+	                                g_free (file);
+	                } else
+	                        gb_file_new (GTK_WINDOW (win));
+	        }
 		break;
 
 		case GB_PREFS_STARTUP_DEFAULT:
@@ -216,52 +218,7 @@
 
 
         /* Begin main loop */
-        bonobo_main ();
+        gtk_main ();
 
         return 0;
 }
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE.  "Save session" callback.                                        */
-/*---------------------------------------------------------------------------*/
-gint save_session_cb (GnomeClient        *client,
-                      gint                phase,
-                      GnomeRestartStyle   save_style,
-                      gint                shutdown,
-                      GnomeInteractStyle  interact_style,
-                      gint                fast,
-                      gpointer            client_data)
-{
-        gchar       *argv[128];
-        gint         argc;
-        const GList *window_list;
-        GList       *p;
-        gbWindow    *window;
-        gbDoc       *doc;
-
-        argv[0] = (gchar *)client_data;
-        argc = 1;
-
-        window_list = gb_window_get_window_list();
-        for ( p=(GList *)window_list; p != NULL; p=p->next ) {
-                window = GB_WINDOW(p->data);
-                if ( !gb_window_is_empty (window) ) {
-                        doc = GB_VIEW(window->view)->doc;
-                        argv[argc++] = gb_doc_get_filename (doc);
-                }
-        }
-        gnome_client_set_clone_command(client, argc, argv);
-        gnome_client_set_restart_command(client, argc, argv);
-
-        return TRUE;
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE.  "Die" callback.                                                 */
-/*---------------------------------------------------------------------------*/
-void client_die_cb (GnomeClient *client,
-                    gpointer     client_data)
-{
-        gb_file_exit ();
-}
-
--- a/src/splash.c
+++ b/src/splash.c
@@ -23,15 +23,9 @@
 #include "config.h"
 
 #include <gtk/gtk.h>
-#include <libgnome/libgnome.h>
 
 #include "splash.h"
 
-#define SPLASH_PIXMAP gnome_program_locate_file (NULL,\
-						 GNOME_FILE_DOMAIN_APP_PIXMAP,\
-						 "gbonds/gbonds_logo.png",\
-						 FALSE, NULL)
-
 #define SPLASH_TIMEOUT 2000
 
 static GtkWidget *splash = NULL;
@@ -60,18 +54,23 @@
 	gtk_frame_set_shadow_type (GTK_FRAME (wframe1), GTK_SHADOW_OUT);
 	wframe2 = gtk_frame_new (NULL);
 
-	wvbox = gtk_vbox_new (FALSE, 5);
+	wvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
 	gtk_container_set_border_width (GTK_CONTAINER (wvbox), 2);
 
-	if (!g_file_test (SPLASH_PIXMAP, G_FILE_TEST_EXISTS)) {
-		g_warning ("Could not find %s", SPLASH_PIXMAP);
+	label = g_build_filename (DATADIR, G_DIR_SEPARATOR_S, "pixmaps",
+	                          G_DIR_SEPARATOR_S, "gbonds",
+	                          G_DIR_SEPARATOR_S, "gbonds_logo.png", NULL);
+	if (!g_file_test (label, G_FILE_TEST_EXISTS)) {
+		g_warning ("Could not find %s", label);
 	}
-	pixbuf = gdk_pixbuf_new_from_file (SPLASH_PIXMAP, &gerror);
+	pixbuf = gdk_pixbuf_new_from_file (label, &gerror);
 	if (gerror != NULL) {
 	        g_warning ("cannot open splash pixbuf: %s", gerror->message );
+	        g_free (label);
 		gtk_widget_destroy (splash);
 		return;
 	}
+	g_free (label);
 	wimage = gtk_image_new_from_pixbuf (pixbuf);
 	g_object_unref (pixbuf);
 
@@ -88,7 +87,7 @@
 
 	gtk_widget_show_all (splash);
 
-	gtk_timeout_add (SPLASH_TIMEOUT, splash_timeout, NULL);
+	g_timeout_add (SPLASH_TIMEOUT, splash_timeout, NULL);
 
 	while (gtk_events_pending ()) {
 		gtk_main_iteration ();
--- a/src/window.h
+++ b/src/window.h
@@ -24,8 +24,6 @@
 #define __WINDOW_H__
 
 #include <gtk/gtk.h>
-#include <bonobo/bonobo-window.h>
-#include <bonobo/bonobo-ui-component.h>
 
 #include "view.h"
 
@@ -33,27 +31,27 @@
 
 #define GB_TYPE_WINDOW (gb_window_get_type ())
 #define GB_WINDOW(obj) \
-        (GTK_CHECK_CAST((obj), GB_TYPE_WINDOW, gbWindow ))
+        (G_TYPE_CHECK_INSTANCE_CAST((obj), GB_TYPE_WINDOW, gbWindow ))
 #define GB_WINDOW_CLASS(klass) \
-        (GTK_CHECK_CLASS_CAST ((klass), GB_TYPE_WINDOW, gbWindowClass))
+        (G_TYPE_CHECK_CLASS_CAST ((klass), GB_TYPE_WINDOW, gbWindowClass))
 #define GB_IS_WINDOW(obj) \
-        (GTK_CHECK_TYPE ((obj), GB_TYPE_WINDOW))
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_WINDOW))
 #define GB_IS_WINDOW_CLASS(klass) \
-        (GTK_CHECK_CLASS_TYPE ((klass), GB_TYPE_WINDOW))
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), GB_TYPE_WINDOW))
 
 typedef struct _gbWindow      gbWindow;
 typedef struct _gbWindowClass gbWindowClass;
 
 struct _gbWindow {
-	BonoboWindow         parent_widget;
+	GtkWindow            parent_widget;
 
-	BonoboUIComponent   *uic;
+	GtkBuilder          *uic;
 
 	GtkWidget           *view;
 };
 
 struct _gbWindowClass {
-	BonoboWindowClass    parent_class;
+	GtkWindowClass       parent_class;
 };
 
 GType        gb_window_get_type          (void);
--- a/src/file.h
+++ b/src/file.h
@@ -23,7 +23,6 @@
 #ifndef __FILE_H__
 #define __FILE_H__
 
-#include "recent-files/egg-recent-view.h"
 #include <gtk/gtk.h>
 
 #include "doc.h"
@@ -37,9 +36,8 @@
 void     gb_file_open        (GtkWindow       *window);
 
 
-gboolean gb_file_open_recent (EggRecentView   *view,
-			      EggRecentItem   *item,
-			      GtkWindow       *window);;
+void     gb_file_open_recent (GtkRecentChooser *chooser,
+			      GtkWindow        *window);
 
 gboolean gb_file_open_real   (const gchar     *filename,
 			      GtkWindow       *window);
--- a/src/recent.c
+++ b/src/recent.c
@@ -28,127 +28,29 @@
 
 #include "debug.h"
 
-static EggRecentModel *model;
-
-/**
- * unescape_string:
- * @escaped_string: an escaped URI, path, or other string
- * @illegal_characters: a string containing a sequence of characters
- * considered "illegal", '\0' is automatically in this list.
- *
- * Decodes escaped characters (i.e. PERCENTxx sequences) in @escaped_string.
- * Characters are encoded in PERCENTxy form, where xy is the ASCII hex code 
- * for character 16x+y.
- * 
- * Return value: a newly allocated string with the unescaped equivalents, 
- * or %NULL if @escaped_string contained one of the characters 
- * in @illegal_characters.
- *
- * this code comes from gnome-vfs-utils.c
- **/
-
-#define HEX_ESCAPE '%'
-
-static int
-hex_to_int (gchar c)
-{
-	return  c >= '0' && c <= '9' ? c - '0'
-		: c >= 'A' && c <= 'F' ? c - 'A' + 10
-		: c >= 'a' && c <= 'f' ? c - 'a' + 10
-		: -1;
-}
-
-static int
-unescape_character (const char *scanner)
-{
-	int first_digit;
-	int second_digit;
-
-	first_digit = hex_to_int (*scanner++);
-	if (first_digit < 0) {
-		return -1;
-	}
-
-	second_digit = hex_to_int (*scanner++);
-	if (second_digit < 0) {
-		return -1;
-	}
-
-	return (first_digit << 4) | second_digit;
-}
-
-static char *
-unescape_string (const gchar *escaped_string, 
-		 const gchar *illegal_characters)
-{
-	const gchar *in;
-	gchar *out, *result;
-	gint character;
-
-	if (escaped_string == NULL) {
-		return NULL;
-	}
-
-	result = g_malloc (strlen (escaped_string) + 1);
-	
-	out = result;
-	for (in = escaped_string; *in != '\0'; in++) {
-		character = *in;
-		if (*in == HEX_ESCAPE) {
-			character = unescape_character (in + 1);
-
-			/* Check for an illegal character. We consider '\0' illegal here. */
-			if (character <= 0
-			    || (illegal_characters != NULL
-				&& strchr (illegal_characters, (char)character) != NULL)) {
-				g_free (result);
-				return NULL;
-			}
-			in += 2;
-		}
-		*out++ = (char)character;
-	}
-	
-	*out = '\0';
-	g_assert (out - result <= strlen (escaped_string));
-	return result;
-	
-}
-
-gchar *
-gb_recent_get_filename (EggRecentItem *item)
-{
-	char *uri, *filename;
-	char *utf8_filename = NULL;
-	int prefix_len = strlen ("file://");
-
-        uri = egg_recent_item_get_uri (item);
-
-	if (strlen (uri) > prefix_len) { 
-		filename = unescape_string (uri + prefix_len, "");
-		utf8_filename = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
-		g_free (filename);
-	}
-	
-        g_free (uri);
-
-        return utf8_filename;
-}
+static GtkRecentManager *model;
 
 void
 gb_recent_add_uri (gchar *uri)
 {
-	EggRecentItem *item;
+	GtkRecentData *item;
+	gchar *groups[] = { "gbonds", NULL };
 	
 	gb_debug (DEBUG_RECENT, "add_uri = %s", uri);
 
-	item = egg_recent_item_new_from_uri (uri);
-	egg_recent_item_add_group (item, "gbonds");
-	egg_recent_model_add_full (model, item);
-	egg_recent_item_unref (item); 
+	item = g_new0 (GtkRecentData, 1);
+	item->mime_type = "application/x-gbonds";
+	item->app_name = "gbonds";
+	item->groups = g_strdupv (groups);
+	item->app_exec = g_strjoin (" ", "gbonds", "%u", NULL);
+	gtk_recent_manager_add_full (model, uri, item);
+
+	g_strfreev (item->groups);
+	g_free (item->app_exec);
+	g_free (item);
 }
 
-EggRecentModel *
+GtkRecentManager *
 gb_recent_get_model (void)
 {
 	return model;
@@ -159,9 +61,5 @@
 {
 	gb_debug (DEBUG_RECENT, "max_recents = %d", gb_prefs->max_recents);
 
-	model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_MRU);
-	egg_recent_model_set_limit (model,
-				    gb_prefs->max_recents);
- 	egg_recent_model_set_filter_groups (model, "gbonds", NULL);
-        egg_recent_model_set_filter_uri_schemes (model, "file", NULL);	
+	model = gtk_recent_manager_get_default ();
 }
--- a/src/recent.h
+++ b/src/recent.h
@@ -22,13 +22,11 @@
 #ifndef __RECENT_H__
 #define __RECENT_H__
 
-#include "recent-files/egg-recent-model.h"
-
-gchar            *gb_recent_get_filename (EggRecentItem *item);
+#include <gtk/gtk.h>
 
 void		  gb_recent_add_uri      (gchar         *uri);
 
-EggRecentModel   *gb_recent_get_model    (void);
+GtkRecentManager *gb_recent_get_model    (void);
 
 void              gb_recent_init         (void);
 
--- a/src/window.c
+++ b/src/window.c
@@ -22,7 +22,7 @@
 
 #include <config.h>
 
-#include <gnome.h>
+#include <glib/gi18n.h>
 
 #include "ui.h"
 #include "window.h"
@@ -43,7 +43,7 @@
 /*============================================================================*/
 /* Private globals                                                            */
 /*============================================================================*/
-static BonoboWindowClass *parent_class;
+static GtkWindowClass *parent_class;
 
 static GList *window_list = NULL;
 
@@ -55,7 +55,7 @@
 static void     gb_window_class_init   (gbWindowClass *class);
 static void     gb_window_init         (gbWindow      *window);
 static void     gb_window_finalize     (GObject       *object);
-static void     gb_window_destroy      (GtkObject     *gtk_object);
+static void     gb_window_destroy      (GtkWidget     *gtk_object);
 
 static void     set_window_title       (gbWindow      *window,
 					gbDoc         *doc);
@@ -96,7 +96,7 @@
 		};
 
 		window_type =
-		    g_type_register_static (bonobo_window_get_type (),
+		    g_type_register_static (gtk_window_get_type (),
 					    "gbWindow",
 					    &window_info, 0);
 	}
@@ -108,7 +108,7 @@
 gb_window_class_init (gbWindowClass *class)
 {
 	GObjectClass   *object_class     = (GObjectClass *) class;
-	GtkObjectClass *gtk_object_class = (GtkObjectClass *) class;
+	GtkWidgetClass *gtk_object_class = (GtkWidgetClass *) class;
 
 	gb_debug (DEBUG_WINDOW, "START");
 
@@ -124,18 +124,16 @@
 static void
 gb_window_init (gbWindow *window)
 {
-	BonoboUIContainer *ui_container;
-	BonoboUIComponent *ui_component;
+	GtkWidget  *ui_container;
+	GtkBuilder *ui_component;
 
 	gb_debug (DEBUG_WINDOW, "START");
 
-	ui_container = bonobo_window_get_ui_container(BONOBO_WINDOW(window));
-	ui_component = bonobo_ui_component_new_default ();
-	bonobo_ui_component_set_container (ui_component,
-					   BONOBO_OBJREF (ui_container),
-					   NULL);
+	ui_container = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+	gtk_container_add (GTK_CONTAINER (window), ui_container);
+	ui_component = gtk_builder_new ();
 
-	gb_ui_init (ui_component, BONOBO_WINDOW (window));
+	gb_ui_init (ui_component, GTK_WINDOW (window));
 
 	gtk_window_set_default_size (GTK_WINDOW (window),
 				     DEFAULT_WINDOW_WIDTH,
@@ -170,7 +168,7 @@
 }
 
 static void
-gb_window_destroy (GtkObject *gtk_object)
+gb_window_destroy (GtkWidget *gtk_object)
 {
 	gbWindow *window;
 
@@ -187,9 +185,7 @@
 		window->uic = NULL;
 	}
 
-	if (GTK_OBJECT_CLASS (parent_class)->destroy) {
-		GTK_OBJECT_CLASS (parent_class)->destroy (gtk_object);
-	}
+	gtk_widget_destroy (gtk_object);
 
 	gb_debug (DEBUG_WINDOW, "END");
 }
@@ -206,7 +202,6 @@
 	gb_debug (DEBUG_WINDOW, "START");
 
 	window = g_object_new (gb_window_get_type (),
-			       "win_name", "gbonds",
 			       "title",    _("(none) - gbonds"),
 			       NULL);
 
@@ -308,7 +303,8 @@
 	}
 
 	window->view = gb_view_new (doc);
-	bonobo_window_set_contents (BONOBO_WINDOW(window), window->view);
+	gtk_box_pack_start (GTK_BOX (gtk_bin_get_child (GTK_BIN (window))),
+	                    window->view, TRUE, TRUE, 0);
 
 	gtk_widget_show_all (window->view);
 
--- a/src/ui.c
+++ b/src/ui.c
@@ -21,8 +21,6 @@
  */
 #include <config.h>
 
-#include "recent-files/egg-recent-view.h"
-#include "recent-files/egg-recent-view-bonobo.h"
 #include <gconf/gconf-client.h>
 
 #include "ui.h"
@@ -36,7 +34,7 @@
 /*==========================================================================*/
 /* Private macros and constants.                                            */
 /*==========================================================================*/
-#define GBONDS_UI_XML GBONDS_UI_DIR "gbonds-ui.xml"
+#define GBONDS_UI_XML GBONDS_UI_DIR "gbonds.ui"
 
 /*==========================================================================*/
 /* Private types.                                                           */
@@ -47,63 +45,45 @@
 /* Private globals                                                          */
 /*==========================================================================*/
 
-static BonoboUIVerb gb_ui_verbs [] = {
-	BONOBO_UI_VERB ("FileNew",               gb_cmd_file_new),
-	BONOBO_UI_VERB ("FileOpen",              gb_cmd_file_open),
-	BONOBO_UI_VERB ("FileImport",            gb_cmd_file_import),
-	BONOBO_UI_VERB ("FileSave",              gb_cmd_file_save),
-	BONOBO_UI_VERB ("FileSaveAs",            gb_cmd_file_save_as),
-	BONOBO_UI_VERB ("FilePrint",             gb_cmd_file_print),
-	BONOBO_UI_VERB ("FileClose",             gb_cmd_file_close),
-	BONOBO_UI_VERB ("FileExit",              gb_cmd_file_exit),
-	BONOBO_UI_VERB ("EditCut",               gb_cmd_edit_cut),
-	BONOBO_UI_VERB ("EditCopy",              gb_cmd_edit_copy),
-	BONOBO_UI_VERB ("EditPaste",             gb_cmd_edit_paste),
-	BONOBO_UI_VERB ("EditAdd",               gb_cmd_edit_add),
-	BONOBO_UI_VERB ("EditDelete",            gb_cmd_edit_delete),
-	BONOBO_UI_VERB ("EditTitle",             gb_cmd_edit_title),
-	BONOBO_UI_VERB ("EditSelectAll",         gb_cmd_edit_select_all),
-	BONOBO_UI_VERB ("EditUnSelectAll",       gb_cmd_edit_unselect_all),
-	BONOBO_UI_VERB ("SettingsPreferences",   gb_cmd_settings_preferences),
-	BONOBO_UI_VERB ("SettingsUpdate",        gb_cmd_settings_update),
-	BONOBO_UI_VERB ("HelpContents",          gb_cmd_help_contents),
-	BONOBO_UI_VERB ("About",                 gb_cmd_help_about),
-
-	BONOBO_UI_VERB_END
-};
-
+/* IDs ending with 1 are GtkToolButton's.  */
 static gchar* doc_verbs [] = {
-	"/commands/FileSave",
-	"/commands/FileSaveAs",
-	"/commands/FilePrint",
-	"/commands/FilePrintPreview",
-	"/commands/FileClose",
-	"/commands/FileCloseAll",
-	"/commands/EditUndo",
-	"/commands/EditRedo",
-	"/commands/EditCut",
-	"/commands/EditCopy",
-	"/commands/EditPaste",
-	"/commands/EditAdd",
-	"/commands/EditTitle",
-	"/commands/EditDelete",
-	"/commands/EditSelectAll",
-	"/commands/EditUnSelectAll",
+	"FileSave",
+	"FileSave1",
+	"FileSaveAs",
+	"FilePrint",
+	"FileClose",
+	"EditCut",
+	"EditCut1",
+	"EditCopy",
+	"EditCopy1",
+	"EditPaste",
+	"EditPaste1",
+	"EditAdd",
+	"EditAdd1",
+	"EditTitle",
+	"EditDelete",
+	"EditDelete1",
+	"EditSelectAll",
+	"EditUnSelectAll",
 
 	NULL
 };
 
 static gchar* doc_modified_verbs [] = {
-	"/commands/FileSave",
+	"FileSave",
+	"FileSave1",
 
 	NULL
 };
 
 static gchar* selection_verbs [] = {
-	"/commands/EditCut",
-	"/commands/EditCopy",
-	"/commands/EditDelete",
-	"/commands/EditUnSelectAll",
+	"EditCut",
+	"EditCut1",
+	"EditCopy",
+	"EditCopy1",
+	"EditDelete",
+	"EditDelete1",
+	"EditUnSelectAll",
 
 	NULL
 };
@@ -113,37 +93,33 @@
 /* Local function prototypes                                                */
 /*==========================================================================*/
 
-static void view_menu_item_toggled_cb     (BonoboUIComponent           *ui_component,
-					   const char                  *path,
-					   Bonobo_UIComponent_EventType type,
-					   const char                  *state,
-					   BonoboWindow                *win);
+static void view_menu_item_toggled_cb     (GtkCheckMenuItem            *item,
+                                           GtkBuilder                  *ui_component);
 
-static void set_app_main_toolbar_style 	  (BonoboUIComponent           *ui_component);
+static void set_app_main_toolbar_style 	  (GtkBuilder                  *ui_component);
 
-static void set_verb_sensitive            (BonoboUIComponent           *ui_component,
+static void set_verb_sensitive            (GtkBuilder                  *ui_component,
 					   gchar                       *cname,
 					   gboolean                     sensitive);
 
-static void set_verb_list_sensitive       (BonoboUIComponent           *ui_component,
+static void set_verb_list_sensitive       (GtkBuilder                  *ui_component,
 					   gchar                      **vlist,
 					   gboolean                     sensitive);
 
-static void set_verb_state                (BonoboUIComponent           *ui_component,
-					   gchar                       *cname,
-					   gboolean                     state);
-
 
 
 /*****************************************************************************/
 /* Initialize UI component for given window.                                 */
 /*****************************************************************************/
 void
-gb_ui_init (BonoboUIComponent *ui_component,
-	    BonoboWindow      *win)
+gb_ui_init (GtkBuilder        *ui_component,
+	    GtkWindow         *win)
 {
-        EggRecentView    *recent_view;
-	EggRecentModel   *recent_model;
+	GtkWidget     *widget, *box;
+	GtkAccelGroup *group;
+	GObject       *obj;
+	GSList        *list, *walk;
+	GError        *error = NULL;
 
 	gb_debug (DEBUG_UI, "START");
 
@@ -151,53 +127,163 @@
 
 	g_return_if_fail (ui_component != NULL);
 
-	bonobo_ui_engine_config_set_path (bonobo_window_get_ui_engine (win),
-					  "/gbonds/UIConfig/kvps");
-	gb_debug (DEBUG_UI, "Path set");
+	group = gtk_accel_group_new ();
+	gtk_window_add_accel_group (win, group);
+
+	if (!gtk_builder_add_from_file (ui_component, GBONDS_UI_XML, &error))
+	        g_error ("Could not set UI: %s", error->message);
 
-	bonobo_ui_util_set_ui (ui_component,
-			       "", GBONDS_UI_XML, "gbonds", NULL);
 	gb_debug (DEBUG_UI, "UI set");
 
-	bonobo_ui_component_add_verb_list_with_data(ui_component,
-						    gb_ui_verbs, win);
+	list = gtk_builder_get_objects (ui_component);
+	for (walk = list; walk; walk = walk->next)
+	        if (GTK_IS_MENU (walk->data))
+	                gtk_menu_set_accel_group (walk->data, group);
+
+	g_slist_free (list);
+
+	/* Add all accelerators manually because GtkBuilder expects
+	   the menubar to be placed in a GtkWindow.  It could be
+	   possible to workaround this by using a fake GtkWindow in
+	   the .ui file but this would be more complicated as widgets
+	   have to be reparented and added again to the GtkAccelGroup
+	   of the gbWindow.  */
+	obj = gtk_builder_get_object (ui_component, "FileNew");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_N, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "FileOpen");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_O, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "FileSave");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_S, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "FileSaveAs");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_S, GDK_CONTROL_MASK|GDK_SHIFT_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "FilePrint");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_P, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "FileClose");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_W, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "FileExit");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_Q, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "EditCut");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_X, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "EditCopy");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_C, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "EditPaste");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_V, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "EditDelete");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_Delete, 0, GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "EditSelectAll");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_A, GDK_CONTROL_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "EditUnSelectAll");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_Z, GDK_CONTROL_MASK|GDK_SHIFT_MASK,
+	                            GTK_ACCEL_VISIBLE);
+	obj = gtk_builder_get_object (ui_component, "HelpContents");
+	gtk_widget_add_accelerator (GTK_WIDGET (obj), "activate", group,
+	                            GDK_KEY_F1, 0, GTK_ACCEL_VISIBLE);
+
+	box = gtk_bin_get_child (GTK_BIN (win));
+	widget = GTK_WIDGET (gtk_builder_get_object (ui_component, "menubar"));
+	gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0);
+	widget = GTK_WIDGET (gtk_builder_get_object (ui_component, "toolbar"));
+	gtk_box_pack_start (GTK_BOX (box), widget, FALSE, FALSE, 0);
+
+	gtk_builder_add_callback_symbols (ui_component,
+	                                  "gb_cmd_file_new",
+	                                  G_CALLBACK (gb_cmd_file_new),
+	                                  "gb_cmd_file_open",
+	                                  G_CALLBACK (gb_cmd_file_open),
+	                                  "gb_cmd_file_import",
+	                                  G_CALLBACK (gb_cmd_file_import),
+	                                  "gb_cmd_file_save",
+	                                  G_CALLBACK (gb_cmd_file_save),
+	                                  "gb_cmd_file_save_as",
+	                                  G_CALLBACK (gb_cmd_file_save_as),
+	                                  "gb_cmd_file_print",
+	                                  G_CALLBACK (gb_cmd_file_print),
+	                                  "gb_cmd_file_close",
+	                                  G_CALLBACK (gb_cmd_file_close),
+	                                  "gb_cmd_file_exit",
+	                                  G_CALLBACK (gb_cmd_file_exit),
+	                                  "gb_cmd_edit_cut",
+	                                  G_CALLBACK (gb_cmd_edit_cut),
+	                                  "gb_cmd_edit_copy",
+	                                  G_CALLBACK (gb_cmd_edit_copy),
+	                                  "gb_cmd_edit_paste",
+	                                  G_CALLBACK (gb_cmd_edit_paste),
+	                                  "gb_cmd_edit_add",
+	                                  G_CALLBACK (gb_cmd_edit_add),
+	                                  "gb_cmd_edit_delete",
+	                                  G_CALLBACK (gb_cmd_edit_delete),
+	                                  "gb_cmd_edit_title",
+	                                  G_CALLBACK (gb_cmd_edit_title),
+	                                  "gb_cmd_edit_select_all",
+	                                  G_CALLBACK (gb_cmd_edit_select_all),
+	                                  "gb_cmd_edit_unselect_all",
+	                                  G_CALLBACK (gb_cmd_edit_unselect_all),
+	                                  "gb_cmd_settings_preferences",
+	                                  G_CALLBACK (gb_cmd_settings_preferences),
+	                                  "gb_cmd_settings_update",
+	                                  G_CALLBACK (gb_cmd_settings_update),
+	                                  "gb_cmd_help_contents",
+	                                  G_CALLBACK (gb_cmd_help_contents),
+	                                  "gb_cmd_help_about",
+	                                  G_CALLBACK (gb_cmd_help_about),
+	                                  NULL);
+	gtk_builder_connect_signals (ui_component, win);
 	gb_debug (DEBUG_UI, "verb list added");
 
 	/* Set the toolbar style according to prefs */
 	set_app_main_toolbar_style (ui_component);
 		
 	/* Add listener for the view menu */
-	bonobo_ui_component_add_listener (ui_component, "ViewMainToolbar", 
-			(BonoboUIListenerFn)view_menu_item_toggled_cb, 
-			(gpointer)win);
-
-	bonobo_ui_component_add_listener (ui_component, "MainToolbarSystem", 
-			(BonoboUIListenerFn)view_menu_item_toggled_cb, 
-			(gpointer)win);
-	bonobo_ui_component_add_listener (ui_component, "MainToolbarIcon", 
-			(BonoboUIListenerFn)view_menu_item_toggled_cb, 
-			(gpointer)win);
-	bonobo_ui_component_add_listener (ui_component, "MainToolbarIconText", 
-			(BonoboUIListenerFn)view_menu_item_toggled_cb, 
-			(gpointer)win);
-	bonobo_ui_component_add_listener (ui_component, "MainToolbarTooltips", 
-			(BonoboUIListenerFn)view_menu_item_toggled_cb, 
-			(gpointer)win);
+	obj = gtk_builder_get_object (ui_component, "ViewMainToolbar");
+	g_signal_connect (obj, "toggled",
+	                  G_CALLBACK (view_menu_item_toggled_cb), ui_component);
+
+	obj = gtk_builder_get_object (ui_component, "MainToolbarSystem");
+	g_object_set_data (obj, "style", GINT_TO_POINTER (GB_TOOLBAR_SYSTEM));
+	g_signal_connect (obj, "toggled",
+	                  G_CALLBACK (view_menu_item_toggled_cb), ui_component);
+	obj = gtk_builder_get_object (ui_component, "MainToolbarIcon");
+	g_object_set_data (obj, "style", GINT_TO_POINTER (GB_TOOLBAR_ICONS));
+	g_signal_connect (obj, "toggled",
+	                  G_CALLBACK (view_menu_item_toggled_cb), ui_component);
+	obj = gtk_builder_get_object (ui_component, "MainToolbarIconText");
+	g_object_set_data (obj, "style",
+	                   GINT_TO_POINTER (GB_TOOLBAR_ICONS_AND_TEXT));
+	g_signal_connect (obj, "toggled",
+	                  G_CALLBACK (view_menu_item_toggled_cb), ui_component);
 
 	set_verb_list_sensitive (ui_component, doc_verbs, FALSE);
 
-	/* add a GeditRecentView object */
-        recent_model = gb_recent_get_model ();
-        recent_view  =
-		EGG_RECENT_VIEW (egg_recent_view_bonobo_new (ui_component,
-							     "/menu/File/Recents"));
-        egg_recent_view_set_model (recent_view, recent_model);
-        
-        g_signal_connect (G_OBJECT (recent_view), "activate",
+        obj = gtk_builder_get_object (ui_component, "Recents");
+        gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (obj),
+                                      gb_prefs->max_recents);
+        g_signal_connect (obj, "item-activated",
                           G_CALLBACK (gb_file_open_recent), win);
 
-	/* Squirrel away a copy to be unreferenced in gl_ui_unref() */
-	g_object_set_data (G_OBJECT (ui_component), "recent-view", recent_view);
 	gb_debug (DEBUG_UI, "END");
 }
 
@@ -205,42 +291,27 @@
 /* Unref wrapper.                                                            */
 /*****************************************************************************/
 void
-gb_ui_unref (BonoboUIComponent *ui_component)
+gb_ui_unref (GtkBuilder *ui_component)
 {
-	EggRecentView *recent_view;
-
-	/* Pull out recent view to unreference. */
-	recent_view = g_object_get_data (G_OBJECT(ui_component), "recent-view");
-	if (recent_view) {
-		g_object_unref (recent_view);
-	}
-
-	bonobo_object_unref(ui_component);
+	g_object_unref (ui_component);
 }
 
 /*****************************************************************************/
 /* Update all verbs of given UI component.                                   */
 /*****************************************************************************/
 void
-gb_ui_update_all (BonoboUIComponent *ui_component,
+gb_ui_update_all (GtkBuilder        *ui_component,
 		  gbView            *view)
 {
 	gbDoc *doc;
 
 	gb_debug (DEBUG_UI, "START");
 
-	bonobo_ui_component_freeze (ui_component, NULL);
-
 	set_verb_list_sensitive (ui_component, doc_verbs, TRUE);
 
 	doc = view->doc;
 	g_return_if_fail (doc != NULL);
 
-	set_verb_sensitive (ui_component, "/commands/EditUndo",
-			    gb_doc_can_undo (doc));
-	set_verb_sensitive (ui_component, "/commands/EditRedo",
-			    gb_doc_can_redo (doc));
-
 	set_verb_list_sensitive (ui_component, 
 				 doc_modified_verbs,
 				 gb_doc_is_modified (doc));
@@ -249,8 +320,6 @@
 				 selection_verbs,
 				 !gb_view_is_selection_empty (view));
 
-	bonobo_ui_component_thaw (ui_component, NULL);
-
 	gb_debug (DEBUG_UI, "END");
 }
 
@@ -258,16 +327,13 @@
 /* Update all verbs of given UI component to "no document" state.            */
 /*****************************************************************************/
 void
-gb_ui_update_nodoc (BonoboUIComponent *ui_component)
+gb_ui_update_nodoc (GtkBuilder *ui_component)
 {
 	gb_debug (DEBUG_UI, "START");
 
-	bonobo_ui_component_freeze (ui_component, NULL);
 	
 	set_verb_list_sensitive (ui_component, doc_verbs, FALSE);
 
-	bonobo_ui_component_thaw (ui_component, NULL);
-
 	gb_debug (DEBUG_UI, "END");
 }
 
@@ -275,19 +341,15 @@
 /* Update doc modified verbs of given UI component.                        */
 /*****************************************************************************/
 void
-gb_ui_update_modified_verbs (BonoboUIComponent *ui_component,
+gb_ui_update_modified_verbs (GtkBuilder        *ui_component,
 			     gbDoc             *doc)
 {
 	gb_debug (DEBUG_UI, "START");
 
-	bonobo_ui_component_freeze (ui_component, NULL);
-
 	set_verb_list_sensitive (ui_component, 
 				 doc_modified_verbs,
 				 gb_doc_is_modified (doc));
 
-	bonobo_ui_component_thaw (ui_component, NULL);
-
 	gb_debug (DEBUG_UI, "END");
 }
 
@@ -295,19 +357,15 @@
 /* Update verbs associated with selection state of given UI component.       */
 /*****************************************************************************/
 void
-gb_ui_update_selection_verbs (BonoboUIComponent *ui_component,
+gb_ui_update_selection_verbs (GtkBuilder        *ui_component,
 			      gbView            *view)
 {
 	gb_debug (DEBUG_UI, "START");
 
-	bonobo_ui_component_freeze (ui_component, NULL);
-
 	set_verb_list_sensitive (ui_component,
 				 selection_verbs,
 				 !gb_view_is_selection_empty (view));
 
-	bonobo_ui_component_thaw (ui_component, NULL);
-
 	gb_debug (DEBUG_UI, "END");
 }
 
@@ -315,20 +373,16 @@
 /* Update undo/redo verbs of given UI component.                             */
 /*****************************************************************************/
 void
-gb_ui_update_undo_redo_verbs (BonoboUIComponent *ui_component,
+gb_ui_update_undo_redo_verbs (GtkBuilder        *ui_component,
 			      gbDoc             *doc)
 {
 	gb_debug (DEBUG_UI, "START");
 
-	bonobo_ui_component_freeze (ui_component, NULL);
-
 	set_verb_sensitive (ui_component,
-			    "/commands/EditUndo", gb_doc_can_undo (doc));
+			    "EditUndo", gb_doc_can_undo (doc));
 
 	set_verb_sensitive (ui_component,
-			    "/commands/EditRedo", gb_doc_can_redo (doc));
-
-	bonobo_ui_component_thaw (ui_component, NULL);
+			    "EditRedo", gb_doc_can_redo (doc));
 
 	gb_debug (DEBUG_UI, "END");
 }
@@ -337,19 +391,16 @@
 /* PRIVATE.  View menu item toggled callback.                                */
 /*---------------------------------------------------------------------------*/
 static void
-view_menu_item_toggled_cb (BonoboUIComponent           *ui_component,
-			   const char                  *path,
-			   Bonobo_UIComponent_EventType type,
-			   const char                  *state,
-			   BonoboWindow                *win)
+view_menu_item_toggled_cb (GtkCheckMenuItem *item,
+                           GtkBuilder       *ui_component)
 {
 	gboolean s;
 
 	gb_debug (DEBUG_UI, "");
 
-	s = (strcmp (state, "1") == 0);
+	s = gtk_check_menu_item_get_active (item);
 
-	if (strcmp (path, "ViewMainToolbar") == 0)
+	if (!GTK_IS_RADIO_MENU_ITEM (item))
 	{
 		gb_prefs->main_toolbar_visible = s;
 		set_app_main_toolbar_style (ui_component);
@@ -358,149 +409,111 @@
 		return;
 	}
 
-	if (s && (strcmp (path, "MainToolbarSystem") == 0))
-	{		
-		gb_prefs->main_toolbar_buttons_style = GB_TOOLBAR_SYSTEM;
-		set_app_main_toolbar_style (ui_component);
-		gb_prefs_save_settings ();
-
-		return;
-	}
-
-	if (s && (strcmp (path, "MainToolbarIcon") == 0))
-	{		
-		gb_prefs->main_toolbar_buttons_style = GB_TOOLBAR_ICONS;
-		set_app_main_toolbar_style (ui_component);
-		gb_prefs_save_settings ();
-
-		return;
-	}
-
-	if (s && (strcmp (path, "MainToolbarIconText") == 0))
+	if (s && GTK_IS_RADIO_MENU_ITEM (item))
 	{		
-		gb_prefs->main_toolbar_buttons_style = GB_TOOLBAR_ICONS_AND_TEXT;
-		set_app_main_toolbar_style (ui_component);
-		gb_prefs_save_settings ();
-
-		return;
-	}
+	        gbToolbarSetting style;
 
-	if (strcmp (path, "MainToolbarTooltips") == 0)
-	{
-		gb_prefs->main_toolbar_view_tooltips = s;
+	        style = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item),
+	                                                    "style"));
+		gb_prefs->main_toolbar_buttons_style = style;
 		set_app_main_toolbar_style (ui_component);
 		gb_prefs_save_settings ();
-
-		return;
 	}
-
 }
 
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  Set main toolbar style.                                         */
 /*---------------------------------------------------------------------------*/
 static void
-set_app_main_toolbar_style (BonoboUIComponent *ui_component)
+set_app_main_toolbar_style (GtkBuilder *ui_component)
 {
 	GConfClient *client;
+	GtkWidget   *widget;
+	GtkCheckMenuItem *item;
 	gboolean     labels;
 
 	gb_debug (DEBUG_UI, "START");
 
-	g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui_component));
+	g_return_if_fail (GTK_IS_BUILDER (ui_component));
 			
-	bonobo_ui_component_freeze (ui_component, NULL);
 
 	/* Updated view menu */
-	set_verb_state (ui_component, 
-			"/commands/ViewMainToolbar",
-			gb_prefs->main_toolbar_visible);
+	widget = GTK_WIDGET (gtk_builder_get_object (ui_component, "toolbar"));
+	gtk_widget_set_visible (widget, gb_prefs->main_toolbar_visible);
 
 	set_verb_sensitive (ui_component, 
-			    "/commands/MainToolbarSystem",
-			    gb_prefs->main_toolbar_visible);
-	set_verb_sensitive (ui_component, 
-			    "/commands/MainToolbarIcon",
+			    "MainToolbarSystem",
 			    gb_prefs->main_toolbar_visible);
 	set_verb_sensitive (ui_component, 
-			    "/commands/MainToolbarIconText",
+			    "MainToolbarIcon",
 			    gb_prefs->main_toolbar_visible);
 	set_verb_sensitive (ui_component, 
-			    "/commands/MainToolbarTooltips",
+			    "MainToolbarIconText",
 			    gb_prefs->main_toolbar_visible);
 
-	set_verb_state (ui_component, 
-			"/commands/MainToolbarSystem",
-			gb_prefs->main_toolbar_buttons_style == GB_TOOLBAR_SYSTEM);
-
-	set_verb_state (ui_component, 
-			"/commands/MainToolbarIcon",
-			gb_prefs->main_toolbar_buttons_style == GB_TOOLBAR_ICONS);
-
-	set_verb_state (ui_component, 
-			"/commands/MainToolbarIconText",
-			gb_prefs->main_toolbar_buttons_style == GB_TOOLBAR_ICONS_AND_TEXT);
-
-	set_verb_state (ui_component, 
-			"/commands/MainToolbarTooltips",
-			gb_prefs->main_toolbar_view_tooltips);
-
 	
 	/* Actually update main_toolbar style */
-	bonobo_ui_component_set_prop (
-		ui_component, "/MainToolbar",
-		"tips", gb_prefs->main_toolbar_view_tooltips ? "1" : "0",
-		NULL);
-	
 	switch (gb_prefs->main_toolbar_buttons_style)
 	{
 		case GB_TOOLBAR_SYSTEM:
 						
 			client = gconf_client_get_default ();
 			if (client == NULL) 
-				goto error;
+				return;
 
 			labels = gconf_client_get_bool (client, 
 					"/desktop/gnome/interface/toolbar-labels", NULL);
 
 			g_object_unref (G_OBJECT (client));
+	                item = GTK_CHECK_MENU_ITEM (gtk_builder_get_object
+	                                            (ui_component,
+	                                             "MainToolbarSystem"));
 			
 			if (labels)
 			{			
-				bonobo_ui_component_set_prop (
-					ui_component, "/MainToolbar", "look", "both", NULL);
+	                        gtk_toolbar_set_style (GTK_TOOLBAR (widget),
+	                                               GTK_TOOLBAR_BOTH);
+	                        if (!gtk_check_menu_item_get_active (item))
+	                                gtk_check_menu_item_set_active (item,
+	                                                                TRUE);
 			
 			}
 			else
 			{
-				bonobo_ui_component_set_prop (
-					ui_component, "/MainToolbar", "look", "icons", NULL);
+	                        gtk_toolbar_set_style (GTK_TOOLBAR (widget),
+	                                               GTK_TOOLBAR_ICONS);
+	                        if (!gtk_check_menu_item_get_active (item))
+	                                gtk_check_menu_item_set_active (item,
+	                                                                TRUE);
 			}
 	
 			break;
 			
 		case GB_TOOLBAR_ICONS:
-			bonobo_ui_component_set_prop (
-				ui_component, "/MainToolbar", "look", "icon", NULL);
+	                item = GTK_CHECK_MENU_ITEM (gtk_builder_get_object
+	                                            (ui_component,
+	                                             "MainToolbarIcon"));
+	                gtk_toolbar_set_style (GTK_TOOLBAR (widget),
+	                                       GTK_TOOLBAR_ICONS);
+	                if (!gtk_check_menu_item_get_active (item))
+	                        gtk_check_menu_item_set_active (item, TRUE);
+
 			
 			break;
 			
 		case GB_TOOLBAR_ICONS_AND_TEXT:
-			bonobo_ui_component_set_prop (
-				ui_component, "/MainToolbar", "look", "both", NULL);
+	                item = GTK_CHECK_MENU_ITEM (gtk_builder_get_object
+	                                            (ui_component,
+	                                             "MainToolbarIconText"));
+	                gtk_toolbar_set_style (GTK_TOOLBAR (widget),
+	                                       GTK_TOOLBAR_BOTH);
+	                if (!gtk_check_menu_item_get_active (item))
+	                        gtk_check_menu_item_set_active (item, TRUE);
 			
 			break;
 		default:
-			goto error;
 			break;
 	}
-	
-	bonobo_ui_component_set_prop (
-			ui_component, "/MainToolbar",
-			"hidden", gb_prefs->main_toolbar_visible ? "0":"1", NULL);
-
- error:
-	bonobo_ui_component_thaw (ui_component, NULL);
 
 	gb_debug (DEBUG_UI, "END");
 }
@@ -510,20 +523,19 @@
 /* Set sensitivity of verb.                                                  */
 /*---------------------------------------------------------------------------*/
 static void
-set_verb_sensitive (BonoboUIComponent  *ui_component,
+set_verb_sensitive (GtkBuilder         *ui_component,
 		    gchar              *cname,
 		    gboolean            sensitive)
 {
+	GtkWidget *widget;
+
 	gb_debug (DEBUG_UI, "START");
 
 	g_return_if_fail (cname != NULL);
-	g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui_component));
+	g_return_if_fail (GTK_IS_BUILDER (ui_component));
 
-	bonobo_ui_component_set_prop (ui_component,
-				      cname,
-				      "sensitive",
-				      sensitive ? "1" : "0",
-				      NULL);
+	widget = GTK_WIDGET (gtk_builder_get_object (ui_component, cname));
+	gtk_widget_set_sensitive (widget, sensitive);
 
 	gb_debug (DEBUG_UI, "END");
 }
@@ -532,46 +544,23 @@
 /* Set sensitivity of a list of verbs.                                       */
 /*---------------------------------------------------------------------------*/
 static void
-set_verb_list_sensitive (BonoboUIComponent   *ui_component,
+set_verb_list_sensitive (GtkBuilder          *ui_component,
 			 gchar              **vlist,
 			 gboolean             sensitive)
 {
+	GtkWidget *widget;
+
 	gb_debug (DEBUG_UI, "START");
 
 	g_return_if_fail (vlist != NULL);
-	g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui_component));
+	g_return_if_fail (GTK_IS_BUILDER (ui_component));
 
 	for ( ; *vlist; ++vlist)
 	{
-		bonobo_ui_component_set_prop (ui_component,
-					      *vlist,
-					      "sensitive",
-					      sensitive ? "1" : "0",
-					      NULL);
+	        widget = GTK_WIDGET (gtk_builder_get_object (ui_component,
+	                                                     *vlist));
+	        gtk_widget_set_sensitive (widget, sensitive);
 	}
 
 	gb_debug (DEBUG_UI, "END");
 }
-
-/*---------------------------------------------------------------------------*/
-/* Set state of a verb.                                                      */
-/*---------------------------------------------------------------------------*/
-static void
-set_verb_state (BonoboUIComponent   *ui_component,
-		gchar               *cname,
-		gboolean             state)
-{
-	gb_debug (DEBUG_UI, "START");
-
-	g_return_if_fail (cname != NULL);
-	g_return_if_fail (BONOBO_IS_UI_COMPONENT (ui_component));
-
-	bonobo_ui_component_set_prop (ui_component,
-				      cname,
-				      "state",
-				      state ? "1" : "0",
-				      NULL);
-
-	gb_debug (DEBUG_UI, "END");
-}
-
--- a/src/ui.h
+++ b/src/ui.h
@@ -22,31 +22,27 @@
 #ifndef __GB_UI_H__
 #define __GB_UI_H__
 
-#include <bonobo/bonobo-ui-component.h>
-#include <bonobo/bonobo-ui-engine.h>
-#include <bonobo/bonobo-window.h>
-
 #include "view.h"
 
 G_BEGIN_DECLS
 
-void gb_ui_init                   (BonoboUIComponent *ui_component,
-				   BonoboWindow      *win);
+void gb_ui_init                   (GtkBuilder        *ui_component,
+				   GtkWindow         *win);
 
-void gb_ui_unref                  (BonoboUIComponent *ui_component);
+void gb_ui_unref                  (GtkBuilder        *ui_component);
 
-void gb_ui_update_all             (BonoboUIComponent *ui_component,
+void gb_ui_update_all             (GtkBuilder        *ui_component,
 				   gbView            *view);
 
-void gb_ui_update_nodoc           (BonoboUIComponent *ui_component);
+void gb_ui_update_nodoc           (GtkBuilder        *ui_component);
 
-void gb_ui_update_modified_verbs  (BonoboUIComponent *ui_component,
+void gb_ui_update_modified_verbs  (GtkBuilder        *ui_component,
 				   gbDoc             *doc);
 
-void gb_ui_update_selection_verbs (BonoboUIComponent *ui_component,
+void gb_ui_update_selection_verbs (GtkBuilder        *ui_component,
 				   gbView            *view);
 
-void gb_ui_update_undo_redo_verbs (BonoboUIComponent *ui_component,
+void gb_ui_update_undo_redo_verbs (GtkBuilder        *ui_component,
 				   gbDoc             *doc);
 
 G_END_DECLS
--- a/src/view.h
+++ b/src/view.h
@@ -36,16 +36,16 @@
 
 
 #define GB_TYPE_VIEW            (gb_view_get_type ())
-#define GB_VIEW(obj)            (GTK_CHECK_CAST((obj), GB_TYPE_VIEW, gbView ))
-#define GB_VIEW_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), GB_TYPE_VIEW, gbViewClass))
-#define GB_IS_VIEW(obj)         (GTK_CHECK_TYPE ((obj), GB_TYPE_VIEW))
-#define GB_IS_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GB_TYPE_VIEW))
+#define GB_VIEW(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GB_TYPE_VIEW, gbView ))
+#define GB_VIEW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GB_TYPE_VIEW, gbViewClass))
+#define GB_IS_VIEW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_VIEW))
+#define GB_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GB_TYPE_VIEW))
 
 typedef struct _gbView      gbView;
 typedef struct _gbViewClass gbViewClass;
 
 struct _gbView {
-	GtkVBox            parent_widget;
+	GtkBox             parent_widget;
 
 	gbDoc             *doc;
 
@@ -69,7 +69,7 @@
 };
 
 struct _gbViewClass {
-	GtkVBoxClass      parent_class;
+	GtkBoxClass       parent_class;
 
 	/* Selection changed signal */
 	void (*selection_changed) (gbView   *view,
--- a/src/commands.h
+++ b/src/commands.h
@@ -23,104 +23,80 @@
 #ifndef __COMMANDS_H__
 #define __COMMANDS_H__
 
-#include <bonobo/bonobo-ui-component.h>
-
 G_BEGIN_DECLS
 
-void gb_cmd_file_new             (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_file_new             (GtkMenuItem       *item,
+                                  gpointer           user_data);
+
+void gb_cmd_file_open            (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_file_open            (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_file_import          (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_file_import          (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_file_save            (GtkWidget         *item,
+                                  gpointer           user_data);
 
-void gb_cmd_file_save            (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_file_save_as         (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_file_save_as         (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_file_print           (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_file_print           (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_file_print_preview   (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_file_print_preview   (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_file_close           (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_file_close           (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_file_exit            (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_file_exit            (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
 
+void gb_cmd_edit_undo            (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_undo            (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_edit_redo            (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_redo            (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_edit_cut             (GtkWidget         *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_cut             (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_edit_copy            (GtkWidget         *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_copy            (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_edit_paste           (GtkWidget         *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_paste           (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_edit_add             (GtkWidget         *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_add             (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_edit_delete          (GtkWidget         *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_delete          (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_edit_title           (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_title           (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_edit_select_all      (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_select_all      (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_edit_unselect_all    (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_edit_unselect_all    (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
 
+void gb_cmd_settings_preferences (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_settings_preferences (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_settings_update      (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_settings_update      (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
 
+void gb_cmd_help_contents        (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_help_contents        (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
+void gb_cmd_help_about           (GtkMenuItem       *item,
+                                  gpointer           user_data);
 
-void gb_cmd_help_about 	         (BonoboUIComponent *uic,
-				  gpointer           user_data,
-				  const gchar       *verbname);
 G_END_DECLS
 
 #endif /* __COMMANDS_H__ */ 
--- a/src/commands.c
+++ b/src/commands.c
@@ -22,9 +22,8 @@
 
 #include <config.h>
 
+#include <glib/gi18n.h>
 #include <gtk/gtk.h>
-#include <libgnome/libgnome.h>
-#include <libgnomeui/libgnomeui.h>
 
 #include "commands.h"
 #include "view.h"
@@ -35,19 +34,13 @@
 #include "prefs-dialog.h"
 #include "debug.h"
 
-#define LOGO_PIXMAP gnome_program_locate_file (NULL,\
-					 GNOME_FILE_DOMAIN_APP_PIXMAP,\
-					 "gbonds/gbonds_logo.png",\
-					 FALSE, NULL)
-
 
 /****************************************************************************/
 /* File->New command.                                                       */
 /****************************************************************************/
 void 
-gb_cmd_file_new (BonoboUIComponent *uic,
-		 gpointer           user_data,
-		 const gchar       *verbname)
+gb_cmd_file_new (GtkMenuItem       *item,
+                 gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -60,9 +53,8 @@
 /* File->Open command.                                                      */
 /****************************************************************************/
 void 
-gb_cmd_file_open (BonoboUIComponent *uic,
-		  gpointer           user_data,
-		  const gchar       *verbname)
+gb_cmd_file_open (GtkMenuItem       *item,
+                  gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -77,9 +69,8 @@
 /* File->Import command.                                                    */
 /****************************************************************************/
 void 
-gb_cmd_file_import (BonoboUIComponent *uic,
-		    gpointer           user_data,
-		    const gchar       *verbname)
+gb_cmd_file_import (GtkMenuItem       *item,
+                    gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -94,9 +85,8 @@
 /* File->Save command.                                                      */
 /****************************************************************************/
 void 
-gb_cmd_file_save (BonoboUIComponent *uic,
-		  gpointer           user_data,
-		  const gchar       *verbname)
+gb_cmd_file_save (GtkWidget         *item,
+                  gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -111,9 +101,8 @@
 /* File->Save_as command.                                                   */
 /****************************************************************************/
 void 
-gb_cmd_file_save_as (BonoboUIComponent *uic,
-		     gpointer           user_data,
-		     const gchar       *verbname)
+gb_cmd_file_save_as (GtkMenuItem       *item,
+                     gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -123,14 +112,12 @@
 
 	gb_file_save_as (GB_VIEW(window->view)->doc, GTK_WINDOW(window));
 }
-
 /****************************************************************************/
 /* File->Print command.                                                     */
 /****************************************************************************/
 void
-gb_cmd_file_print (BonoboUIComponent *uic,
-		   gpointer           user_data,
-		   const gchar       *verbname)
+gb_cmd_file_print (GtkMenuItem       *item,
+                   gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -138,17 +125,15 @@
 
 	g_return_if_fail (window && GB_IS_WINDOW(window));
 
-	gb_print_dialog (GB_VIEW(window->view), BONOBO_WINDOW(window));
+	gb_print_dialog (GB_VIEW(window->view), GTK_WINDOW(window));
 
 }
-
 /****************************************************************************/
 /* File->Close command.                                                     */
 /****************************************************************************/
 void 
-gb_cmd_file_close (BonoboUIComponent *uic,
-		   gpointer           user_data,
-		   const gchar       *verbname)
+gb_cmd_file_close (GtkMenuItem       *item,
+                   gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -163,9 +148,8 @@
 /* File->Exit command.                                                      */
 /****************************************************************************/
 void 
-gb_cmd_file_exit (BonoboUIComponent *uic,
-		  gpointer           user_data,
-		  const gchar       *verbname)
+gb_cmd_file_exit (GtkMenuItem       *item,
+                  gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -181,9 +165,8 @@
 /* Edit->Cut command.                                                       */
 /****************************************************************************/
 void 
-gb_cmd_edit_cut (BonoboUIComponent *uic,
-		 gpointer           user_data,
-		 const gchar       *verbname)
+gb_cmd_edit_cut (GtkWidget         *item,
+                 gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -198,9 +181,8 @@
 /* Edit->Copy command.                                                      */
 /****************************************************************************/
 void 
-gb_cmd_edit_copy (BonoboUIComponent *uic,
-		  gpointer           user_data,
-		  const gchar       *verbname)
+gb_cmd_edit_copy (GtkWidget         *item,
+                  gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -215,9 +197,8 @@
 /* Edit->Paste command.                                                     */
 /****************************************************************************/
 void 
-gb_cmd_edit_paste (BonoboUIComponent *uic,
-		   gpointer           user_data,
-		   const gchar       *verbname)
+gb_cmd_edit_paste (GtkWidget         *item,
+                   gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -233,9 +214,8 @@
 /* Edit->Add command.                                                       */
 /****************************************************************************/
 void 
-gb_cmd_edit_add (BonoboUIComponent *uic,
-		 gpointer           user_data,
-		 const gchar       *verbname)
+gb_cmd_edit_add (GtkWidget         *item,
+                 gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -243,16 +223,15 @@
 
 	g_return_if_fail (window && GB_IS_WINDOW(window));
 
-	gb_edit_add_bond (GB_VIEW(window->view), BONOBO_WINDOW(window)); 
+	gb_edit_add_bond (GB_VIEW(window->view), GTK_WINDOW(window));
 }
 
 /****************************************************************************/
 /* Edit->Delete command.                                                    */
 /****************************************************************************/
 void 
-gb_cmd_edit_delete (BonoboUIComponent *uic,
-		    gpointer           user_data,
-		    const gchar       *verbname)
+gb_cmd_edit_delete (GtkWidget         *item,
+                    gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -260,16 +239,15 @@
 
 	g_return_if_fail (window && GB_IS_WINDOW(window));
 
-	gb_edit_delete_bonds (GB_VIEW(window->view), BONOBO_WINDOW(window)); 
+	gb_edit_delete_bonds (GB_VIEW(window->view), GTK_WINDOW(window));
 }
 
 /****************************************************************************/
 /* Edit->Title command.                                                     */
 /****************************************************************************/
 void 
-gb_cmd_edit_title (BonoboUIComponent *uic,
-		   gpointer           user_data,
-		   const gchar       *verbname)
+gb_cmd_edit_title (GtkMenuItem       *item,
+                   gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -277,16 +255,15 @@
 
 	g_return_if_fail (window && GB_IS_WINDOW(window));
 
-	gb_edit_title (GB_VIEW(window->view), BONOBO_WINDOW(window)); 
+	gb_edit_title (GB_VIEW(window->view), GTK_WINDOW(window));
 }
 
 /****************************************************************************/
 /* Edit->Select_all command.                                                */
 /****************************************************************************/
 void
-gb_cmd_edit_select_all (BonoboUIComponent *uic,
-			gpointer           user_data,
-			const gchar       *verbname)
+gb_cmd_edit_select_all (GtkMenuItem       *item,
+                        gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -301,9 +278,8 @@
 /* Edit->Select_all command.                                                */
 /****************************************************************************/
 void
-gb_cmd_edit_unselect_all (BonoboUIComponent *uic,
-			  gpointer           user_data,
-			  const gchar       *verbname)
+gb_cmd_edit_unselect_all (GtkMenuItem       *item,
+                          gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -318,9 +294,8 @@
 /* Settings->Preferences command.                                           */
 /****************************************************************************/
 void
-gb_cmd_settings_preferences (BonoboUIComponent *uic,
-			     gpointer           user_data,
-			     const gchar       *verbname)
+gb_cmd_settings_preferences (GtkMenuItem       *item,
+                             gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 	static GtkWidget *dlg = NULL;
@@ -350,9 +325,8 @@
 /* Settings->Update command.                                                */
 /****************************************************************************/
 void
-gb_cmd_settings_update (BonoboUIComponent *uic,
-			gpointer           user_data,
-			const gchar       *verbname)
+gb_cmd_settings_update (GtkMenuItem       *item,
+                        gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 
@@ -368,9 +342,8 @@
 /* Help->Contents command.                                                  */
 /****************************************************************************/
 void 
-gb_cmd_help_contents (BonoboUIComponent *uic,
-		      gpointer           user_data,
-		      const gchar       *verbname)
+gb_cmd_help_contents (GtkMenuItem       *item,
+                      gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
 	GError *error = NULL;
@@ -379,7 +352,8 @@
 
 	g_return_if_fail (window && GB_IS_WINDOW(window));
 
-	gnome_help_display_with_doc_id (NULL, NULL, "gbonds.xml", NULL, &error);
+	gtk_show_uri_on_window (GTK_WINDOW (window), "ghelp:gbonds",
+	                        GDK_CURRENT_TIME, &error);
 	
 	if (error != NULL)
 	{
@@ -393,27 +367,17 @@
 /* Help->About command.                                                     */
 /****************************************************************************/
 void 
-gb_cmd_help_about (BonoboUIComponent *uic,
-		   gpointer           user_data,
-		   const gchar       *verbname)
+gb_cmd_help_about (GtkMenuItem       *item,
+                   gpointer           user_data)
 {
 	gbWindow *window = GB_WINDOW (user_data);
-	static GtkWidget *about = NULL;
 	GdkPixbuf        *pixbuf = NULL;
+	gchar            *file;
 	
 	gchar *copy_text = "Copyright 2000-2008 Jim Evins";
 	gchar *about_text =
 		_("A savings bond inventory program for GNOME.\n"
 		  " \n"
-		  "GBonds is free software; you can redistribute it and/or modify it "
-		  "under the terms of the GNU General Public License as published by "
-		  "the Free Software Foundation; either version 2 of the License, or "
-		  "(at your option) any later version.\n" " \n"
-		  "This program is distributed in the hope that it will be useful, but "
-		  "WITHOUT ANY WARRANTY; without even the implied warranty of "
-		  "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU "
-		  "General Public License for more details.\n"
-		  " \n"
 		  "DISCLAIMER:  GBonds is not affiliated with or endorsed by the "
 		  "U.S. Treasury or the U.S. Government.");
 
@@ -421,7 +385,7 @@
 		"Jim Evins <evins@snaught.com>",
 		" ",
 		_("See the file AUTHORS for additional credits,"),
-		_("or visit http://gbonds.sourceforge.net"),
+		_("or visit the website http://gbonds.sourceforge.net"),
 		NULL
 	};
 	
@@ -429,35 +393,24 @@
 
 	g_return_if_fail (window && GB_IS_WINDOW(window));
 
-	if (about != NULL)
-	{
-		gdk_window_show (about->window);
-		gdk_window_raise (about->window);
-		return;
-	}
-	
-	pixbuf = gdk_pixbuf_new_from_file ( LOGO_PIXMAP, NULL);
-
-	about = gnome_about_new (_("gbonds"), VERSION,
-				 copy_text,
-				 about_text,
-				(const char **)authors,
-				(const char **)NULL,
-				(const char *)NULL,
-				pixbuf);
-
-	gtk_window_set_transient_for (GTK_WINDOW (about),
-				      GTK_WINDOW (window));
+	file = g_build_filename (DATADIR, G_DIR_SEPARATOR_S, "pixmaps",
+	                         G_DIR_SEPARATOR_S, "gbonds",
+	                         G_DIR_SEPARATOR_S, "gbonds_logo.png", NULL);
+	pixbuf = gdk_pixbuf_new_from_file (file, NULL);
+	g_free (file);
+
+	gtk_show_about_dialog (GTK_WINDOW (window),
+	                       "program-name", _("gbonds"),
+	                       "version", VERSION,
+	                       "copyright", copy_text,
+	                       "comments", about_text,
+	                       "authors", authors,
+	                       "logo", pixbuf,
+	                       "license-type", GTK_LICENSE_GPL_2_0,
+	                       "website", "http://gbonds.sourceforge.net",
+	                       NULL);
 
-	gtk_window_set_destroy_with_parent (GTK_WINDOW (about), TRUE);
-
-	if (pixbuf != NULL)
-		g_object_unref (pixbuf);
-	
-	g_signal_connect (G_OBJECT (about), "destroy",
-			  G_CALLBACK (gtk_widget_destroyed), &about);
-	
-	gtk_widget_show (about);
+	g_object_unref (pixbuf);
 }
 
 
--- a/src/edit.h
+++ b/src/edit.h
@@ -22,19 +22,18 @@
 #ifndef __EDIT_H__
 #define __EDIT_H__
 
-#include <bonobo/bonobo-window.h>
 #include "view.h"
 
 G_BEGIN_DECLS
 
 void    gb_edit_add_bond        (gbView       *view,
-				 BonoboWindow *win);
+				 GtkWindow    *win);
 
 void    gb_edit_delete_bonds    (gbView       *view,
-				 BonoboWindow *win);
+				 GtkWindow    *win);
 
 void    gb_edit_title           (gbView       *view,
-				 BonoboWindow *win);
+				 GtkWindow    *win);
 
 G_END_DECLS
 
--- a/src/print-dialog.h
+++ b/src/print-dialog.h
@@ -22,9 +22,8 @@
 #ifndef __PRINT_DIALOG_H__
 #define __PRINT_DIALOG_H__
 
-#include <bonobo/bonobo-window.h>
 #include "view.h"
 
-extern void gb_print_dialog (gbView *view, BonoboWindow *win);
+extern void gb_print_dialog (gbView *view, GtkWindow *win);
 
 #endif
--- a/src/prefs-dialog.h
+++ b/src/prefs-dialog.h
@@ -29,11 +29,11 @@
 G_BEGIN_DECLS
 
 #define GB_TYPE_PREFS_DIALOG            (gb_prefs_dialog_get_type ())
-#define GB_PREFS_DIALOG(obj)            (GTK_CHECK_CAST ((obj), GB_TYPE_PREFS_DIALOG, gbPrefsDialog))
-#define GB_PREFS_DIALOG_CLASS(klass)    (GTK_CHECK_CLASS_CAST ((klass), GB_TYPE_PREFS_DIALOG, gbPrefsDialogClass))
-#define GB_IS_PREFS_DIALOG(obj)         (GTK_CHECK_TYPE ((obj), GB_TYPE_PREFS_DIALOG))
-#define GB_IS_PREFS_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GB_TYPE_PREFS_DIALOG))
-#define GB_PREFS_DIALOG_GET_CLASS(obj)  (GTK_CHECK_GET_CLASS ((obj), GB_TYPE_PREFS_DIALOG, gbPrefsDialogClass))
+#define GB_PREFS_DIALOG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_PREFS_DIALOG, gbPrefsDialog))
+#define GB_PREFS_DIALOG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GB_TYPE_PREFS_DIALOG, gbPrefsDialogClass))
+#define GB_IS_PREFS_DIALOG(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_PREFS_DIALOG))
+#define GB_IS_PREFS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GB_TYPE_PREFS_DIALOG))
+#define GB_PREFS_DIALOG_GET_CLASS(obj)  (G_TYPE_CHECK_GET_CLASS ((obj), GB_TYPE_PREFS_DIALOG, gbPrefsDialogClass))
 
 
 typedef struct _gbPrefsDialog 		gbPrefsDialog;
@@ -54,7 +54,7 @@
 	gbHigDialogClass      parent_class;
 };
 
-GtkType    	gb_prefs_dialog_get_type 	(void) G_GNUC_CONST;
+GType    	gb_prefs_dialog_get_type 	(void) G_GNUC_CONST;
 
 GtkWidget      *gb_prefs_dialog_new		(GtkWindow *parent);
 
--- a/src/file.c
+++ b/src/file.c
@@ -22,7 +22,7 @@
 
 #include <config.h>
 
-#include <gnome.h>
+#include <glib/gi18n.h>
 #include <string.h>
 
 #include "doc-xml.h"
@@ -31,7 +31,6 @@
 #include "recent.h"
 #include "hig.h"
 #include "util.h"
-#include "libbonobo.h"
 
 #include "debug.h"
 
@@ -47,7 +46,6 @@
 /*===========================================*/
 /* Local function prototypes.                */
 /*===========================================*/
-#ifdef HAVE_FILE_CHOOSER
 static void open_response             (GtkDialog         *chooser,
 				       gint               response,
 				       GtkWindow         *window);
@@ -57,19 +55,6 @@
 static void save_as_response          (GtkDialog         *chooser,
 				       gint               response,
 				       gbDoc             *doc);
-#else
-static void open_ok                   (GtkWidget         *widget,
-				       GtkFileSelection  *fsel);
-
-static void import_ok                 (GtkWidget         *widget,
-				       GtkFileSelection  *fsel);
-static void save_as_ok_cb             (GtkWidget         *widget,
-				       GtkFileSelection  *fsel);
-static void save_as_cancel_cb         (GtkWidget         *widget,
-				       GtkFileSelection  *fsel);
-static void save_as_destroy_cb        (GtkWidget         *widget,
-				       gboolean          *destroy_flag);
-#endif
 
 gboolean    import_real               (const gchar       *filename,
 				       GtkWindow         *window);
@@ -103,7 +88,6 @@
 	gb_debug (DEBUG_FILE, "END");
 }
 
-#ifdef HAVE_FILE_CHOOSER
 
 /*****************************************************************************/
 /* "Open" menu callback.                                                     */
@@ -121,8 +105,8 @@
 	chooser = gtk_file_chooser_dialog_new ("Open inventory",
 					       window,
 					       GTK_FILE_CHOOSER_ACTION_OPEN,
-					       GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-					       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	                                       _("_Open"), GTK_RESPONSE_ACCEPT,
+	                                       _("_Cancel"), GTK_RESPONSE_CANCEL,
 					       NULL);
 
 	/* Recover state of open dialog */
@@ -228,134 +212,28 @@
 	gb_debug (DEBUG_FILE, "END");
 }
 
-#else
-
-/*****************************************************************************/
-/* "Open" menu callback.                                                     */
-/*****************************************************************************/
-void
-gb_file_open (GtkWindow *window)
-{
-	GtkFileSelection *fsel;
-
-	gb_debug (DEBUG_FILE, "START");
-
-	g_return_if_fail (window != NULL);
-
-	fsel = GTK_FILE_SELECTION (gtk_file_selection_new (_("Open")));
-	gtk_window_set_transient_for (GTK_WINDOW (fsel), window);
-	gtk_window_set_title (GTK_WINDOW (fsel), _("Open inventory"));
-
-	g_object_set_data (G_OBJECT (fsel), "parent_window", window);
-
-	g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
-			  G_CALLBACK (open_ok), fsel);
-
-	g_signal_connect_swapped (G_OBJECT (fsel->cancel_button), "clicked",
-				  G_CALLBACK (gtk_widget_destroy),
-				  G_OBJECT (fsel));
-
-	/* Recover state of open dialog */
-	if (open_path != NULL) {
-		gtk_file_selection_set_filename (fsel, open_path);
-	}
-
-	/* show the dialog */
-	gtk_widget_show (GTK_WIDGET (fsel));
-
-	gb_debug (DEBUG_FILE, "END");
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE.  Open "O.K." button callback.                                    */
-/*---------------------------------------------------------------------------*/
-static void
-open_ok (GtkWidget        *widget,
-	 GtkFileSelection *fsel)
-{
-	gchar            *filename;
-	GtkWidget        *dlg;
-	gint              ret;
-	EggRecentModel   *recent;
-	GtkWindow        *window;
-
-	gb_debug (DEBUG_FILE, "START");
-
-	g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
-
-	/* get the filename */
-	filename = g_strdup (gtk_file_selection_get_filename (fsel));
-
-	if (!filename || g_file_test (filename, G_FILE_TEST_IS_DIR)) {
-
-		dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
-					GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-					GTK_MESSAGE_WARNING,
-					GTK_BUTTONS_CLOSE,
-					_("Empty file name selection"),
-					_("Please select a file or supply a valid file name"));
-
-		gtk_dialog_run (GTK_DIALOG (dlg));
-		gtk_widget_destroy (dlg);
-
-	} else {
-
-		if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
-
-			dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
-						GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-						GTK_MESSAGE_WARNING,
-						GTK_BUTTONS_CLOSE,
-						_("File does not exist"),
-						_("Please select a file or supply a valid file name"));
-
-			gtk_dialog_run (GTK_DIALOG (dlg));
-			gtk_widget_destroy (dlg);
-
-
-		} else {
-		
-			window = g_object_get_data (G_OBJECT(fsel),
-						    "parent_window");
-
-			if ( gb_file_open_real (filename, window) ) {
-				gtk_widget_destroy (GTK_WIDGET (fsel));
-			}
-
-		}
-
-	}
-
-	g_free (filename);
-
-	gb_debug (DEBUG_FILE, "END");
-}
-
-#endif
 
 /*****************************************************************************/
 /* "Open recent" menu callback.                                              */
 /*****************************************************************************/
-gboolean
-gb_file_open_recent (EggRecentView   *view,
-		     EggRecentItem   *item,
+void
+gb_file_open_recent (GtkRecentChooser *chooser,
 		     GtkWindow       *window)
 {
-	gboolean result = FALSE;
-	gchar *filename;
+	gchar *filename, *item;
 	
 	gb_debug (DEBUG_FILE, "");
 
-	filename = gb_recent_get_filename (item);
+	item = gtk_recent_chooser_get_current_uri (chooser);
+	filename = g_filename_from_uri (item, NULL, NULL);
+	g_free (item);
 
 	if (filename) {
 		gb_debug (DEBUG_FILE, "open recent: %s", filename);
 
-		result = gb_file_open_real (filename, window);
+		gb_file_open_real (filename, window);
 		g_free (filename);
 	}
-
-	return result;
 }
 
 /*---------------------------------------------------------------------------*/
@@ -365,7 +243,7 @@
 gb_file_open_real (const gchar     *filename,
 		   GtkWindow       *window)
 {
-	gchar            *abs_filename;
+	gchar            *abs_filename, *uri;
 	gbDoc            *doc;
 	gbDocXMLStatus    status;
 	GtkWidget        *new_window;
@@ -410,15 +288,13 @@
 			gtk_widget_show_all (new_window);
 		}
 
-		gb_recent_add_uri (abs_filename);
+	        uri = g_filename_to_uri (abs_filename, NULL, NULL);
+		gb_recent_add_uri (uri);
+	        g_free (uri);
 
 		if (open_path != NULL)
 			g_free (open_path);
 		open_path = g_path_get_dirname (abs_filename);
-#ifndef HAVE_FILE_CHOOSER
-		if (open_path != NULL)
-			open_path = g_strconcat (open_path, "/", NULL);
-#endif
 
 		g_free (abs_filename);
 
@@ -429,7 +305,6 @@
 	}
 }
 
-#ifdef HAVE_FILE_CHOOSER
 
 /*****************************************************************************/
 /* "Import" menu callback.                                                   */
@@ -447,8 +322,8 @@
 	chooser = gtk_file_chooser_dialog_new ("Import inventory",
 					       window,
 					       GTK_FILE_CHOOSER_ACTION_OPEN,
-					       GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-					       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	                                       _("_Open"), GTK_RESPONSE_ACCEPT,
+	                                       _("_Cancel"), GTK_RESPONSE_CANCEL,
 					       NULL);
 
 	/* Recover state of import dialog */
@@ -554,110 +429,6 @@
 	gb_debug (DEBUG_FILE, "END");
 }
 
-#else
-
-/*****************************************************************************/
-/* "Import" menu callback.                                                   */
-/*****************************************************************************/
-void
-gb_file_import (GtkWindow *window)
-{
-	GtkFileSelection *fsel;
-
-	gb_debug (DEBUG_FILE, "START");
-
-	g_return_if_fail (window != NULL);
-
-	fsel = GTK_FILE_SELECTION (gtk_file_selection_new (_("Import")));
-	gtk_window_set_transient_for (GTK_WINDOW (fsel), window);
-	gtk_window_set_title (GTK_WINDOW (fsel), _("Import inventory"));
-
-	g_object_set_data (G_OBJECT (fsel), "parent_window", window);
-
-	g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
-			  G_CALLBACK (import_ok), fsel);
-
-	g_signal_connect_swapped (G_OBJECT (fsel->cancel_button), "clicked",
-				  G_CALLBACK (gtk_widget_destroy),
-				  G_OBJECT (fsel));
-
-	/* Recover state of import dialog */
-	if (import_path != NULL) {
-		gtk_file_selection_set_filename (fsel, import_path);
-	}
-
-	/* show the dialog */
-	gtk_widget_show (GTK_WIDGET (fsel));
-
-	gb_debug (DEBUG_FILE, "END");
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE.  Import "O.K." button callback.                                  */
-/*---------------------------------------------------------------------------*/
-static void
-import_ok (GtkWidget        *widget,
-	   GtkFileSelection *fsel)
-{
-	gchar            *filename;
-	GtkWidget        *dlg;
-	gint              ret;
-	EggRecentModel   *recent;
-	GtkWindow        *window;
-
-	gb_debug (DEBUG_FILE, "START");
-
-	g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
-
-	/* get the filename */
-	filename = g_strdup (gtk_file_selection_get_filename (fsel));
-
-	if (!filename || g_file_test (filename, G_FILE_TEST_IS_DIR)) {
-
-		dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
-					GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-					GTK_MESSAGE_WARNING,
-					GTK_BUTTONS_CLOSE,
-					_("Empty file name selection"),
-					_("Please select a file or supply a valid file name"));
-
-		gtk_dialog_run (GTK_DIALOG (dlg));
-		gtk_widget_destroy (dlg);
-
-	} else {
-
-		if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
-
-			dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
-						GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-						GTK_MESSAGE_WARNING,
-						GTK_BUTTONS_CLOSE,
-						_("File does not exist"),
-						_("Please select a file or supply a valid file name"));
-
-			gtk_dialog_run (GTK_DIALOG (dlg));
-			gtk_widget_destroy (dlg);
-
-
-		} else {
-		
-			window = g_object_get_data (G_OBJECT(fsel),
-						    "parent_window");
-
-			if ( import_real (filename, window) ) {
-				gtk_widget_destroy (GTK_WIDGET (fsel));
-			}
-
-		}
-
-	}
-
-	g_free (filename);
-
-	gb_debug (DEBUG_FILE, "END");
-}
-
-#endif
 
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  Import a file.                                                  */
@@ -714,10 +485,6 @@
 		if (import_path != NULL)
 			g_free (import_path);
 		import_path = g_path_get_dirname (abs_filename);
-#ifndef HAVE_FILE_CHOOSER
-		if (import_path != NULL)
-			import_path = g_strconcat (import_path, "/", NULL);
-#endif
 		g_free (abs_filename);
 
 		gb_debug (DEBUG_FILE, "END true");
@@ -735,7 +502,7 @@
 	      GtkWindow *window)
 {
 	gbDocXMLStatus    status;
-	gchar            *filename = NULL;
+	gchar            *uri, *filename = NULL;
 
 	gb_debug (DEBUG_FILE, "");
 
@@ -790,7 +557,9 @@
 	{
 		gb_debug (DEBUG_FILE, "OK");
 
-		gb_recent_add_uri (filename);
+	        uri = g_filename_to_uri (filename, NULL, NULL);
+		gb_recent_add_uri (uri);
+	        g_free (uri);
 
 		g_free (filename);
 
@@ -798,7 +567,6 @@
 	}
 }
 
-#ifdef HAVE_FILE_CHOOSER
 
 /*****************************************************************************/
 /* "Save As" menu callback.                                                  */
@@ -824,8 +592,8 @@
 	chooser = gtk_file_chooser_dialog_new (title,
 					       window,
 					       GTK_FILE_CHOOSER_ACTION_SAVE,
-					       GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
-					       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	                                       _("_Save"), GTK_RESPONSE_ACCEPT,
+	                                       _("_Cancel"), GTK_RESPONSE_CANCEL,
 					       NULL);
 
 	gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
@@ -876,7 +644,7 @@
 		  gint           response,
 		  gbDoc         *doc)
 {
-	gchar            *raw_filename, *filename, *full_filename;
+	gchar            *raw_filename, *filename, *full_filename, *uri;
 	GtkWidget        *dlg;
 	gbDocXMLStatus    status;
 	gboolean         *saved_flag;
@@ -967,7 +735,10 @@
 
 					*saved_flag = TRUE;
 
-					gb_recent_add_uri (filename);
+	                                uri = g_filename_to_uri (filename,
+	                                                         NULL, NULL);
+					gb_recent_add_uri (uri);
+	                                g_free (uri);
 
 					if (save_path != NULL)
 						g_free (save_path);
@@ -997,218 +768,6 @@
 	gb_debug (DEBUG_FILE, "END");
 }
 
-#else
-
-/*****************************************************************************/
-/* "Save As" menu callback.                                                  */
-/*****************************************************************************/
-gboolean
-gb_file_save_as (gbDoc     *doc,
-		 GtkWindow *window)
-{
-	GtkFileSelection *fsel;
-	gboolean          saved_flag = FALSE;
-	gboolean          destroy_flag = FALSE;
-	gchar            *name, *title;
-
-	gb_debug (DEBUG_FILE, "START");
-
-	g_return_val_if_fail (doc && GB_IS_DOC(doc), FALSE);
-	g_return_val_if_fail (window && GTK_IS_WINDOW(window), FALSE);
-
-	name = gb_doc_get_short_name (doc);
-	title = g_strdup_printf (_("Save \"%s\" as"), name);
-	g_free (name);
-
-	fsel = GTK_FILE_SELECTION (gtk_file_selection_new (title));
-	gtk_window_set_modal (GTK_WINDOW (fsel), TRUE);
-	gtk_window_set_transient_for (GTK_WINDOW (fsel), window);
-
-	g_object_set_data (G_OBJECT (fsel), "doc", doc);
-	g_object_set_data (G_OBJECT (fsel), "saved_flag", &saved_flag);
-
-	g_signal_connect (G_OBJECT (fsel->ok_button), "clicked",
-			  G_CALLBACK (save_as_ok_cb), fsel);
-
-	g_signal_connect (G_OBJECT (fsel->cancel_button), "clicked",
-			  G_CALLBACK (save_as_cancel_cb), fsel);
-
-	g_signal_connect (G_OBJECT (fsel), "destroy",
-			  G_CALLBACK (save_as_destroy_cb), &destroy_flag);
-
-	/* Recover proper state of save-as dialog */
-	if (save_path != NULL) {
-		gtk_file_selection_set_filename (fsel, save_path);
-	}
-
-	/* show the dialog */
-	gtk_widget_show (GTK_WIDGET (fsel));
-
-	/* Hold here and process events until we are done with this dialog. */
-	gtk_main ();
-
-	/* Destroy dialog if not already destroyed. */
-	if (!destroy_flag) {
-		/* Disconnect our destroy callback first, so that we don't
-		 * kill the current gtk_main() loop. */
-		g_signal_handlers_disconnect_by_func (GTK_OBJECT (fsel),
-						      G_CALLBACK (save_as_destroy_cb),
-						      &destroy_flag);
-		gtk_widget_destroy (GTK_WIDGET (fsel));
-	}
-
-	g_free (title);
-
-	gb_debug (DEBUG_FILE, "END");
-
-	/* Return flag as set by one of the above callbacks, TRUE = saved */
-	return saved_flag;
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE.  "Save As" ok button callback.                                   */
-/*---------------------------------------------------------------------------*/
-static void
-save_as_ok_cb (GtkWidget        *widget,
-	       GtkFileSelection *fsel)
-{
-	gchar            *raw_filename, *filename;
-	GtkWidget        *dlg;
-	gbDoc            *doc;
-	gbDocXMLStatus    status;
-	EggRecentModel   *recent;
-	gboolean         *saved_flag;
-	gchar            *primary_msg;
-	gboolean          cancel_flag = FALSE;
-
-	gb_debug (DEBUG_FILE, "START");
-
-	g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
-
-	doc = g_object_get_data (G_OBJECT(fsel), "doc");
-	saved_flag = g_object_get_data (G_OBJECT(fsel), "saved_flag");
-
-	/* get the filename */
-	raw_filename = g_strdup (gtk_file_selection_get_filename (fsel));
-
-	gb_debug (DEBUG_FILE, "raw_filename = \"%s\"", raw_filename);
-
-	if (!raw_filename || g_file_test (raw_filename, G_FILE_TEST_IS_DIR)) {
-
-		dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
-					GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-					GTK_MESSAGE_WARNING,
-					GTK_BUTTONS_CLOSE,
-					_("Empty file name selection"),
-					_("Please supply a valid file name"));
-
-		gtk_dialog_run (GTK_DIALOG (dlg));
-		gtk_widget_destroy (dlg);
-
-	} else {
-
-		filename = gb_util_add_extension (raw_filename);
-
-		gb_debug (DEBUG_FILE, "filename = \"%s\"", filename);
-
-		if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
-			gint ret;
-
-			primary_msg = g_strdup_printf (_("Overwrite file \"%s\"?"),
-						       filename);
-
-			dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
-						GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-						GTK_MESSAGE_QUESTION,
-						GTK_BUTTONS_YES_NO,
-						primary_msg,
-						_("File already exists."));
-			
-			g_free (primary_msg);
-
-			ret = gtk_dialog_run (GTK_DIALOG (dlg));
-			if ( ret == GTK_RESPONSE_NO ) {
-				cancel_flag = TRUE;
-			}
-			gtk_widget_destroy (dlg);
-		}
-
-		if (!cancel_flag) {
-
-			gb_doc_xml_save (doc, filename, &status);
-
-			gb_debug (DEBUG_FILE, "status of save = %d", status);
-
-			if ( status != GB_DOC_XML_OK ) {
-
-				primary_msg = g_strdup_printf (_("Could not save file \"%s\""),
-							       filename);
-
-				dlg = gb_hig_alert_new (GTK_WINDOW(fsel),
-							GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-							GTK_MESSAGE_ERROR,
-							GTK_BUTTONS_CLOSE,
-							primary_msg,
-							_("Error encountered during save.  The file is still not saved."));
-
-				g_free (primary_msg);
-
-				gtk_dialog_run (GTK_DIALOG (dlg));
-				gtk_widget_destroy (dlg);
-
-			} else {
-
-				*saved_flag = TRUE;
-
-				gb_recent_add_uri (filename);
-
-				if (save_path != NULL)
-					g_free (save_path);
-				save_path = g_path_get_dirname (filename);
-				if (save_path != NULL)
-					save_path = g_strconcat (save_path, "/", NULL);
-
-				gtk_widget_destroy (GTK_WIDGET (fsel));
-			}
-
-		}
-
-		g_free (filename);
-	}
-
-	g_free (raw_filename);
-
-	gb_debug (DEBUG_FILE, "END");
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE.  "Save As" cancel button callback.                               */
-/*---------------------------------------------------------------------------*/
-static void
-save_as_cancel_cb (GtkWidget        *widget,
-		   GtkFileSelection *fsel)
-{
-	gboolean *saved_flag = g_object_get_data (G_OBJECT (fsel), "saved_flag");
-
-	g_return_if_fail (GTK_IS_FILE_SELECTION (fsel));
-
-	*saved_flag = FALSE;
-	gtk_widget_hide (GTK_WIDGET (fsel));
-	gtk_main_quit ();
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE.  "Save As" destroy callback.                                     */
-/*---------------------------------------------------------------------------*/
-static void
-save_as_destroy_cb (GtkWidget *widget,
-		    gboolean  *destroy_flag)
-{
-	*destroy_flag = TRUE;
-	gtk_main_quit ();
-}
-
-#endif
 
 /*****************************************************************************/
 /* "Close" menu callback.                                                    */
@@ -1251,10 +810,10 @@
 					       GTK_RESPONSE_NO);
 
 			gtk_dialog_add_button (GTK_DIALOG (msgbox),
-					       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+	                                       _("_Cancel"), GTK_RESPONSE_CANCEL);
 
 			gtk_dialog_add_button (GTK_DIALOG (msgbox),
-					       GTK_STOCK_SAVE, GTK_RESPONSE_YES);
+	                                       _("_Save"), GTK_RESPONSE_YES);
 
 			gtk_dialog_set_default_response	(GTK_DIALOG (msgbox), GTK_RESPONSE_YES);
 
@@ -1292,7 +851,7 @@
 			
 			gb_debug (DEBUG_FILE, "All windows closed.");
 	
-			bonobo_main_quit ();
+			gtk_main_quit ();
 		}
 
 	}
--- a/src/hig.h
+++ b/src/hig.h
@@ -37,13 +37,13 @@
 
 #define GB_TYPE_HIG_ALERT (gb_hig_alert_get_type ())
 #define GB_HIG_ALERT(obj) \
-        (GTK_CHECK_CAST((obj), GB_TYPE_HIG_ALERT, gbHigAlert ))
+        (G_TYPE_CHECK_INSTANCE_CAST((obj), GB_TYPE_HIG_ALERT, gbHigAlert ))
 #define GB_HIG_ALERT_CLASS(klass) \
-        (GTK_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_ALERT, gbHigAlertClass))
+        (G_TYPE_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_ALERT, gbHigAlertClass))
 #define GB_IS_HIG_ALERT(obj) \
-        (GTK_CHECK_TYPE ((obj), GB_TYPE_HIG_ALERT))
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_HIG_ALERT))
 #define GB_IS_HIG_ALERT_CLASS(klass) \
-        (GTK_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_ALERT))
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_ALERT))
 
 typedef struct _gbHigAlert      gbHigAlert;
 typedef struct _gbHigAlertClass gbHigAlertClass;
@@ -72,13 +72,13 @@
 
 #define GB_TYPE_HIG_DIALOG (gb_hig_dialog_get_type ())
 #define GB_HIG_DIALOG(obj) \
-        (GTK_CHECK_CAST((obj), GB_TYPE_HIG_DIALOG, gbHigDialog ))
+        (G_TYPE_CHECK_INSTANCE_CAST((obj), GB_TYPE_HIG_DIALOG, gbHigDialog ))
 #define GB_HIG_DIALOG_CLASS(klass) \
-        (GTK_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_DIALOG, gbHigDialogClass))
+        (G_TYPE_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_DIALOG, gbHigDialogClass))
 #define GB_IS_HIG_DIALOG(obj) \
-        (GTK_CHECK_TYPE ((obj), GB_TYPE_HIG_DIALOG))
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_HIG_DIALOG))
 #define GB_IS_HIG_DIALOG_CLASS(klass) \
-        (GTK_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_DIALOG))
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_DIALOG))
 
 typedef struct _gbHigDialog      gbHigDialog;
 typedef struct _gbHigDialogClass gbHigDialogClass;
@@ -113,26 +113,26 @@
 
 #define GB_TYPE_HIG_CATEGORY (gb_hig_category_get_type ())
 #define GB_HIG_CATEGORY(obj) \
-        (GTK_CHECK_CAST((obj), GB_TYPE_HIG_CATEGORY, gbHigCategory ))
+        (G_TYPE_CHECK_INSTANCE_CAST((obj), GB_TYPE_HIG_CATEGORY, gbHigCategory ))
 #define GB_HIG_CATEGORY_CLASS(klass) \
-        (GTK_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_CATEGORY, gbHigCategoryClass))
+        (G_TYPE_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_CATEGORY, gbHigCategoryClass))
 #define GB_IS_HIG_CATEGORY(obj) \
-        (GTK_CHECK_TYPE ((obj), GB_TYPE_HIG_CATEGORY))
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_HIG_CATEGORY))
 #define GB_IS_HIG_CATEGORY_CLASS(klass) \
-        (GTK_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_CATEGORY))
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_CATEGORY))
 
 typedef struct _gbHigCategory      gbHigCategory;
 typedef struct _gbHigCategoryClass gbHigCategoryClass;
 
 struct _gbHigCategory {
-	GtkVBox           parent_widget;
+	GtkBox            parent_widget;
 
 	GtkWidget        *label;
 	GtkWidget        *vbox;
 };
 
 struct _gbHigCategoryClass {
-	GtkVBoxClass      parent_class;
+	GtkBoxClass       parent_class;
 };
 
 GType      gb_hig_category_get_type         (void);
@@ -154,23 +154,23 @@
 
 #define GB_TYPE_HIG_VBOX (gb_hig_vbox_get_type ())
 #define GB_HIG_VBOX(obj) \
-        (GTK_CHECK_CAST((obj), GB_TYPE_HIG_VBOX, gbHigVBox ))
+        (G_TYPE_CHECK_INSTANCE_CAST((obj), GB_TYPE_HIG_VBOX, gbHigVBox ))
 #define GB_HIG_VBOX_CLASS(klass) \
-        (GTK_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_VBOX, gbHigVBoxClass))
+        (G_TYPE_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_VBOX, gbHigVBoxClass))
 #define GB_IS_HIG_VBOX(obj) \
-        (GTK_CHECK_TYPE ((obj), GB_TYPE_HIG_VBOX))
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_HIG_VBOX))
 #define GB_IS_HIG_VBOX_CLASS(klass) \
-        (GTK_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_VBOX))
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_VBOX))
 
 typedef struct _gbHigVBox      gbHigVBox;
 typedef struct _gbHigVBoxClass gbHigVBoxClass;
 
 struct _gbHigVBox {
-	GtkVBox           parent_widget;
+	GtkBox            parent_widget;
 };
 
 struct _gbHigVBoxClass {
-	GtkVBoxClass      parent_class;
+	GtkBoxClass       parent_class;
 };
 
 GType      gb_hig_vbox_get_type         (void);
@@ -187,23 +187,23 @@
 
 #define GB_TYPE_HIG_HBOX (gb_hig_hbox_get_type ())
 #define GB_HIG_HBOX(obj) \
-        (GTK_CHECK_CAST((obj), GB_TYPE_HIG_HBOX, gbHigHBox ))
+        (G_TYPE_CHECK_INSTANCE_CAST((obj), GB_TYPE_HIG_HBOX, gbHigHBox ))
 #define GB_HIG_HBOX_CLASS(klass) \
-        (GTK_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_HBOX, gbHigHBoxClass))
+        (G_TYPE_CHECK_CLASS_CAST ((klass), GB_TYPE_HIG_HBOX, gbHigHBoxClass))
 #define GB_IS_HIG_HBOX(obj) \
-        (GTK_CHECK_TYPE ((obj), GB_TYPE_HIG_HBOX))
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_HIG_HBOX))
 #define GB_IS_HIG_HBOX_CLASS(klass) \
-        (GTK_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_HBOX))
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), GB_TYPE_HIG_HBOX))
 
 typedef struct _gbHigHBox      gbHigHBox;
 typedef struct _gbHigHBoxClass gbHigHBoxClass;
 
 struct _gbHigHBox {
-	GtkHBox           parent_widget;
+	GtkBox            parent_widget;
 };
 
 struct _gbHigHBoxClass {
-	GtkHBoxClass      parent_class;
+	GtkBoxClass       parent_class;
 };
 
 GType      gb_hig_hbox_get_type           (void);
--- a/src/prefs-dialog.c
+++ b/src/prefs-dialog.c
@@ -21,8 +21,7 @@
  */
 #include <config.h>
 
-#include <libgnome/libgnome.h>
-#include <libgnomeui/libgnomeui.h>
+#include <glib/gi18n.h>
 
 #include "hig.h"
 #include "prefs-dialog.h"
@@ -182,7 +181,7 @@
 	g_return_if_fail (dlg->private != NULL);
 
 	gtk_dialog_add_button (GTK_DIALOG(dlg),
-			       GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
+	                       _("_Close"), GTK_RESPONSE_CLOSE);
 
 	gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_CLOSE);
 
@@ -203,7 +202,7 @@
 	update_startup_page_from_prefs (dlg);
 	update_rdate_range_page_from_prefs (dlg);
 
-        gtk_widget_show_all (GTK_DIALOG (dlg)->vbox);   
+        gtk_widget_show_all (gtk_dialog_get_content_area (GTK_DIALOG (dlg)));
 
         gtk_window_set_modal (GTK_WINDOW (dlg), TRUE);
         gtk_window_set_title (GTK_WINDOW (dlg), _("gbabels Preferences"));
@@ -243,7 +242,7 @@
 static GtkWidget *
 startup_page (gbPrefsDialog *dlg)
 {
-	GtkWidget *wvbox, *wframe, *wentry;
+	GtkWidget *wvbox, *wframe;
 	GSList *radio_group = NULL;
 
 	wvbox = gb_hig_vbox_new (GB_HIG_VBOX_OUTER);
@@ -275,10 +274,8 @@
 				    dlg->private->startup3_radio);
 
 	dlg->private->startup_file_entry =
-		gnome_file_entry_new (NULL, _("select file:"));
-	gnome_file_entry_set_modal (GNOME_FILE_ENTRY(dlg->private->startup_file_entry),
-				    TRUE);
-	wentry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY(dlg->private->startup_file_entry));
+	        gtk_file_chooser_button_new (_("select file:"),
+	                                     GTK_FILE_CHOOSER_ACTION_OPEN);
 	gb_hig_category_add_widget (GB_HIG_CATEGORY(wframe),
 				    dlg->private->startup_file_entry);
 
@@ -292,8 +289,8 @@
 		G_OBJECT(dlg->private->startup3_radio),
 		"toggled", G_CALLBACK(update_prefs_from_startup_page), dlg);
 	g_signal_connect_swapped (
-		G_OBJECT(wentry),
-		"changed", G_CALLBACK(update_prefs_from_startup_page), dlg);
+		G_OBJECT(dlg->private->startup_file_entry),
+		"file-set", G_CALLBACK(update_prefs_from_startup_page), dlg);
 
 	return wvbox;
 }
@@ -347,7 +344,7 @@
 static void
 update_startup_page_from_prefs (gbPrefsDialog *dlg)
 {
-	GtkWidget *wentry;
+        //GtkWidget *wentry;
 
 	g_signal_handlers_block_by_func (
 		G_OBJECT(dlg->private->startup1_radio),
@@ -383,8 +380,11 @@
 			TRUE);
 		gtk_widget_set_sensitive (GTK_WIDGET(dlg->private->startup_file_entry),
 					  TRUE);
-		wentry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY(dlg->private->startup_file_entry));
-		gtk_entry_set_text (GTK_ENTRY(wentry), gb_prefs->startup_file);
+	        if (strlen (gb_prefs->startup_file))
+	                gtk_file_chooser_set_filename
+	                        (GTK_FILE_CHOOSER
+	                         (dlg->private->startup_file_entry),
+	                         gb_prefs->startup_file);
 		break;
 	default:
 		g_warning ("Illegal startup action");	/* Should not happen */
@@ -449,8 +449,6 @@
 static void
 update_prefs_from_startup_page (gbPrefsDialog *dlg)
 {
-	GtkWidget *wentry;
-
 	if (gtk_toggle_button_get_active (
 		    GTK_TOGGLE_BUTTON(dlg->private->startup1_radio))) {
 		gb_prefs->startup_action = GB_PREFS_STARTUP_BLANK;
@@ -468,9 +466,9 @@
 		gb_prefs->startup_action = GB_PREFS_STARTUP_DEFAULT;
 		gtk_widget_set_sensitive (GTK_WIDGET(dlg->private->startup_file_entry),
 					  TRUE);
-		wentry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY(dlg->private->startup_file_entry));
-		gb_prefs->startup_file = gtk_editable_get_chars (GTK_EDITABLE(wentry),
-								 0, -1);
+	        gb_prefs->startup_file
+	            = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER
+	                                             (dlg->private->startup_file_entry));
 	}
 
 	gb_prefs_save_settings ();
--- a/src/view.c
+++ b/src/view.c
@@ -22,7 +22,7 @@
 
 #include <config.h>
 
-#include <gnome.h>
+#include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include <gtk/gtkinvisible.h>
 #include <string.h>
@@ -172,7 +172,7 @@
 		};
 
 		view_type =
-		    g_type_register_static (gtk_vbox_get_type (),
+		    g_type_register_static (gtk_box_get_type (),
 					    "gbView", &view_info, 0);
 	}
 
@@ -208,6 +208,8 @@
 {
 	gb_debug (DEBUG_VIEW, "START");
 
+	gtk_orientable_set_orientation (GTK_ORIENTABLE (view),
+	                                GTK_ORIENTATION_VERTICAL);
 	view->doc = NULL;
 
 	gb_debug (DEBUG_VIEW, "END");
@@ -280,7 +282,7 @@
 	w = gb_view_construct_bond_list( view );
 	gtk_box_pack_start( GTK_BOX(wvbox), w, TRUE, TRUE, 5 );
 
-	whbox = gtk_hbox_new (FALSE, 0);
+	whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 	gtk_box_pack_start( GTK_BOX(wvbox), whbox, FALSE, FALSE, 5 );
 
 	w = gb_view_construct_totals_list( view );
@@ -300,6 +302,15 @@
 }
 
 /*---------------------------------------------------------------------------*/
+/* PRIVATE.  Fill the combobox with rdates.                                  */
+/*---------------------------------------------------------------------------*/
+static void
+fill_combo (gchar *rdate, GtkComboBoxText *combo)
+{
+        gtk_combo_box_text_append_text (combo, rdate);
+}
+
+/*---------------------------------------------------------------------------*/
 /* PRIVATE.  Create rdate selection widgets.                                 */
 /*---------------------------------------------------------------------------*/
 static GtkWidget *
@@ -317,18 +328,18 @@
 	default: n_dates = 12; break;
 	}
 
-	whbox = gtk_hbox_new (FALSE, 0);
+	whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
 	gtk_box_pack_start (GTK_BOX(whbox),
 			    gtk_label_new (_("Redemption Date:")),
 			    FALSE, FALSE, 5);
 
 	/* Combo */
-	view->rdate_combo = gtk_combo_new();
+	view->rdate_combo = gtk_combo_box_text_new_with_entry ();
 	gtk_container_set_border_width( GTK_CONTAINER(view->rdate_combo), 5 );
 	table_model = gb_table_get_model ();
 	rdate_list = gb_table_model_get_rdate_list( table_model, n_dates );
-	gtk_combo_set_popdown_strings( GTK_COMBO(view->rdate_combo), rdate_list );
+	g_list_foreach (rdate_list, (GFunc) fill_combo, view->rdate_combo);
 	gb_table_model_free_rdate_list( rdate_list );
 	gtk_box_pack_start (GTK_BOX(whbox),
 			    view->rdate_combo,
@@ -337,12 +348,12 @@
 	g_signal_connect( G_OBJECT(table_model), "changed",
 			  G_CALLBACK(table_model_changed_cb), view );
 
-	view->rdate_entry = GTK_COMBO(view->rdate_combo)->entry;
+	view->rdate_entry = gtk_bin_get_child (GTK_BIN (view->rdate_combo));
 	gtk_entry_set_max_length( GTK_ENTRY(view->rdate_entry), 8 );
-	gtk_entry_set_editable( GTK_ENTRY(view->rdate_entry), FALSE );
+	gtk_editable_set_editable (GTK_EDITABLE (view->rdate_entry), FALSE);
 	gtk_entry_set_text( GTK_ENTRY(view->rdate_entry), view->rdate );
 
-	g_signal_connect( G_OBJECT(GTK_COMBO(view->rdate_combo)->entry),
+	g_signal_connect( view->rdate_combo,
 			  "changed", G_CALLBACK(rdate_changed_cb), view );
 
 	return whbox;
@@ -378,7 +389,6 @@
 					       G_TYPE_POINTER /* Pointer to record */,
 					       G_TYPE_STRING  /* Foreground color */);
 	view->bond_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL(view->bond_store));
-	gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(view->bond_list), TRUE);
 
 	renderer = gtk_cell_renderer_text_new ();
 	g_object_set (G_OBJECT(renderer), "xalign", 0.0, NULL);
@@ -580,36 +590,39 @@
 {
 	GtkWidget         *wouter_hbox, *wframe, *wvbox, *whbox, *wlabel;
 
-	wouter_hbox = gtk_hbox_new (FALSE, 0);
+	wouter_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
 	wframe = gtk_frame_new( _("Totals") );
 	gtk_box_pack_start( GTK_BOX(wouter_hbox), wframe, FALSE, FALSE, 5 );
 
-	wvbox = gtk_vbox_new (FALSE, 0);
+	wvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
 	gtk_container_add( GTK_CONTAINER(wframe), wvbox );
 
-	whbox = gtk_hbox_new (FALSE, 10);
+	whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
 	gtk_box_pack_start( GTK_BOX(wvbox), whbox, TRUE, TRUE, 0 );
 	wlabel = gtk_label_new (_("Inventory value:"));
 	gtk_box_pack_start( GTK_BOX(whbox), wlabel, FALSE, FALSE, 5 );
 	view->inventory_value_label = gtk_label_new ("$0.00");
-	gtk_misc_set_alignment (GTK_MISC(view->inventory_value_label), 1.0, 0.5);
+	gtk_label_set_xalign (GTK_LABEL (view->inventory_value_label), 1.0);
+	gtk_label_set_yalign (GTK_LABEL (view->inventory_value_label), 0.5);
 	gtk_box_pack_end( GTK_BOX(whbox), view->inventory_value_label, FALSE, FALSE, 5 );
 	
-	whbox = gtk_hbox_new (FALSE, 10);
+	whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
 	gtk_box_pack_start( GTK_BOX(wvbox), whbox, TRUE, TRUE, 0 );
 	wlabel = gtk_label_new (_("Redemption value:"));
 	gtk_box_pack_start( GTK_BOX(whbox), wlabel, FALSE, FALSE, 5 );
 	view->redemption_value_label = gtk_label_new ("$0.00");
-	gtk_misc_set_alignment (GTK_MISC(view->redemption_value_label), 1.0, 0.5);
+	gtk_label_set_xalign (GTK_LABEL (view->redemption_value_label), 1.0);
+	gtk_label_set_yalign (GTK_LABEL (view->redemption_value_label), 0.5);
 	gtk_box_pack_end( GTK_BOX(whbox), view->redemption_value_label, FALSE, FALSE, 5 );
 	
-	whbox = gtk_hbox_new (FALSE, 10);
+	whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
 	gtk_box_pack_start( GTK_BOX(wvbox), whbox, TRUE, TRUE, 0 );
 	wlabel = gtk_label_new (_("Interest:"));
 	gtk_box_pack_start( GTK_BOX(whbox), wlabel, FALSE, FALSE, 5 );
 	view->total_interest_label = gtk_label_new ("$0.00");
-	gtk_misc_set_alignment (GTK_MISC(view->total_interest_label), 1.0, 0.5);
+	gtk_label_set_xalign (GTK_LABEL (view->total_interest_label), 1.0);
+	gtk_label_set_yalign (GTK_LABEL (view->total_interest_label), 0.5);
 	gtk_box_pack_end( GTK_BOX(whbox), view->total_interest_label, FALSE, FALSE, 5 );
 	
 
@@ -617,65 +630,92 @@
 }
 
 /*---------------------------------------------------------------------------*/
+/* PRIVATE. Install CSS for the legend labels.  Called only once.            */
+/*---------------------------------------------------------------------------*/
+static void
+install_css (void)
+{
+	GtkCssProvider *provider;
+	const gchar    *css;
+
+	css = ".nopay { color: " GB_VIEW_NOPAY_COLOR "; }"
+	      ".exch { color: " GB_VIEW_MATURED_EXCH_COLOR "; }"
+	      ".noexch { color: " GB_VIEW_MATURED_NOT_EXCH_COLOR "; }";
+
+	provider = gtk_css_provider_new ();
+	gtk_css_provider_load_from_data (provider, css, -1, NULL);
+	gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+	                                           GTK_STYLE_PROVIDER (provider),
+	                                           GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+	g_object_unref (provider);
+ }
+
+/*---------------------------------------------------------------------------*/
 /* PRIVATE. Create legend widgets.                                           */
 /*---------------------------------------------------------------------------*/
 static GtkWidget *
 gb_view_construct_legend(gbView *view)
 {
 	GtkWidget    *wouter_hbox, *wframe, *wvbox, *whbox, *wlabel;
-	GdkColor      gdk_color = {0,0,0,0};
 	GtkSizeGroup *size_group;
+	GtkStyleContext *ctxt;
+	static gboolean css_installed = FALSE;
+
+	if (!css_installed) {
+	        install_css ();
+	        css_installed = TRUE;
+	}
 
 	size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 
-	wouter_hbox = gtk_hbox_new (FALSE, 0);
+	wouter_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
 	wframe = gtk_frame_new( _("Legend") );
 	gtk_box_pack_start( GTK_BOX(wouter_hbox), wframe, FALSE, FALSE, 5 );
 
-	wvbox = gtk_vbox_new (FALSE, 0);
+	wvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
 	gtk_container_add( GTK_CONTAINER(wframe), wvbox );
 
-	whbox = gtk_hbox_new (FALSE, 0);
+	whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 	gtk_box_pack_start( GTK_BOX(wvbox), whbox, TRUE, TRUE, 0 );
 	wlabel = gtk_label_new (_("*"));
 	gtk_size_group_add_widget (size_group, wlabel);
-	gdk_color_parse (GB_VIEW_NOPAY_COLOR, &gdk_color);
-	gtk_widget_modify_fg (wlabel, GTK_STATE_NORMAL, &gdk_color);
-	gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.5);
+	ctxt = gtk_widget_get_style_context (wlabel);
+	gtk_style_context_add_class (ctxt, "nopay");
+	gtk_label_set_yalign (GTK_LABEL (wlabel), 0.5);
 	gtk_box_pack_start( GTK_BOX(whbox), wlabel, FALSE, FALSE, 5 );
 	wlabel = gtk_label_new (_("- Not yet eligible for payment"));
-	gdk_color_parse (GB_VIEW_NOPAY_COLOR, &gdk_color);
-	gtk_widget_modify_fg (wlabel, GTK_STATE_NORMAL, &gdk_color);
-	gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.5);
+	ctxt = gtk_widget_get_style_context (wlabel);
+	gtk_style_context_add_class (ctxt, "nopay");
+	gtk_label_set_yalign (GTK_LABEL (wlabel), 0.5);
 	gtk_box_pack_start( GTK_BOX(whbox), wlabel, FALSE, FALSE, 5 );
 	
-	whbox = gtk_hbox_new (FALSE, 0);
+	whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 	gtk_box_pack_start( GTK_BOX(wvbox), whbox, TRUE, TRUE, 0 );
 	wlabel = gtk_label_new (_("M"));
 	gtk_size_group_add_widget (size_group, wlabel);
-	gdk_color_parse (GB_VIEW_MATURED_EXCH_COLOR, &gdk_color);
-	gtk_widget_modify_fg (wlabel, GTK_STATE_NORMAL, &gdk_color);
-	gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.5);
+	ctxt = gtk_widget_get_style_context (wlabel);
+	gtk_style_context_add_class (ctxt, "exch");
+	gtk_label_set_yalign (GTK_LABEL (wlabel), 0.5);
 	gtk_box_pack_start( GTK_BOX(whbox), wlabel, FALSE, FALSE, 5 );
 	wlabel = gtk_label_new (_("- Matured (exchangeable)"));
-	gdk_color_parse (GB_VIEW_MATURED_EXCH_COLOR, &gdk_color);
-	gtk_widget_modify_fg (wlabel, GTK_STATE_NORMAL, &gdk_color);
-	gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.5);
+	ctxt = gtk_widget_get_style_context (wlabel);
+	gtk_style_context_add_class (ctxt, "exch");
+	gtk_label_set_yalign (GTK_LABEL (wlabel), 0.5);
 	gtk_box_pack_start( GTK_BOX(whbox), wlabel, FALSE, FALSE, 5 );
 	
-	whbox = gtk_hbox_new (FALSE, 0);
+	whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 	gtk_box_pack_start( GTK_BOX(wvbox), whbox, TRUE, TRUE, 0 );
 	wlabel = gtk_label_new (_("M"));
 	gtk_size_group_add_widget (size_group, wlabel);
-	gdk_color_parse (GB_VIEW_MATURED_NOT_EXCH_COLOR, &gdk_color);
-	gtk_widget_modify_fg (wlabel, GTK_STATE_NORMAL, &gdk_color);
-	gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.5);
+	ctxt = gtk_widget_get_style_context (wlabel);
+	gtk_style_context_add_class (ctxt, "noexch");
+	gtk_label_set_yalign (GTK_LABEL (wlabel), 0.5);
 	gtk_box_pack_start( GTK_BOX(whbox), wlabel, FALSE, FALSE, 5 );
 	wlabel = gtk_label_new (_("- Matured (not exchangeable)"));
-	gdk_color_parse (GB_VIEW_MATURED_NOT_EXCH_COLOR, &gdk_color);
-	gtk_widget_modify_fg (wlabel, GTK_STATE_NORMAL, &gdk_color);
-	gtk_misc_set_alignment (GTK_MISC(wlabel), 0.0, 0.5);
+	ctxt = gtk_widget_get_style_context (wlabel);
+	gtk_style_context_add_class (ctxt, "noexch");
+	gtk_label_set_yalign (GTK_LABEL (wlabel), 0.5);
 	gtk_box_pack_start( GTK_BOX(whbox), wlabel, FALSE, FALSE, 5 );
 
 	return wouter_hbox;
@@ -713,13 +753,13 @@
 				  GDK_SELECTION_TYPE_STRING, 1 );
 
 	g_signal_connect( G_OBJECT(view->invisible), "selection_clear_event",
-			  GTK_SIGNAL_FUNC(selection_clear_cb), view );
+			  G_CALLBACK(selection_clear_cb), view );
 
 	g_signal_connect( G_OBJECT(view->invisible), "selection_get",
-			  GTK_SIGNAL_FUNC(selection_get_cb), view );
+			  G_CALLBACK(selection_get_cb), view );
 
 	g_signal_connect( G_OBJECT(view->invisible), "selection_received",
-			  GTK_SIGNAL_FUNC(selection_received_cb), view );
+			  G_CALLBACK(selection_received_cb), view );
 
 	gb_debug (DEBUG_VIEW, "END");
 }
@@ -746,7 +786,7 @@
 					 G_CALLBACK(rdate_changed_cb), view );
 
 	rdate_list = gb_table_model_get_rdate_list( table_model, n_dates );
-	gtk_combo_set_popdown_strings( GTK_COMBO(view->rdate_combo), rdate_list );
+	g_list_foreach (rdate_list, (GFunc) fill_combo, view->rdate_combo);
 	gb_table_model_free_rdate_list( rdate_list );
 
 	gtk_entry_set_text( GTK_ENTRY(view->rdate_entry), view->rdate );
@@ -1306,7 +1346,8 @@
 		       guint            time,
 		       gpointer         data)
 {
-	gchar      **text, *p_sn, *p_denom, *p_series, *p_idate;
+	gchar      **text, *p_sn, *p_denom, *p_series, *p_idate, *str;
+	const guchar *rawdata;
 	int          i;
 	gbDocBond   *p_bond;
 	gbStatus     errno;
@@ -1316,14 +1357,18 @@
 
 	g_return_if_fail (GB_IS_VIEW (view));
 
-	if (selection_data->length < 0) {
+	if (gtk_selection_data_get_length (selection_data) < 0) {
 		return;
 	}
-	if (selection_data->type != GDK_SELECTION_TYPE_STRING) {
+	str = gdk_atom_name (gtk_selection_data_get_data_type (selection_data));
+	if (g_strcmp0 (str, "STRING")) {
+	        g_free (str);
 		return;
 	}
+	g_free (str);
 
-	text = g_strsplit( (gchar *)selection_data->data, "\n", 0 );
+	rawdata = gtk_selection_data_get_data (selection_data);
+	text = g_strsplit( (gchar *)rawdata, "\n", 0 );
 	for ( i=0; (text[i] != NULL) && (*text[i] != 0); i++ ) {
 		p_sn     = strtok( text[i], " " );
 		p_denom  = strtok( NULL, " $" );
--- a/src/edit.c
+++ b/src/edit.c
@@ -20,7 +20,7 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 #include <config.h>
-#include <gnome.h>
+#include <glib/gi18n.h>
 
 #include "edit.h"
 #include "hig.h"
@@ -53,18 +53,18 @@
 /*****************************************************************************/
 void
 gb_edit_add_bond (gbView       *view,
-		  BonoboWindow *win)
+		  GtkWindow    *win)
 {
 	GtkWidget *add_dlg;
 
 	g_return_if_fail (view && GB_IS_VIEW(view));
-	g_return_if_fail (win && BONOBO_IS_WINDOW(win));
+	g_return_if_fail (win && GTK_IS_WINDOW(win));
 
 	add_dlg = gb_hig_dialog_new_with_buttons ( _("Add new bond"),
 						   GTK_WINDOW(win),
 						   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-						   GTK_STOCK_OK, GTK_RESPONSE_OK,
-						   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	                                           _("_OK"), GTK_RESPONSE_OK,
+	                                           _("_Cancel"), GTK_RESPONSE_CANCEL,
 						   NULL );
 
 	create_add_dialog_widgets (GB_HIG_DIALOG(add_dlg), view);
@@ -103,7 +103,7 @@
 	gb_hig_category_add_widget (GB_HIG_CATEGORY(wframe), whbox);
 
 	wlabel = gtk_label_new(_("Serial Number: "));
-	gtk_misc_set_alignment (GTK_MISC(wlabel), 0, 0.5);
+	gtk_label_set_yalign (GTK_LABEL (wlabel), 0.5);
 	gtk_size_group_add_widget (size_group, wlabel);
 	gb_hig_hbox_add_widget (GB_HIG_HBOX(whbox), wlabel);
 	sn_entry = gtk_entry_new();
@@ -113,7 +113,7 @@
 	gb_hig_category_add_widget (GB_HIG_CATEGORY(wframe), whbox);
 
 	wlabel = gtk_label_new(_("Issue Date: "));
-	gtk_misc_set_alignment (GTK_MISC(wlabel), 0, 0.5);
+	gtk_label_set_yalign (GTK_LABEL (wlabel), 0.5);
 	gtk_size_group_add_widget (size_group, wlabel);
 	gb_hig_hbox_add_widget (GB_HIG_HBOX(whbox), wlabel);
 	idate_entry = gtk_entry_new();
@@ -238,7 +238,7 @@
 /*****************************************************************************/
 void
 gb_edit_delete_bonds (gbView       *view,
-		      BonoboWindow *win)
+		      GtkWindow    *win)
 {
 	GtkWidget     *del_dlg;
 	gbDocBond     *p_bond;
@@ -250,7 +250,7 @@
 	enum { ASK, DONT_ASK, CANCEL } state = ASK;
 
 	g_return_if_fail (view && GB_IS_VIEW(view));
-	g_return_if_fail (win && BONOBO_IS_WINDOW(win));
+	g_return_if_fail (win && GTK_IS_WINDOW(win));
 
 	selected_bond_list = gb_view_get_selected_bond_list( view );
 
@@ -309,10 +309,10 @@
 				g_free( msg );
 
 				gtk_dialog_add_buttons (GTK_DIALOG(del_dlg),
-							GTK_STOCK_YES, GTK_RESPONSE_YES,
+	                                                _("_Yes"), GTK_RESPONSE_YES,
 							_("Yes to All"), 1,
-							GTK_STOCK_NO, GTK_RESPONSE_NO,
-							GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	                                                _("_No"), GTK_RESPONSE_NO,
+	                                                _("_Cancel"), GTK_RESPONSE_CANCEL,
 							NULL);
 
 				switch ( gtk_dialog_run( GTK_DIALOG(del_dlg) ) ) {
@@ -356,18 +356,18 @@
 /*****************************************************************************/
 void
 gb_edit_title (gbView       *view,
-	       BonoboWindow *win)
+	       GtkWindow    *win)
 {
 	GtkWidget *title_dlg;
 
 	g_return_if_fail (view && GB_IS_VIEW(view));
-	g_return_if_fail (win && BONOBO_IS_WINDOW(win));
+	g_return_if_fail (win && GTK_IS_WINDOW(win));
 
 	title_dlg = gb_hig_dialog_new_with_buttons (_("Edit inventory title"),
 						    GTK_WINDOW(win),
 						    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-						    GTK_STOCK_OK, GTK_RESPONSE_OK,
-						    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	                                            _("_OK"), GTK_RESPONSE_OK,
+	                                            _("_Cancel"), GTK_RESPONSE_CANCEL,
 						    NULL);
 
 	create_title_dialog_widgets (GB_HIG_DIALOG(title_dlg), view);
--- a/src/doc-sbw.c
+++ b/src/doc-sbw.c
@@ -22,7 +22,8 @@
 
 #include <config.h>
 
-#include <gnome.h>
+#include <glib/gi18n.h>
+#include <stdio.h>
 #include <string.h>
 
 #include "doc-sbw.h"
--- a/src/doc-xml.c
+++ b/src/doc-xml.c
@@ -22,7 +22,7 @@
 
 #include <config.h>
 
-#include <gnome.h>
+#include <glib/gi18n.h>
 #include <libxml/tree.h>
 #include <libxml/parser.h>
 
--- a/src/doc.c
+++ b/src/doc.c
@@ -22,7 +22,7 @@
 
 #include <config.h>
 
-#include <gnome.h>
+#include <glib/gi18n.h>
 
 #include "doc.h"
 #include "marshal.h"
--- a/src/prefs.c
+++ b/src/prefs.c
@@ -20,9 +20,6 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#include <libgnome/libgnome.h>
-#include <libgnomeui/libgnomeui.h>
-
 #include <gconf/gconf-client.h>
 
 #include "prefs.h"
--- a/src/table-model.c
+++ b/src/table-model.c
@@ -22,7 +22,7 @@
 
 #include <config.h>
 
-#include <gnome.h>
+#include <glib/gi18n.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <dirent.h>
@@ -43,11 +43,6 @@
 /* Private macros and constants.                          */
 /*========================================================*/
 
-#define REDEMPTION_DATA_DIR gnome_program_locate_file (NULL,\
-					               GNOME_FILE_DOMAIN_APP_DATADIR,\
-					               "gbonds/",\
-					               FALSE, NULL)
-
 /*========================================================*/
 /* Private types.                                         */
 /*========================================================*/
@@ -215,7 +210,7 @@
 void
 gb_table_model_update (gbTableModel *table_model)
 {
-	gchar *home_data_dir;
+	gchar *home_data_dir, *rdata_dir;
 	GList *table;
 
 	gb_debug (DEBUG_TABLE, "START");
@@ -229,7 +224,9 @@
 
 	table = NULL;
 
-	table = append_tables_from_dir( table, REDEMPTION_DATA_DIR );
+	rdata_dir = g_build_path (G_DIR_SEPARATOR_S, DATADIR, "gbonds", NULL);
+	table = append_tables_from_dir( table, rdata_dir );
+	g_free (rdata_dir);
 
 	home_data_dir = get_home_data_dir();
 	table = append_tables_from_dir( table, home_data_dir );
@@ -252,7 +249,8 @@
 static gchar *
 get_home_data_dir (void)
 {
-	gchar *dir = gnome_util_prepend_user_home( ".gbonds" );
+	gchar *dir = g_build_path (G_DIR_SEPARATOR_S, g_get_home_dir (),
+	                           ".gbonds", NULL);
 
 	/* Try to create ~/.gbonds directory.  If it already exists, no problem. */
 	mkdir( dir, 0775 );
--- a/src/update.c
+++ b/src/update.c
@@ -22,8 +22,8 @@
 
 #include <config.h>
 
-#include <gnome.h>
-#include <libgnomevfs/gnome-vfs.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
 #include <libxml/tree.h>
 #include <libxml/parser.h>
 #include <math.h>
@@ -34,20 +34,10 @@
 
 #include "debug.h"
 
-#define ICON_PIXMAP gnome_program_locate_file (NULL,\
-                                               GNOME_FILE_DOMAIN_APP_PIXMAP,\
-					       "gbonds.png",\
-					       FALSE, NULL)
-
-#define REDEMPTION_DATA_DIR gnome_program_locate_file (NULL,\
-                                                       GNOME_FILE_DOMAIN_APP_DATADIR,\
-                                                       "gbonds/",\
-                                                       FALSE, NULL)
-
 #define  DRUID_WIDTH  640
 #define  DRUID_HEIGHT 400
-#define  DRUID_BG_COLOR { 0, 70*256, 85*256, 80*256 }
-#define  DRUID_TITLE_COLOR { 0, 255*256, 255*256, 255*256 }
+#define  DRUID_BG_COLOR "rgb (70, 85, 80)"
+#define  DRUID_TITLE_COLOR "white"
 
 
 /*===========================================*/
@@ -62,15 +52,15 @@
 typedef struct {
   gint            n;
   GList           *list;
-  GnomeVFSURI     *uri;
+  GFile           *uri;
 } DirCallbackData;
 
 typedef struct {
   gint            i, n;
-  gint            total_bytes_read, total_bytes, file_bytes_read, file_bytes;
+  goffset         total_bytes_read, total_bytes, file_bytes_read, file_bytes;
   GList           *list, *p;
-  GnomeVFSURI     *uri;
-  GnomeVFSHandle  *local_handle;
+  GFile           *uri, *file;
+  GFileOutputStream *local_handle;
   gpointer        buffer;
   gint            buffer_length;
   gpointer        line_buffer;
@@ -85,9 +75,8 @@
 GList *site_list = NULL;
 gchar *site_uri;
 
-GtkWidget *update_window = NULL;
 GtkWidget *update_druid;
-GtkWidget *download_page;
+GtkWidget *custom_widget;
 GtkWidget *site_entry;
 GtkWidget *status_label;
 GtkWidget *file_label;
@@ -95,9 +84,9 @@
 GtkWidget *total_progress;
 GtkWidget *finish_page;
 
-GnomeVFSAsyncHandle *remote_dir_handle = NULL;
-GnomeVFSAsyncHandle *remote_file_handle = NULL;
-gboolean update_cancel_flag = FALSE;
+GCancellable *update_cancel_flag = NULL;
+static gboolean css_installed = FALSE;
+gboolean mounted = FALSE;
 
 
 
@@ -105,52 +94,45 @@
 /* Local function prototypes                 */
 /*===========================================*/
 
-static void add_start_page( GnomeDruid *wdruid,
+static void add_start_page( GtkAssistant *wdruid,
 			    GdkPixbuf *logo );
-static void add_select_download_page( GnomeDruid *wdruid,
+static void add_select_download_page( GtkAssistant *wdruid,
 				      GdkPixbuf *logo );
-static void add_downloading_page( GnomeDruid *wdruid, GdkPixbuf *logo );
-static void prepare_downloading_page( GnomeDruidPage *page, GnomeDruid *druid,
+static void add_downloading_page( GtkAssistant *wdruid, GdkPixbuf *logo );
+static void prepare_downloading_page( GtkAssistant *druid, GtkWidget *page,
 				      gpointer data );
 
-static void got_remote_list( GnomeVFSURI *uri, GList *list, gint n );
+static void got_remote_list( GFile *uri, GList *list, gint n );
 static GList *prune_list_from_dir( GList *list, gint *n,
 				   const gchar *dirname );
-static void get_remote_file_list( GnomeVFSURI *uri );
-static void get_remote_file_list_cb( GnomeVFSAsyncHandle *handle,
-				     GnomeVFSResult result,
-				     GList *list,
-				     guint entries_read,
+static void get_remote_file_list( GFile *uri );
+static void get_remote_file_list_cb( GObject *src,
+				     GAsyncResult *result,
 				     gpointer callback_data );
 
-static void download_files( GnomeVFSURI *uri, GList *list, gint n );
-static void open_remote_file_callback( GnomeVFSAsyncHandle *handle,
-				       GnomeVFSResult result,
+static void download_files( GFile *uri, GList *list, gint n );
+static void open_remote_file_callback( GObject *handle,
+				       GAsyncResult *result,
 				       gpointer callback_data );
 static gchar *hash_filename( const gchar *filename );
-static void read_remote_file_callback( GnomeVFSAsyncHandle *handle,
-				       GnomeVFSResult result,
-				       gpointer buffer,
-				       GnomeVFSFileSize bytes_requested,
-				       GnomeVFSFileSize bytes_read,
+static void read_remote_file_callback( GObject *handle,
+				       GAsyncResult *result,
 				       gpointer callback_data );
-static void close_remote_file_callback( GnomeVFSAsyncHandle *handle,
-					GnomeVFSResult result,
+static void close_remote_file_callback( GObject *handle,
+					GAsyncResult *result,
 					gpointer callback_data );
+static void mount_volume (GFile *file);
+static void unmount_volume (GFile *file);
 
 static void download_done( DownloadCallbackData *data );
 static void no_download( void );
 
-static void add_finish_page( GnomeDruid *wdruid, GdkPixbuf *logo );
-static void prepare_finish_page( GnomeDruidPage *page,
-				 GnomeDruid *druid, gpointer data );
+static void add_finish_page( GtkAssistant *wdruid, GdkPixbuf *logo );
 
 static void
-finish_cb( GnomeDruidPage *page, GnomeDruid *druid, gpointer data );
-static void
-cancel_cb( GnomeDruid *druid, gpointer data );
+cancel_cb( GtkAssistant *druid, gpointer data );
 static void
-destroy_cb( GtkWindow *window, gpointer data );
+destroy_cb( GtkAssistant *window, gpointer data );
 
 static
 GList *read_site_list( void );
@@ -169,52 +151,104 @@
 gb_update_druid (void)
 {
 	GdkPixbuf *logo;
+	gchar     *file;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
-	if ( update_window == NULL ) {
-		
-		remote_dir_handle = NULL;
-		remote_file_handle = NULL;
-		update_cancel_flag = FALSE;
-
-		logo = gdk_pixbuf_new_from_file (ICON_PIXMAP, NULL);
-
-		update_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-		gtk_window_set_default_size (GTK_WINDOW(update_window),
-					     DRUID_WIDTH, DRUID_HEIGHT);
-		update_druid = gnome_druid_new();
-		gtk_container_add( GTK_CONTAINER(update_window), update_druid );
-
-		add_start_page( GNOME_DRUID(update_druid), logo );
-		add_select_download_page( GNOME_DRUID(update_druid), logo );
-		add_downloading_page( GNOME_DRUID(update_druid), logo );
-		add_finish_page( GNOME_DRUID(update_druid), logo );
-		
-		g_signal_connect( G_OBJECT(update_druid), "cancel",
-				  G_CALLBACK(cancel_cb), NULL );
+	file = g_build_filename (DATADIR, G_DIR_SEPARATOR_S, "pixmaps",
+	                         G_DIR_SEPARATOR_S, "gbonds.png", NULL);
+	logo = gdk_pixbuf_new_from_file (file, NULL);
+	g_free (file);
 
-		g_signal_connect( G_OBJECT(update_window), "destroy",
-				  G_CALLBACK(destroy_cb), NULL );
+	update_druid = gtk_assistant_new ();
+	gtk_window_set_default_size (GTK_WINDOW (update_druid),
+	                             DRUID_WIDTH, DRUID_HEIGHT);
 
-		gtk_widget_show_all( update_window );
-	}
+	add_start_page (GTK_ASSISTANT (update_druid), logo);
+	add_select_download_page (GTK_ASSISTANT (update_druid), logo);
+	add_downloading_page (GTK_ASSISTANT (update_druid), logo);
+	add_finish_page (GTK_ASSISTANT (update_druid), logo);
+	g_object_unref (logo);
+
+	g_signal_connect (update_druid, "cancel",
+	                  G_CALLBACK (cancel_cb), NULL);
+	g_signal_connect (update_druid, "close",
+	                  G_CALLBACK (destroy_cb), NULL);
+
+	gtk_widget_show_all (update_druid);
 
 	gb_debug (DEBUG_UPDATE, "END");
 
 }
 
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Install CSS for the GtkAssistant's decoration.                 */
+/*--------------------------------------------------------------------------*/
+static void
+install_css (void)
+{
+       GtkCssProvider *provider;
+       const gchar    *css;
+
+       css = ".white-fg { color: " DRUID_TITLE_COLOR "; }"
+             ".green-bg { background-color: " DRUID_BG_COLOR "; }";
+
+       provider = gtk_css_provider_new ();
+       gtk_css_provider_load_from_data (provider, css, -1, NULL);
+       gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+                                                  GTK_STYLE_PROVIDER (provider),
+                                                  GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+        g_object_unref (provider);
+        css_installed = TRUE;
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Create decorated header for a GtkAssistant page.               */
+/*--------------------------------------------------------------------------*/
+static GtkWidget *
+create_header (gchar *title, GdkPixbuf *logo)
+{
+        GtkWidget       *vbox, *hbox, *widget;
+        GtkStyleContext *ctxt;
+        const gchar     *format;
+        gchar           *markup;
+
+        if (!css_installed)
+                install_css ();
+
+        /* This is the format string used in the original GnomeDruid.  */
+        format = "<span size=\"xx-large\" weight=\"ultrabold\">\%s</span>";
+
+        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+        hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+        widget = gtk_image_new_from_pixbuf (logo);
+        ctxt = gtk_widget_get_style_context (widget);
+        gtk_style_context_add_class (ctxt, "green-bg");
+        gtk_box_pack_end (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
+
+        widget = gtk_label_new (NULL);
+        markup = g_markup_printf_escaped (format, title);
+        gtk_label_set_markup (GTK_LABEL (widget), markup);
+        ctxt = gtk_widget_get_style_context (widget);
+        gtk_style_context_add_class (ctxt, "green-bg");
+        gtk_style_context_add_class (ctxt, "white-fg");
+        g_free (markup);
+
+        gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
+        gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+
+        return vbox;
+}
+
 
 
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Create and add start page to druid.                            */
 /*--------------------------------------------------------------------------*/
 static void
-add_start_page( GnomeDruid *wdruid, GdkPixbuf *logo )
+add_start_page( GtkAssistant *wdruid, GdkPixbuf *logo )
 {
-	GtkWidget    *wpage;
-	GdkColor      druid_bg_color = DRUID_BG_COLOR;
-	GdkColor      druid_title_color = DRUID_TITLE_COLOR;
+	GtkWidget    *wpage, *label;
 	gbDate        date_min, date_max, date_today;
 	gchar        *date_min_string, *date_max_string, *date_today_string;
 	gchar        *msg, *msg1;
@@ -257,21 +291,16 @@
 		      ),
 		   msg1, date_min_string, date_max_string );
 
-	wpage = gnome_druid_page_edge_new_with_vals (GNOME_EDGE_START,
-						     TRUE,
-						     _("Update redemption tables"),
-						     msg,
-						     logo,
-						     NULL,
-						     NULL);
-	gnome_druid_page_edge_set_bg_color (GNOME_DRUID_PAGE_EDGE(wpage),
-					    &druid_bg_color);
-	gnome_druid_page_edge_set_logo_bg_color (GNOME_DRUID_PAGE_EDGE(wpage),
-						 &druid_bg_color);
-	gnome_druid_page_edge_set_title_color (GNOME_DRUID_PAGE_EDGE(wpage),
-					       &druid_title_color);
+	wpage = create_header (_("Update redemption tables"), logo);
+
+	label = gtk_label_new (msg);
+	gtk_box_pack_start (GTK_BOX (wpage), label, TRUE, FALSE, 0);
 
-	gnome_druid_append_page( wdruid, GNOME_DRUID_PAGE(wpage) );
+	gtk_assistant_append_page (wdruid, wpage);
+	gtk_assistant_set_page_title (wdruid, wpage,
+	                              _("Update redemption tables"));
+	gtk_assistant_set_page_type (wdruid, wpage, GTK_ASSISTANT_PAGE_INTRO);
+	gtk_assistant_set_page_complete (wdruid, wpage, TRUE);
 
 	g_free( date_min_string );
 	g_free( date_max_string );
@@ -282,17 +311,23 @@
 	gb_debug (DEBUG_UPDATE, "END");
 }
 
+/*---------------------------------------------------------------------------*/
+/* PRIVATE.  Fill the combobox with the available sites.                     */
+/*---------------------------------------------------------------------------*/
+static void
+fill_combo (gchar *site, GtkComboBoxText *combo)
+{
+	gtk_combo_box_text_append_text (combo, site);
+}
 
 
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Create and add "select download site" page to druid.           */
 /*--------------------------------------------------------------------------*/
 static void
-add_select_download_page( GnomeDruid *wdruid, GdkPixbuf *logo )
+add_select_download_page( GtkAssistant *wdruid, GdkPixbuf *logo )
 {
 	GtkWidget *wvbox;
-	GdkColor   druid_bg_color = DRUID_BG_COLOR;
-	GdkColor   druid_title_color = DRUID_TITLE_COLOR;
 	GtkWidget *whbox, *wcombo;
 	GList      *name_list = NULL;
 	GList      *p;
@@ -300,22 +335,11 @@
 
 	gb_debug (DEBUG_UPDATE, "START");
 
-	download_page = gnome_druid_page_standard_new_with_vals (_("Select download site"),
-								 logo,
-								 NULL);
-	gnome_druid_page_standard_set_background(GNOME_DRUID_PAGE_STANDARD(download_page),
-						 &druid_bg_color);
-	gnome_druid_page_standard_set_logo_background(GNOME_DRUID_PAGE_STANDARD(download_page),
-						      &druid_bg_color);
-	gnome_druid_page_standard_set_title_foreground( GNOME_DRUID_PAGE_STANDARD(download_page),
-						   &druid_title_color);
-	gnome_druid_append_page( wdruid, GNOME_DRUID_PAGE(download_page) );
+	wvbox = create_header (_("Select download site"), logo);
 
-	wvbox = GNOME_DRUID_PAGE_STANDARD(download_page)->vbox;
-
-	whbox = gtk_hbox_new( FALSE, 10 );
+	whbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
 	gtk_container_set_border_width( GTK_CONTAINER(whbox), 20 );
-	gtk_box_pack_start( GTK_BOX(wvbox), whbox, TRUE, TRUE, 0 );
+	gtk_box_pack_start (GTK_BOX (wvbox), whbox, TRUE, FALSE, 0);
 
 	gtk_box_pack_start( GTK_BOX(whbox),
 			    gtk_label_new( _("Download site:") ),
@@ -328,14 +352,20 @@
 		site = (Site *)p->data;
 		name_list = g_list_append( name_list, site->name );
 	}
-	wcombo = gtk_combo_new();
-	gtk_combo_set_popdown_strings( GTK_COMBO(wcombo), name_list );
+	wcombo = gtk_combo_box_text_new_with_entry ();
+	g_list_foreach (name_list, (GFunc) fill_combo, wcombo);
 	g_list_free( name_list );
 	name_list = NULL;
-	site_entry = GTK_COMBO(wcombo)->entry;
-	gtk_entry_set_editable( GTK_ENTRY(site_entry), FALSE );
+	gtk_combo_box_set_active (GTK_COMBO_BOX (wcombo), 0);
+	site_entry = gtk_bin_get_child (GTK_BIN (wcombo));
+	gtk_editable_set_editable (GTK_EDITABLE (site_entry), FALSE);
 	gtk_box_pack_start( GTK_BOX(whbox), wcombo, TRUE, TRUE, 0 );
 
+	gtk_assistant_append_page (wdruid, wvbox);
+	gtk_assistant_set_page_title (wdruid, wvbox, _("Select download site"));
+	gtk_assistant_set_page_type (wdruid, wvbox, GTK_ASSISTANT_PAGE_CONTENT);
+	gtk_assistant_set_page_complete (wdruid, wvbox, TRUE);
+
 	gb_debug (DEBUG_UPDATE, "END");
 }
 
@@ -345,30 +375,17 @@
 /* PRIVATE.  Create and add "downloading" page to druid.                    */
 /*--------------------------------------------------------------------------*/
 static void
-add_downloading_page( GnomeDruid *wdruid, GdkPixbuf *logo )
+add_downloading_page( GtkAssistant *wdruid, GdkPixbuf *logo )
 {
-	GtkWidget *wpage, *wvbox, *wvbox2, *wvbox3, *wvbox4;
+	GtkWidget *wvbox, *wvbox2, *wvbox3, *wvbox4;
 	GtkWidget *whbox2, *whbox3, *whbox4;
 	GtkWidget *wlabel1, *wlabel2, *wframe;
-	GdkColor   druid_bg_color = DRUID_BG_COLOR;
-	GdkColor   druid_title_color = DRUID_TITLE_COLOR;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
-	wpage = gnome_druid_page_standard_new_with_vals (_("Downloading..."),
-							 logo,
-							 NULL);
-	gnome_druid_page_standard_set_background(GNOME_DRUID_PAGE_STANDARD(wpage),
-						 &druid_bg_color);
-	gnome_druid_page_standard_set_logo_background(GNOME_DRUID_PAGE_STANDARD(wpage),
-						      &druid_bg_color);
-	gnome_druid_page_standard_set_title_foreground(GNOME_DRUID_PAGE_STANDARD(wpage),
-						       &druid_title_color);
-	gnome_druid_append_page( wdruid, GNOME_DRUID_PAGE(wpage) );
-
-	wvbox = GNOME_DRUID_PAGE_STANDARD(wpage)->vbox;
+	wvbox = create_header (_("Downloading..."), logo);
 
-	wvbox2 = gtk_vbox_new( FALSE, 10 );
+	wvbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
 	gtk_container_set_border_width( GTK_CONTAINER(wvbox2), 20 );
 	gtk_box_pack_start( GTK_BOX(wvbox), wvbox2, TRUE, FALSE, 0 );
 
@@ -377,17 +394,17 @@
 
 	wframe = gtk_frame_new( NULL );
 	gtk_box_pack_start( GTK_BOX(wvbox2), wframe, FALSE, TRUE, 0 );
-	whbox2 = gtk_hbox_new( FALSE, 0 );
+	whbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 	gtk_container_set_border_width( GTK_CONTAINER(whbox2), 5 );
 	gtk_container_add( GTK_CONTAINER(wframe), whbox2 );
 	status_label = gtk_label_new( _("Status") );
 	gtk_label_set_justify( GTK_LABEL(status_label), GTK_JUSTIFY_LEFT );
 	gtk_box_pack_start( GTK_BOX(whbox2), status_label, FALSE, TRUE, 0 );
 
-	wvbox3 = gtk_vbox_new( FALSE, 2 );
+	wvbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
 	gtk_box_pack_start( GTK_BOX(wvbox2), wvbox3, TRUE, FALSE, 0 );
 
-	whbox3 = gtk_hbox_new( FALSE, 0 );
+	whbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 	gtk_box_pack_start( GTK_BOX(wvbox3), whbox3, FALSE, TRUE, 0 );
 	file_label = gtk_label_new( _("File") );
 	gtk_label_set_justify( GTK_LABEL(file_label), GTK_JUSTIFY_LEFT );
@@ -397,10 +414,10 @@
 	gtk_progress_bar_set_text( GTK_PROGRESS_BAR(file_progress), "" );
 	gtk_box_pack_start( GTK_BOX(wvbox3), file_progress, FALSE, TRUE, 0 );
 
-	wvbox4 = gtk_vbox_new( FALSE, 2 );
+	wvbox4 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
 	gtk_box_pack_start( GTK_BOX(wvbox2), wvbox4, TRUE, FALSE, 0 );
 
-	whbox4 = gtk_hbox_new( FALSE, 0 );
+	whbox4 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 	gtk_box_pack_start( GTK_BOX(wvbox4), whbox4, FALSE, TRUE, 0 );
 	wlabel2 = gtk_label_new( _("Total") );
 	gtk_label_set_justify( GTK_LABEL(wlabel2), GTK_JUSTIFY_LEFT );
@@ -410,7 +427,11 @@
 	gtk_progress_bar_set_text( GTK_PROGRESS_BAR(total_progress), "" );
 	gtk_box_pack_start( GTK_BOX(wvbox4), total_progress, FALSE, TRUE, 0 );
 
-	g_signal_connect_after( G_OBJECT(wpage), "prepare",
+	gtk_assistant_append_page (wdruid, wvbox);
+	gtk_assistant_set_page_title (wdruid, wvbox, _("Download"));
+	gtk_assistant_set_page_type (wdruid, wvbox,
+	                             GTK_ASSISTANT_PAGE_CUSTOM);
+	g_signal_connect_after( G_OBJECT(wdruid), "prepare",
 				G_CALLBACK(prepare_downloading_page), NULL );
 
 	gb_debug (DEBUG_UPDATE, "END");
@@ -423,7 +444,7 @@
 /* kicks off the entire async download process.                             */
 /*--------------------------------------------------------------------------*/
 static void
-prepare_downloading_page( GnomeDruidPage *page, GnomeDruid *druid,
+prepare_downloading_page( GtkAssistant *druid, GtkWidget *page,
 			  gpointer data )
 {
 	const gchar *site_name;
@@ -432,7 +453,9 @@
 
 	gb_debug (DEBUG_UPDATE, "START");
 
-	gnome_druid_set_buttons_sensitive( druid, FALSE, FALSE, TRUE, FALSE );
+	if (gtk_assistant_get_current_page (druid) != 2)
+	        return;
+
 	site_name = gtk_entry_get_text( GTK_ENTRY(site_entry) );
 	for ( p = site_list; p != NULL; p=p->next ) {
 		site = (Site *)p->data;
@@ -442,96 +465,332 @@
 		}
 	}
 
-	get_remote_file_list( gnome_vfs_uri_new( site_uri ) );
+	custom_widget = gtk_button_new_with_mnemonic (_("_Cancel"));
+	g_signal_connect (custom_widget, "clicked",
+	                  G_CALLBACK (cancel_cb), NULL);
+	gtk_widget_show (custom_widget);
+	gtk_assistant_add_action_widget (druid, custom_widget);
+
+	mount_volume (g_file_new_for_uri (site_uri));
 
 	gb_debug (DEBUG_UPDATE, "END");
 }
 
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Present an I/O error message in the summary page of the        */
+/* assistant.  Completes the update process.                                */
+/*--------------------------------------------------------------------------*/
+static void
+io_error (gchar *message, ...)
+{
+	GtkWidget *widget;
+	GdkPixbuf *logo;
+	gchar     *msg;
+	va_list    ap;
+
+	va_start (ap, message);
+
+	logo = g_object_get_data (G_OBJECT (finish_page), "logo");
+	widget = create_header (_("Error during download"), logo);
+	gtk_box_pack_start (GTK_BOX (finish_page), widget, FALSE, FALSE, 0);
+
+	msg = g_strdup_vprintf (message, ap);
+	widget = gtk_label_new (msg);
+	gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
+	gtk_box_pack_start (GTK_BOX (finish_page), widget, TRUE, FALSE, 0);
+	gtk_widget_show_all (finish_page);
+
+	/* Log for debugging purposes.  */
+	g_warning ("%s", msg);
+	g_free (msg);
+
+	gtk_assistant_remove_action_widget (GTK_ASSISTANT (update_druid),
+	                                    custom_widget);
+	gtk_assistant_next_page (GTK_ASSISTANT (update_druid));
+
+	va_end (ap);
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Asynchronous callback for the unmount operation.  This is the  */
+/* last I/O operation; upon success all callback structs are freed.         */
+/*--------------------------------------------------------------------------*/
+static void
+unmount_complete_cb (GObject *src, GAsyncResult *res, gpointer user_data)
+{
+	GFile                *file = user_data;
+	GError               *err = NULL;
+	DirCallbackData      *dirdata;
+	DownloadCallbackData *data;
+
+	dirdata = g_object_get_data (G_OBJECT (file), "dirdata");
+	data = g_object_get_data (G_OBJECT (file), "data");
+	g_mount_unmount_with_operation_finish (G_MOUNT (src), res, &err);
+
+	/* Unmounting is likely to fail if some of the previous async
+	   operations is not yet complete.  Just retry to unmount if
+	   that is the case.  */
+	if (err && g_error_matches (err, G_IO_ERROR, G_IO_ERROR_BUSY)) {
+	        g_object_unref (src);
+	        unmount_volume (file);
+	        g_error_free (err);
+	        return;
+	}
+
+	if (err) {
+	        g_warning ("Unmounting failed: %s\n", err->message);
+	        g_error_free (err);
+	} else {
+	        mounted = FALSE;
+	        g_object_unref (file);
+	        if (dirdata)
+	                g_free (dirdata);
+	        if (data) {
+	                g_list_free_full (data->list, g_object_unref);
+	                g_free (data->buffer);
+	                g_free (data->line_buffer);
+	                g_free (data);
+	        }
+	        g_object_unref (update_cancel_flag);
+	        update_cancel_flag = NULL;
+	}
+
+	g_object_unref (src);
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Begin the asynchronous process of unmounting the remote site.  */
+/*--------------------------------------------------------------------------*/
+static void
+unmount_volume (GFile *file)
+{
+	GMountOperation *op;
+	GMount          *mount;
+	GError          *err = NULL;
+
+	g_return_if_fail (file != NULL);
+
+	mount = g_file_find_enclosing_mount (file, NULL, &err);
+	if (err) {
+	        /* Don't emit a warning here as this may happen if the
+	           user cancelled the update early, before the mount
+	           is completed.  */
+	        if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED))
+	                g_warning ("Could not find enclosing mount: %s",
+	                           err->message);
+	        g_object_unref (file);
+	        g_error_free (err);
+	        return;
+	}
+
+	op = g_mount_operation_new ();
+	g_mount_unmount_with_operation (mount, G_MOUNT_UNMOUNT_NONE, op,
+	                                NULL, unmount_complete_cb, file);
+	g_object_unref (op);
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Callback for the mount operation; ensures anonymous access     */
+/* without explicit user confirmation (which would be annoying).            */
+/*--------------------------------------------------------------------------*/
+static void
+ask_password_cb (GMountOperation *op, gchar *message, gchar *user,
+                 gchar *domain, GAskPasswordFlags flags, gpointer data)
+{
+	g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Asynchronous callback for the mount operation.                 */
+/*--------------------------------------------------------------------------*/
+static void
+mount_complete_cb (GObject *src, GAsyncResult *res, gpointer data)
+{
+	GMountOperation *op = data;
+	GError          *err = NULL;
+
+	g_file_mount_enclosing_volume_finish (G_FILE (src), res, &err);
+	g_object_unref (op);
+	if (err) {
+	        /* If the mount operation was cancelled, GIO will
+	           attempt to complete it anyway, which may succeed or
+	           not.  Try unmounting just in case.  */
+	        if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+	                unmount_volume (G_FILE (src));
+	                g_error_free (err);
+	                return;
+	        }
+	        io_error ("Could not mount remote filesystem: %s",
+	                  err->message);
+	        /* Break the loop in get_remote_file_list.  */
+	        g_cancellable_cancel (update_cancel_flag);
+	        g_object_unref (src);
+	        g_error_free (err);
+	} else {
+	        mounted = TRUE;
+	        get_remote_file_list (G_FILE (src));
+	}
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Begin the asynchronous process of mounting the remote site.    */
+/*--------------------------------------------------------------------------*/
+static void
+mount_volume (GFile *uri)
+{
+	GMountOperation *op;
+	gchar           *status_string;
+
+	status_string = g_strdup_printf (_("Connecting to \"%s\" ..."),
+	                                 site_uri);
+	gtk_label_set_text (GTK_LABEL (status_label), status_string);
+	g_free (status_string);
+
+	if (!update_cancel_flag)
+	        update_cancel_flag = g_cancellable_new ();
+
+	op = g_mount_operation_new ();
+	g_mount_operation_set_anonymous (op, TRUE);
+	g_signal_connect (op, "ask-password",
+	                  G_CALLBACK (ask_password_cb), NULL);
+
+	g_file_mount_enclosing_volume (uri,
+	                               G_MOUNT_MOUNT_NONE,
+	                               op,
+	                               update_cancel_flag,
+	                               mount_complete_cb,
+	                               op);
+}
 
 
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Begin the asynchronous process of contacting the given site    */
 /* and getting a list of apropriate files from the site.                    */
 /*--------------------------------------------------------------------------*/
-static void get_remote_file_list( GnomeVFSURI *uri )
+static void get_remote_file_list( GFile *uri )
 {
 	DirCallbackData *data;
-	gchar           *status_string;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
-	status_string = g_strdup_printf( _("Connecting to \"%s\" ..."), site_uri );
-	gtk_label_set_text( GTK_LABEL(status_label), status_string );
-	g_free( status_string );
-
 	data = g_new0( DirCallbackData, 1 );
 	data->n = 0;
 	data->list = NULL;
 	data->uri = uri;
 
-	gnome_vfs_async_load_directory_uri (&remote_dir_handle,
-					    uri,
-					    GNOME_VFS_FILE_INFO_DEFAULT,
-					    1,
-					    0,
-					    get_remote_file_list_cb,
-					    data);
+	g_object_set_data (G_OBJECT (uri), "dirdata", data);
 
-	gb_debug (DEBUG_UPDATE, "END");
-}
+	while (!mounted && !g_cancellable_is_cancelled (update_cancel_flag))
+	        gtk_main_iteration ();
 
+	if (g_cancellable_is_cancelled (update_cancel_flag)) {
+	        g_free (data);
+	        return;
+	}
+
+	g_file_enumerate_children_async (uri,
+	                                 "standard::*",
+	                                 G_FILE_QUERY_INFO_NONE,
+	                                 G_PRIORITY_DEFAULT,
+	                                 update_cancel_flag,
+	                                 get_remote_file_list_cb,
+	                                 data);
 
 
+	gb_debug (DEBUG_UPDATE, "END");
+}
 
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Asynchronous callback for each directory entry from remote     */
 /* site.                                                                    */
 /*--------------------------------------------------------------------------*/
-static void get_remote_file_list_cb( GnomeVFSAsyncHandle *handle,
-				     GnomeVFSResult result,
-				     GList *list,
-				     guint entries_read,
+static void get_remote_list_cb( GObject *src,
+                                GAsyncResult *result,
+                                gpointer callback_data )
+{
+	DirCallbackData *data = (DirCallbackData *)callback_data;
+	GFileInfo       *safe_info;
+	GList           *list, *walk;
+	GError          *error = NULL;
+	gchar           *ext;
+	const gchar     *name;
+
+	if (g_cancellable_is_cancelled (update_cancel_flag)) {
+	        g_object_unref (src);
+	        unmount_volume (data->uri);
+	        return;
+	}
+
+	list = g_file_enumerator_next_files_finish (G_FILE_ENUMERATOR (src),
+	                                            result, &error);
+	if (error) {
+	        gchar *uri;
+
+	        uri = g_file_get_uri (data->uri);
+	        io_error ("Could not obtain the list of files at site %s: %s",
+	                  uri, error->message);
+	        g_free (uri);
+	        g_object_unref (src);
+	        unmount_volume (data->uri);
+	        g_error_free (error);
+	        return;
+	}
+
+	for (walk = list; walk; walk = walk->next) {
+	        name = g_file_info_get_name (walk->data);
+	        ext = strrchr (name, '.');
+		if (ext
+	            && (g_ascii_strcasecmp (ext, ".asc") == 0)
+	            && (g_ascii_strncasecmp (name, "sb", 2) == 0)) {
+	                safe_info = g_file_info_dup (walk->data);
+			data->list = g_list_prepend (data->list, safe_info);
+			data->n++;
+		}
+	}
+
+	g_object_unref (src);
+	g_list_free_full (list, g_object_unref);
+	got_remote_list (data->uri, data->list, data->n);
+}
+
+/*--------------------------------------------------------------------------*/
+/* PRIVATE.  Asynchronous callback for obtaining a remote enumerator.       */
+/*--------------------------------------------------------------------------*/
+static void get_remote_file_list_cb( GObject *src,
+				     GAsyncResult *result,
 				     gpointer callback_data )
 {
 	DirCallbackData  *data = (DirCallbackData *)callback_data;
-	GnomeVFSFileInfo *info, *safe_info;
-	gchar            *ext;
+	GFileEnumerator  *fenum;
+	GError           *err = NULL;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
-	if ( update_cancel_flag ) {
-		gnome_vfs_async_cancel( handle );
-		gtk_widget_destroy( update_window );
-		update_window = NULL;
+	if (g_cancellable_is_cancelled (update_cancel_flag)) {
+	        unmount_volume (G_FILE (src));
 		gb_debug (DEBUG_UPDATE, "END -- CANCEL");
 		return;
 	}
 
-	switch (result) {
-
-	case GNOME_VFS_OK:
-		info = (GnomeVFSFileInfo *)list->data;
-		ext = strrchr( info->name, '.' );
-		if ( ext &&
-		     (g_ascii_strcasecmp( ext, ".asc" ) == 0 ) &&
-		     (g_ascii_strncasecmp( info->name, "sb", 2 ) == 0) ) {
-			safe_info = gnome_vfs_file_info_dup( info );
-			data->list = g_list_prepend( data->list, safe_info );
-			data->n++;
-		}
-		break;
-
-	case GNOME_VFS_ERROR_EOF:
-		got_remote_list( data->uri, data->list, data->n );
-		break;
-
-	default:
-		g_warning( "Unexpected error: %d: %s\n",
-			   result, gnome_vfs_result_to_string(result) );
-		break;
-
-	}
-
+	fenum = g_file_enumerate_children_finish (G_FILE (src), result, &err);
+	if (err) {
+	        gchar *uri;
+
+	        uri = g_file_get_uri (G_FILE (src));
+	        io_error (_("Could not obtain files from remote site %s: %s"),
+	                  uri, err->message);
+	        g_free (uri);
+	        unmount_volume (G_FILE (src));
+	        g_error_free (err);
+	        return;
+	}
+
+	g_file_enumerator_next_files_async (fenum,
+	                                    G_MAXINT32,
+	                                    G_PRIORITY_DEFAULT,
+	                                    update_cancel_flag,
+	                                    get_remote_list_cb,
+	                                    data);
 
 	gb_debug (DEBUG_UPDATE, "END");
 }
@@ -542,8 +801,9 @@
 /* PRIVATE.  Called once the remote file list is completed.  Kicks off the  */
 /* asynchronous process of downloading any new files in that list.          */
 /*--------------------------------------------------------------------------*/
-static void got_remote_list( GnomeVFSURI *uri, GList *list, gint n )
+static void got_remote_list( GFile *uri, GList *list, gint n )
 {
+	gchar *rdata_dir;
 	gchar *home_data_dir = gb_util_get_home_data_dir();
 
 	gb_debug (DEBUG_UPDATE, "START");
@@ -552,7 +812,8 @@
 	 * Now we have a list of remote redemption files, now lets remove any
 	 * files from that list that we already have locally.
 	 */
-	list = prune_list_from_dir( list, &n, REDEMPTION_DATA_DIR );
+	rdata_dir = g_build_path (G_DIR_SEPARATOR_S, DATADIR, "gbonds", NULL);
+	list = prune_list_from_dir( list, &n, rdata_dir );
 	list = prune_list_from_dir( list, &n, home_data_dir );
 
 	/*
@@ -561,6 +822,7 @@
 	download_files( uri, list, n );
 
 	g_free( home_data_dir );
+	g_free (rdata_dir);
 
 	gb_debug (DEBUG_UPDATE, "END");
 }
@@ -574,36 +836,48 @@
 static GList *
 prune_list_from_dir( GList *remote_list, gint *n, const gchar *dirname )
 {
-	GnomeVFSFileInfo *local_info, *remote_info;
-	GList            *local_list;
-	GList            *p_remote, *p_local;
-	gchar            *local_text_uri;
-	GnomeVFSResult    ret;
+	GFileInfo        *local_info, *remote_info;
+	GList            *p_remote;
+	GFile            *local_text_uri;
+	GFileEnumerator  *direnum;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
 	if ( dirname == NULL ) return remote_list;
 
-	local_text_uri = gnome_vfs_get_uri_from_local_path( dirname );
-	if ( (ret = gnome_vfs_directory_list_load (&local_list,
-						   local_text_uri,
-						   GNOME_VFS_FILE_INFO_DEFAULT))
-	     != GNOME_VFS_OK ) {
-		return remote_list;
-	}
-
-	for ( p_local=local_list; p_local != NULL; p_local=p_local->next ) {
-		local_info = (GnomeVFSFileInfo *)p_local->data;
+	local_text_uri = g_file_new_for_path (dirname);
+	if (!(direnum
+	      = g_file_enumerate_children (local_text_uri,
+	                                   "standard::*",
+	                                   G_FILE_QUERY_INFO_NONE,
+	                                   update_cancel_flag,
+	                                   NULL))) {
+	        g_object_unref (local_text_uri);
+	        return remote_list;
+	}
+
+	while (1) {
+	        if (!g_file_enumerator_iterate (direnum, &local_info, NULL,
+	                                        update_cancel_flag, NULL)) {
+	                g_object_unref (direnum);
+	                g_object_unref (local_text_uri);
+	                return remote_list;
+	        }
+	        if (!local_info)
+	                break;
 
 		for ( p_remote=remote_list; p_remote != NULL; p_remote=p_remote->next ) {
-			remote_info = (GnomeVFSFileInfo *)p_remote->data;
+			remote_info = (GFileInfo *)p_remote->data;
 			/* Filenames have no guaranteed encoding, but given that we are only
 			 * interested in redemption files, it's safe to assume they are ASCII.
 			 * Even if they are not, a false positive or false negative here is
 			 * unlikely to be a real problem. */
-			if ( g_ascii_strcasecmp( local_info->name, remote_info->name ) == 0 ) {
+	                if (g_ascii_strcasecmp (g_file_info_get_name
+	                                        (local_info),
+	                                        g_file_info_get_name
+	                                        (remote_info)) == 0) {
 				remote_list = g_list_remove_link( remote_list, p_remote );
-				gnome_vfs_file_info_unref( remote_info );
+				g_object_unref (remote_info);
 				p_remote->data = remote_info = NULL;
 				g_list_free_1( p_remote ); p_remote = NULL;
 				*n -= 1;
@@ -613,7 +887,8 @@
 
 	}
   
-	g_free( local_text_uri );
+	g_object_unref (local_text_uri);
+	g_object_unref (direnum);
 
 	gb_debug (DEBUG_UPDATE, "END");
 
@@ -625,14 +900,13 @@
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Start downloading files in the list from remote site.          */
 /*--------------------------------------------------------------------------*/
-static void download_files( GnomeVFSURI *uri, GList *list, gint n )
+static void download_files( GFile *uri, GList *list, gint n )
 {
-	GnomeVFSFileInfo     *info;
-	GnomeVFSURI          *file_uri;
+	GFileInfo            *info;
 	DownloadCallbackData *data;
-	gint                  total_bytes;
+	goffset               total_bytes;
 	GList                *p;
-	gchar                *status_string;
+	gchar                *status_string, *tmp;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
@@ -644,8 +918,8 @@
 
 		total_bytes = 0;
 		for ( p=list; p!=NULL; p=p->next ) {
-			info = (GnomeVFSFileInfo *)p->data;
-			total_bytes += info->size;
+			info = (GFileInfo *)p->data;
+	                total_bytes += g_file_info_get_size (info);
 		}
 
 		data = g_new0( DownloadCallbackData, 1 );
@@ -661,20 +935,24 @@
 		data->line_buffer = g_malloc0( 4096 );
 		data->local_handle = NULL;
 
-		info = (GnomeVFSFileInfo *)data->p->data;
-		gb_debug (DEBUG_UPDATE, "Opening %s", info->name );
-		file_uri = gnome_vfs_uri_append_file_name( data->uri, info->name );
-		gb_debug (DEBUG_UPDATE, " URI = %s",
-			  gnome_vfs_uri_to_string (file_uri, 0) );
-  
-		gnome_vfs_async_open_uri (&remote_file_handle,
-					  file_uri,
-					  GNOME_VFS_OPEN_READ,
-					  0,
-					  open_remote_file_callback,
-					  data);
+		info = (GFileInfo *)data->p->data;
+	        gb_debug (DEBUG_UPDATE, "Opening %s",
+	                  g_file_info_get_name (info));
+	        data->file = g_file_get_child (data->uri,
+	                                       g_file_info_get_name (info));
+	        g_object_set_data (G_OBJECT (uri), "data", data);
+	        tmp = g_file_get_uri (data->file);
+	        gb_debug (DEBUG_UPDATE, " URI = %s", tmp);
+	        g_free (tmp);
+
+	        g_file_read_async (data->file,
+	                           G_PRIORITY_DEFAULT,
+	                           update_cancel_flag,
+	                           open_remote_file_callback,
+	                           data);
 	}
 	else {
+	        unmount_volume (uri);
 		no_download();
 	}
 
@@ -689,69 +967,93 @@
 /* and begin the process of copying data from the remote file to the local  */
 /* file.                                                                    */
 /*--------------------------------------------------------------------------*/
-static void open_remote_file_callback( GnomeVFSAsyncHandle *handle,
-				       GnomeVFSResult result,
+static void open_remote_file_callback( GObject *handle,
+				       GAsyncResult *result,
 				       gpointer callback_data )
 {
 	DownloadCallbackData *data = (DownloadCallbackData *)callback_data;
-	GnomeVFSFileInfo     *info = (GnomeVFSFileInfo *)data->p->data;
-	gchar                *local_path, *local_text_uri, *local_name;
-	GnomeVFSHandle       *local_handle;
+	GFileInfo            *info = (GFileInfo *)data->p->data;
+	GFile                *local_text_uri;
+	gchar                *local_path, *local_name, *data_dir;
+	GFileInputStream     *remote_handle;
+	GFileOutputStream    *local_handle;
 	gchar                *status_string;
-	GnomeVFSResult        ret;
+	GError               *error = NULL;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
-	if ( update_cancel_flag ) {
-		gnome_vfs_async_close( handle, close_remote_file_callback, data );
+	if (g_cancellable_is_cancelled (update_cancel_flag)) {
+	        unmount_volume (data->uri);
 		gb_debug (DEBUG_UPDATE, "END -- CANCEL");
 		return;
 	}
 
-	switch (result) {
-
-	case GNOME_VFS_OK:
-		data->file_bytes_read = 0;
-		data->file_bytes      = info->size;
-
-		status_string = g_strdup_printf( _("File: \"%s\" (%d of %d)"),
-						 info->name, (data->i+1), data->n );
-		gtk_label_set_text( GTK_LABEL(file_label), status_string );
-		g_free( status_string );
-
-		update_progress_bar (GTK_PROGRESS_BAR(file_progress),
-				     0,
-				     data->file_bytes);
-		update_progress_bar (GTK_PROGRESS_BAR(total_progress),
-				     data->total_bytes_read,
-				     data->total_bytes);
-    
-		local_name = hash_filename( info->name );
-		local_path = g_build_filename (gb_util_get_home_data_dir(),
-					       local_name,
-					       NULL);
-		local_text_uri = gnome_vfs_get_uri_from_local_path( local_path );
-		ret = gnome_vfs_create( &local_handle, local_text_uri,
-					GNOME_VFS_OPEN_WRITE, FALSE, 0664 );
-		if ( ret != GNOME_VFS_OK ) {
-			g_warning( "error opening local file %s, %s\n", local_path,
-				   gnome_vfs_result_to_string(ret) );
-		}
-		else {
-			data->local_handle = local_handle;
-			gnome_vfs_async_read( handle, data->buffer, data->buffer_length,
-					      read_remote_file_callback, data );
-		}
-		g_free( local_name );
-		g_free( local_path );
-		g_free( local_text_uri );
-		break;
-
-	default:
-		g_warning( "Open failed: %s.\n", gnome_vfs_result_to_string(result) );
-		break;
-
-	}
+	remote_handle = g_file_read_finish (G_FILE (handle), result, &error);
+	if (error) {
+	        gchar *uri;
+
+	        uri = g_file_get_uri (G_FILE (handle));
+	        io_error ("Opening remote file %s failed: %s", uri,
+	                  error->message);
+	        g_free (uri);
+	        unmount_volume (data->uri);
+	        g_error_free (error);
+	        return;
+	}
+
+	data->file_bytes_read = 0;
+	data->file_bytes = g_file_info_get_size (info);
+
+	status_string = g_strdup_printf (_("File: \"%s\" (%d of %d)"),
+	                                 g_file_info_get_name (info),
+	                                 (data->i + 1), data->n);
+	gtk_label_set_text (GTK_LABEL (file_label), status_string);
+	g_free (status_string);
+
+	update_progress_bar (GTK_PROGRESS_BAR (file_progress),
+	                     0,
+	                     data->file_bytes);
+	update_progress_bar (GTK_PROGRESS_BAR (total_progress),
+	                     data->total_bytes_read,
+	                     data->total_bytes);
+
+	local_name = hash_filename (g_file_info_get_name (info));
+	data_dir = gb_util_get_home_data_dir ();
+	local_path = g_build_filename (data_dir, local_name, NULL);
+	g_free (data_dir);
+	local_text_uri = g_file_new_for_path (local_path);
+	local_handle = g_file_create (local_text_uri, G_FILE_CREATE_NONE,
+	                              NULL, &error);
+
+	/* File may exist if the user cancelled the operation during
+	   downloading and decided to retry the update later.  */
+	if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
+	        g_error_free (error);
+	        error = NULL;
+	        g_file_delete (local_text_uri, NULL, NULL);
+	        local_handle = g_file_create (local_text_uri,
+	                                      G_FILE_CREATE_NONE,
+	                                      NULL, &error);
+	}
+	if (error) {
+	        io_error ("Error opening local file %s: %s\n", local_path,
+	                  error->message);
+	        g_object_unref (remote_handle);
+	        unmount_volume (data->uri);
+	        g_error_free (error);
+	} else {
+	        data->local_handle = local_handle;
+	        g_input_stream_read_async (G_INPUT_STREAM (remote_handle),
+	                                   data->buffer,
+	                                   data->buffer_length,
+	                                   G_PRIORITY_DEFAULT,
+	                                   update_cancel_flag,
+	                                   read_remote_file_callback,
+	                                   data);
+	}
+	g_free (local_name);
+	g_free (local_path);
+	g_object_unref (local_text_uri);
 
 	gb_debug (DEBUG_UPDATE, "END");
 }
@@ -776,63 +1078,76 @@
 /* file, and copy it to the local file.                                     */
 /*--------------------------------------------------------------------------*/
 static void
-read_remote_file_callback( GnomeVFSAsyncHandle *handle,
-			   GnomeVFSResult result,
-			   gpointer buffer,
-			   GnomeVFSFileSize bytes_requested,
-			   GnomeVFSFileSize bytes_read,
+read_remote_file_callback( GObject *handle,
+			   GAsyncResult *result,
 			   gpointer callback_data )
 {
 	DownloadCallbackData *data = (DownloadCallbackData *)callback_data;
-	GnomeVFSFileSize      bytes_written;
+	GError               *error = NULL;
+	gssize                bytes_read, bytes_written;
 
 	gb_debug (DEBUG_UPDATE, "START");
-
-	if ( update_cancel_flag ) {
-		gnome_vfs_async_close( handle, close_remote_file_callback, data );
+	if (g_cancellable_is_cancelled (update_cancel_flag)) {
+	        g_object_unref (handle);
+	        g_object_unref (data->local_handle);
+	        unmount_volume (data->uri);
 		gb_debug (DEBUG_UPDATE, "END -- CANCEL");
 		return;
 	}
 
-	switch (result) {
-
-	case GNOME_VFS_OK:
-		if ( bytes_read > 0 ) {
-			data->total_bytes_read += bytes_read;
-			data->file_bytes_read += bytes_read;
-
-			update_progress_bar (GTK_PROGRESS_BAR(file_progress),
-					     data->file_bytes_read,
-					     data->file_bytes);
-			update_progress_bar (GTK_PROGRESS_BAR(total_progress),
-					     data->total_bytes_read,
-					     data->total_bytes);
-
-			gnome_vfs_write( data->local_handle,
-					 buffer, bytes_read, &bytes_written );
-			if ( bytes_written != bytes_read ) {
-				g_warning( "Write failed: %d bytes written != %d bytes read",
-					   (gint)bytes_written, (gint)bytes_read );
-			}
-			gnome_vfs_async_read( handle, data->buffer, data->buffer_length,
-					      read_remote_file_callback, data );
-		}
-		else {
-			gnome_vfs_async_close( handle, close_remote_file_callback, data );
-			gb_debug (DEBUG_UPDATE, "0 length read");
-		}
-		break;
-
-	case GNOME_VFS_ERROR_EOF:
-		gb_debug (DEBUG_UPDATE, "EOF -- %" GNOME_VFS_OFFSET_FORMAT_STR,
-			  bytes_read);
-		gnome_vfs_async_close( handle, close_remote_file_callback, data );
-		break;
-
-	default:
-		g_warning( "Read failed: %s", gnome_vfs_result_to_string(result) );
-		break;
-
+	bytes_read = g_input_stream_read_finish (G_INPUT_STREAM (handle),
+	                                         result, &error);
+	if (error) {
+	        gchar *uri;
+
+	        uri = g_file_get_uri (data->file);
+	        io_error ("Could not read remote file %s: %s", uri,
+	                  error->message);
+	        g_free (uri);
+	        g_object_unref (handle);
+	        g_object_unref (data->local_handle);
+	        unmount_volume (data->uri);
+	        g_error_free (error);
+	        return;
+	}
+
+	if (bytes_read > 0) {
+	        data->total_bytes_read += bytes_read;
+	        data->file_bytes_read += bytes_read;
+
+	        update_progress_bar (GTK_PROGRESS_BAR (file_progress),
+	                             data->file_bytes_read,
+	                             data->file_bytes);
+	        update_progress_bar (GTK_PROGRESS_BAR (total_progress),
+	                             data->total_bytes_read,
+	                             data->total_bytes);
+
+	        bytes_written = g_output_stream_write (G_OUTPUT_STREAM
+	                                               (data->local_handle),
+	                                               data->buffer,
+	                                               bytes_read,
+	                                               NULL,
+	                                               NULL);
+	        if (bytes_written != bytes_read) {
+	                g_warning ("Write failed: %d bytes written != "
+	                           "%d bytes read",
+	                           (gint)bytes_written, (gint)bytes_read);
+	        }
+	        g_input_stream_read_async (G_INPUT_STREAM (handle),
+	                                   data->buffer,
+	                                   data->buffer_length,
+	                                   G_PRIORITY_DEFAULT,
+	                                   update_cancel_flag,
+	                                   read_remote_file_callback,
+	                                   data);
+	} else {
+	        gb_debug (DEBUG_UPDATE, "EOF -- %" G_GSSIZE_FORMAT,
+	                  bytes_read);
+	        g_input_stream_close_async (G_INPUT_STREAM (handle),
+	                                    G_PRIORITY_DEFAULT,
+	                                    update_cancel_flag,
+	                                    close_remote_file_callback,
+	                                    data);
 	}
 
 	gb_debug (DEBUG_UPDATE, "END");
@@ -845,50 +1160,63 @@
 /* PRIVATE.  Remote file closed callback.  Close local file and open the    */
 /* next remote file in the list, if any.                                    */
 /*--------------------------------------------------------------------------*/
-static void close_remote_file_callback( GnomeVFSAsyncHandle *handle,
-					GnomeVFSResult result,
+static void close_remote_file_callback( GObject *handle,
+					GAsyncResult *result,
 					gpointer callback_data )
 {
 	DownloadCallbackData *data = (DownloadCallbackData *)callback_data;
-	GnomeVFSFileInfo     *info;
-	GnomeVFSURI          *file_uri;
+	GFileInfo            *info;
+	GError               *error = NULL;
+	gchar                *tmp;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
 	if ( data->local_handle ) {
-		gnome_vfs_close( data->local_handle );
+	        g_output_stream_close (G_OUTPUT_STREAM (data->local_handle),
+	                               NULL, NULL);
+	        g_object_unref (data->local_handle);
 		data->local_handle = NULL;
 	}
 
-	if ( update_cancel_flag ) {
-		gtk_widget_destroy( update_window );
-		update_window = NULL;
-		gb_debug (DEBUG_UPDATE, "END -- CANCEL");
-		return;
+	g_input_stream_close_finish (G_INPUT_STREAM (handle), result, &error);
+	if (error) {
+	        gchar *uri;
+
+	        uri = g_file_get_uri (data->file);
+	        g_warning ("Could not close remote file %s: %s", uri,
+	                   error->message);
+	        g_free (uri);
+	        g_object_unref (handle);
+	        g_error_free (error);
 	}
 
-	if (result != GNOME_VFS_OK) {
-		g_warning( "Close failed: %s", gnome_vfs_result_to_string(result) );
+	if (g_cancellable_is_cancelled (update_cancel_flag)) {
+	        unmount_volume (data->uri);
+	        return;
 	}
 
+	g_object_unref (data->file);
+
 	data->i++;
 	data->p = data->p->next;
 	if ( data->p ) {
-		info = (GnomeVFSFileInfo *)data->p->data;
-		gb_debug (DEBUG_UPDATE, "Opening %s", info->name );
-		file_uri = gnome_vfs_uri_append_file_name( data->uri, info->name );
-		gb_debug (DEBUG_UPDATE, " URI = %s",
-			  gnome_vfs_uri_to_string (file_uri, 0) );
-		gnome_vfs_async_cancel (handle);
-		gnome_vfs_async_open_uri (&remote_file_handle,
-					  file_uri,
-					  GNOME_VFS_OPEN_READ,
-					  0,
-					  open_remote_file_callback,
-					  data);
+		info = (GFileInfo *)data->p->data;
+		gb_debug (DEBUG_UPDATE, "Opening %s",
+	                  g_file_info_get_name (info));
+	        data->file = g_file_get_child (data->uri,
+	                                       g_file_info_get_name (info));
+	        tmp = g_file_get_uri (data->file);
+		gb_debug (DEBUG_UPDATE, " URI = %s", tmp);
+	        g_free (tmp);
+	        g_file_read_async (data->file,
+	                           G_PRIORITY_DEFAULT,
+	                           update_cancel_flag,
+	                           open_remote_file_callback,
+	                           data);
 	}
 	else {
 		download_done( data );
+	        unmount_volume (data->uri);
 	}
 
 	gb_debug (DEBUG_UPDATE, "END");
@@ -905,42 +1233,57 @@
 download_done( DownloadCallbackData *data )
 {
 	GList            *p;
-	GnomeVFSFileInfo *info, tmp_info = {0};
+	GFileInfo        *info, *tmp_info;
+	GFile            *hash_text_uri, *file_text_uri;
 	gchar            *hash_name;
-	gchar            *hash_path, *hash_text_uri;
-	gchar            *file_path, *file_text_uri;
+	gchar            *hash_path;
+	gchar            *file_path;
 	gchar            *date_min, *date_max, *finish_msg;
 	gchar            *data_dir;
 	gbTableModel     *table_model;
+	GtkWidget        *tmp;
+	GdkPixbuf        *logo;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
 	/* Rename downloaded files (undo name hash) */
 	data_dir = gb_util_get_home_data_dir();
 	for ( p=data->list; p != NULL; p=p->next ) {
-		info = (GnomeVFSFileInfo *)p->data;
-		hash_name = hash_filename( info->name );
-		hash_path = g_build_filename( data_dir, hash_name, NULL );
-		hash_text_uri = gnome_vfs_get_uri_from_local_path( hash_path );
-		file_path = g_build_filename( data_dir, info->name, NULL );
-		file_text_uri = gnome_vfs_get_uri_from_local_path( file_path );
-		gnome_vfs_get_file_info (hash_text_uri, &tmp_info, GNOME_VFS_FILE_INFO_DEFAULT);
-		if ( info->size == tmp_info.size ) {
-			gnome_vfs_move( hash_text_uri, file_text_uri, FALSE );
+		info = (GFileInfo *)p->data;
+	        hash_name = hash_filename (g_file_info_get_name (info));
+		hash_path = g_build_filename (data_dir, hash_name, NULL);
+	        hash_text_uri = g_file_new_for_path (hash_path);
+		file_path = g_build_filename (data_dir,
+	                                      g_file_info_get_name (info),
+	                                      NULL);
+	        file_text_uri = g_file_new_for_path (file_path);
+	        tmp_info = g_file_query_info (hash_text_uri,
+	                                      G_FILE_ATTRIBUTE_STANDARD_SIZE,
+	                                      G_FILE_QUERY_INFO_NONE,
+	                                      update_cancel_flag,
+	                                      NULL);
+	        if (g_file_info_get_size (info)
+	            == g_file_info_get_size (tmp_info)) {
+	                g_file_move (hash_text_uri, file_text_uri,
+	                             G_FILE_COPY_NONE, update_cancel_flag,
+	                             NULL, NULL, NULL);
 		} else {
 			g_warning ("%s: Temporary file size (%"
-				   GNOME_VFS_OFFSET_FORMAT_STR
+				   G_GOFFSET_FORMAT
 				   ") does not match remote size (%"
-				   GNOME_VFS_OFFSET_FORMAT_STR
+				   G_GOFFSET_FORMAT
 				   ").",
-				   info->name, tmp_info.size, info->size);
-			gnome_vfs_unlink (hash_text_uri);
+	                           g_file_info_get_name (info),
+	                           g_file_info_get_size (tmp_info),
+	                           g_file_info_get_size (info));
+	                g_file_delete (hash_text_uri, NULL, NULL);
 		}
 		g_free( hash_name );
 		g_free( hash_path );
-		g_free( hash_text_uri );
+		g_object_unref (hash_text_uri);
 		g_free( file_path );
-		g_free( file_text_uri );
+		g_object_unref (file_text_uri);
+	        g_object_unref (tmp_info);
 	}
 	g_free( data_dir );
 
@@ -949,8 +1292,9 @@
 	gb_table_model_update (table_model);
 
 	/* customize finish page for this outcome */
-	gnome_druid_page_edge_set_title( GNOME_DRUID_PAGE_EDGE(finish_page),
-					 _( "Download done" ) );
+	logo = g_object_get_data (G_OBJECT (finish_page), "logo");
+	tmp = create_header (_("Download done"), logo);
+	gtk_box_pack_start (GTK_BOX (finish_page), tmp, FALSE, FALSE, 0);
 	date_min = gb_date_fmt (gb_table_model_get_rdate_min (table_model));
 	date_max = gb_date_fmt (gb_table_model_get_rdate_max (table_model));
 	finish_msg = g_strdup_printf(
@@ -959,16 +1303,17 @@
 		   "GBonds is now configured with redemption data\n"
 		   "for %s - %s.\n" ),
 		data->n, date_min, date_max );
-	gnome_druid_page_edge_set_text( GNOME_DRUID_PAGE_EDGE(finish_page), finish_msg );
+	gtk_box_pack_start (GTK_BOX (finish_page), gtk_label_new (finish_msg),
+	                    TRUE, TRUE, 0);
+	gtk_widget_show_all (finish_page);
 	g_free( date_min );
 	g_free( date_max );
 	g_free( finish_msg );
 
-	remote_dir_handle = NULL;
-
 	/* Now jump to the finish page */
-	gnome_druid_set_page( GNOME_DRUID(update_druid),
-			      GNOME_DRUID_PAGE(finish_page) );
+	gtk_assistant_remove_action_widget (GTK_ASSISTANT (update_druid),
+	                                    custom_widget);
+	gtk_assistant_next_page (GTK_ASSISTANT (update_druid));
 
 	gb_debug (DEBUG_UPDATE, "END");
 }
@@ -984,12 +1329,15 @@
 {
 	gchar *date_min, *date_max, *finish_msg;
 	gbTableModel     *table_model;
+	GtkWidget        *tmp;
+	GdkPixbuf        *logo;
 
 	gb_debug (DEBUG_UPDATE, "START");
 
 	/* customize finish page for this outcome */
-	gnome_druid_page_edge_set_title( GNOME_DRUID_PAGE_EDGE(finish_page),
-					 _( "No new data available" ) );
+	logo = g_object_get_data (G_OBJECT (finish_page), "logo");
+	tmp = create_header (_("No new data available"), logo);
+	gtk_box_pack_start (GTK_BOX (finish_page), tmp, FALSE, FALSE, 0);
 	table_model = gb_table_get_model ();
 	date_min = gb_date_fmt (gb_table_model_get_rdate_min (table_model));
 	date_max = gb_date_fmt (gb_table_model_get_rdate_max (table_model));
@@ -999,16 +1347,17 @@
 		   "GBonds is still configured with redemption data\n"
 		   "for %s - %s.\n" ),
 		date_min, date_max );
-	gnome_druid_page_edge_set_text( GNOME_DRUID_PAGE_EDGE(finish_page), finish_msg );
+	gtk_box_pack_start (GTK_BOX (finish_page), gtk_label_new (finish_msg),
+	                    TRUE, TRUE, 0);
+	gtk_widget_show_all (finish_page);
 	g_free( date_min );
 	g_free( date_max );
 	g_free( finish_msg );
 
-	remote_dir_handle = NULL;
-
 	/* Now jump to the finish page */
-	gnome_druid_set_page( GNOME_DRUID(update_druid),
-			      GNOME_DRUID_PAGE(finish_page) );
+	gtk_assistant_remove_action_widget (GTK_ASSISTANT (update_druid),
+	                                    custom_widget);
+	gtk_assistant_next_page (GTK_ASSISTANT (update_druid));
 
 	gb_debug (DEBUG_UPDATE, "END");
 }
@@ -1020,102 +1369,37 @@
 /* PRIVATE.  Add finish page to druid.                                      */
 /*--------------------------------------------------------------------------*/
 static void
-add_finish_page( GnomeDruid *wdruid, GdkPixbuf *logo )
-{
-	GdkColor   druid_bg_color = DRUID_BG_COLOR;
-	GdkColor   druid_title_color = DRUID_TITLE_COLOR;
-
-	gb_debug (DEBUG_UPDATE, "START");
-
-	finish_page = gnome_druid_page_edge_new_with_vals (GNOME_EDGE_FINISH,
-							   TRUE,
-							   _("done"),
-							   _("Done."),
-							   logo,
-							   NULL,
-							   NULL);
-	gnome_druid_page_edge_set_bg_color(GNOME_DRUID_PAGE_EDGE(finish_page),
-					   &druid_bg_color);
-	gnome_druid_page_edge_set_logo_bg_color (GNOME_DRUID_PAGE_EDGE(finish_page),
-						 &druid_bg_color );
-	gnome_druid_page_edge_set_title_color (GNOME_DRUID_PAGE_EDGE(finish_page),
-					       &druid_title_color );
-	gnome_druid_append_page( wdruid, GNOME_DRUID_PAGE(finish_page) );
-
-	g_signal_connect_after( G_OBJECT(finish_page), "prepare",
-				G_CALLBACK(prepare_finish_page), NULL );
-
-	g_signal_connect( G_OBJECT(finish_page), "finish",
-			  G_CALLBACK(finish_cb), NULL );
-
-	gb_debug (DEBUG_UPDATE, "END");
-}
-
-
-
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  Prepare finish page callback.                                  */
-/*--------------------------------------------------------------------------*/
-static void
-prepare_finish_page( GnomeDruidPage *page, GnomeDruid *druid, gpointer data )
+add_finish_page( GtkAssistant *wdruid, GdkPixbuf *logo )
 {
-
 	gb_debug (DEBUG_UPDATE, "START");
 
-	gnome_druid_set_show_finish( GNOME_DRUID(druid), TRUE );
+	finish_page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+	g_object_set_data (G_OBJECT (finish_page), "logo", logo);
 
-	gnome_druid_set_buttons_sensitive( GNOME_DRUID(druid),
-					   FALSE, TRUE, FALSE, FALSE );
+	gtk_assistant_append_page (wdruid, finish_page);
+	gtk_assistant_set_page_title (wdruid, finish_page, _("Result"));
+	gtk_assistant_set_page_type (wdruid, finish_page,
+	                             GTK_ASSISTANT_PAGE_SUMMARY);
 
 	gb_debug (DEBUG_UPDATE, "END");
 }
 
 
 
-
-/*--------------------------------------------------------------------------*/
-/* PRIVATE.  End druid.                                                     */
-/*--------------------------------------------------------------------------*/
-static void
-finish_cb( GnomeDruidPage *page, GnomeDruid *druid, gpointer data )
-{
-	gb_debug (DEBUG_UPDATE, "START");
-
-	g_signal_handlers_block_by_func( G_OBJECT(update_window),
-					 G_CALLBACK(destroy_cb), NULL );
-
-	gtk_widget_destroy( update_window );
-	update_window = NULL;
-
-	gb_debug (DEBUG_UPDATE, "END");
-}
-
 
 
 /*--------------------------------------------------------------------------*/
 /* PRIVATE.  Cancel druid.                                                  */
 /*--------------------------------------------------------------------------*/
 static void
-cancel_cb( GnomeDruid *druid, gpointer data )
+cancel_cb( GtkAssistant *druid, gpointer data )
 {
 	gb_debug (DEBUG_UPDATE, "START");
 
-	g_signal_handlers_block_by_func( G_OBJECT(update_window),
-					 G_CALLBACK(destroy_cb), NULL );
-	if ( remote_dir_handle ) {
-
-		/* let the async stuff know to exit as gracefully as possible. */
-		update_cancel_flag = TRUE;
-
-	}
-	else {
-
-		/* we haven't started any of the async stuff yet, so just destroy window */
-		gtk_widget_destroy( update_window );
-		update_window = NULL;
+	if (update_cancel_flag)
+	        g_cancellable_cancel (update_cancel_flag);
 
-	}
+	gtk_widget_destroy (update_druid);
 
 	gb_debug (DEBUG_UPDATE, "END");
 }
@@ -1126,24 +1410,11 @@
 /* PRIVATE.  Destroy druid.                                                 */
 /*--------------------------------------------------------------------------*/
 static void
-destroy_cb( GtkWindow *window, gpointer data )
+destroy_cb( GtkAssistant *window, gpointer data )
 {
 	gb_debug (DEBUG_UPDATE, "START");
 
-	if ( remote_dir_handle ) {
-
-		/* let the async stuff know to exit as gracefully as possible. */
-		update_cancel_flag = TRUE;
-		g_signal_stop_emission_by_name( G_OBJECT(update_window), "destroy" );
-
-	}
-	else {
-
-		/* we haven't started any of the async stuff yet, so just destroy window */
-		gtk_widget_destroy( update_window );
-		update_window = NULL;
-
-	}
+	gtk_widget_destroy (update_druid);
 
 	gb_debug (DEBUG_UPDATE, "END");
 }
@@ -1165,12 +1436,14 @@
 
 	gb_debug (DEBUG_UPDATE, "START");
 
-	xml_filename = g_build_filename( REDEMPTION_DATA_DIR,
+	xml_filename = g_build_filename (DATADIR, G_DIR_SEPARATOR_S,
+	                                 "gbonds", G_DIR_SEPARATOR_S,
 					 "download-sites.xml",
 					 NULL);
 	doc = xmlParseFile( xml_filename );
 	if ( !doc ) {
 		g_warning( "xmlParseFile error \"%s\"", xml_filename );
+	        g_free (xml_filename);
 		return NULL;
 	}
 	g_free( xml_filename );
--- a/src/util.c
+++ b/src/util.c
@@ -23,7 +23,8 @@
 #include <config.h>
 
 #include <string.h>
-#include <gnome.h>
+#include <sys/stat.h>
+#include <glib.h>
 
 #include "util.h"
 
@@ -97,7 +98,8 @@
 gchar *
 gb_util_get_home_data_dir (void)
 {
-	gchar *dir = gnome_util_prepend_user_home( ".gbonds" );
+	gchar *dir = g_build_path (G_DIR_SEPARATOR_S, g_get_home_dir (),
+	                           ".gbonds", NULL);
 
 	/* Try to create ~/.gbonds directory.  If it already exists, no problem. */
 	mkdir( dir, 0775 );
--- a/src/hig.c
+++ b/src/hig.c
@@ -23,6 +23,7 @@
 #include <config.h>
 
 #include <glib.h>
+#include <glib/gi18n.h>
 
 #include "hig.h"
 
@@ -156,7 +157,6 @@
 	GtkWidget    *dialog, *hbox, *image, *label;
 	gchar        *label_text;
 	const gchar  *stock_id = NULL;
-	GtkStockItem  item;
   
 	/* Bare dialog */
 	dialog = g_object_new (gb_hig_alert_get_type (), NULL);
@@ -175,37 +175,31 @@
 	}
 
 	/* Create HBOX */
-	hbox = gtk_hbox_new (FALSE, HIG_ALERT_SPACING);
-	gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
+	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, HIG_ALERT_SPACING);
+	gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area
+	                             (GTK_DIALOG (dialog))),
 			    hbox, FALSE, FALSE, 0);
 
 	/* Create image */
 	switch (type) {
 	case GTK_MESSAGE_INFO:
-		stock_id = GTK_STOCK_DIALOG_INFO;
+		stock_id = "dialog-information";
 		break;
 	case GTK_MESSAGE_QUESTION:
-		stock_id = GTK_STOCK_DIALOG_QUESTION;
+		stock_id = "dialog-question";
 		break;
 	case GTK_MESSAGE_WARNING:
-		stock_id = GTK_STOCK_DIALOG_WARNING;
+		stock_id = "dialog-warning";
 		break;
 	case GTK_MESSAGE_ERROR:
-		stock_id = GTK_STOCK_DIALOG_ERROR;
+		stock_id = "dialog-error";
 		break;
 	default:
-		stock_id = GTK_STOCK_DIALOG_INFO;
+		stock_id = "dialog-information";
 		g_warning ("Unknown GtkMessageType %d", type);
 		break;
 	}
-	if (gtk_stock_lookup (stock_id, &item)) {
-		image = gtk_image_new_from_stock (stock_id,
-						  GTK_ICON_SIZE_DIALOG);
-	} else {
-		image = gtk_image_new_from_stock (NULL,
-						  GTK_ICON_SIZE_DIALOG);
-		g_warning ("Stock dialog ID doesn't exist?");
-	}
+	image = gtk_image_new_from_icon_name (stock_id, GTK_ICON_SIZE_DIALOG);
 	gtk_box_pack_start (GTK_BOX(hbox), image, FALSE, FALSE, 0);
 
 	/* Create label containing primary and secondary text */
@@ -219,10 +213,10 @@
 	gtk_window_set_title (GTK_WINDOW(dialog), "");
 	gtk_container_set_border_width (GTK_CONTAINER(dialog),
 					HIG_ALERT_BORDER);
-	gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
 
 	/* Adjust VBOX properties */
-	gtk_box_set_spacing (GTK_BOX(GTK_DIALOG(dialog)->vbox),
+	gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_content_area
+	                              (GTK_DIALOG(dialog))),
 			     HIG_ALERT_SPACING);
 
 	/* Adjust HBOX properties */
@@ -230,12 +224,12 @@
 	gtk_container_set_border_width (GTK_CONTAINER(hbox), HIG_ALERT_BORDER);
 
 	/* Adjust IMAGE properties */
-	gtk_misc_set_alignment (GTK_MISC(image), 0.5, 0.0);
+	gtk_widget_set_halign (image, GTK_ALIGN_CENTER);
 
 	/* Adjust LABEL properties */
 	gtk_label_set_line_wrap (GTK_LABEL(label), TRUE);
 	gtk_label_set_use_markup (GTK_LABEL(label), TRUE);
-	gtk_misc_set_alignment (GTK_MISC(image), 0.5, 0.0);
+	gtk_widget_set_halign (image, GTK_ALIGN_CENTER);
 
 	/* Add buttons */
 	switch (buttons) {
@@ -244,27 +238,27 @@
 		break;
 	case GTK_BUTTONS_OK:
 		gtk_dialog_add_button (GTK_DIALOG(dialog),
-				       GTK_STOCK_OK, GTK_RESPONSE_OK);
+	                               _("_OK"), GTK_RESPONSE_OK);
 		break;
 	case GTK_BUTTONS_CLOSE:
 		gtk_dialog_add_button (GTK_DIALOG(dialog),
-				       GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
+	                               _("_Close"), GTK_RESPONSE_CLOSE);
 		break;
 	case GTK_BUTTONS_CANCEL:
 		gtk_dialog_add_button (GTK_DIALOG(dialog),
-				       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+	                               _("_Cancel"), GTK_RESPONSE_CANCEL);
 		break;
 	case GTK_BUTTONS_YES_NO:
 		gtk_dialog_add_button (GTK_DIALOG(dialog),
-				       GTK_STOCK_NO, GTK_RESPONSE_NO);
+	                               _("_No"), GTK_RESPONSE_NO);
 		gtk_dialog_add_button (GTK_DIALOG(dialog),
-				       GTK_STOCK_YES, GTK_RESPONSE_YES);
+	                               _("_Yes"), GTK_RESPONSE_YES);
 		break;
 	case GTK_BUTTONS_OK_CANCEL:
 		gtk_dialog_add_button (GTK_DIALOG(dialog),
-				       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+	                               _("_Cancel"), GTK_RESPONSE_CANCEL);
 		gtk_dialog_add_button (GTK_DIALOG(dialog),
-				       GTK_STOCK_OK, GTK_RESPONSE_OK);
+	                               _("_OK"), GTK_RESPONSE_OK);
 		break;
 	default:
 		g_warning ("Unknown GtkButtonsType");
@@ -323,14 +317,18 @@
 static void
 gb_hig_dialog_init (gbHigDialog *hig_dialog)
 {
+	GtkWidget *carea;
+
 	gtk_container_set_border_width (GTK_CONTAINER(hig_dialog),
 					HIG_DIALOG_BORDER);
 
-	hig_dialog->vbox = gtk_vbox_new (FALSE, HIG_DIALOG_VBOX_SPACING);
-	gtk_box_pack_start (GTK_BOX(GTK_DIALOG(hig_dialog)->vbox),
+	hig_dialog->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL,
+	                                HIG_DIALOG_VBOX_SPACING);
+	carea = gtk_dialog_get_content_area (GTK_DIALOG (hig_dialog));
+	gtk_box_pack_start (GTK_BOX (carea),
 			    hig_dialog->vbox, FALSE, FALSE, 0);
 
-	gtk_box_set_spacing (GTK_BOX(GTK_DIALOG(hig_dialog)->vbox),
+	gtk_box_set_spacing (GTK_BOX (carea),
 			     HIG_DIALOG_OUTER_VBOX_SPACING);
 }
 
@@ -465,7 +463,7 @@
 		};
 
 		hig_category_type =
-		    g_type_register_static (gtk_vbox_get_type (),
+		    g_type_register_static (gtk_box_get_type (),
 					    "gbHigCategory",
 					    &hig_category_info, 0);
 	}
@@ -493,12 +491,11 @@
 	/* 1st row: Label */
 	hig_category->label = gtk_label_new ("");
 	gtk_label_set_use_markup (GTK_LABEL(hig_category->label), TRUE);
-	gtk_misc_set_alignment (GTK_MISC(hig_category->label), 0.0, 0.0);
 	gtk_box_pack_start (GTK_BOX(hig_category),
 			    hig_category->label, FALSE, FALSE, 0);
 	
 	/* 2nd row: HBOX */
-	hbox = gtk_hbox_new (FALSE, HIG_VBOX_INNER_SPACING);
+	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, HIG_VBOX_INNER_SPACING);
 	gtk_box_pack_start (GTK_BOX(hig_category), hbox, FALSE, FALSE, 0);
 
 	/* 2nd row, Column 1: Indentation spacing */
@@ -506,7 +503,8 @@
 			    gtk_label_new ("    "), FALSE, FALSE, 0);
 
 	/* 2nd row, Column 2: User area (inner vbox) */
-	hig_category->vbox = gtk_vbox_new (FALSE, HIG_VBOX_INNER_SPACING);
+	hig_category->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL,
+                                          HIG_VBOX_INNER_SPACING);
 	gtk_box_pack_start (GTK_BOX(hbox),
 			    hig_category->vbox, TRUE, TRUE, 0);
 }
@@ -582,7 +580,7 @@
 		};
 
 		hig_vbox_type =
-		    g_type_register_static (gtk_vbox_get_type (),
+		    g_type_register_static (gtk_box_get_type (),
 					    "gbHigVBox",
 					    &hig_vbox_info, 0);
 	}
@@ -604,6 +602,8 @@
 gb_hig_vbox_init (gbHigVBox *hig_vbox)
 {
 	/* defaults to an INNER VBox */
+	gtk_orientable_set_orientation (GTK_ORIENTABLE (hig_vbox),
+	                                GTK_ORIENTATION_VERTICAL);
 	gtk_box_set_spacing (GTK_BOX(hig_vbox), HIG_VBOX_INNER_SPACING);
 	gtk_container_set_border_width (GTK_CONTAINER(hig_vbox), 0);
 }
@@ -688,7 +688,7 @@
 		};
 
 		hig_hbox_type =
-		    g_type_register_static (gtk_hbox_get_type (),
+		    g_type_register_static (gtk_box_get_type (),
 					    "gbHigHBox",
 					    &hig_hbox_info, 0);
 	}
@@ -709,6 +709,8 @@
 static void
 gb_hig_hbox_init (gbHigHBox *hig_hbox)
 {
+	gtk_orientable_set_orientation (GTK_ORIENTABLE (hig_hbox),
+	                                GTK_ORIENTATION_HORIZONTAL);
 	gtk_box_set_spacing (GTK_BOX(hig_hbox), HIG_HBOX_SPACING);
 	gtk_container_set_border_width (GTK_CONTAINER(hig_hbox), 0);
 }
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -8,7 +8,8 @@
 src/edit.c
 src/file.c
 src/gbonds.c
-src/gbonds-ui.xml
+src/gbonds.ui
+src/hig.c
 src/prefs-dialog.c
 src/print-dialog.c
 src/print.c
--- /dev/null
+++ b/src/gbonds.ui
@@ -0,0 +1,536 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1
+
+gbonds - U.S. Savings Bond inventory program for GNOME
+Copyright (C) 2018 Yavor Doganov <yavor@gnu.org>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+Author: Yavor Doganov <yavor@gnu.org>
+
+-->
+<interface domain="gbonds">
+  <requires lib="gtk+" version="3.20"/>
+  <!-- interface-license-type gplv2 -->
+  <!-- interface-name gbonds -->
+  <!-- interface-description U.S. Savings Bond inventory program for GNOME -->
+  <!-- interface-copyright 2018 Yavor Doganov <yavor@gnu.org> -->
+  <!-- interface-authors Yavor Doganov <yavor@gnu.org> -->
+  <object class="GtkRecentFilter" id="recentfilter1">
+    <mime-types>
+      <mime-type>application/x-gbonds</mime-type>
+    </mime-types>
+    <patterns>
+      <pattern>*.gbonds</pattern>
+    </patterns>
+  </object>
+  <object class="GtkMenuBar" id="menubar">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkMenuItem" id="File">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">_File</property>
+        <property name="use_underline">True</property>
+        <child type="submenu">
+          <object class="GtkMenu">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkMenuItem" id="FileNew">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Create a new document</property>
+                <property name="label" translatable="yes">_New</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_file_new" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="FileOpen">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Open a file</property>
+                <property name="label" translatable="yes">_Open...</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_file_open" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="FileImport">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Import an SBW Inventory</property>
+                <property name="label" translatable="yes">_Import...</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_file_import" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="recentmenu">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Recent _Files</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkRecentChooserMenu" id="Recents">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="filter">recentfilter1</property>
+                    <property name="limit">4</property>
+                    <property name="sort_type">mru</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparatorMenuItem" id="sep1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="FileSave">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Save the current file</property>
+                <property name="label" translatable="yes">_Save</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_file_save" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="FileSaveAs">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Save the current file with a different name</property>
+                <property name="label" translatable="yes">Save _As...</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_file_save_as" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparatorMenuItem" id="sep2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="FilePrint">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Print the current file</property>
+                <property name="label" translatable="yes">_Print...</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_file_print" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparatorMenuItem" id="sep7">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="FileClose">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Close the current file</property>
+                <property name="label" translatable="yes">_Close</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_file_close" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="FileExit">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Quit the program</property>
+                <property name="label" translatable="yes">_Quit</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_file_exit" swapped="no"/>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="Edit">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">_Edit</property>
+        <property name="use_underline">True</property>
+        <child type="submenu">
+          <object class="GtkMenu">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkMenuItem" id="EditCut">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Cut the selection</property>
+                <property name="label" translatable="yes">Cu_t</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_edit_cut" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="EditCopy">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Copy the selection</property>
+                <property name="label" translatable="yes">_Copy</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_edit_copy" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="EditPaste">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Paste the clipboard</property>
+                <property name="label" translatable="yes">_Paste</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_edit_paste" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparatorMenuItem" id="sep3">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="EditAdd">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Add bond</property>
+                <property name="label" translatable="yes">_Add...</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_edit_add" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="EditDelete">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Delete the selected bonds</property>
+                <property name="label" translatable="yes">_Delete</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_edit_delete" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="EditTitle">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Edit title</property>
+                <property name="label" translatable="yes">_Title...</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_edit_title" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparatorMenuItem" id="sep4">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="EditSelectAll">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Select all objects</property>
+                <property name="label" translatable="yes">Select _All</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_edit_select_all" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="EditUnSelectAll">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Remove all selections</property>
+                <property name="label" translatable="yes">U_n-select All</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_edit_unselect_all" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparatorMenuItem" id="sep5">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="SettingsPreferences">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Configure the application</property>
+                <property name="label" translatable="yes">Pr_eferences...</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_settings_preferences" swapped="no"/>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="View">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">_View</property>
+        <property name="use_underline">True</property>
+        <child type="submenu">
+          <object class="GtkMenu">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkCheckMenuItem" id="ViewMainToolbar">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Change the visibility of the main toolbar in the current window</property>
+                <property name="label" translatable="yes">_Main Toolbar</property>
+                <property name="use_underline">True</property>
+                <property name="active">True</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparatorMenuItem" id="sep6">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="CustomizeMainToolbar">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Customize Main Toolbar</property>
+                <child type="submenu">
+                  <object class="GtkMenu">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkRadioMenuItem" id="MainToolbarSystem">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="tooltip_text" translatable="yes">Set main toolbar button style according to desktop default</property>
+                        <property name="label" translatable="yes">_Desktop Default</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_as_radio">True</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkRadioMenuItem" id="MainToolbarIcon">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="tooltip_text" translatable="yes">Only show icons in the main toolbar</property>
+                        <property name="label" translatable="yes">_Icon</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_as_radio">True</property>
+                        <property name="group">MainToolbarSystem</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkRadioMenuItem" id="MainToolbarIconText">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="tooltip_text" translatable="yes">Show both icons and texts in the main toolbar</property>
+                        <property name="label" translatable="yes">Icon and _Text</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_as_radio">True</property>
+                        <property name="group">MainToolbarSystem</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="Tools">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">_Tools</property>
+        <property name="use_underline">True</property>
+        <child type="submenu">
+          <object class="GtkMenu">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkMenuItem" id="SettingsUpdate">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Update redemption tables druid</property>
+                <property name="label" translatable="yes">_Update redemption tables...</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_settings_update" swapped="no"/>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="Help">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">_Help</property>
+        <property name="use_underline">True</property>
+        <child type="submenu">
+          <object class="GtkMenu">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkMenuItem" id="HelpContents">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">Open the gbonds manual</property>
+                <property name="label" translatable="yes">_Contents</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_help_contents" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="About">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="tooltip_text" translatable="yes">About gbonds</property>
+                <property name="label" translatable="yes">_About...</property>
+                <property name="use_underline">True</property>
+                <signal name="activate" handler="gb_cmd_help_about" swapped="no"/>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkToolbar" id="toolbar">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkToolButton" id="EditAdd1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Add bond</property>
+        <property name="label" translatable="yes">Add</property>
+        <property name="icon_name">list-add</property>
+        <signal name="clicked" handler="gb_cmd_edit_add" swapped="no"/>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="EditDelete1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Delete the selected bonds</property>
+        <property name="label" translatable="yes">Delete</property>
+        <property name="icon_name">user-trash</property>
+        <signal name="clicked" handler="gb_cmd_edit_delete" swapped="no"/>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkSeparatorToolItem">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="FileSave1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Save the current file</property>
+        <property name="label" translatable="yes">Save</property>
+        <property name="icon_name">document-save</property>
+        <signal name="clicked" handler="gb_cmd_file_save" swapped="no"/>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkSeparatorToolItem">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="EditCut1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Cut the selection</property>
+        <property name="label" translatable="yes">Cut</property>
+        <property name="icon_name">edit-cut</property>
+        <signal name="clicked" handler="gb_cmd_edit_cut" swapped="no"/>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="EditCopy1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Copy the selection</property>
+        <property name="label" translatable="yes">Copy</property>
+        <property name="icon_name">edit-copy</property>
+        <signal name="clicked" handler="gb_cmd_edit_copy" swapped="no"/>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkToolButton" id="EditPaste1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="tooltip_text" translatable="yes">Paste the clipboard</property>
+        <property name="label" translatable="yes">Paste</property>
+        <property name="icon_name">edit-paste</property>
+        <signal name="clicked" handler="gb_cmd_edit_paste" swapped="no"/>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="homogeneous">True</property>
+      </packing>
+    </child>
+  </object>
+</interface>
--- a/src/print-dialog.c
+++ b/src/print-dialog.c
@@ -24,11 +24,8 @@
 #include <math.h>
 #include <time.h>
 #include <ctype.h>
+#include <glib/gi18n.h>
 #include <gtk/gtk.h>
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
 
 #include "print-dialog.h"
 #include "hig.h"
@@ -48,70 +45,58 @@
 /*===========================================*/
 /* Private function prototypes.              */
 /*===========================================*/
-static void print_response (GtkDialog *dlg,
-			    gint       response,
-			    gbView    *view);
 
 
 /*****************************************************************************/
 /* "Print" dialog.                                                           */
 /*****************************************************************************/
 void
-gb_print_dialog (gbView *view, BonoboWindow *win)
+gb_print_dialog (gbView *view, GtkWindow *win)
 {
 	GtkWidget *dlg;
+	GtkPrintOperation *op;
+	GtkPrintOperationResult res;
+	static GtkPrintSettings *settings;
+	PrintInfo *pi;
+	GError *err = NULL;
 
 	g_return_if_fail (view && GB_IS_VIEW(view));
-	g_return_if_fail (win && BONOBO_IS_WINDOW(win));
+	g_return_if_fail (win && GTK_IS_WINDOW(win));
 
-	dlg = gnome_print_dialog_new (NULL, (guchar*)_("Print inventory"), 0);
-
-	gtk_window_set_transient_for (GTK_WINDOW(dlg), GTK_WINDOW(win));
-
-	g_signal_connect (G_OBJECT(dlg), "response",
-                          G_CALLBACK (print_response), view);
-
-	gtk_widget_show (dlg);
-}
-
-/*---------------------------------------------------------------------------*/
-/* PRIVATE.  Print "response" callback.                                      */
-/*---------------------------------------------------------------------------*/
-static void
-print_response (GtkDialog *dlg,
-		gint       response,
-		gbView     *view)
-{
-	GnomePrintConfig *config;
-	GnomePrintJob    *job;
-	GtkWidget        *preview;
-
-	switch (response) {
-
-	case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
-		config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG(dlg));
-		job = gnome_print_job_new (config);
-		gb_print (job, view);
-		gnome_print_job_close (job);
-		gnome_print_job_print (job);
-		g_object_unref (G_OBJECT(job));
-		break;
-
-	case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
-		config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG(dlg));
-		job = gnome_print_job_new (config);
-		gb_print (job, view);
-		gnome_print_job_close (job);
-		preview = gnome_print_job_preview_new (job, (guchar*)_("Print preview"));
-		gtk_widget_show (preview);
-		g_object_unref (G_OBJECT(job));
-		break;
-
-	default:
-		break;
+	op = gtk_print_operation_new ();
+	pi = print_info_new (view);
 
+	g_signal_connect (op, "begin-print", G_CALLBACK (begin_print_cb), pi);
+	g_signal_connect (op, "draw-page", G_CALLBACK (draw_page_cb), pi);
+	g_signal_connect (op, "end-print", G_CALLBACK (end_print_cb), pi);
+
+	gtk_print_operation_set_unit (op, GTK_UNIT_POINTS);
+	gtk_print_operation_set_embed_page_setup (op, TRUE);
+
+	if (!settings)
+	        settings = gtk_print_settings_new ();
+	gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_BASENAME,
+	                        "gbonds");
+	gtk_print_operation_set_print_settings (op, settings);
+
+	res = gtk_print_operation_run (op,
+	                               GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+	                               win, &err);
+
+	if (res == GTK_PRINT_OPERATION_RESULT_ERROR) {
+	        dlg = gb_hig_alert_new (win, GTK_DIALOG_DESTROY_WITH_PARENT,
+	                                GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+	                                _("Print error"), err->message);
+	        gtk_dialog_run (GTK_DIALOG (dlg));
+	        gtk_widget_destroy (dlg);
+	        g_error_free (err);
+	} else if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
+	        if (settings)
+	                g_object_unref (settings);
+	        settings = g_object_ref (gtk_print_operation_get_print_settings
+	                                 (op));
 	}
 
-	gtk_widget_destroy (GTK_WIDGET (dlg));
+	g_object_unref (op);
 }
 
--- a/src/print.c
+++ b/src/print.c
@@ -25,7 +25,7 @@
 
 #include <time.h>
 #include <ctype.h>
-#include <libgnomeprint/gnome-print-job.h>
+#include <glib/gi18n.h>
 
 #include "print.h"
 
@@ -40,493 +40,413 @@
 /* Private types.                            */
 /*===========================================*/
 typedef struct _PrintInfo {
-  /* gnome print context */
-  GnomePrintContext *pc;
-
-  /* gnome print config */
-  GnomePrintConfig *config;
-
-  /* paper characteristics */
-  gdouble page_width;
-  gdouble page_height;
-  gdouble margin_top;
-  gdouble margin_bottom;
-  gdouble margin_left;
-  gdouble margin_right;
-
-  /* position of main printing area margins */
-  gdouble x_lmargin, x_rmargin;
-  gdouble y_tmargin, y_bmargin;
-
-  /* Current font info */
-  GnomeFont *font;
-  gchar     *font_name;
-  gint      font_size;
-  gdouble   font_spacing;
-  gboolean  font_italic;
-
-  /* Current position */
-  gdouble x, y;
+  gbView *view;
 
+  gint n_pages;
+  guint n_bonds;
+  gint i_bond;
+  gint to_skip;
+
+  gdouble inventory_value;
+  gdouble redemption_value;
+  gdouble total_interest;
 } PrintInfo;
 
 /*===========================================*/
 /* Private function prototypes.              */
 /*===========================================*/
-static void print_page_header( PrintInfo *pi,
-			       gchar *title, gchar *name,
-			       gint i_page, gint n_pages,
-			       const gchar *date_string );
-static void print_empty_inventory( PrintInfo *pi );
-static void print_redemption_date( PrintInfo *pi, gchar *rdate );
-static void print_table_headers( PrintInfo *pi );
-static void print_bond_info( PrintInfo *pi, gbDocBondInfo *info );
-static void print_legend( PrintInfo *pi );
-static void print_summary( PrintInfo *pi,
-			   gchar *rdate, gint n_bonds,
-			   gdouble inventory_value,
-			   gdouble redemption_value,
-			   gdouble total_interest );
-
-static PrintInfo *print_info_new( GnomePrintJob *job );
-static void print_info_free( PrintInfo *pi );
-
-static void print_font( PrintInfo *pi, gchar *name, gint size );
-static void print_bold( PrintInfo *pi );
-static void print_bold_end( PrintInfo *pi );
-static void print_show( PrintInfo *pi, gchar *text );
-static void print_show_right( PrintInfo *pi, gchar *text );
-static void print_show_center( PrintInfo *pi, gchar *text );
-static void print_goto_line( PrintInfo *pi, gint n );
-static void print_goto_next_line( PrintInfo *pi );
-static void print_goto_header( PrintInfo *pi );
-static void print_goto_footer( PrintInfo *pi );
-static void print_goto_eol( PrintInfo *pi );
-static void print_goto_center( PrintInfo *pi );
-static void print_goto_column( PrintInfo *pi, gint n );
-static void print_hbar( PrintInfo *pi, gint n );
 
-
-/******************************************************************************/
-/* Print the inventory.                                                       */
-/******************************************************************************/
 void
-gb_print (GnomePrintJob    *job,
-	  gbView           *view)
+begin_print_cb (GtkPrintOperation *op,
+                GtkPrintContext   *ctxt,
+                gpointer           user_data)
 {
-  PrintInfo     *pi;
-  gint           i_page, n_pages;
-  gint           i_bond, n_bonds;
-  gchar         *page_str;
-  gchar         *basename, *title;
-  GList         *p;
-  gbDocBond     *p_bond;
-  gbDocBondInfo *info;
-  gbStatus       status;
-  gdouble        inventory_value=0.0, redemption_value=0.0, total_interest=0.0;
-  time_t         t;
-  struct tm     *tm;
-  gchar         *date_string;
-
-  pi = print_info_new (job);
-
-  basename = gb_doc_get_short_name (view->doc);
-  title    = gb_doc_get_title (view->doc);
-
-  /* Format date string */
-  t = time(NULL); tm = localtime(&t);
-  date_string = g_strdup_printf( "%02d/%02d/%4d %2d:%02d %s",
-				 tm->tm_mon+1, tm->tm_mday, tm->tm_year+1900,
-				 (tm->tm_hour%12) ? tm->tm_hour%12 : 12,
-				 tm->tm_min,
-				 (tm->tm_hour/12) ? "PM" : "AM" );
+  PrintInfo *pi = (PrintInfo *)user_data;
 
   /* Count bonds in inventory */
-  n_bonds = 0;
-  for ( p=view->doc->list; p!=NULL; p=p->next ) {
-    n_bonds++;
-  }
+  pi->n_bonds = g_list_length (pi->view->doc->list);
 
   /* Calculate total number of pages */
-  if ( n_bonds == 0 ) {
-    n_pages = 1;
-  }
-  else {
-    n_pages = ( (n_bonds-1) / GBONDS_PRINT_BONDS_PER_PAGE ) + 2;
-  }
-
-  i_page = 1;
-  i_bond = 0;
-
-  /* Begin new page */
-  page_str = g_strdup_printf( "%d", i_page );
-  gnome_print_beginpage( pi->pc, (guchar *)page_str );
-  g_free( page_str );
-  print_page_header( pi, title, basename, i_page, n_pages, date_string );
-
-  if ( view->doc->list == NULL ) {
-    print_empty_inventory( pi );
-    gnome_print_showpage( pi->pc );
-  }
-  else {
-    /*---------------------------------------------*/
-    /* Traverse bond list and print information.   */
-    /*---------------------------------------------*/
-    print_goto_line( pi, 3 );
-    print_redemption_date( pi, view->rdate );
-    for ( p=view->doc->list; p!=NULL; p=p->next ) {
-      p_bond = (gbDocBond *)p->data;
+  if (pi->n_bonds == 0)
+    pi->n_pages = 1;
+  else
+    /* Broken: constant may be inappropriate for some paper sizes or
+       even A4 landscape.  */
+    pi->n_pages = ((pi->n_bonds - 1) / GBONDS_PRINT_BONDS_PER_PAGE) + 2;
 
-      if ( (i_bond % GBONDS_PRINT_BONDS_PER_PAGE) == 0 ) {
+  gtk_print_operation_set_n_pages (op, pi->n_pages);
+}
 
-	if ( i_bond != 0 ) {
-	  /* Finish old page */
-	  gnome_print_showpage( pi->pc );
-
-	  /* Begin new page */
-	  i_page++;
-	  page_str = g_strdup_printf( "%d", i_page );
-	  gnome_print_beginpage( pi->pc, (guchar *)page_str );
-	  g_free( page_str );
-	  print_page_header( pi,
-			     title, basename, i_page, n_pages, date_string );
-	  print_goto_line( pi, 3 );
-	  print_redemption_date( pi, view->rdate );
-	}
+/******************************************************************************/
+/* Print the inventory.                                                       */
+/******************************************************************************/
+void
+draw_page_cb (GtkPrintOperation *op,
+              GtkPrintContext   *ctxt,
+              gint               page_nr,
+              gpointer           user_data)
+{
+  PrintInfo            *pi = (PrintInfo *)user_data;
+  cairo_t              *cr;
+  PangoLayout          *layout;
+  PangoFontDescription *desc;
+  PangoRectangle        rect;
+  GList                *p;
+  gint                  text_width;
+  gdouble               width, height, x;
+  gchar                *basename, *title, *date_string, *footer, *line, *buf;
+  time_t                t;
+  struct tm            *tm;
+  gbDocBond            *p_bond;
+  gbDocBondInfo        *info;
+  gbStatus              status;
+
+  cr = gtk_print_context_get_cairo_context (ctxt);
+  width = gtk_print_context_get_width (ctxt);
+
+  layout = gtk_print_context_create_pango_layout (ctxt);
+
+  desc = pango_font_description_from_string (GBONDS_PRINT_HEADER_FONT);
+  pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
+  pango_font_description_set_size (desc,
+                                   GBONDS_PRINT_HEADER_FONT_SIZE
+                                   * PANGO_SCALE);
+  pango_layout_set_font_description (layout, desc);
+
+  title = gb_doc_get_title (pi->view->doc);
+  if (!title)
+    title = g_strdup ("");
+
+  pango_layout_set_text (layout, title, -1);
+  g_free (title);
+  pango_layout_get_pixel_size (layout, &text_width, NULL);
+  pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+  cairo_move_to (cr, (width - text_width) / 2, 0);
+  pango_cairo_show_layout (cr, layout);
+
+  pango_font_description_set_size (desc,
+                                   (GBONDS_PRINT_HEADER_FONT_SIZE - 2)
+                                   * PANGO_SCALE);
+  pango_layout_set_font_description (layout, desc);
+  pango_font_description_free (desc);
+  pango_layout_set_text (layout, _("Savings Bond Inventory Report"), -1);
+  pango_layout_get_pixel_size (layout, &text_width, NULL);
+  cairo_move_to (cr, (width - text_width) / 2, GBONDS_PRINT_HEADER_FONT_SIZE);
+  pango_cairo_show_layout (cr, layout);
+  g_object_unref (layout);
+
+  layout = gtk_print_context_create_pango_layout (ctxt);
+  desc = pango_font_description_from_string (GBONDS_PRINT_BODY_FONT);
+  pango_font_description_set_size (desc,
+                                   GBONDS_PRINT_BODY_FONT_SIZE * PANGO_SCALE);
+
+  if (!pi->view->doc->list) {
+    pango_layout_set_font_description (layout, desc);
+    pango_layout_set_text (layout, _("(Empty Inventory)"), -1);
+    pango_layout_get_pixel_size (layout, &text_width, NULL);
+    cairo_move_to (cr, (width - text_width) / 2,
+                   2 * GBONDS_PRINT_HEADER_FONT_SIZE);
+    pango_cairo_show_layout (cr, layout);
+  } else if (page_nr < pi->n_pages - 1) {
+    pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
+    pango_layout_set_font_description (layout, desc);
+    pango_layout_set_text (layout, _("Redemption Date: "), -1);
+    cairo_move_to (cr, 0, 5 * GBONDS_PRINT_HEADER_FONT_SIZE);
+    pango_cairo_show_layout (cr, layout);
+
+    pango_layout_get_pixel_size (layout, &text_width, NULL);
+    pango_font_description_set_weight (desc, PANGO_WEIGHT_NORMAL);
+    pango_layout_set_font_description (layout, desc);
+    pango_layout_set_text (layout, pi->view->rdate, -1);
+    cairo_rel_move_to (cr, text_width, 0);
+    pango_cairo_show_layout (cr, layout);
+
+    for (p = pi->view->doc->list; p; p = p->next) {
+      /* Skip bonds that are already drawn.  */
+      if (page_nr > 0
+          && pi->to_skip <= GBONDS_PRINT_BONDS_PER_PAGE * page_nr) {
+        pi->to_skip++;
+        continue;
+      }
+      p_bond = (gbDocBond *)p->data;
 
-	print_table_headers( pi );
+      if ((pi->i_bond % GBONDS_PRINT_BONDS_PER_PAGE) == 0) {
+        /* Draw table headers.  */
+        pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
+        pango_layout_set_font_description (layout, desc);
+        pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+
+        pango_layout_set_text (layout, _("Serial Number"), -1);
+        pango_layout_get_pixel_size (layout, &text_width, NULL);
+        cairo_move_to (cr, 0, 8 * GBONDS_PRINT_BODY_FONT_SIZE);
+        pango_cairo_show_layout (cr, layout);
+        cairo_rel_move_to (cr, 0, 1.3 * GBONDS_PRINT_BODY_FONT_SIZE);
+        cairo_line_to (cr, text_width, 9.3 * GBONDS_PRINT_BODY_FONT_SIZE);
+        cairo_stroke (cr);
+
+        pango_layout_set_text (layout, _("Denom. & Series"), -1);
+        cairo_move_to (cr, text_width + 1, 7 * GBONDS_PRINT_BODY_FONT_SIZE);
+        pango_layout_get_size (layout, &text_width, NULL);
+        pango_layout_set_width (layout, text_width - 1);
+        pango_layout_get_pixel_size (layout, &text_width, NULL);
+        pango_layout_get_pixel_extents (layout, NULL, &rect);
+        cairo_get_current_point (cr, &x, NULL);
+        pango_cairo_show_layout (cr, layout);
+        cairo_move_to (cr, x + rect.x, 9.3 * GBONDS_PRINT_BODY_FONT_SIZE);
+        cairo_rel_line_to (cr, text_width, 0);
+        cairo_get_current_point (cr, &x, NULL);
+        cairo_stroke (cr);
+
+        pango_layout_set_text (layout, _("Issue Date"), -1);
+        cairo_move_to (cr, x + 5, 7 * GBONDS_PRINT_BODY_FONT_SIZE);
+        pango_layout_get_size (layout, &text_width, NULL);
+        pango_layout_set_width (layout, text_width - 1);
+        pango_layout_get_pixel_size (layout, &text_width, NULL);
+        pango_cairo_show_layout (cr, layout);
+        pango_layout_get_pixel_extents (layout, NULL, &rect);
+        cairo_move_to (cr, x + rect.x, 9.3 * GBONDS_PRINT_BODY_FONT_SIZE);
+        cairo_rel_line_to (cr, rect.width + 10, 0);
+        cairo_get_current_point (cr, &x, NULL);
+        cairo_stroke (cr);
+
+        pango_layout_set_text (layout, _("Value"), -1);
+        cairo_move_to (cr, x + 10, 8 * GBONDS_PRINT_BODY_FONT_SIZE);
+        pango_layout_get_pixel_extents (layout, NULL, &rect);
+        pango_cairo_show_layout (cr, layout);
+        cairo_move_to (cr, x + rect.x, 9.3 * GBONDS_PRINT_BODY_FONT_SIZE);
+        cairo_rel_line_to (cr, rect.width + 20, 0);
+        cairo_get_current_point (cr, &x, NULL);
+        cairo_stroke (cr);
+
+        pango_layout_set_text (layout, _("Interest"), -1);
+        cairo_move_to (cr, x + 15, 8 * GBONDS_PRINT_BODY_FONT_SIZE);
+        pango_layout_get_pixel_extents (layout, NULL, &rect);
+        pango_cairo_show_layout (cr, layout);
+        cairo_move_to (cr, x + 15 + rect.x, 9.3 * GBONDS_PRINT_BODY_FONT_SIZE);
+        cairo_rel_line_to (cr, rect.width + 5, 0);
+        cairo_get_current_point (cr, &x, NULL);
+        cairo_stroke (cr);
+
+        pango_layout_set_text (layout, _("Yield To Date"), -1);
+        cairo_move_to (cr, x + 10, 7 * GBONDS_PRINT_BODY_FONT_SIZE);
+        pango_layout_get_size (layout, &text_width, NULL);
+        pango_layout_set_width (layout, text_width - 1);
+        pango_layout_get_pixel_size (layout, &text_width, NULL);
+        pango_cairo_show_layout (cr, layout);
+        pango_layout_get_pixel_extents (layout, NULL, &rect);
+        cairo_move_to (cr, x + 10 + rect.x, 9.3 * GBONDS_PRINT_BODY_FONT_SIZE);
+        cairo_rel_line_to (cr, rect.width, 0);
+        cairo_get_current_point (cr, &x, NULL);
+        cairo_stroke (cr);
+
+        pango_layout_set_text (layout, _("Next Accrual"), -1);
+        cairo_move_to (cr, x + 10, 7 * GBONDS_PRINT_BODY_FONT_SIZE);
+        pango_layout_get_size (layout, &text_width, NULL);
+        pango_layout_set_width (layout, text_width - 1);
+        pango_layout_get_pixel_size (layout, &text_width, NULL);
+        pango_cairo_show_layout (cr, layout);
+        pango_layout_get_pixel_extents (layout, NULL, &rect);
+        cairo_move_to (cr, x + 10 + rect.x, 9.3 * GBONDS_PRINT_BODY_FONT_SIZE);
+        cairo_rel_line_to (cr, rect.width, 0);
+        cairo_get_current_point (cr, &x, NULL);
+        cairo_stroke (cr);
+
+        pango_layout_set_text (layout, _("Final Maturity"), -1);
+        cairo_move_to (cr, x + 10, 7 * GBONDS_PRINT_BODY_FONT_SIZE);
+        pango_layout_get_size (layout, &text_width, NULL);
+        pango_layout_set_width (layout, text_width - 1);
+        pango_layout_get_pixel_size (layout, &text_width, NULL);
+        pango_cairo_show_layout (cr, layout);
+        pango_layout_get_pixel_extents (layout, NULL, &rect);
+        cairo_move_to (cr, x + 10 + rect.x, 9.3 * GBONDS_PRINT_BODY_FONT_SIZE);
+        cairo_rel_line_to (cr, rect.width, 0);
+        cairo_get_current_point (cr, &x, NULL);
+        cairo_stroke (cr);
+
+        pango_font_description_set_weight (desc, PANGO_WEIGHT_NORMAL);
+        pango_layout_set_font_description (layout, desc);
+        pango_layout_set_width (layout, -1);
+        cairo_move_to (cr, 0, 10 * GBONDS_PRINT_BODY_FONT_SIZE);
       }
 
-      info = gb_doc_bond_get_info( p_bond, view->rdate, &status );
-      if ( info == NULL ) {
-	return;
+      info = gb_doc_bond_get_info (p_bond, pi->view->rdate, &status);
+      if (!info) {
+        g_warning ("Unexpected error while getting data for printing");
+        gtk_print_operation_cancel (op);
+        return;
       }
-      print_bond_info( pi, info );
 
-      i_bond++;
-      inventory_value += info->value;
-      total_interest  += info->interest;
-      if ( !info->nopay_flag ) redemption_value += info->value;
+      /* This is broken by design; column width and position depend on
+         the translations of the table header strings.  */
+      line
+        = g_strdup_printf ("%-13s %7s %-2s   %7s %10s %10s   %6s   %7s  %7s %s",
+                           info->sn, info->denom_str, info->series,
+                           info->issue_date, info->value_str,
+                           info->interest_str, info->yield_str,
+                           info->next_accrual, info->final_maturity,
+                           info->flag_str);
+      pango_layout_set_text (layout, line, -1);
+      g_free (line);
+      cairo_rel_move_to (cr, 0, GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+
+      pi->i_bond++;
+      pi->inventory_value += info->value;
+      pi->total_interest  += info->interest;
+      if (!info->nopay_flag)
+        pi->redemption_value += info->value;
 
       gb_doc_bond_free_info( info );
       info = NULL;
-    }
-    gnome_print_showpage( pi->pc );
-
-    /*---------------------------------------------*/
-    /* Finish up with a summary page.              */
-    /*---------------------------------------------*/
-    i_page++;
-    page_str = g_strdup_printf( "%d", i_page );
-    gnome_print_beginpage( pi->pc, (guchar *)page_str );
-    g_free( page_str );
-    print_page_header( pi, title, basename, i_page, n_pages, date_string );
-    print_summary( pi,
-		   view->rdate, n_bonds,
-		   inventory_value, redemption_value, total_interest );
-    print_legend( pi );
-    gnome_print_showpage( pi->pc );
-  }
-
-  print_info_free( pi );
-  g_free( basename );
-  g_free( title );
-  g_free( date_string );
-}
-
-
-
-
-/*==================================================*/
-/* PRIVATE.  Print page header and footer           */
-/*==================================================*/
-static void
-print_page_header( PrintInfo   *pi,
-		   gchar       *title,
-		   gchar       *name,
-		   gint         i_page,
-		   gint         n_pages,
-		   const gchar *date_string )
-{
-  gchar *string;
-
-  if ( title == NULL ) {
-    title = "";
-  }
-  if ( name == NULL ) {
-    name = _("Unsaved Inventory");
-  }
-
-  print_goto_header( pi );
-
-  print_font( pi, GBONDS_PRINT_HEADER_FONT, GBONDS_PRINT_HEADER_FONT_SIZE );
-  print_goto_center( pi );
-  print_show_center( pi, title );
-  print_goto_next_line( pi );
-
-  print_font( pi, GBONDS_PRINT_HEADER_FONT, GBONDS_PRINT_HEADER_FONT_SIZE-2 );
-  print_goto_center( pi );
-  print_show_center( pi, _("Savings Bond Inventory Report") );
-
-  print_goto_footer( pi );
-  print_font( pi, GBONDS_PRINT_HEADER_FONT, GBONDS_PRINT_HEADER_FONT_SIZE-2 );
-
-  string = g_strdup_printf( "%s  %s", date_string, name );
-  print_show( pi, string );
-  g_free( string );
-
-  print_goto_eol( pi );
-  string = g_strdup_printf( _("%d of %d"), i_page, n_pages );
-  print_show_right( pi, string );
-  g_free( string );
-}
-
-
-
-
-/*==================================================*/
-/* PRIVATE.  Print "empty inventory" message.       */
-/*==================================================*/
-static void
-print_empty_inventory (PrintInfo *pi)
-{
-  print_font( pi, GBONDS_PRINT_BODY_FONT, GBONDS_PRINT_BODY_FONT_SIZE );
-
-  print_goto_line( pi, 2 );
-  print_show( pi, _("(Empty Inventory)") );
-}
-
-
-
-
-/*==================================================*/
-/* PRIVATE.  Print redemption date                  */
-/*==================================================*/
-static void
-print_redemption_date (PrintInfo *pi,
-		       gchar     *rdate)
-{
-  print_font( pi, GBONDS_PRINT_BODY_FONT, GBONDS_PRINT_BODY_FONT_SIZE );
-
 
-  print_bold( pi );
-  print_show( pi, _("Redemption Date: ") );
-  print_bold_end( pi );
-
-  print_show( pi, rdate );
-
-  print_goto_next_line( pi );
-}
-
-
-
-
-/*==================================================*/
-/* PRIVATE.  Print table headers                    */
-/*==================================================*/
-static void
-print_table_headers (PrintInfo *pi)
-{
-  gint n = 5, m=1;
-
-  gnome_print_setlinewidth( pi->pc, 1.0 );
-
-  print_font( pi, GBONDS_PRINT_BODY_FONT, GBONDS_PRINT_BODY_FONT_SIZE );
-  print_bold( pi );
-
-  print_goto_line( pi, n+1 );
-  print_goto_column( pi, m );
-  print_show( pi, _("Serial Number") );
-  print_goto_column( pi, m );
-  print_hbar( pi, 13 );
-  m += 14;
-
-  print_goto_line( pi, n );
-  print_goto_column( pi, m );
-  print_show( pi, _(" Denom. &") );
-  print_goto_line( pi, n+1 );
-  print_goto_column( pi, m );
-  print_show( pi, _("  Series") );
-  print_goto_column( pi, m );
-  print_hbar( pi, 10 );
-  m += 11;
-  
-  print_goto_line( pi, n );
-  print_goto_column( pi, m );
-  print_show( pi, _(" Issue") );
-  print_goto_line( pi, n+1 );
-  print_goto_column( pi, m );
-  print_show( pi, _(" Date") );
-  print_goto_column( pi, m );
-  print_hbar( pi, 7 );
-  m += 8;
-
-  print_goto_line( pi, n+1 );
-  print_goto_column( pi, m );
-  print_show( pi, _("  Value") );
-  print_goto_column( pi, m );
-  print_hbar( pi, 10 );
-  m += 11;
-  
-  print_goto_line( pi, n+1 );
-  print_goto_column( pi, m );
-  print_show( pi, _(" Interest") );
-  print_goto_column( pi, m );
-  print_hbar( pi, 10 );
-  m += 11;
-  
-  print_goto_line( pi, n );
-  print_goto_column( pi, m );
-  print_show( pi, _(" Yield") );
-  print_goto_line( pi, n+1 );
-  print_goto_column( pi, m );
-  print_show( pi, _("To Date") );
-  print_goto_column( pi, m );
-  print_hbar( pi, 7 );
-  m += 8;
-  
-  print_goto_line( pi, n );
-  print_goto_column( pi, m );
-  print_show( pi, _(" Next") );
-  print_goto_line( pi, n+1 );
-  print_goto_column( pi, m );
-  print_show( pi, _("Accrual") );
-  print_goto_column( pi, m );
-  print_hbar( pi, 7 );
-  m += 8;
-  
-  print_goto_line( pi, n );
-  print_goto_column( pi, m );
-  print_show( pi, _(" Final") );
-  print_goto_line( pi, n+1 );
-  print_goto_column( pi, m );
-  print_show( pi, _("Maturity") );
-  print_goto_column( pi, m );
-  print_hbar( pi, 8 );
-
-  print_bold_end( pi );
-  print_goto_line( pi, n+2 );
-}
-
-
-
-
-/*==================================================*/
-/* PRIVATE.  Print bond information (table line)    */
-/*==================================================*/
-static void
-print_bond_info (PrintInfo     *pi,
-		 gbDocBondInfo *info)
-{
-  gchar *line;
-
-  print_font( pi, GBONDS_PRINT_BODY_FONT, GBONDS_PRINT_BODY_FONT_SIZE );
-
-  print_goto_next_line( pi );
-  line = g_strdup_printf(  "%-13s %7s %-2s %7s %10s %10s %6s  %7s %7s %s",
-			   info->sn, info->denom_str, info->series,
-			   info->issue_date, info->value_str,
-			   info->interest_str, info->yield_str,
-			   info->next_accrual, info->final_maturity,
-			   info->flag_str );
-  print_show( pi, line );
-  g_free( line );
-}
-
-
-
-
-/*==================================================*/
-/* PRIVATE.  Print legend at bottom of each page.   */
-/*==================================================*/
-static void
-print_legend (PrintInfo *pi)
-{
-  print_font( pi, GBONDS_PRINT_BODY_FONT, GBONDS_PRINT_BODY_FONT_SIZE );
-
-  print_goto_next_line( pi );
-  print_goto_next_line( pi );
+      if ((pi->i_bond % GBONDS_PRINT_BONDS_PER_PAGE) == 0)
+        break;
+    }
+  } else {
+      /* Draw the summary page.  */
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
+      pango_layout_set_font_description (layout, desc);
+      pango_layout_set_text (layout, _("Summary"), -1);
+      cairo_move_to (cr, 0, 5 * GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+
+      pango_layout_set_text (layout, _("Redemption Date:  "), -1);
+      cairo_rel_move_to (cr, 0, 2 * GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+      pango_layout_get_pixel_size (layout, &text_width, NULL);
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_NORMAL);
+      pango_layout_set_font_description (layout, desc);
+      line = g_strdup_printf ("%12s", pi->view->rdate);
+      pango_layout_set_text (layout, line, -1);
+      g_free (line);
+      cairo_rel_move_to (cr, text_width, 0);
+      pango_cairo_show_layout (cr, layout);
+
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
+      pango_layout_set_font_description (layout, desc);
+      pango_layout_set_text (layout, _("Number of Bonds:  "), -1);
+      cairo_rel_move_to (cr, -text_width, GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+      pango_layout_get_pixel_size (layout, &text_width, NULL);
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_NORMAL);
+      pango_layout_set_font_description (layout, desc);
+      line = g_strdup_printf ("%12d", pi->n_bonds);
+      pango_layout_set_text (layout, line, -1);
+      g_free (line);
+      cairo_rel_move_to (cr, text_width, 0);
+      pango_cairo_show_layout (cr, layout);
+
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
+      pango_layout_set_font_description (layout, desc);
+      pango_layout_set_text (layout, _("Inventory Value:  "), -1);
+      cairo_rel_move_to (cr, -text_width, GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+      pango_layout_get_pixel_size (layout, &text_width, NULL);
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_NORMAL);
+      pango_layout_set_font_description (layout, desc);
+      buf = gb_value_fmt (pi->inventory_value, TRUE);
+      line = g_strdup_printf ("%12s", buf);
+      g_free (buf);
+      pango_layout_set_text (layout, line, -1);
+      g_free (line);
+      cairo_rel_move_to (cr, text_width, 0);
+      pango_cairo_show_layout (cr, layout);
+
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
+      pango_layout_set_font_description (layout, desc);
+      pango_layout_set_text (layout, _("Redemption Value: "), -1);
+      cairo_rel_move_to (cr, -text_width, GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+      pango_layout_get_pixel_size (layout, &text_width, NULL);
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_NORMAL);
+      pango_layout_set_font_description (layout, desc);
+      buf = gb_value_fmt (pi->redemption_value, TRUE);
+      line = g_strdup_printf ("%12s", buf);
+      g_free (buf);
+      pango_layout_set_text (layout, line, -1);
+      g_free (line);
+      cairo_rel_move_to (cr, text_width, 0);
+      pango_cairo_show_layout (cr, layout);
+
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
+      pango_layout_set_font_description (layout, desc);
+      pango_layout_set_text (layout, _("Total Interest:   "), -1);
+      cairo_rel_move_to (cr, -text_width, GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+      pango_layout_get_pixel_size (layout, &text_width, NULL);
+      pango_font_description_set_weight (desc, PANGO_WEIGHT_NORMAL);
+      pango_layout_set_font_description (layout, desc);
+      buf = gb_value_fmt (pi->total_interest, TRUE);
+      line = g_strdup_printf ("%12s", buf);
+      g_free (buf);
+      pango_layout_set_text (layout, line, -1);
+      g_free (line);
+      cairo_rel_move_to (cr, text_width, 0);
+      pango_cairo_show_layout (cr, layout);
+
+      pango_layout_set_text (layout, _("Notes:"), -1);
+      cairo_rel_move_to (cr, -text_width, 3 * GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+      pango_layout_set_text (layout, _("* = Bond is not yet eligible for "
+                                       "redemption."), -1);
+      cairo_rel_move_to (cr, 0, GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+      pango_layout_set_text (layout, _("M = Bond has reached final maturity."),
+                             -1);
+      cairo_rel_move_to (cr, 0, GBONDS_PRINT_BODY_FONT_SIZE);
+      pango_cairo_show_layout (cr, layout);
+    }
 
-  print_goto_next_line( pi );
-  print_show( pi, _("Notes:") );
+  pango_font_description_free (desc);
+  g_object_unref (layout);
 
-  print_goto_next_line( pi );
-  print_show( pi, _("* = Bond is not yet eligible for redemption.") );
+  /* Format date string */
+  t = time (NULL);
+  tm = localtime (&t);
+  date_string = g_strdup_printf ("%02d/%02d/%4d %2d:%02d %s",
+                                 tm->tm_mon+1, tm->tm_mday, tm->tm_year+1900,
+                                 (tm->tm_hour%12) ? tm->tm_hour%12 : 12,
+                                 tm->tm_min,
+                                 (tm->tm_hour/12) ? "PM" : "AM");
+  basename = gb_doc_get_short_name (pi->view->doc);
+  if (!basename)
+    basename = g_strdup (_("Unsaved Inventory"));
+
+  layout = gtk_print_context_create_pango_layout (ctxt);
+  desc = pango_font_description_from_string (GBONDS_PRINT_HEADER_FONT);
+  pango_font_description_set_size (desc,
+                                   (GBONDS_PRINT_HEADER_FONT_SIZE - 2)
+                                   * PANGO_SCALE);
+  pango_layout_set_font_description (layout, desc);
+  pango_font_description_free (desc);
+
+  footer = g_strdup_printf ("%s  %s", date_string, basename);
+  pango_layout_set_text (layout, footer, -1);
+  g_free (date_string);
+  g_free (basename);
+  g_free (footer);
+  height = gtk_print_context_get_height (ctxt);
+  cairo_move_to (cr, 0, height - GBONDS_PRINT_HEADER_FONT_SIZE - 2);
+  pango_cairo_show_layout (cr, layout);
+
+  footer = g_strdup_printf (_("%d of %d"), page_nr + 1, pi->n_pages);
+  pango_layout_set_text (layout, footer, -1);
+  g_free (footer);
+  pango_layout_get_pixel_size (layout, &text_width, NULL);
+  cairo_rel_move_to (cr, width - text_width, 0);
+  pango_cairo_show_layout (cr, layout);
 
-  print_goto_next_line( pi );
-  print_show( pi, _("M = Bond has reached final maturity.") );
+  g_object_unref (layout);
 }
 
-
-
-
-/*==================================================*/
-/* PRIVATE.  Print inventory summary information.   */
-/*==================================================*/
-static void
-print_summary (PrintInfo *pi,
-	       gchar *rdate, gint n_bonds,
-	       gdouble inventory_value,
-	       gdouble redemption_value,
-	       gdouble total_interest)
+void
+end_print_cb (GtkPrintOperation *op,
+              GtkPrintContext   *ctxt,
+              gpointer           user_data)
 {
-  gchar *string;
-  gchar *buf;
+  PrintInfo *pi = (PrintInfo *)user_data;
 
-  print_font( pi, GBONDS_PRINT_BODY_FONT, GBONDS_PRINT_BODY_FONT_SIZE );
-
-  print_goto_line( pi, 3 );
-  print_bold( pi );
-  print_show( pi, _("Summary") );
-  print_bold_end( pi );
-
-  print_goto_next_line( pi );
-
-  print_goto_next_line( pi );
-  print_bold( pi );
-  print_show( pi, _("Redemption Date:  ") );
-  print_bold_end( pi );
-  string = g_strdup_printf( "%12s", rdate );
-  print_show( pi, string );
-  g_free( string );
-
-  print_goto_next_line( pi );
-  print_bold( pi );
-  print_show( pi, _("Number of Bonds:  ") );
-  print_bold_end( pi );
-  string = g_strdup_printf( "%12d", n_bonds );
-  print_show( pi, string );
-  g_free( string );
-
-  print_goto_next_line( pi );
-  print_bold( pi );
-  print_show( pi, _("Inventory Value:  ") );
-  print_bold_end( pi );
-  buf = gb_value_fmt( inventory_value, TRUE );
-  string = g_strdup_printf( "%12s", buf );
-  g_free( buf );
-  print_show( pi, string );
-  g_free( string );
-
-  print_goto_next_line( pi );
-  print_bold( pi );
-  print_show( pi, _("Redemption Value: ") );
-  print_bold_end( pi );
-  buf = gb_value_fmt( redemption_value, TRUE );
-  string = g_strdup_printf( "%12s", buf );
-  g_free( buf );
-  print_show( pi, string );
-  g_free( string );
-
-  print_goto_next_line( pi );
-  print_bold( pi );
-  print_show( pi, _("Total Interest:   ") );
-  print_bold_end( pi );
-  buf = gb_value_fmt( total_interest, TRUE );
-  string = g_strdup_printf( "%12s", buf );
-  g_free( buf );
-  print_show( pi, string );
-  g_free( string );
+  g_free (pi);
 }
 
 
@@ -535,254 +455,19 @@
 /*==================================================*/
 /* PRIVATE.  new print info structure               */
 /*==================================================*/
-static PrintInfo *
-print_info_new (GnomePrintJob *job)
+PrintInfo *
+print_info_new (gbView *view)
 {
   PrintInfo *pi = g_new0( PrintInfo, 1 );
 
-  pi->pc = gnome_print_job_get_context (job);
-
-  pi->config = gnome_print_job_get_config (job);
-
-  gnome_print_config_get_length (pi->config,
-				 (guchar *)GNOME_PRINT_KEY_PAPER_WIDTH,
-				 &pi->page_width,
-				 NULL);
-  gnome_print_config_get_length (pi->config,
-				 (guchar *)GNOME_PRINT_KEY_PAPER_HEIGHT,
-				 &pi->page_height,
-				 NULL);
-
-  gnome_print_config_get_length (pi->config,
-				 (guchar *)GNOME_PRINT_KEY_PAGE_MARGIN_TOP,
-				 &pi->margin_top,
-				 NULL);
-  gnome_print_config_get_length (pi->config,
-				 (guchar *)GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM,
-				 &pi->margin_bottom,
-				 NULL);
-  gnome_print_config_get_length (pi->config,
-				 (guchar *)GNOME_PRINT_KEY_PAGE_MARGIN_LEFT,
-				 &pi->margin_left,
-				 NULL);
-  gnome_print_config_get_length (pi->config,
-				 (guchar *)GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT,
-				 &pi->margin_right,
-				       NULL);
-
-  pi->x_lmargin = pi->margin_left;
-  pi->x_rmargin = pi->page_width - pi->margin_right;
-  pi->y_tmargin = pi->page_height - pi->margin_top;
-  pi->y_bmargin = pi->margin_bottom;
-  
-  pi->font_name = NULL;
+  pi->view = view;
+  pi->n_bonds = 0;
+  pi->i_bond = 0;
+  pi->to_skip = 1;
+  pi->inventory_value = 0.0;
+  pi->redemption_value = 0.0;
+  pi->total_interest = 0.0;
 
   return pi;
 }
 
-
-
-
-/*==================================================*/
-/* PRIVATE.  free print info structure              */
-/*==================================================*/
-static void print_info_free( PrintInfo *pi )
-{
-  gnome_print_context_close( pi->pc );
-
-  g_free( pi->font_name );
-  pi->font_name = NULL;
-
-  g_free( pi );
-}
-
-
-
-
-/*==================================================*/
-/* PRIVATE.  Set new font.                          */
-/*==================================================*/
-static void print_font( PrintInfo *pi, gchar *name, gint size )
-{
-  pi->font = gnome_font_find_closest_from_weight_slant ((guchar *)name,
-							GNOME_FONT_BOOK,
-							FALSE,
-							size);
-  gnome_print_setfont( pi->pc, pi->font );
-  
-  g_free( pi->font_name );
-  pi->font_name = g_strdup( name );
-  pi->font_size    = size;
-  pi->font_spacing = size;
-  pi->font_italic  = FALSE;
-}
-
-
-
-
-/*==================================================*/
-/* PRIVATE.  Embolden current font.                 */
-/*==================================================*/
-static void print_bold( PrintInfo *pi )
-{
-  pi->font = gnome_font_find_closest_from_weight_slant ((guchar *)pi->font_name,
-							GNOME_FONT_BOLD,
-							pi->font_italic,
-							pi->font_size);
-  gnome_print_setfont( pi->pc, pi->font );
-}
-
-
-
-
-/*==================================================*/
-/* PRIVATE.  End Embolden.                          */
-/*==================================================*/
-static void print_bold_end( PrintInfo *pi )
-{
-  pi->font = gnome_font_find_closest_from_weight_slant ((guchar *)pi->font_name,
-							GNOME_FONT_BOOK,
-							pi->font_italic,
-							pi->font_size);
-  gnome_print_setfont( pi->pc, pi->font );
-}
-
-
-
-
-/*===================================================*/
-/* PRIVATE.  Show text starting at current position. */
-/*===================================================*/
-static void print_show( PrintInfo *pi, gchar *text )
-{
-  gnome_print_show( pi->pc, (guchar *)text );
-  pi->x += gnome_font_get_width_utf8( pi->font, text );
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-}
-
-
-
-
-/*===================================================*/
-/* PRIVATE.  Show text anchored on the right.        */
-/*===================================================*/
-static void print_show_right( PrintInfo *pi, gchar *text )
-{
-  pi->x -= gnome_font_get_width_utf8( pi->font, text );
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-  gnome_print_show( pi->pc, (guchar *)text );
-}
-
-
-
-/*=====================================================*/
-/* PRIVATE.  Show text centered about current position */
-/*=====================================================*/
-static void print_show_center( PrintInfo *pi, gchar *text )
-{
-  pi->x -= gnome_font_get_width_utf8( pi->font, text ) / 2.0;
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-  gnome_print_show( pi->pc, (guchar *)text );
-}
-
-
-
-
-/*=============================================================*/
-/* PRIVATE.  Goto line n.  Assume current font's line spacing. */
-/*=============================================================*/
-static void print_goto_line( PrintInfo *pi, gint n )
-{
-  pi->x = pi->x_lmargin;
-  pi->y = pi->y_tmargin - n*pi->font_spacing;
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-}
-
-
-
-
-/*=============================================================*/
-/* PRIVATE.  Goto next line.                                   */
-/*=============================================================*/
-static void print_goto_next_line( PrintInfo *pi )
-{
-  pi->x = pi->x_lmargin;
-  pi->y -= pi->font_spacing;
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-}
-
-
-
-
-/*===================================================*/
-/* PRIVATE.  Goto header, just above top margin.     */
-/*===================================================*/
-static void print_goto_header( PrintInfo *pi )
-{
-  pi->x = pi->x_lmargin;
-  pi->y = pi->y_tmargin + 24;
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-}
-
-
-/*===================================================*/
-/* PRIVATE.  Goto footer, just below bottom margin.  */
-/*===================================================*/
-static void print_goto_footer( PrintInfo *pi )
-{
-  pi->x = pi->x_lmargin;
-  pi->y = pi->y_bmargin - 6;
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-}
-
-
-
-
-/*===================================================*/
-/* PRIVATE.  Goto right margin.                      */
-/*===================================================*/
-static void print_goto_eol( PrintInfo *pi )
-{
-  pi->x = pi->x_rmargin;
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-}
-
-
-
-
-/*===================================================*/
-/* PRIVATE.  Goto center of line.                    */
-/*===================================================*/
-static void print_goto_center( PrintInfo *pi )
-{
-  pi->x = (pi->x_lmargin + pi->x_rmargin) / 2.0;
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-}
-
-
-
-
-/*===============================================================*/
-/* PRIVATE.  Goto column n.  Assumes current font is fixedwidth. */
-/*===============================================================*/
-static void print_goto_column( PrintInfo *pi, gint n )
-{
-  pi->x = pi->x_lmargin + (n-1)*gnome_font_get_width_utf8( pi->font, "#" );
-  gnome_print_moveto( pi->pc, pi->x, pi->y );
-}
-
-
-
-
-/*===============================================================*/
-/* PRIVATE.  Draw n column horizontal line.                      */
-/*===============================================================*/
-static void print_hbar( PrintInfo *pi, gint n )
-{
-  gnome_print_moveto( pi->pc, pi->x, pi->y - 0.3*pi->font_spacing );
-
-  pi->x += (n)*gnome_font_get_width_utf8( pi->font, " " );
-  gnome_print_lineto( pi->pc, pi->x, pi->y - 0.3*pi->font_spacing );
-  gnome_print_stroke( pi->pc );
-}
-
--- a/src/print.h
+++ b/src/print.h
@@ -22,15 +22,26 @@
 #ifndef __PRINT_H__
 #define __PRINT_H__
 
-#include <gnome.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
 #include "view.h"
 
 G_BEGIN_DECLS
 
-void gb_print (GnomePrintJob    *job,
-	       gbView           *view);
+typedef struct _PrintInfo PrintInfo;
+
+PrintInfo *print_info_new (gbView *view);
+
+void begin_print_cb (GtkPrintOperation *op,
+                     GtkPrintContext   *ctxt,
+                     gpointer           user_data);
+
+void draw_page_cb (GtkPrintOperation *op,
+                   GtkPrintContext   *ctxt,
+                   gint               page_nr,
+                   gpointer           user_data);
+
+void end_print_cb (GtkPrintOperation *op,
+                   GtkPrintContext   *ctxt,
+                   gpointer           user_data);
 
 G_END_DECLS
 
--- a/src/gbonds-ui.xml
+++ /dev/null
@@ -1,240 +0,0 @@
-<Root>
-
-<commands>
-        <cmd name="FileNew" _label="New"
-	_tip="Create a new document" pixtype="stock" pixname="gtk-new" accel="*Control*N"/>
-        
-        <cmd name="FileOpen" _label="Open"
-	_tip="Open a file" pixtype="stock" pixname="gtk-open" accel="*Control*O"/>
-	
-        <cmd name="FileImport" _label="Import"
-	_tip="Import an SBW Inventory" pixtype="stock" pixname="gtk-convert"/>
-	
-        <cmd name="FileSave" _label="Save"
-	_tip="Save the current file" pixtype="stock" pixname="gtk-save"
-	accel="*Control*S"/>
-	
-        <cmd name="FileSaveAs" _label="Save As"
-        _tip="Save the current file with a different name"
-	pixtype="stock" pixname="gtk-save-as"
-	accel="*Shift**Control*S"/>
-
-        <cmd name="FilePrint" _label="Print"
-	_tip="Print the current file" pixtype="stock" pixname="gtk-print"
-	accel="*Control*P"/>
-	
-        <cmd name="FileClose" _label="Close"
-	_tip="Close the current file" pixtype="stock" pixname="gtk-close"
-	accel="*Control*W"/>
-
-        <cmd name="FileExit" _label="Quit" _tip="Quit the program"
-        pixtype="stock" pixname="gtk-quit" accel="*Control*Q"/>
-
-
-
-	<cmd name="EditUndo" _label="Undo" _tip="Undo the last action"
-        pixtype="stock" pixname="gtk-undo" accel="*Control*Z"/>
-	
-        <cmd name="EditRedo" _label="Redo" _tip="Redo the undone action"
-        pixtype="stock" pixname="gtk-redo" accel="*Shift**Control*Z"/>
-	
-        <cmd name="EditCut" _label="Cut" _tip="Cut the selection"
-        pixtype="stock" pixname="gtk-cut" accel="*Control*X"/>
-	
-        <cmd name="EditCopy" _label="Copy"
-	_tip="Copy the selection" pixtype="stock" pixname="gtk-copy" accel="*Control*c"/>
-	
-        <cmd name="EditPaste" _label="Paste"
-	_tip="Paste the clipboard" pixtype="stock" pixname="gtk-paste" accel="*Control*v"/>
-	
-        <cmd name="EditAdd" _label="Add" _tip="Add bond"
-        pixtype="stock" pixname="gtk-add"/>
-
-        <cmd name="EditDelete" _label="Delete" _tip="Delete the selected bonds"
-        pixtype="stock" pixname="gtk-delete" accel="Delete"/>
-
-        <cmd name="EditTitle" _label="_Title" _tip="Edit title"/>
-
-	<cmd name="EditSelectAll" _label="Select All" _tip="Select all objects"
-	accel="*Control*A"/>     
-
-	<cmd name="EditUnSelectAll" _label="Un-select All" _tip="Remove all selections"
-	accel="*Shift**Control*Z"/>
-
-	<cmd name="ViewMainToolbar" _label="_Main Toolbar" type="toggle"
-	_tip="Change the visibility of the main toolbar in the current window" state="0"/>
-
-        <cmd name="MainToolbarSystem" id="MainToolbarSystem" _label="_Desktop Default" type="radio" 
-         group="main_buttons" state = "1" _tip="Set main toolbar button style according to desktop default"/>
-
-	<cmd name="MainToolbarIcon" id="MainToolbarIcon" _label="_Icon" type="radio" 
-	 group="main_buttons" _tip="Only show icons in the main toolbar"/>
-
-	<cmd name="MainToolbarIconText" id="MainToolbarIconText" _label="Icon and _Text" type="radio" 
-	 group="main_buttons" _tip ="Show both icons and texts in the main toolbar"/>
-
-	<cmd name="MainToolbarTooltips" id="MainToolbarTooltips" _label="Show _Tooltips" type="toggle"
-	_tip="Show tooltips in the main toolbar" state="1"/>
-
-        <cmd name="SettingsPreferences" _label="Preferences" _tip="Configure the application"
-	  pixtype="stock" pixname="gtk-preferences"/>
-
-        <cmd name="SettingsUpdate" _label="_Update redemption tables" _tip="Update redemption tables druid"/>
-
-	<cmd name="BonoboCustomize" _label="Customize" _tip="Customize toolbars"/>
-
-	<cmd name="HelpContents" _label="Contents" _tip="Open the gbonds manual"
-	accel="F1" pixtype="stock" pixname="gtk-help"/>
-
-        <cmd name="About" _label="About..." _tip="About gbonds"
-        pixtype="stock" pixname="About"/>
-
-
-	<cmd name="BonoboUIDump" _label="Dump XML" _tip="Dump the UI Xml description" hidden="0"/>
-
-</commands>
-
-<menu>
-
-<submenu name="File" _label="_File">
-        
-        <menuitem name="FileNew" verb="" _label="_New"/>
-        
-        <menuitem name="FileOpen" verb="" _label="_Open..."/>
-
-        <menuitem name="FileImport" verb="" _label="_Import..."/>
-
-	<submenu name="Recents" _label="Recent _Files">
-
-	</submenu>
-
-	<separator/>
-
-        <menuitem name="FileSave" verb="" _label="_Save"/>
-	
-        <menuitem name="FileSaveAs" verb="" _label="Save _As..."/>
-
-	<separator/>
-			
-	<menuitem name="FilePrint" verb="" _label="_Print..."/>
-
-	<placeholder name="FileOps_1" />
-
-	<placeholder name="FileOps_2" delimit="top"/>
-
-	<separator/>
-	
-        <menuitem name="FileClose" verb="" _label="_Close"/>
-
-        <menuitem name="FileExit" verb="" _label="_Quit"/>
-
-</submenu>
-
-<submenu name="Edit" _label="_Edit">
-
-        <menuitem name="EditCut" verb="" _label="Cu_t"/>
-	
-        <menuitem name="EditCopy" verb="" _label="_Copy"/>
-	
-        <menuitem name="EditPaste" verb="" _label="_Paste"/>
-	
-	<separator/>
-
-        <menuitem name="EditAdd" verb="" _label="_Add..."/>
-
-        <menuitem name="EditDelete" verb="" _label="_Delete"/>
-	
-        <menuitem name="EditTitle" verb="" _label="_Title..."/>
-
-	<placeholder name="EditOps_1" /> 
-	
-	<separator/>
-
-	<placeholder name="EditOps_2" /> 
-
-        <menuitem name="EditSelectAll" verb="" _label="Select _All"/>
-
-        <menuitem name="EditUnSelectAll" verb="" _label="U_n-select All"/>
-
-	<placeholder name="EditOps_3" /> 
-
-	<placeholder name="EditOps_4" delimit="top"/>
-
-	<placeholder name="EditOps_5" delimit="top"/>
-
-	<separator/>
-
-	<menuitem name="SettingsPreferences" verb="" _label="Pr_eferences..."/>
-
-</submenu>
-
-<submenu name="View" _label="_View" hidden="0">
-
-	<menuitem name="ViewMainToolbar" id="ViewMainToolbar" verb=""/>
-
-	<separator/>
-
-	<submenu name="CustomizeMainToolbar" _label="Customize Main Toolbar">
-		
-		<menuitem name="MainToolbarSystem" verb=""/>
-		<menuitem name="MainToolbarIcon" verb=""/>
-		<menuitem name="MainToolbarIconText" verb=""/>
-
-		<separator/>
-
-		<menuitem name="MainToolbarTooltips" verb=""/>
-
-	</submenu>
-
-	<placeholder name="ViewOps" delimit="top"/>
-
-</submenu>
-
-
-<submenu name="Tools" _label="_Tools">
-	
-	<menuitem name="SettingsUpdate" verb="" _label="_Update redemption tables..."/>
-
-</submenu>
-
-<submenu name="Help" _label="_Help">
-	
-	<menuitem name="HelpContents" verb="" _label="_Contents"/>
-	
-        <menuitem name="About" verb="" _label="_About..."/>
-
-</submenu>
-
-<submenu name="Debug" _label="_Debug" hidden="1">
-
-	<menuitem name="BonoboUIDump" verb=""/>
-	<menuitem name="BonoboCustomize" label="Customize" verb=""/>
-</submenu>
-
-</menu>
-
-<dockitem name="MainToolbar" _tip="Main toolbar" config="0" 
-	behavior = "exclusive" in_new_band="1">
-	
-	<toolitem name="EditAdd" verb=""/>
-	<toolitem name="EditDelete" verb=""/>
-
-	<separator/>
-
-	<toolitem name="FileSave" verb=""/>
-	<toolitem name="FilePrint" verb=""/>
-	
-	<separator/>
-
-	<toolitem name="EditCut" verb=""/>
-	<toolitem name="EditCopy" verb=""/>
-	<toolitem name="EditPaste" verb=""/>
-
-</dockitem>
-
-<status resize_grip="1">
-	<item name="main"/>
-</status>
-
-</Root>
-
