Index: addressbook/gui/component/addressbook-view.c
===================================================================
--- addressbook/gui/component/addressbook-view.c	(revision 33390)
+++ addressbook/gui/component/addressbook-view.c	(working copy)
@@ -193,7 +193,7 @@ print_cb (BonoboUIComponent *uih, void *
 	AddressbookView *view = (AddressbookView *) user_data;
 	EABView *v = get_current_view (view);
 	if (v)
-		eab_view_print (v, 0);
+		eab_view_print (v, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 }
 
 static void
@@ -202,7 +202,7 @@ print_preview_cb (BonoboUIComponent *uih
 	AddressbookView *view = (AddressbookView *) user_data;
 	EABView *v = get_current_view (view);
 	if (v)
-		eab_view_print_preview (v);
+		eab_view_print (v, GTK_PRINT_OPERATION_ACTION_PREVIEW);
 }
 
 static void
Index: addressbook/gui/widgets/e-addressbook-view.h
===================================================================
--- addressbook/gui/widgets/e-addressbook-view.h	(revision 33390)
+++ addressbook/gui/widgets/e-addressbook-view.h	(working copy)
@@ -130,8 +130,8 @@ void       eab_view_save_as             
 void       eab_view_view                (EABView  *view);
 void       eab_view_send                (EABView  *view);
 void       eab_view_send_to             (EABView  *view);
-void       eab_view_print               (EABView  *view, int preview);
-void       eab_view_print_preview       (EABView  *view);
+void       eab_view_print               (EABView  *view,
+                                         GtkPrintOperationAction action);
 void       eab_view_delete_selection    (EABView  *view, gboolean is_delete);
 void       eab_view_cut                 (EABView  *view);
 void       eab_view_copy                (EABView  *view);
Index: addressbook/gui/widgets/e-addressbook-view.c
===================================================================
--- addressbook/gui/widgets/e-addressbook-view.c	(revision 33390)
+++ addressbook/gui/widgets/e-addressbook-view.c	(working copy)
@@ -37,11 +37,6 @@
 #include <e-util/e-icon-factory.h>
 #include <libgnomeui/gnome-dialog-util.h>
 
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-
 #include "addressbook/printing/e-contact-print.h"
 #include "addressbook/printing/e-contact-print-envelope.h"
 #include "addressbook/gui/widgets/eab-popup.h"
@@ -81,7 +76,6 @@
 
 #include <libxml/tree.h>
 #include <libxml/parser.h>
-#include <gtk/gtkprintunixdialog.h>
 
 #define SHOW_ALL_SEARCH "(contains \"x-evolution-any-field\" \"\")"
 
@@ -121,7 +115,6 @@ static void query_changed               
 static void search_activated            (ESearchBar *esb, EABView *view);
 static void search_menu_activated       (ESearchBar *esb, int id, EABView *view);
 static GList *get_master_list (void);
-static void contact_print_button_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr,EPrintable *printable);
 
 #define PARENT_TYPE GTK_TYPE_VBOX
 static GtkVBoxClass *parent_class = NULL;
@@ -874,17 +867,13 @@ print (EPopup *ep, EPopupItem *pitem, vo
 {
 	/*ContactAndBook *contact_and_book = data;*/
 	EABPopupTargetSelect *t = (EABPopupTargetSelect *)ep->target;
-	GtkWidget *dialog;
+	GList *contact_list;
 
-	if (t->cards->len == 1) {
-	       	dialog = e_contact_print_contact_dialog_new(t->cards->pdata[0]);
-		e_contact_print_response (dialog, GTK_RESPONSE_OK, NULL);
-	} else {
-		GList *contacts = get_contact_list(t);
-		dialog = e_contact_print_contact_list_dialog_new (contacts);
-		e_contact_print_response (dialog, GTK_RESPONSE_OK, NULL);
-		g_list_free(contacts);
-	}
+	contact_list = get_contact_list (t);
+	e_contact_print (
+		NULL, NULL, contact_list,
+		GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
+	g_list_free (contact_list);
 }
 
 static void
@@ -1703,77 +1692,46 @@ get_master_list (void)
 	return category_list;
 }
 
-typedef struct {
-	GtkWidget *table;
-	GObject *printable;
-} EContactPrintDialogWeakData;
-
 static void
-e_contact_print_destroy(gpointer data, GObject *where_object_was)
+contact_print_button_draw_page (GtkPrintOperation *operation,
+                                GtkPrintContext *context,
+                                gint page_nr,
+                                EPrintable *printable)
 {
-	EContactPrintDialogWeakData *weak_data = data;
-	g_object_unref (weak_data->printable);
-	g_object_unref (weak_data->table);
-	g_free (weak_data);
+	GtkPageSetup *setup;
+	gdouble top_margin;
+	cairo_t *cr;
+
+	setup = gtk_print_context_get_page_setup (context);
+	top_margin = gtk_page_setup_get_top_margin (setup, GTK_UNIT_POINTS);
+
+	cr = gtk_print_context_get_cairo_context (context);
+
+	e_printable_reset (printable);
+
+	while (e_printable_data_left (printable)) {
+		cairo_save (cr);
+		e_printable_print_page (
+			printable, context, 6.5 * 72, top_margin + 10, TRUE);
+		cairo_restore (cr);
+	}
 }
 
 static void
-e_contact_print_button(GtkDialog *dialog, gint response, gpointer data)
-{	
-#ifdef G_OS_UNIX		/* Just to get it to build on Win32 */
-	GtkPrintOperation *print;
-	GtkPrintSettings *settings;
-	GtkPageSetup *page_setup;
-	GtkPaperSize *paper_size;
-
-	EPrintable *printable = g_object_get_data(G_OBJECT(dialog), "printable");
-	print = gtk_print_operation_new ();
-	page_setup = gtk_page_setup_new ();
-
-		/*get & set,the settings of the dialog */
-	settings = gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (dialog));
-	paper_size = gtk_paper_size_new ("iso_a4"); /* FIXME paper size hardcoded */
-	gtk_page_setup_set_paper_size (page_setup, paper_size);
-	gtk_print_operation_set_print_settings (print, settings);
-
-	gtk_print_operation_set_n_pages (print, 1);
-	gtk_print_operation_set_default_page_setup (print, page_setup);
-		/* run the dialog */
-	g_signal_connect (print,"draw_page",G_CALLBACK(contact_print_button_draw_page), printable);
- 	
-	if (response == GTK_RESPONSE_APPLY)
-		gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
-	else
-		gtk_print_operation_run (print,GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL,NULL);
-		
-	gtk_widget_destroy(dialog);
-	g_object_unref (print);
-#else
-	g_warning ("Not implemented currently on Windows");
-#endif
-}
+e_contact_print_button (EPrintable *printable, GtkPrintOperationAction action)
+{
+	GtkPrintOperation *operation;
 
-static void 
-contact_print_button_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr,EPrintable *printable)
+	operation = e_print_operation_new ();
+	gtk_print_operation_set_n_pages (operation, 1);
 
-{
-	cairo_t *cr;
-	GtkPageSetup *page_setup;
-	gdouble top_margin;
-       
-	cr = gtk_print_context_get_cairo_context (context);
-	page_setup = gtk_print_operation_get_default_page_setup (print);
-	top_margin = gtk_page_setup_get_top_margin (page_setup, GTK_UNIT_POINTS);
-	e_printable_reset(printable);
-		while (e_printable_data_left(printable)) {
-			cairo_save (cr);
-			e_printable_print_page (printable,
-						context,
-						6.5 * 72,
-						top_margin + 10,
-						TRUE);
-			cairo_restore (cr);
-		}
+	g_signal_connect (
+		operation, "draw_page",
+		G_CALLBACK (contact_print_button_draw_page), printable);
+
+	gtk_print_operation_run (operation, action, NULL, NULL);
+
+	g_object_unref (operation);
 }
 
 void
@@ -1838,110 +1796,43 @@ eab_view_discard_menus (EABView *view)
 }
 
 void
-eab_view_print(EABView *view, int preview)
+eab_view_print (EABView *view, GtkPrintOperationAction action)
 {
 	if (view->view_type == EAB_VIEW_MINICARD) {
-		char *query;
 		EBook *book;
-		GtkWidget *print;
-		GList *list;
+		EBookQuery *query;
+		gchar *query_string;
+		GList *contact_list;
 
-		g_object_get (view->model,
-			      "query", &query,
-			      "book", &book,
-			      NULL);
-		list = get_selected_contacts (view); 
-		print = e_contact_print_dialog_new (book, query, list);
+		g_object_get (
+			view->model, "query", &query_string,
+			"book", &book, NULL);
 
-		if (!preview)
-			e_contact_print_response (print, GTK_RESPONSE_OK, NULL);
+		if (query_string != NULL)
+			query = e_book_query_from_string (query_string);
 		else
-			e_contact_print_response (print, GTK_RESPONSE_APPLY, NULL);
+			query = NULL;
+		g_free (query_string);
 
-		g_free (query);
-		e_free_object_list (list);
-	}
-	else if (view->view_type == EAB_VIEW_TABLE) {
-		GtkWidget *dialog;
-		EPrintable *printable;
-		ETable *etable;
-		EContactPrintDialogWeakData *weak_data;
-
-		/* FIXME: Allow range selection in table views, as in minicard view */
-		dialog = e_print_get_dialog (_("Print cards"), 0);
+		contact_list = get_selected_contacts (view);
+		e_contact_print (book, query, contact_list, action);
+		e_free_object_list (contact_list);
 
-		g_object_get(view->widget, "table", &etable, NULL);
-		printable = e_table_get_printable(etable);
-		g_object_ref (printable);
-		gtk_object_sink (GTK_OBJECT (printable));
-		g_object_unref(etable);
-		g_object_ref (view->widget);
+		if (query != NULL)
+			e_book_query_unref (query);
 
-		g_object_set_data (G_OBJECT (dialog), "table", view->widget);
-		g_object_set_data (G_OBJECT (dialog), "printable", printable);
-		
-		weak_data = g_new (EContactPrintDialogWeakData, 1);
-		weak_data->table = view->widget;
-		weak_data->printable = G_OBJECT (printable);
-		g_object_weak_ref (G_OBJECT (dialog), e_contact_print_destroy, weak_data);
-		if (preview)
-			e_contact_print_button (dialog, GTK_RESPONSE_APPLY, NULL);
-		else
-			e_contact_print_button (dialog, GTK_RESPONSE_OK, NULL);
-	}
-#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW
-	else if (view->view_type == EAB_VIEW_TREEVIEW) {
-		/* XXX */
-	}
-#endif
-}
-
-void
-eab_view_print_preview(EABView *view)
-{
-	if (view->view_type == EAB_VIEW_MINICARD) {
-		char *query;
-		EBook *book;
-		GtkWidget *dialog;
-		GList *list;
-
-		g_object_get (view->model,
-			      "query", &query,
-			      "book", &book,
-			      NULL);
-
-		list = get_selected_contacts (view);
-		if (list != NULL)
-			dialog = e_contact_print_contact_list_dialog_new (list);
-		else
-			dialog = e_contact_print_dialog_new (book, query, list);
-		e_contact_print_response (dialog, GTK_RESPONSE_APPLY, NULL);
-		e_free_object_list (list);
-		g_free (query);
-	}else if (view->view_type == EAB_VIEW_TABLE) {
-		GtkWidget *dialog;
+	} else if (view->view_type == EAB_VIEW_TABLE) {
 		EPrintable *printable;
-		ETable *etable;
-		EContactPrintDialogWeakData *weak_data;
+		ETable *table;
 
-		/* FIXME: Allow range selection in table views, as in minicard view */
-		dialog = e_print_get_dialog (_("Print cards"), 0);
+		g_object_get (view->widget, "table", &table, NULL);
+		printable = e_table_get_printable (table);
+		g_object_ref_sink (printable);
+		g_object_unref (table);
 
-		g_object_get(view->widget, "table", &etable, NULL);
-		printable = e_table_get_printable(etable);
-		g_object_ref (printable);
-		gtk_object_sink (GTK_OBJECT (printable));
-		g_object_unref(etable);
-		g_object_ref (view->widget);
+		e_contact_print_button (printable, action);
 
-		g_object_set_data (G_OBJECT (dialog), "table", view->widget);
-		g_object_set_data (G_OBJECT (dialog), "printable", printable);
-		
-		weak_data = g_new (EContactPrintDialogWeakData, 1);
-		weak_data->table = view->widget;
-		weak_data->printable = G_OBJECT (printable);
-		g_object_weak_ref (G_OBJECT (dialog), e_contact_print_destroy, weak_data);
-		e_contact_print_button (dialog, GTK_RESPONSE_APPLY, NULL);
+		g_object_unref (printable);
 	}
 }
 
Index: addressbook/printing/e-contact-print.c
===================================================================
--- addressbook/printing/e-contact-print.c	(revision 33390)
+++ addressbook/printing/e-contact-print.c	(working copy)
@@ -33,19 +33,11 @@
 #include <libxml/xmlmemory.h>
 #include <libgnome/gnome-util.h>
 #include <glib/gi18n.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-unit.h>
-#include <libgnomeprint/gnome-print-config.h>
-#include <libgnomeprint/gnome-font.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
 #include <libebook/e-book.h>
 #include <libebook/e-contact.h>
 
 #include <gtk/gtk.h>
-#include <gtk/gtkprintunixdialog.h>
+#include <libedataserver/e-flag.h>
 #include <libedataserver/e-xml-utils.h>
 
 #include "e-util/e-print.h"
@@ -53,556 +45,340 @@
 #include "e-util/e-util-private.h"
 
 #include "e-contact-print.h"
-	
-#define SCALE 5
-#define HYPHEN_PIXELS 20
-#define HYPHEN_PENALTY ( (SCALE) * (SCALE) * (HYPHEN_PIXELS) * (HYPHEN_PIXELS) )
 
 typedef struct _EContactPrintContext EContactPrintContext;
 typedef struct _ContactPrintItem ContactPrintItem;
 
 struct _EContactPrintContext
 {
-	GtkPrintContext *pc;
-	GtkPrintOperation *print;
-	GnomePrintJob     *master;
-	PangoLayout *pl;
+	GtkPrintContext *context;
 	gdouble x;
 	gdouble y;
 	gint column;
+	gdouble column_width;
+	gdouble column_spacing;
 	EContactPrintStyle *style;
 	gboolean first_section;
 
 	PangoFontDescription *letter_heading_font;
-	char *character;
+	gchar *section;
 	gboolean first_contact;
 
-	gboolean uses_book;
-	int type;
-	gint response_id;
 	EBook *book;
 	EBookQuery *query;
 
-	GList *contacts;
-};
-
-struct _ContactPrintItem
-{
-	EContactPrintContext *ctxt;
-	EContactPrintStyle *style;
-	EContact *contact;
 	GList *contact_list;
-	EBook *book;
-	GtkPrintSettings *settings;
-	gboolean uses_book, uses_list;
 };
 
-static void 
-contact_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, ContactPrintItem *cpi);
-
-static void
-print_func (EBookView *book_view, const GList *contacts, EContactPrintContext *ctxt);
-
-static double
-get_font_height (PangoFontDescription *font)
+static gdouble
+get_font_height (PangoFontDescription *desc)
 {
-	return (double)pango_font_description_get_size (font)/(double)PANGO_SCALE;
+	return pango_units_to_double (
+		pango_font_description_get_size (desc));
 }
 
-static double
-get_font_width (EContactPrintContext *context, PangoFontDescription *font, const char *text)
+static gdouble
+get_font_width (GtkPrintContext *context,
+                PangoFontDescription *desc,
+                const gchar *text)
 {
-	int width;
-	int height;
+	PangoLayout *layout;
+	gint width, height;
 
-	g_return_val_if_fail (font, 0.0);
-	g_return_val_if_fail (text, 0.0);
+	g_return_val_if_fail (desc, .0);
+	g_return_val_if_fail (text, .0);
 
-	g_assert (context->pl);
-	pango_layout_set_font_description (context->pl, font);
-	pango_layout_set_text (context->pl, text, -1);
-	pango_layout_set_width (context->pl, -1);
-	pango_layout_set_indent (context->pl, 0);
+	layout = gtk_print_context_create_pango_layout (context);
 
-	pango_layout_get_size (context->pl,
-			       &width,
-			       &height);
+	pango_layout_set_font_description (layout, desc);
+	pango_layout_set_text (layout, text, -1);
+	pango_layout_set_width (layout, -1);
+	pango_layout_set_indent (layout, 0);
 
-	return (double)width/(double)PANGO_SCALE;
-}
+	pango_layout_get_size (layout, &width, &height);
 
-static PangoFontDescription*
-find_font (const char *name, double height)
-{
-	PangoFontDescription *desc = pango_font_description_new ();
-	pango_font_description_set_family (desc, name);	
-	pango_font_description_set_size (desc, height * PANGO_SCALE);	
+	g_object_unref (layout);
 
-	return desc;
-}
-
-static PangoFontDescription*
-find_closest_font_from_weight_slant (const guchar *family, GnomeFontWeight weight, gboolean italic, gdouble size)
-{
-	PangoFontDescription *desc = pango_font_description_new ();
-	pango_font_description_set_family (desc, family);	
-
-	/* GnomePrintWeight and PangoWeight values should be interchangeable: */
-	pango_font_description_set_weight (desc, (PangoWeight)weight);
-
-	if (italic) {
-		pango_font_description_set_style (desc, PANGO_STYLE_ITALIC);
-	}
-	pango_font_description_set_size (desc, size * PANGO_SCALE);
-
-	return desc;
+	return pango_units_to_double (width);
 }
 
 static void
-e_contact_output(EContactPrintContext *ctxt, PangoFontDescription *font, double x, double y, double width, const gchar *text)
+e_contact_output (GtkPrintContext *context,
+                  PangoFontDescription *font,
+                  gdouble x, gdouble y, gdouble width,
+                  const gchar *text)
 {
-	double indent;
-	cairo_t *cr = gtk_print_context_get_cairo_context (ctxt->pc);
-	cairo_save(cr);
+	PangoLayout *layout;
+	gdouble indent;
+	cairo_t *cr;
 
-	if ( width == -1 || get_font_width(ctxt, font, text) <= width ) {
-		indent = 0.0;
-	} else {
-		indent = get_font_width (ctxt, font, "     ");	
-	} 	
+	layout = gtk_print_context_create_pango_layout (context);
 
-	g_assert (ctxt->pl);
-	pango_layout_set_font_description (ctxt->pl, font);
-	pango_layout_set_text (ctxt->pl, text, -1);
-	pango_layout_set_width (ctxt->pl, width*PANGO_SCALE);
-	pango_layout_set_indent (ctxt->pl, indent*PANGO_SCALE);
+	if (width == -1 || get_font_width (context, font, text) <= width)
+		indent = .0;
+	else
+		indent = get_font_width (context, font, "     ");
 
-	cairo_move_to(cr, x, y);
-	pango_cairo_show_layout (cr, ctxt->pl);
+	pango_layout_set_font_description (layout, font);
+	pango_layout_set_text (layout, text, -1);
+	pango_layout_set_width (layout, pango_units_from_double (width));
+	pango_layout_set_indent (layout, pango_units_from_double (indent));
+
+	cr = gtk_print_context_get_cairo_context (context);
+
+	cairo_save (cr);
+	cairo_move_to (cr, x, y);
+	pango_cairo_show_layout (cr, layout);
 	cairo_restore (cr);
 
+	g_object_unref (layout);
 }
 
 static gdouble
-e_contact_text_height(EContactPrintContext *ctxt, PangoFontDescription *font, double width, const gchar *text)
+e_contact_text_height (GtkPrintContext *context,
+                       PangoFontDescription *desc,
+                       const gchar *text)
 {
-	gint w, h;
+	PangoLayout *layout;
+	gint width, height;
 
-	g_assert (ctxt->pl);
-	pango_layout_set_font_description (ctxt->pl, font);
-	pango_layout_set_text (ctxt->pl, text, -1);
-	pango_layout_set_width (ctxt->pl, 1); /* fix me width hard coded */
-	pango_layout_set_indent (ctxt->pl, 0);
-	pango_layout_get_size (ctxt->pl, &w, &h);
+	layout = gtk_print_context_create_pango_layout (context);
 
-	return (double)h/(double)PANGO_SCALE;
-}
+	pango_layout_set_font_description (layout, desc);
+	pango_layout_set_text (layout, text, -1);
 
-#if 0
-static void
-e_contact_output_and_advance(EContactPrintContext *ctxt, PangoFontDescription *font, double x, double width, gchar *text)
-{
-	ctxt->y -= .1 * get_font_height (font);
-	e_contact_output(ctxt->pc, font, x, ctxt->y, width, text);
-	ctxt->y -= e_contact_text_height(ctxt->pc, font, width, text);
-	ctxt->y -= .1 * get_font_height (font);
-}
-#endif
+	pango_layout_get_size (layout, &width, &height);
 
-static void
-e_contact_rectangle(GtkPrintContext *pc, 
-		   gdouble x0,
-		   gdouble y0,
-		   gdouble x1,
-		   gdouble y1,
-		   gdouble r,
-		   gdouble g,
-		   gdouble b)
-{
-	cairo_t *cr;
-	cr = gtk_print_context_get_cairo_context (pc);
-	cairo_save(cr);
-	cairo_set_source_rgb(cr, r, g, b);
-	cairo_rectangle (cr,x0, y0, x1, y1);
-	cairo_fill (cr);
-	cairo_restore (cr);
-}
+	g_object_unref (layout);
 
-static double
-e_contact_get_letter_heading_height (EContactPrintContext *ctxt)
-{
-	return get_font_height (ctxt->letter_heading_font);
+	return pango_units_to_double (height);
 }
 
 static void
-e_contact_print_letter_heading (EContactPrintContext *ctxt, gchar *character)
+e_contact_print_letter_heading (EContactPrintContext *ctxt, gchar *letter)
 {
-	gdouble height;
-	gdouble width;
+	PangoLayout *layout;
+	PangoFontDescription *desc;
+	PangoFontMetrics *metrics;
+	gint width, height;
 	cairo_t *cr;
 
-	width = get_font_width(ctxt, ctxt->letter_heading_font, "m") * 1.7;
-	height = get_font_height (ctxt->letter_heading_font);
-	
-	cr = gtk_print_context_get_cairo_context (ctxt->pc);
-	cairo_save(cr);
+	desc = ctxt->letter_heading_font;
+
+	layout = gtk_print_context_create_pango_layout (ctxt->context);
+
+	/* Make the rectangle thrice the average character width.
+	 * XXX Works well for English, what about other locales? */
+	metrics = pango_context_get_metrics (
+		pango_layout_get_context (layout),
+		desc, pango_language_get_default ());
+	width = pango_font_metrics_get_approximate_char_width (metrics) * 3;
+	pango_font_metrics_unref (metrics);
+
+	pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+	pango_layout_set_font_description (layout, desc);
+	pango_layout_set_text (layout, letter, -1);
+	pango_layout_set_width (layout, width);
+	pango_layout_get_size (layout, NULL, &height);
+
+	/* Draw white text centered in a black rectangle. */
+
+	cr = gtk_print_context_get_cairo_context (ctxt->context);
+
+	cairo_save (cr);
+	cairo_set_source_rgb (cr, .0, .0, .0);
+	cairo_rectangle (
+		cr, ctxt->x, ctxt->y,
+		pango_units_to_double (width),
+		pango_units_to_double (height));
+	cairo_fill (cr);
+	cairo_restore (cr);
 
-	e_contact_rectangle( ctxt->pc, ctxt->x, ctxt->y, width, height + 6, 0, 0, 0); 
-	cairo_set_source_rgb(cr, 1, 1, 1);
-	ctxt->y += 4;
-	e_contact_output(ctxt, ctxt->letter_heading_font, 
-			ctxt->x + (width - get_font_width(ctxt, ctxt->letter_heading_font, character))/ 2 - 5,
-			ctxt->y - 5, 
-			-1,
-			character);
-	ctxt->y += height;
-	ctxt->y += 2;
-	ctxt->y += 3;
+	cairo_save (cr);
+	cairo_move_to (cr, ctxt->x, ctxt->y);
+	cairo_set_source_rgb (cr, 1., 1., 1.);
+	pango_cairo_show_layout (cr, layout);
+	cairo_restore (cr);
 
-	cairo_restore(cr);
+	ctxt->y += pango_units_to_double (height);
 }
 
 static void
-e_contact_start_new_page(EContactPrintContext *ctxt)
+e_contact_start_new_page (EContactPrintContext *ctxt)
 {
 	cairo_t *cr;
-	cr = gtk_print_context_get_cairo_context (ctxt->pc);
-       	ctxt->x = ctxt->style->left_margin;
-	ctxt->y = ctxt->style->top_margin;
-	cairo_show_page (cr);
-	ctxt->column = 0;
-}
 
-static double
-e_contact_get_contact_size(EContact *contact, EContactPrintContext *ctxt)
-{
-	const char *file_as;
-	gdouble height = 0;
-	gdouble page_width  = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
-	gdouble column_width;
-	gint field;
-	column_width = (page_width + 18) / ctxt->style->num_columns - 18;
+	cr = gtk_print_context_get_cairo_context (ctxt->context);
 
-	height += get_font_height (ctxt->style->headings_font) * .2;
-
-	height += get_font_height (ctxt->style->headings_font) * .2;
-
-	file_as = e_contact_get_const (contact, E_CONTACT_FILE_AS);
-
-	height += e_contact_text_height(ctxt, ctxt->style->headings_font, column_width - 4, file_as);
-
-	height += get_font_height (ctxt->style->headings_font) * .2;
-
-	height += get_font_height (ctxt->style->headings_font) * .2;
-	
-	for(field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING; field++) {
-		char *string;
-		string = e_contact_get(contact, field);
-		if (string && *string) {
-			double xoff = 0;
-			xoff += get_font_width(ctxt, ctxt->style->body_font, e_contact_pretty_name (field));
-			xoff += get_font_width(ctxt, ctxt->style->body_font, ":  ");
-			height += e_contact_text_height(ctxt, ctxt->style->body_font, column_width - xoff, string);
-			height += .2 * get_font_height (ctxt->style->body_font);
-		}
-		g_free(string);
-	}
-	height += get_font_height (ctxt->style->headings_font) * .4;
+	cairo_show_page (cr);
 
-	/* g_message ("%s %g", e_card_simple_get (simple, E_CARD_SIMPLE_FIELD_FILE_AS), height); */
-	return height;
+       	ctxt->x = ctxt->y = .0;
+	ctxt->column = 0;
 }
 
-
 static void
 e_contact_print_contact (EContact *contact, EContactPrintContext *ctxt)
 {
-	gdouble page_width  = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin);
-	gdouble column_width;
 	char *file_as;
 	cairo_t *cr;
 	int field;
 
-	column_width = (page_width + 18) / ctxt->style->num_columns - 18;
-	cr = gtk_print_context_get_cairo_context (ctxt->pc);
+	cr = gtk_print_context_get_cairo_context (ctxt->context);
 	cairo_save(cr);
 	ctxt->y += get_font_height (ctxt->style->headings_font) * .2; 
-	ctxt->y += get_font_height (ctxt->style->headings_font) * .2;
 
 	file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
                                                              
-	if (ctxt->style->print_using_grey)
-			e_contact_rectangle(ctxt->pc, 
-			    ctxt->x,ctxt->y + get_font_height (ctxt->style->headings_font) * .3, 
-			    column_width, 
-			    e_contact_text_height(ctxt, 
-						    ctxt->style->headings_font, 
-					            column_width - 4, file_as) 
-						    + get_font_height (ctxt->style->headings_font) * .3,
-					            .85, .85, .85); 
-	  
-		
-	e_contact_output(ctxt, ctxt->style->headings_font, ctxt->x + 2, ctxt->y + 5, column_width + 4, file_as);
-	ctxt->y += e_contact_text_height(ctxt, ctxt->style->headings_font, column_width + 4, file_as);
+	if (ctxt->style->print_using_grey) {
+		cairo_save (cr);
+		cairo_set_source_rgb (cr, .85, .85, .85);
+		cairo_rectangle (cr, ctxt->x, ctxt->y, ctxt->column_width,
+			e_contact_text_height (ctxt->context,
+				ctxt->style->headings_font, file_as));
+		cairo_fill (cr);
+		cairo_restore (cr);
+	}
+
+	e_contact_output (
+		ctxt->context, ctxt->style->headings_font,
+		ctxt->x, ctxt->y, ctxt->column_width + 4, file_as);
+	ctxt->y += e_contact_text_height (
+		ctxt->context, ctxt->style->headings_font, file_as);
+
 	g_free (file_as);
 
 	ctxt->y += get_font_height (ctxt->style->headings_font) * .2;
-	ctxt->y += get_font_height (ctxt->style->headings_font) * .2;
-	
-	for(field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING;field++) 
+
+	for (field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING; field++) 
 	{
-		char *string;
-		string = e_contact_get(contact, field);
-		
-		if (string && *string) {
-			double xoff = 0;
-
-		e_contact_output(ctxt, 
-				 ctxt->style->body_font, 
-				 ctxt->x + xoff, 
-				 ctxt->y + 5, 
-				 -1, 
-				 e_contact_pretty_name (field));
-
-			xoff += get_font_width(ctxt, ctxt->style->body_font, e_contact_pretty_name (field));
-			e_contact_output(ctxt, ctxt->style->body_font, ctxt->x + xoff, ctxt->y + 5, -1, ":  ");
-			xoff += get_font_width(ctxt, ctxt->style->body_font, ":  ");
-
-		e_contact_output(ctxt, 
-				 ctxt->style->body_font, 
-				 ctxt->x + xoff, 
-				 ctxt->y + 5, 
-				 column_width - xoff, 
-				 string);
+		const gchar *value;
+		gchar *text;
 
-			ctxt->y += e_contact_text_height(ctxt, ctxt->style->body_font, column_width - xoff, string);
-			ctxt->y += .2 * get_font_height (ctxt->style->body_font);
+		value = e_contact_get_const (contact, field);
+		if (value == NULL || *value == '\0')
+			continue;
 
-		}
-		g_free(string);
-	} 
-	ctxt->y += get_font_height (ctxt->style->headings_font) * .4 + 8;
-	cairo_restore(cr);
-}
+		text = g_strdup_printf ("%s:  %s",
+			e_contact_pretty_name (field), value);
 
-static void
-e_contact_start_new_column (EContactPrintContext *ctxt)
-{
-	gdouble page_width  = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin); 
-	gdouble column_offset;
+		e_contact_output (
+			ctxt->context, ctxt->style->body_font, 
+			ctxt->x, ctxt->y, -1, text);
 
-	column_offset = (page_width + 18) / ctxt->style->num_columns;
-	ctxt->column ++;
+		ctxt->y += e_contact_text_height (
+			ctxt->context, ctxt->style->body_font, text);
 
-	if (ctxt->column >= ctxt->style->num_columns) {
-		e_contact_start_new_page(ctxt);
-		ctxt->column = 0;
+		ctxt->y += .2 * get_font_height (ctxt->style->body_font);
+
+		g_free (text);
 	}
-	ctxt->x = ctxt->style->left_margin + column_offset * ctxt->column;
-    	ctxt->y = ctxt->style->top_margin + 12;
+
+	ctxt->y += get_font_height (ctxt->style->headings_font) * .4 + 8;
+
+	cairo_restore (cr);
 }
 
 static void
-complete_sequence (EBookView *book_view, EBookViewStatus status, EContactPrintContext *ctxt)
+e_contact_start_new_column (EContactPrintContext *ctxt)
 {
-	GList *contacts = ctxt->contacts;
-
-	ctxt->first_contact = TRUE;
-	ctxt->character = NULL;
-	ctxt->y = ctxt->style->page_height + ctxt->style->top_margin;
-	ctxt->x = (ctxt->style->left_margin);
-
-	for(; contacts; contacts = contacts->next) {
-		EContact *contact = contacts->data;
-		guchar *file_as;
-		gchar *letter_str = NULL;
-
-		file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
-		
-	        if (file_as != NULL) {
-		        letter_str = g_strndup (file_as, g_utf8_next_char (file_as) - (gchar *) file_as);
-	        }
-	        if ( file_as && (!ctxt->character || g_utf8_collate (ctxt->character, letter_str) != 0) ) {
-			g_free (ctxt->character);
-			ctxt->character = g_strdup (letter_str);
-			if (ctxt->style->sections_start_new_page && ! ctxt->first_contact) {
-				e_contact_start_new_page(ctxt);
-		        }
-			else if ((!ctxt->first_contact) && (ctxt->y  > ctxt->style->page_height * 60 )) 
-		        	e_contact_start_new_column(ctxt);
-			if ( ctxt->style->letter_headings )
-				e_contact_print_letter_heading(ctxt, ctxt->character);
-			ctxt->first_section = FALSE;
-		} 
-			
-	        else if ( (!ctxt->first_contact) && (ctxt->y  > ctxt->style->page_height * 60)) { 
-			e_contact_start_new_column(ctxt);
-			if ( ctxt->style->letter_headings )
-				e_contact_print_letter_heading(ctxt, ctxt->character);
-		}
-	
-		g_free (letter_str);
-		e_contact_print_contact(contact, ctxt);
-		ctxt->first_contact = FALSE;
+	if (++ctxt->column >= ctxt->style->num_columns)
+		e_contact_start_new_page (ctxt);
+	else {
+		ctxt->x = ctxt->column *
+			(ctxt->column_width + ctxt->column_spacing);
+	    	ctxt->y = .0;
 	}
-
-	if (book_view)
-		g_object_unref(book_view);
-
-        g_object_unref(ctxt->pc);
-	g_object_unref(ctxt->pl);
-	if (ctxt->book) 
-		g_object_unref(ctxt->book);
-	
-	g_free(ctxt->character);
-	if (ctxt->query)
-		e_book_query_unref (ctxt->query);
-      	g_list_foreach(ctxt->contacts, (GFunc) g_object_unref, NULL);
-	g_list_free(ctxt->contacts);
-	pango_font_description_free(ctxt->style->headings_font);
-	pango_font_description_free(ctxt->style->body_font);
-	pango_font_description_free(ctxt->style->header_font);
-	pango_font_description_free(ctxt->style->footer_font);
-	pango_font_description_free(ctxt->letter_heading_font);
-	g_free(ctxt->style);
 }
 
 static int
 contact_compare (EContact *contact1, EContact *contact2)
 {
-	if (contact1 && contact2) {
-		const char *file_as1, *file_as2;
-		file_as1 = e_contact_get_const (contact1, E_CONTACT_FILE_AS);
-		file_as2 = e_contact_get_const (contact2, E_CONTACT_FILE_AS);
-
-		if (file_as1 && file_as2)
-			return g_utf8_collate(file_as1, file_as2);
-		if (file_as1)
-			return -1;
-		if (file_as2)
-			return 1;
-		return strcmp(e_contact_get_const(contact1, E_CONTACT_UID), e_contact_get_const(contact2, E_CONTACT_UID));
-	} else {
+	const gchar *field1, *field2;
+
+	if (contact1 == NULL || contact2 == NULL)
 		return 0;
-	}
-}
 
-static void
-create_contact(EBookView *book_view, const GList *contacts, EContactPrintContext *ctxt)
-{
-	for(; contacts; contacts = contacts->next) {
-		EContact *contact = contacts->data;
-		g_object_ref(contact);
-		ctxt->contacts = g_list_insert_sorted(ctxt->contacts, contact, (GCompareFunc) contact_compare);
-	}
-}
+	field1 = e_contact_get_const (contact1, E_CONTACT_FILE_AS);
+	field2 = e_contact_get_const (contact2, E_CONTACT_FILE_AS);
 
-static void
-book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, EContactPrintContext *ctxt)
-{
-	g_object_ref(book_view);
+	if (field1 != NULL && field2 != NULL)
+		return g_utf8_collate (field1, field2);
 
-	g_signal_connect(book_view,
-			 "contacts_added",
-			 G_CALLBACK(create_contact),
-			 ctxt);
-	g_signal_connect(book_view,
-			 "sequence_complete",
-			 G_CALLBACK(print_func),
-			 ctxt);
-	e_book_view_start (book_view);
-}
+	if (field1 != NULL || field2 != NULL)
+		return (field1 != NULL) ? -1 : 1;
 
-static void 
-print_func (EBookView *book_view, const GList *contacts, EContactPrintContext *ctxt)
-{
-        GtkPrintSettings *settings;
-	settings = gtk_print_settings_new ();
-	/* runs a print dialog, emittings signals */
-	if(ctxt->response_id == GTK_RESPONSE_APPLY)
-		gtk_print_operation_run (ctxt->print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
-	else
-		gtk_print_operation_run (ctxt->print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
-	settings = gtk_print_operation_get_print_settings (ctxt->print);
-	e_print_save_settings (settings); 
-}
+	field1 = e_contact_get_const (contact1, E_CONTACT_UID);
+	field2 = e_contact_get_const (contact2, E_CONTACT_UID);
 
-static void
-e_contact_do_print_contacts (EBook *book, EBookQuery *query, EContactPrintContext *ctxt)
-{
-	EBookView *bookview;
-	gboolean status;
+	g_assert (field1 != NULL && field2 != NULL);
 
-	status = e_book_get_book_view (book, query, NULL, -1, &bookview, NULL);
-	book_view_loaded (book, 1, bookview, ctxt);
+	return strcmp (field1, field2);
 }
-	
-static  void
-e_contact_do_print (EBook *book, EBookQuery *query, EContactPrintContext *ctxt)
+
+static void
+contacts_added (EBookView *book_view, const GList *contact_list,
+                EContactPrintContext *ctxt)
 {
-	switch ( ctxt->style->type ) {
-	case E_CONTACT_PRINT_TYPE_CARDS:
-		e_contact_do_print_contacts( book, query, ctxt);
-		break;
-	default:
-		break;
+	while (contact_list != NULL) {
+		ctxt->contact_list = g_list_insert_sorted(
+			ctxt->contact_list,
+			g_object_ref (contact_list->data),
+			(GCompareFunc) contact_compare);
+		contact_list = contact_list->next;
 	}
 }
 
-static void lowify( char *data )
+static void 
+sequence_complete (EBookView *book_view, const GList *contact_list,
+                   EFlag *book_view_started)
 {
-	for ( ; *data; data++ )
-		*data = tolower((unsigned char) *data);
+	e_flag_set (book_view_started);
 }
 
-static gboolean get_bool( char *data )
+static gboolean
+get_bool (gchar *data)
 {
-	if ( data ) {
-		lowify ( data );
-		return ! strcmp(data, "true");
-	} else
+	if (data)
+		return (g_ascii_strcasecmp (data, "true") == 0);
+	else
 		return FALSE;
 }
 
-static void get_string( char *data, char **variable )
+static void
+get_string (gchar *data, gchar **variable)
 {
-	g_free ( *variable );
-	if ( data )
-		*variable = g_strdup( data );
-	else
-		*variable = g_strdup( "" );
+	g_free (*variable);
+	*variable = g_strdup ((data != NULL) ? data : "");
 }
 
-static int get_integer( char *data )
+static gint
+get_integer (gchar *data)
 {
-	if ( data )
-		return atoi(data);
-	else 
-		return 0;
+	return (data != NULL) ? atoi (data) : 0;
 }
 
-static double get_float( char *data )
+static gdouble
+get_float (gchar *data)
 {
-	if ( data )
-		return atof(data);
-	else 
-		return 0;
+	return (data != NULL) ? atof (data) : .0;
 }
 
-static void get_font( char *data, PangoFontDescription **variable )
+static void
+get_font (gchar *data, PangoFontDescription **variable)
 {
-	if ( data ) {
-		PangoFontDescription *font = pango_font_description_from_string ( data );
-		if ( font ) {
-			pango_font_description_free(*variable);
-			*variable = font;
-		}
+	PangoFontDescription *desc = NULL;
+
+	if (data != NULL)
+		desc = pango_font_description_from_string (data);
+
+	if (desc != NULL) {
+		pango_font_description_free (*variable);
+		*variable = desc;
 	}
 }
 
-
 static void
-e_contact_build_style(EContactPrintStyle *style, GtkPrintSettings *config)
+e_contact_build_style (EContactPrintStyle *style)
 {
 	xmlDocPtr styledoc;
 	gchar *filename;
@@ -614,8 +390,8 @@ e_contact_build_style(EContactPrintStyle
 	style->blank_forms = 2;
 	style->letter_headings = FALSE;
 
-	style->headings_font = find_closest_font_from_weight_slant ("Sans", GNOME_FONT_BOLD, FALSE, 8);
-	style->body_font = find_closest_font_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6);
+	style->headings_font = pango_font_description_from_string ("Sans Bold 8");
+	style->body_font = pango_font_description_from_string ("Sans 6");
 
 	style->print_using_grey = TRUE;
 	style->paper_type = 0;
@@ -639,21 +415,23 @@ e_contact_build_style(EContactPrintStyle
 #endif
 	style->orientation_portrait = FALSE;
 
-	style->header_font = find_closest_font_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6);
+	style->header_font = pango_font_description_copy (style->body_font);
 
 	style->left_header = g_strdup("");
 	style->center_header = g_strdup("");
 	style->right_header = g_strdup("");
 
-	style->footer_font = find_closest_font_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6);
+	style->footer_font = pango_font_description_copy (style->body_font);
 
-	style->left_footer = g_strdup("");
-	style->center_footer = g_strdup("");
-	style->right_footer = g_strdup("");
+	style->left_footer = g_strdup ("");
+	style->center_footer = g_strdup ("");
+	style->right_footer = g_strdup ("");
 	style->reverse_on_even_pages = FALSE;
-	filename = g_concat_dir_and_file(EVOLUTION_ECPSDIR, "medbook.ecps");
+
+	filename = g_build_filename (EVOLUTION_ECPSDIR, "medbook.ecps", NULL);
 	styledoc = e_xml_parse_file (filename);
-	g_free(filename);
+	g_free (filename);
+
 	if (styledoc) {
 		xmlNodePtr stylenode = xmlDocGetRootElement(styledoc);
 		xmlNodePtr node;
@@ -662,12 +440,11 @@ e_contact_build_style(EContactPrintStyle
 			if ( !strcmp( node->name, "title" ) ) {
 				get_string(data, &(style->title));
 			} else if ( !strcmp( node->name, "type" ) ) {
-				lowify( data );
-				if ( !strcmp( data, "cards" ) )
+				if (g_ascii_strcasecmp (data, "cards") == 0)
 					style->type = E_CONTACT_PRINT_TYPE_CARDS;
-				else if ( !strcmp( data, "memo_style" ) )
+				else if (g_ascii_strcasecmp (data, "memo_style") == 0)
 					style->type = E_CONTACT_PRINT_TYPE_MEMO_STYLE;
-				else if ( !strcmp( data, "phone_list" ) )
+				else if (g_ascii_strcasecmp (data, "phone_list") == 0)
 					style->type = E_CONTACT_PRINT_TYPE_PHONE_LIST;
 			} else if ( !strcmp( node->name, "sections_start_new_page" ) ) {
 				style->sections_start_new_page = get_bool(data);
@@ -701,8 +478,8 @@ e_contact_build_style(EContactPrintStyle
 				style->page_height = get_float(data);
 			} else if ( !strcmp( node->name, "orientation" ) ) {
 				if ( data ) {
-					lowify(data);
-					style->orientation_portrait = strcmp(data, "landscape");
+					style->orientation_portrait =
+						(g_ascii_strcasecmp (data, "landscape") != 0);
 				} else {
 					style->orientation_portrait = TRUE;
 				}
@@ -733,204 +510,192 @@ e_contact_build_style(EContactPrintStyle
 
 }
 
-static gint
-e_contact_print_close(GnomeDialog *dialog, gpointer data)
+static void
+load_contacts (EContactPrintContext *ctxt)
 {
-	return FALSE;
+	/* Load contacts from the EBook.  This is an asynchronous operation
+	 * but we force it to be synchronous here. */
+
+	EBookView *book_view;
+	EFlag *book_view_started;
+
+	book_view_started = e_flag_new ();
+
+	e_book_get_book_view (
+		ctxt->book, ctxt->query, NULL, -1, &book_view, NULL);
+
+	g_signal_connect (
+		book_view, "contacts_added",
+		G_CALLBACK (contacts_added), ctxt);
+	g_signal_connect (
+		book_view, "sequence_complete",
+		G_CALLBACK (sequence_complete), book_view_started);
+
+	e_book_view_start (book_view);
+
+	while (!e_flag_is_set (book_view_started))
+		g_main_context_iteration (NULL, TRUE);
+
+	e_flag_free (book_view_started);
 }
 
-void
-e_contact_print_response(GtkWidget *dialog, gint response_id, gpointer data)
+static void
+free_contacts (EContactPrintContext *ctxt)
 {
-#ifdef G_OS_UNIX		/* Just to get it to build on Win32 */
-	GtkPrintSettings *settings;
-	GtkPaperSize *paper_size;
-	GtkPageSetup *page_setup;
-	GList *contact_list = NULL;
-	EBook *book = NULL;
-	EBookQuery *query = NULL;
-	EContact *contact = NULL;
-	gdouble font_size;
-	gboolean uses_book = FALSE, uses_list = FALSE, uses_range = FALSE;
-
-	EContactPrintContext *ctxt = g_new0 (EContactPrintContext, 1);
-	EContactPrintStyle *style = g_new0 (EContactPrintStyle, 1);
-	ContactPrintItem *cpi = g_new0 (ContactPrintItem, 1);
-
-	settings = gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (dialog));
-	uses_range = GPOINTER_TO_INT (g_object_get_data(G_OBJECT (dialog),"uses_range"));
-
-	if (uses_range) {
-		if (gtk_print_settings_get_print_pages (settings) == GTK_PRINT_PAGES_ALL) {
-			uses_book = TRUE;
-		 }
-		if (gtk_print_settings_get_print_pages (settings) == GTK_PRINT_PAGES_CURRENT)
-			uses_list = TRUE;
-	}
-	else {
-		uses_book = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), "uses_book"));
-		uses_list = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (dialog), "uses_list"));
-	} 
-	if (uses_book) {
-		book = g_object_get_data(G_OBJECT(dialog), "book");
-		query = g_object_get_data(G_OBJECT(dialog), "query");
-		e_book_query_ref (query);
-	}
-	else if (uses_list) {
-		contact_list = g_object_get_data(G_OBJECT(dialog), "contact_list");
-	}
-	else {
-		contact = g_object_get_data(G_OBJECT(dialog), "contact");
-	}   
+	g_list_foreach (ctxt->contact_list, (GFunc) g_object_unref, NULL);
+	g_list_free (ctxt->contact_list);
+}
+
+static void
+contact_begin_print (GtkPrintOperation *operation,
+                     GtkPrintContext *context,
+                     EContactPrintContext *ctxt)
+{
+	GtkPageSetup *setup;
+	gdouble page_width;
+
+	e_contact_build_style (ctxt->style);
+
+	setup = gtk_print_context_get_page_setup (context);
+	page_width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
 
-	page_setup = gtk_page_setup_new ();
-	paper_size = gtk_paper_size_new ("iso_a4"); /* FIXME paper size hardcoded */
-	gtk_page_setup_set_paper_size (page_setup, paper_size);	
-	ctxt->print = gtk_print_operation_new ();
-	gtk_print_operation_set_default_page_setup (ctxt->print, page_setup);
-	gtk_print_operation_set_n_pages (ctxt->print, 1);
-	gtk_print_settings_set_print_pages (settings, GTK_PRINT_PAGES_ALL); 
-
-	/* style information */
-	e_contact_build_style(style, settings);
-	style->page_height = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_INCH);
-	style->page_width = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_INCH);
-	ctxt->x = 0;
-	ctxt->y = 0;
+	ctxt->context = context;
+	ctxt->x = ctxt->y = .0;
 	ctxt->column = 0;
-	ctxt->style = style;
+	ctxt->first_contact = TRUE;
 	ctxt->first_section = TRUE;
-	ctxt->type = GTK_RESPONSE_OK;
-	font_size = 72 * ctxt->style->page_height / 27.0 / 2.0;
-	ctxt->letter_heading_font = find_font (pango_font_description_get_family (ctxt->style->headings_font), 
-					       get_font_height (ctxt->style->headings_font)*1.5);
-	ctxt->book = book;
-	ctxt->query = query;
-	ctxt->response_id = response_id;
-	cpi->uses_book = uses_book;
-	cpi->uses_list = uses_list;
-	cpi->settings = settings;
-	cpi->ctxt = ctxt;
-	cpi->contact= contact;
-	cpi->ctxt->contacts = NULL;
-	cpi->contact_list= contact_list;
-	cpi->book = book; 
-	gtk_print_operation_set_print_settings (ctxt->print, settings);
-	g_signal_connect (ctxt->print, "draw_page",G_CALLBACK (contact_draw_page), cpi);
-
-	if (!uses_book) {
-	        if(ctxt->response_id == GTK_RESPONSE_APPLY) 
-		        gtk_print_operation_run (ctxt->print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
-		else
-			gtk_print_operation_run (ctxt->print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
-		settings = gtk_print_operation_get_print_settings (ctxt->print);
-		e_print_save_settings (settings); 
+	ctxt->section = NULL;
+
+	ctxt->column_spacing = gtk_print_context_get_dpi_x (context) / 4;
+	ctxt->column_width = (page_width + ctxt->column_spacing) /
+		ctxt->style->num_columns - ctxt->column_spacing;
+
+	ctxt->letter_heading_font = pango_font_description_new ();
+	pango_font_description_set_family (
+		ctxt->letter_heading_font,
+		pango_font_description_get_family (
+			ctxt->style->headings_font));
+	pango_font_description_set_size (
+		ctxt->letter_heading_font,
+		pango_font_description_get_size (
+			ctxt->style->headings_font) * 1.5);
+
+	if (ctxt->book != NULL)
+		load_contacts (ctxt);
+}
+
+static void
+contact_draw (EContact *contact, EContactPrintContext *ctxt)
+{
+	GtkPageSetup *setup;
+	gdouble page_height;
+	gchar *file_as;
+	gboolean new_section = FALSE;
+
+	setup = gtk_print_context_get_page_setup (ctxt->context);
+	page_height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
+
+	file_as = e_contact_get (contact, E_CONTACT_FILE_AS);
+
+	if (file_as != NULL) {
+		gchar *section;
+		gsize width;
+
+		width = g_utf8_next_char (file_as) - file_as;
+		section = g_utf8_strup (file_as, width);
+
+		new_section = (ctxt->section == NULL ||
+			g_utf8_collate (ctxt->section, section) != 0);
+
+		if (new_section) {
+			g_free (ctxt->section);
+			ctxt->section = section;
+		} else
+			g_free (section);
+	}
+
+	if (new_section) {
+		if (!ctxt->first_contact) {
+			if (ctxt->style->sections_start_new_page)
+				e_contact_start_new_page (ctxt);
+			else if (ctxt->y > page_height)
+				e_contact_start_new_column (ctxt);
+		}
+		if (ctxt->style->letter_headings)
+			e_contact_print_letter_heading (ctxt, ctxt->section);
+		ctxt->first_section = FALSE;
+	} 
+
+	else if (!ctxt->first_contact && (ctxt->y > page_height)) { 
+		e_contact_start_new_column (ctxt);
+		if (ctxt->style->letter_headings)
+			e_contact_print_letter_heading (ctxt, ctxt->section);
 	}
-	else
-		e_contact_do_print_contacts (book, query, ctxt);
 
-	g_object_unref (cpi); 
-	if (!uses_book) {
-			g_object_unref (ctxt->print); 
-			g_free (ctxt);
-	}	
-	gtk_widget_destroy (dialog); 
-#else
-	g_warning ("Not implemented currently on Windows");
-#endif
+	e_contact_print_contact (contact, ctxt);
+
+	ctxt->first_contact = FALSE;
 }
 
+static void
+contact_draw_page (GtkPrintOperation *operation,
+                   GtkPrintContext *context,
+                   gint page_nr,
+                   EContactPrintContext *ctxt)
+{
+	g_list_foreach (ctxt->contact_list, (GFunc) contact_draw, ctxt);
+}
+ 
+static void
+contact_end_print (GtkPrintOperation *operation,
+                   GtkPrintContext *context,
+                   EContactPrintContext *ctxt)
+{
+	pango_font_description_free (ctxt->style->headings_font);
+	pango_font_description_free (ctxt->style->body_font);
+	pango_font_description_free (ctxt->style->header_font);
+	pango_font_description_free (ctxt->style->footer_font);
+	pango_font_description_free (ctxt->letter_heading_font);
+
+	g_free (ctxt->section);
 
-GtkWidget *
-e_contact_print_dialog_new(EBook *book, char *query, GList *list)
+	if (ctxt->book != NULL)
+		free_contacts (ctxt);
+}
+
+void
+e_contact_print (EBook *book, EBookQuery *query,
+                 GList *contact_list, GtkPrintOperationAction action)
 {
-	GtkWidget *dialog;
-	GList *copied_list = NULL;
-	GList *l;
-	
-	dialog = e_print_get_dialog(_("Print contacts"), 0); 
-
-	if (list != NULL) {
-		copied_list = g_list_copy (list);
-		for (l = copied_list; l; l = l->next)
-			l->data = e_contact_duplicate (E_CONTACT (l->data));
-	}
-	g_object_ref(book);
-	g_object_set_data(G_OBJECT(dialog), "contact_list", copied_list);
-	g_object_set_data(G_OBJECT(dialog), "book", book);
-	g_object_set_data(G_OBJECT(dialog), "query", e_book_query_from_string  (query));
-	g_object_set_data(G_OBJECT(dialog), "uses_range", GINT_TO_POINTER (TRUE)); 
-
-	g_signal_connect(dialog,
-			 "response", G_CALLBACK(e_contact_print_response), NULL);
-	g_signal_connect(dialog,
-			 "close", G_CALLBACK(e_contact_print_close), NULL);
-	return dialog;
-
-}
-
-GtkWidget *
-e_contact_print_contact_dialog_new(EContact *contact)
-{
-	GtkWidget *dialog;
-
-	dialog = e_print_get_dialog(_("Print contact"), 0);
-        contact = e_contact_duplicate(contact);
-	g_object_set_data(G_OBJECT(dialog), "contact", contact);
-	g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (FALSE));
-	g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (FALSE));
-	g_object_set_data(G_OBJECT(dialog), "uses_range", GINT_TO_POINTER (FALSE));
-	g_signal_connect(dialog,
-			 "response", G_CALLBACK(e_contact_print_response), NULL);
-	g_signal_connect(dialog,
-			 "close", G_CALLBACK(e_contact_print_close), NULL);
-	return dialog;
-}
-
-GtkWidget *
-e_contact_print_contact_list_dialog_new(GList *list)
-{
-	GtkWidget *dialog;
-	GList *copied_list;
-	GList *l;
-
-	if (list == NULL)
-		return NULL; 
-
-	copied_list = g_list_copy (list);
-	for (l = copied_list; l; l = l->next)
-		l->data = e_contact_duplicate (E_CONTACT (l->data));
-
-	dialog = e_print_get_dialog(_("Print contact"), 0);
-
-	g_object_set_data(G_OBJECT(dialog), "contact_list", copied_list);
-	g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (TRUE));
-	g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (FALSE));
-	g_object_set_data(G_OBJECT(dialog), "uses_range", GINT_TO_POINTER (FALSE));
-	g_signal_connect(dialog,
-			 "response", G_CALLBACK(e_contact_print_response), NULL);
-	g_signal_connect(dialog,
-			 "close", G_CALLBACK(e_contact_print_close), NULL);
-	return dialog;
-}
-
-static void
-contact_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, ContactPrintItem *cpi)
-{
-		cpi->ctxt->pc = context;
-		g_object_ref (cpi->ctxt->pc);
-		cpi->ctxt->pl =gtk_print_context_create_pango_layout (context);
-		
-			if (cpi->uses_book) {
-				complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, cpi->ctxt);
-			} 
-			
-			else if (cpi->uses_list) {
-				cpi->ctxt->contacts = cpi->contact_list;
-				complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, cpi->ctxt);
-			}
-			else {
-				cpi->ctxt->contacts = g_list_append(NULL,cpi->contact);
-				complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, cpi->ctxt);
-			} 
+	GtkPrintOperation *operation;
+	EContactPrintContext ctxt;
+	EContactPrintStyle style;
+
+	if (book != NULL) {
+		ctxt.book = book;
+		ctxt.query = query;
+		ctxt.contact_list = NULL;
+	} else {
+		ctxt.book = NULL;
+		ctxt.query = NULL;
+		ctxt.contact_list = contact_list;
+	}
+	ctxt.style = &style;
+
+	operation = e_print_operation_new ();
+	gtk_print_operation_set_n_pages (operation, 1);
+
+	g_signal_connect (
+		operation, "begin-print",
+		G_CALLBACK (contact_begin_print), &ctxt);
+	g_signal_connect (
+		operation, "draw_page",
+		G_CALLBACK (contact_draw_page), &ctxt);
+	g_signal_connect (
+		operation, "end-print",
+		G_CALLBACK (contact_end_print), &ctxt);
+
+	gtk_print_operation_run (operation, action, NULL, NULL);
+
+	g_object_unref (operation);
 }
Index: addressbook/printing/test-print.c
===================================================================
--- addressbook/printing/test-print.c	(revision 33390)
+++ addressbook/printing/test-print.c	(working copy)
@@ -32,12 +32,6 @@
 /* This is a horrible thing to do, but it is just a test. */
 GtkWidget *print;
 
-static gint test_close(GnomeDialog *dialog, gpointer data)
-{
-	exit(0);
-	return 1;
-}
-
 #if 0
 static void about_callback( GtkWidget *widget, gpointer data )
 {
@@ -77,9 +71,8 @@ int main( int argc, char *argv[] )
   shown_fields = g_list_append(shown_fields, "Third field");
   shown_fields = g_list_append(shown_fields, "Fourth field");
 
-  print = e_contact_print_dialog_new(NULL, NULL, NULL);
-  gtk_widget_show_all(print);
-  g_signal_connect(print, "close", G_CALLBACK(test_close), NULL);
+  /* does nothing */
+  e_contact_print (NULL, NULL, NULL, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 
   bonobo_main(); 
 
Index: addressbook/printing/e-contact-print.h
===================================================================
--- addressbook/printing/e-contact-print.h	(revision 33390)
+++ addressbook/printing/e-contact-print.h	(working copy)
@@ -23,14 +23,13 @@
 #define E_CONTACT_PRINT_H
 
 #include <glib.h>
-#include <gtk/gtkwidget.h>
+#include <gtk/gtkprintoperation.h>
 #include <libebook/e-book.h>
-#include <libebook/e-contact.h>
 #include "e-contact-print-types.h"
 
-GtkWidget *e_contact_print_dialog_new (EBook *book, char *query, GList *list);
-GtkWidget *e_contact_print_contact_dialog_new (EContact *card);
-GtkWidget *e_contact_print_contact_list_dialog_new(GList *list);
-void e_contact_print_response (GtkWidget *dialog, gint response_id, gpointer data);
+void            e_contact_print               (EBook *book,
+					       EBookQuery *query,
+					       GList *contact_list,
+					       GtkPrintOperationAction action);
 
 #endif /* E_CONTACT_PRINT_H */
Index: addressbook/printing/e-contact-print-types.h
===================================================================
--- addressbook/printing/e-contact-print-types.h	(revision 33390)
+++ addressbook/printing/e-contact-print-types.h	(working copy)
@@ -23,8 +23,6 @@
 #define E_CONTACT_PRINT_TYPES_H
 
 #include <glib.h>
-#include <libgnomeprint/gnome-font.h>
-#include <libgnomeprint/gnome-print-pango.h>
 
 typedef struct _EContactPrintStyle EContactPrintStyle;
 typedef enum _EContactPrintType EContactPrintType;
Index: addressbook/printing/e-contact-print-envelope.c
===================================================================
--- addressbook/printing/e-contact-print-envelope.c	(revision 33390)
+++ addressbook/printing/e-contact-print-envelope.c	(working copy)
@@ -19,16 +19,17 @@
  * Boston, MA 02111-1307, USA.
  */
 
+/* XXX Keeping the rendering code around for future reference,
+ *     but it needs a lot of work to make it usable again. */
+
+#if 0
+
 #include <config.h>
 #include "addressbook/printing/e-contact-print-envelope.h"
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <libgnomeui/gnome-dialog.h>
 #include <time.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
 #include <e-util/e-print.h>
 
 #define ENVELOPE_HEIGHT (72.0 * 4.0)
@@ -123,12 +124,6 @@ ecpe_linelist_print(GnomePrintContext *p
 	}
 }
 
-static gint
-e_contact_print_envelope_close(GnomeDialog *dialog, gpointer data)
-{
-	return FALSE;
-}
-
 static void
 ecpe_print(GnomePrintContext *pc, EContact *contact, gboolean as_return)
 {
@@ -166,78 +161,4 @@ ecpe_print(GnomePrintContext *pc, EConta
 	gnome_print_context_close(pc);
 }
 
-static void
-e_contact_print_envelope_button(GnomeDialog *dialog, gint button, gpointer data)
-{
-	GnomePrintJob *master;
-	GnomePrintContext *pc;
-	GnomePrintConfig *config;
-	EContact *contact = NULL;
-	GtkWidget *preview;
-
-	contact = g_object_get_data(G_OBJECT(dialog), "contact");
-
-	switch( button ) {
-	case GNOME_PRINT_DIALOG_RESPONSE_PRINT:
-		config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (dialog));
-		master = gnome_print_job_new (config);
-		pc = gnome_print_job_get_context( master );
-
-		ecpe_print(pc, contact, FALSE);
-		
-		gnome_print_job_print(master);
-		gnome_dialog_close(dialog);
-		break;
-	case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW:
-		config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (dialog));
-		master = gnome_print_job_new (config);
-		pc = gnome_print_job_get_context( master );
-
-		ecpe_print(pc, contact, FALSE);
-		
-		preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview"));
-		gtk_widget_show_all(preview);
-		break;
-	case GNOME_PRINT_DIALOG_RESPONSE_CANCEL:
-		g_object_unref(contact);
-		gnome_dialog_close(dialog);
-		break;
-	}
-}
-
-GtkWidget *
-e_contact_print_envelope_dialog_new(EContact *contact)
-{
-	GtkWidget *dialog;
-	
-	dialog = e_print_get_dialog (_("Print envelope"), GNOME_PRINT_DIALOG_COPIES);
-
-	contact = e_contact_duplicate(contact);
-	g_object_set_data(G_OBJECT(dialog), "contact", contact);
-	g_signal_connect(dialog,
-			 "clicked", G_CALLBACK(e_contact_print_envelope_button), NULL);
-	g_signal_connect(dialog,
-			 "close", G_CALLBACK(e_contact_print_envelope_close), NULL);
-	return dialog;
-}
-
-/* FIXME: Print all the contacts selected. */
-GtkWidget *
-e_contact_print_envelope_list_dialog_new(GList *list)
-{
-	GtkWidget *dialog;
-	EContact *contact;
-
-	if (list == NULL)
-		return NULL;
-
-	dialog = e_print_get_dialog(_("Print envelope"), GNOME_PRINT_DIALOG_COPIES);
-
-	contact = e_contact_duplicate(list->data);
-	g_object_set_data(G_OBJECT(dialog), "contact", contact);
-	g_signal_connect(dialog,
-			 "clicked", G_CALLBACK(e_contact_print_envelope_button), NULL);
-	g_signal_connect(dialog,
-			 "close", G_CALLBACK(e_contact_print_envelope_close), NULL);
-	return dialog;
-}
+#endif
Index: addressbook/printing/e-contact-print-envelope.h
===================================================================
--- addressbook/printing/e-contact-print-envelope.h	(revision 33390)
+++ addressbook/printing/e-contact-print-envelope.h	(working copy)
@@ -22,11 +22,6 @@
 #ifndef E_CONTACT_PRINT_ENVELOPE_H
 #define E_CONTACT_PRINT_ENVELOPE_H
 
-#include <gtk/gtkwidget.h>
-#include <libebook/e-contact.h>
-#include "e-contact-print-types.h"
-
-GtkWidget *e_contact_print_envelope_dialog_new(EContact *contact);
-GtkWidget *e_contact_print_envelope_list_dialog_new(GList *list);
+/* XXX Currently unused */
 
 #endif /* E_CONTACT_PRINT_ENVELOPE_H */
Index: addressbook/printing/Makefile.am
===================================================================
--- addressbook/printing/Makefile.am	(revision 33390)
+++ addressbook/printing/Makefile.am	(working copy)
@@ -22,8 +22,6 @@ noinst_LTLIBRARIES =				\
 	libecontactprint.la
 
 libecontactprint_la_SOURCES = 			\
-	e-contact-print-envelope.c		\
-	e-contact-print-envelope.h		\
 	e-contact-print-style-editor.c		\
 	e-contact-print-style-editor.h		\
 	e-contact-print-types.h			\
Index: plugins/print-message/print-message.c
===================================================================
--- plugins/print-message/print-message.c	(revision 33390)
+++ plugins/print-message/print-message.c	(working copy)
@@ -30,7 +30,6 @@
 #include "mail/em-format-html-print.h"
 #include <glib.h>
 #include <glib/gi18n.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
 #include "mail/em-menu.h"
 #include "mail/em-utils.h"
 #include "e-util/e-print.h"
@@ -39,72 +38,34 @@
 
 void org_gnome_compose_print_message (EPlugin *ep, EMMenuTargetWidget *t);
 
-struct _print_data {
-	GtkPrintSettings *config;
-	CamelMimeMessage *msg;
-	int preview;
-};
-
-static void
-print_response (GtkWidget *w, int resp, struct _print_data *data)
-{
-	EMFormatHTMLPrint *print;
-
-	switch (resp) {
-	case GTK_RESPONSE_APPLY:
-		data->preview = TRUE;
-	case GTK_RESPONSE_OK:
-		print = em_format_html_print_new();
-	   	em_format_html_print_raw_message(print, data->config, data->msg, data->preview);
-		g_object_unref(print);
-		break;
-	}
-
-	if (w)
-		gtk_widget_destroy(w);
-	
-	e_print_save_settings (data->config);
-	g_object_unref(data->config);
-	g_free(data);
-
-}
-
-void  org_gnome_print_message (EPlugin *ep, EMMenuTargetWidget *t);
-
 void 
 org_gnome_print_message (EPlugin *ep, EMMenuTargetWidget *t)
 {
-
        	EMsgComposer *composer = (EMsgComposer *)t->target.widget;
-	struct _print_data *data;
-	GtkDialog *dialog;
-	
-	data = g_malloc0(sizeof(*data));
-	data->config = e_print_load_settings ();
-	data->preview = 0;
-	
-	data->msg = e_msg_composer_get_message (composer, 1);
-	dialog = (GtkDialog *)e_print_get_dialog_with_config (_("Print Message"), 0, data->config);
-	gtk_dialog_set_default_response(dialog, GTK_RESPONSE_OK);
-	e_dialog_set_transient_for ((GtkWindow *) dialog, (GtkWidget *) composer);
-	print_response (dialog, GTK_RESPONSE_OK, data);	
+	GtkPrintOperationAction action;
+	CamelMimeMessage *message;
+	EMFormatHTMLPrint *efhp;
+
+	action = GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG;
+	message = e_msg_composer_get_message (composer, 1);
+
+	efhp = em_format_html_print_new (NULL, action);
+	em_format_html_print_raw_message (efhp, message);
+	g_object_unref (efhp);
 }
 
-void org_gnome_print_preview (EPlugin *ep, EMMenuTargetWidget *t);
-
 void
 org_gnome_print_preview (EPlugin *ep, EMMenuTargetWidget *t)
 {
   	EMsgComposer *composer = (EMsgComposer *)t->target.widget;
-	struct _print_data *data;
-	
-	data = g_malloc0(sizeof(*data));
-	data->config = e_print_load_settings ();
-	data->preview = 0;
-	
-	data->msg = e_msg_composer_get_message (composer, 1);
-
-	print_response(NULL, GTK_RESPONSE_APPLY, data);
+	GtkPrintOperationAction action;
+	CamelMimeMessage *message;
+	EMFormatHTMLPrint *efhp;
+
+	action = GTK_PRINT_OPERATION_ACTION_PREVIEW;
+	message = e_msg_composer_get_message (composer, 1);
+
+	efhp = em_format_html_print_new (NULL, action);
+	em_format_html_print_raw_message (efhp, message);
+	g_object_unref (efhp);
 }
-
-
Index: mail/em-format-html-print.c
===================================================================
--- mail/em-format-html-print.c	(revision 33390)
+++ mail/em-format-html-print.c	(working copy)
@@ -26,274 +26,212 @@
 #endif
 
 #include <string.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
+#include <gtk/gtk.h>
 #include <gtkhtml/gtkhtml.h>
-#include <gtk/gtkwindow.h>
 
 #include <camel/camel-i18n.h>
 #include "mail-ops.h"
 #include "mail-mt.h"
 #include "em-format-html-print.h"
-#include <gtk/gtk.h>
 #include <e-util/e-print.h>
 
-static void efhp_builtin_init(EMFormatHTMLPrintClass *efhc);
-
-static EMFormatHTMLClass *efhp_parent;
+static gpointer parent_class = NULL;
 
 static void
-efhp_init(GObject *o)
+efhp_finalize (GObject *o)
 {
 	EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o;
-	GtkWidget *html = (GtkWidget *)efhp->formathtml.html;
 
-	/* ?? */
-	gtk_widget_set_name(html, "EvolutionMailPrintHTMLWidget");
+	gtk_widget_destroy (efhp->window);
+	if (efhp->source != NULL)
+		g_object_unref (efhp->source);
 
-	/* gtk widgets don't like to be realized outside top level widget
-	   so we put new html widget into gtk window */
-	efhp->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-	gtk_container_add((GtkContainer *)efhp->window, html);
-	gtk_widget_realize(html);
-	efhp->formathtml.show_icon = FALSE;
+	((GObjectClass *) parent_class)->finalize (o);
 }
 
 static void
-efhp_finalise(GObject *o)
+efhp_class_init (GObjectClass *class)
 {
-	EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o;
-
-	gtk_widget_destroy(efhp->window);
-	if (efhp->settings)
-		g_object_unref(efhp->settings);
-	if (efhp->source)
-		g_object_unref(efhp->source);
-
-	((GObjectClass *)efhp_parent)->finalize(o);
+	parent_class = g_type_class_ref(EM_TYPE_FORMAT_HTML_PRINT);
+	class->finalize = efhp_finalize;
 }
 
 static void
-efhp_base_init(EMFormatHTMLPrintClass *efhpklass)
+efhp_init (GObject *o)
 {
-	efhp_builtin_init(efhpklass);
-}
+	EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o;
+	GtkWidget *html = (GtkWidget *)efhp->parent.html;
 
-static void
-efhp_class_init(GObjectClass *klass)
-{
-	klass->finalize = efhp_finalise;
+	/* ?? */
+	gtk_widget_set_name(html, "EvolutionMailPrintHTMLWidget");
+
+	/* gtk widgets don't like to be realized outside top level widget
+	   so we put new html widget into gtk window */
+	efhp->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+	gtk_container_add (GTK_CONTAINER (efhp->window), html);
+	gtk_widget_realize (html);
+	efhp->parent.show_icon = FALSE;
 }
 
 GType
-em_format_html_print_get_type(void)
+em_format_html_print_get_type (void)
 {
 	static GType type = 0;
 
-	if (type == 0) {
-		static const GTypeInfo info = {
-			sizeof(EMFormatHTMLPrintClass),
-			(GBaseInitFunc)efhp_base_init, NULL,
-			(GClassInitFunc)efhp_class_init,
-			NULL, NULL,
-			sizeof(EMFormatHTMLPrint), 0,
-			(GInstanceInitFunc)efhp_init
+	if (G_UNLIKELY (type == 0)) {
+		static const GTypeInfo type_info = {
+			sizeof (EMFormatHTMLPrintClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) efhp_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (EMFormatHTMLPrint),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) efhp_init
 		};
-		efhp_parent = g_type_class_ref(em_format_html_get_type());
-		type = g_type_register_static(em_format_html_get_type(), "EMFormatHTMLPrint", &info, 0);
+
+		type = g_type_register_static (
+			em_format_html_get_type (), "EMFormatHTMLPrint",
+			&type_info, 0);
 	}
 
 	return type;
 }
 
-EMFormatHTMLPrint *em_format_html_print_new(void)
+EMFormatHTMLPrint *
+em_format_html_print_new (EMFormatHTML *source, GtkPrintOperationAction action)
 {
 	EMFormatHTMLPrint *efhp;
 
-	efhp = g_object_new(em_format_html_print_get_type(), 0);
+	efhp = g_object_new (EM_TYPE_FORMAT_HTML_PRINT, NULL);
+	if (source != NULL)
+		efhp->source = g_object_ref (source);
+	efhp->action = action;
 
 	return efhp;
 }
 
 struct footer_info {
-	GnomeFont *local_font;
+	PangoLayout *layout;
 	gint page_num, pages;
 };
-typedef struct MailDraw MailDraw;
-
-struct MailDraw {
-	EMFormatHTMLPrint *efhp;
-	struct footer_info info;
-	void *data;
-	gint res;
-	gdouble line;
-};
 
-static void mail_draw_page(GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, MailDraw *mdi);
 static void
-efhp_footer_cb(GtkHTML *html, GtkPrintContext *print_context, double x, double y, double width, double height, void *data)
+efhp_footer_cb (GtkHTML *html, GtkPrintContext *context, gdouble x, gdouble y,
+                gdouble width, gdouble height, gpointer data)
 {
 	struct footer_info *info = data;
+	gchar *footer_text;
 	cairo_t *cr;
-     
-	/* do we want anything nicer here, like who its from, etc? */
-	if (info->local_font) {
-		char *text = g_strdup_printf (_("Page %d of %d"), info->page_num, info->pages);
-		/*gdouble tw = gnome_font_get_width_string (info->local_font, text);*/
-		/* FIXME: work out how to measure this */
-		gdouble tw = strlen(text) * 8;
-		cr = gtk_print_context_get_cairo_context (print_context);
-		cairo_save (cr);
-		cairo_set_source_rgb (cr, .0, .0, .0);
-		cairo_move_to (cr, x + width - tw, y - gnome_font_get_ascender(info->local_font));
-		cairo_set_font_face (cr, NULL);
-		cairo_set_font_size (cr, 6);
-		cairo_show_text (cr, text);
-		cairo_restore(cr);
-		g_free(text); 
-		info->page_num++;   
-	}
-}
 
-/* perform preview, or print */
-/* returns GNOME_PRINT_OK on success */
-static void
-emfhp_complete(EMFormatHTMLPrint *efhp, void *data)
-{
-	GtkPaperSize *paper_size;
-	GtkPrintOperation *print;
-	GtkPrintSettings *settings;
-	GtkPageSetup *page_setup;
-	struct MailDraw *mdi;
-	struct footer_info info;
+	footer_text = g_strdup_printf (_("Page %d of %d"),
+		info->page_num++, info->pages);
+
+	pango_layout_set_text (info->layout, footer_text, -1);
+	pango_layout_set_width (info->layout, pango_units_from_double (width));
 
-	page_setup = gtk_page_setup_new ();
-	paper_size = gtk_paper_size_new ("iso_a4");/*FIXME paper size hardcoded */
-	print = gtk_print_operation_new ();
-	gtk_page_setup_set_paper_size (page_setup, paper_size);	 
-
-	settings = e_print_load_settings ();
-	gtk_print_operation_set_print_settings (print, settings);
-	/* running the dialog */
-	gtk_print_operation_set_default_page_setup (print, page_setup);
-	gtk_print_operation_set_n_pages (print, 1); 
-
-	/*initialise the struct */
-	mdi = g_new0 (MailDraw, 1);
-	mdi->efhp = efhp;
-	mdi->line = 0.0;
-	mdi->res = GNOME_PRINT_OK;
-	mdi->info = info;
-			
-        /* connect */
-	g_signal_connect (print,"draw_page", G_CALLBACK (mail_draw_page), mdi);
-	if (!efhp->preview)
-		gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL); 
-	else
-		gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
-	settings = gtk_print_operation_get_print_settings (print);
-	e_print_save_settings (settings);
-	g_object_unref (print);
+	cr = gtk_print_context_get_cairo_context (context);
+
+	cairo_save (cr);
+	cairo_set_source_rgb (cr, .0, .0, .0);
+	cairo_move_to (cr, x, y);
+	pango_cairo_show_layout (cr, info->layout);
+	cairo_restore (cr);
+
+	g_free (footer_text);
 }
 
 static void 
-mail_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, MailDraw *mdi)
+mail_draw_page (GtkPrintOperation *print, GtkPrintContext *context,
+                gint page_nr, EMFormatHTMLPrint *efhp)
 {
-	mdi->info.local_font = gnome_font_find_closest("Sans Regular", 10.0);
-	if (mdi->info.local_font) {
-		mdi->line = gnome_font_get_ascender(mdi->info.local_font) - gnome_font_get_descender(mdi->info.local_font);                
-		mdi->info.page_num = 1;
-		mdi->info.pages = gtk_html_print_page_get_pages_num(mdi->efhp->formathtml.html, context, 0.0, mdi->line );
-		gtk_html_print_page_with_header_footer(mdi->efhp->formathtml.html,
-						  context, 
-						  0.0, 
-					          mdi->line,
-					          NULL,
-						  efhp_footer_cb, 
-						  &(mdi->info));
-	} else {
-		gtk_html_print_page (mdi->efhp->formathtml.html, context);
-	}
-}
+	GtkHTML *html = efhp->parent.html;
+	PangoFontDescription *desc;
+	PangoFontMetrics *metrics;
+	struct footer_info info;
+	gdouble footer_height;
 
-int em_format_html_print_print(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, int preview)
-{
-	EMFormat *emfs = (EMFormat *)source;
+	desc = pango_font_description_from_string ("Sans Regular 10");
 
-	efhp->settings = settings;
-	if (settings)
-		g_object_ref(settings);
+	info.layout = gtk_print_context_create_pango_layout (context);
+	pango_layout_set_alignment (info.layout, PANGO_ALIGN_CENTER);
+	pango_layout_set_font_description (info.layout, desc);
 
-	efhp->preview = preview;
-	((EMFormatHTML *)efhp)->load_http = source->load_http_now;
+	metrics = pango_context_get_metrics (
+		pango_layout_get_context (info.layout),
+		desc, pango_language_get_default ());
+	footer_height = pango_units_to_double (
+		pango_font_metrics_get_ascent (metrics) +
+		pango_font_metrics_get_descent (metrics));
+	pango_font_metrics_unref (metrics);
 
-	g_signal_connect(efhp, "complete", G_CALLBACK(emfhp_complete), efhp);
+	pango_font_description_free (desc);
 
-	g_object_ref(efhp);
-	em_format_format_clone((EMFormat *)efhp, emfs->folder, emfs->uid, emfs->message, (EMFormat *)source);
+	info.page_num = 1;
+	info.pages = gtk_html_print_page_get_pages_num (
+		html, context, 0.0, footer_height);
 
-	return 0;		/* damn async ... */
+	gtk_html_print_page_with_header_footer (
+		html, context, 0.0, footer_height,
+		NULL, efhp_footer_cb, &info);
 }
 
 static void
-emfhp_got_message(struct _CamelFolder *folder, const char *uid, struct _CamelMimeMessage *msg, void *data)
+emfhp_complete (EMFormatHTMLPrint *efhp)
 {
-	EMFormatHTMLPrint *efhp = data;
-
-	if (msg) {
-		if (efhp->source)
-			((EMFormatHTML *)efhp)->load_http = efhp->source->load_http_now;
-		g_signal_connect(efhp, "complete", G_CALLBACK(emfhp_complete), efhp);
-		em_format_format_clone((EMFormat *)efhp, folder, uid, msg, (EMFormat *)efhp->source);
-	} else {
-		g_object_unref(efhp);
-	}
-}
+	GtkPrintOperation *operation;
 
-int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, struct _CamelFolder *folder, const char *uid, int preview)
-{
-	efhp->settings = settings;
+	operation = e_print_operation_new ();
+	gtk_print_operation_set_n_pages (operation, 1); 
 
-	if (settings)
-		g_object_ref(settings);
-	efhp->preview = preview;
-	efhp->source = source;
-	if (source)
-		g_object_ref(source);
-	g_object_ref(efhp);
+	g_signal_connect (
+		operation, "draw-page",
+		G_CALLBACK (mail_draw_page), efhp);
 
-	mail_get_message(folder, uid, emfhp_got_message, efhp, mail_thread_new);
+	gtk_print_operation_run (operation, efhp->action, NULL, NULL); 
 
-	return 0;		/* damn async ... */
+	g_object_unref (operation);
 }
 
-int em_format_html_print_raw_message(EMFormatHTMLPrint *efhp, GtkPrintSettings *settings, struct _CamelMimeMessage *msg, int preview)
+static void
+emfhp_got_message (CamelFolder *folder, const char *uid,
+                   CamelMimeMessage *msg, gpointer data)
 {
-	efhp->settings = settings;
+	EMFormatHTMLPrint *efhp = data;
 
-	if (settings)
-		g_object_ref(settings);
-	efhp->source = NULL;
-	efhp->preview = preview;
-	g_object_ref(efhp);
+	if (msg == NULL) {
+		g_object_unref (efhp);
+		return;
+	}
 
-	emfhp_got_message(NULL, NULL, msg, efhp);
+	if (efhp->source != NULL)
+		((EMFormatHTML *)efhp)->load_http =
+			efhp->source->load_http_now;
 
-	return 0;
+	g_signal_connect (
+		efhp, "complete", G_CALLBACK (emfhp_complete), efhp);
+	em_format_format_clone (
+		(EMFormat *) efhp, folder, uid, msg,
+		(EMFormat *) efhp->source);
 }
 
-/* ********************************************************************** */
+void
+em_format_html_print_message (EMFormatHTMLPrint *efhp,
+                              CamelFolder *folder,
+                              const char *uid)
+{
+	g_object_ref (efhp);
 
-/* if only ... but i doubt this is possible with gnome print/gtkhtml */
-static EMFormatHandler type_builtin_table[] = {
-	/*{ "application/postscript", (EMFormatFunc)efhp_application_postscript },*/
-};
+	mail_get_message (
+		folder, uid, emfhp_got_message, efhp, mail_thread_new);
+}
 
-static void
-efhp_builtin_init(EMFormatHTMLPrintClass *efhc)
+void
+em_format_html_print_raw_message (EMFormatHTMLPrint *efhp,
+                                  CamelMimeMessage *msg)
 {
-	int i;
+	g_object_ref (efhp);
 
-	for (i=0;i<sizeof(type_builtin_table)/sizeof(type_builtin_table[0]);i++)
-		em_format_class_add_handler((EMFormatClass *)efhc, &type_builtin_table[i]);
+	emfhp_got_message (NULL, NULL, msg, efhp);
 }
Index: mail/em-format-html-print.h
===================================================================
--- mail/em-format-html-print.h	(revision 33390)
+++ mail/em-format-html-print.h	(working copy)
@@ -8,32 +8,32 @@
 
 #include "mail/em-format-html.h"
 
-struct GtkPrintSettings;
+#define EM_TYPE_FORMAT_HTML_PRINT \
+	(em_format_html_print_get_type ())
+
 typedef struct _EMFormatHTMLPrint EMFormatHTMLPrint;
 typedef struct _EMFormatHTMLPrintClass EMFormatHTMLPrintClass;
 
-struct _CamelFolder;
-
 struct _EMFormatHTMLPrint {
-	EMFormatHTML formathtml;
+	EMFormatHTML parent;
 
-	struct _GtkWidget *window;	/* used to realise the gtkhtml in a toplevel, i dont know why */
-	struct _GtkPrintSettings *settings;
-	struct _EMFormatHTML *source; /* used for print_message */
+	GtkWidget *window;	/* used to realise the gtkhtml in a toplevel, i dont know why */
+	EMFormatHTML *source; /* used for print_message */
 
-	guint preview:1;
+	GtkPrintOperationAction action;
 };
 
 struct _EMFormatHTMLPrintClass {
-	EMFormatHTMLClass formathtml_class;
+	EMFormatHTMLClass parent_class;
 };
 
-GType em_format_html_print_get_type(void);
-
-EMFormatHTMLPrint *em_format_html_print_new(void);
-
-int em_format_html_print_print(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, int preview);
-int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct GtkPrintSettings *settings, struct _CamelFolder *folder, const char *uid, int preview);
-int em_format_html_print_raw_message(EMFormatHTMLPrint *efhp, struct _GtkPrintSettings *settings, struct _CamelMimeMessage *msg, int preview);
+GType      em_format_html_print_get_type      (void);
+EMFormatHTMLPrint * em_format_html_print_new  (EMFormatHTML *source,
+                                               GtkPrintOperationAction action);
+void       em_format_html_print_message       (EMFormatHTMLPrint *efhp,
+                                               CamelFolder *folder,
+                                               const char *uid);
+void        em_format_html_print_raw_message  (EMFormatHTMLPrint *efhp,
+                                               CamelMimeMessage *msg);
 
 #endif /* ! _EM_FORMAT_HTML_PRINT_H */
Index: mail/em-folder-view.c
===================================================================
--- mail/em-folder-view.c	(revision 33390)
+++ mail/em-folder-view.c	(working copy)
@@ -108,7 +108,6 @@
 #include "mail-vfolder.h"
 #include "mail-component.h"
 #include "mail-tools.h"
-#include <gtk/gtkprintunixdialog.h>
 
 #include "evolution-shell-component-utils.h" /* Pixmap stuff, sigh */
 
@@ -779,7 +778,7 @@ static void
 emfv_popup_print(EPopup *ep, EPopupItem *pitem, void *data)
 {
 	EMFolderView *emfv = data;
-	em_folder_view_print(emfv, FALSE);
+	em_folder_view_print(emfv, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 }
 
 static void
@@ -1547,7 +1546,7 @@ emfv_print_preview_message(BonoboUICompo
 {
 	EMFolderView *emfv = data;
 
-	em_folder_view_print(emfv, TRUE);
+	em_folder_view_print(emfv, GTK_PRINT_OPERATION_ACTION_PREVIEW);
 }
 
 static void
@@ -2112,86 +2111,30 @@ emfv_activate(EMFolderView *emfv, Bonobo
 	}
 }
 
-struct _print_data {
-	EMFolderView *emfv;
-
-	GtkPrintSettings *settings;
-	int preview;
-	CamelFolder *folder;
-	char *uid;
-};
-
-static void
-emfv_print_response(GtkWidget *w, int resp, struct _print_data *data)
-{
-	EMFormatHTMLPrint *print;
-	gboolean preview = FALSE;
-	
-	switch (resp) {
-	case GTK_RESPONSE_APPLY:
-               preview = TRUE;
-	case GTK_RESPONSE_OK:
-      	       print = em_format_html_print_new ();
-	       print->preview = preview;
-	       em_format_set_session ((EMFormat *)print, ((EMFormat *)data->emfv->preview)->session);
-	       em_format_html_print_message (print, 
-				      (EMFormatHTML *)data->emfv->preview, 
-				      data->settings,
-				      data->folder,
-				      data->uid, 
-				      data->preview);
-	       g_object_unref(print); 
-	       break;
-	}
-
-	if (w)
-		gtk_widget_destroy (w);
-
-	g_object_unref (data->emfv); 
-	g_object_unref (data->settings); 
-	camel_object_unref (data->folder);
-	g_free (data->uid);
-	g_free (data);
-}
-
-
-
-int em_folder_view_print(EMFolderView *emfv, int preview)
+int
+em_folder_view_print (EMFolderView *emfv, GtkPrintOperationAction action)
 {
-	struct _print_data *data;
+	EMFormatHTMLPrint *efhp;
 	GPtrArray *uids;
 
 	if (emfv->folder == NULL)
 		return 0;
 
-	uids = message_list_get_selected(emfv->list);
-	if (uids->len != 1) {
-		message_list_free_uids(emfv->list, uids);
-		return 0;
-	}
+	uids = message_list_get_selected (emfv->list);
+	if (uids->len != 1)
+		goto exit;
 
-	data = g_malloc0(sizeof(*data));
-	data->emfv = emfv;
-	g_object_ref(emfv);
-	data->settings = e_print_load_settings ();
-	data->preview = preview;
-	data->folder = emfv->folder;
-	camel_object_ref(data->folder);
-	data->uid = g_strdup(uids->pdata[0]);
-	message_list_free_uids(emfv->list, uids);
+	efhp = em_format_html_print_new (
+		(EMFormatHTML *) emfv->preview, action);
+	em_format_set_session (
+		(EMFormat *) efhp,
+		((EMFormat *) emfv->preview)->session);
+	em_format_html_print_message (
+		efhp, emfv->folder, uids->pdata[0]);
+	g_object_unref (efhp);
 
-	if (preview) {
-	        GtkDialog *dialog = (GtkDialog *)e_print_get_dialog_with_config (_("Print Message"), 
-									 0, data->settings);
-		e_dialog_set_transient_for ((GtkWindow *) dialog, (GtkWidget *) emfv);
-		emfv_print_response(dialog, GTK_RESPONSE_APPLY, data);
-	} else {
-		GtkDialog *dialog = (GtkDialog *)e_print_get_dialog_with_config (_("Print Message"), 
-								         0, data->settings);
-		gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
-		e_dialog_set_transient_for ((GtkWindow *) dialog, (GtkWidget *) emfv);
-		emfv_print_response (dialog, GTK_RESPONSE_OK, data);
-	}
+exit:
+	message_list_free_uids (emfv->list, uids);
 
 	return 0;
 }
Index: mail/em-folder-view.h
===================================================================
--- mail/em-folder-view.h	(revision 33390)
+++ mail/em-folder-view.h	(working copy)
@@ -25,6 +25,7 @@
 #define _EM_FOLDER_VIEW_H
 
 #include <gtk/gtkvbox.h>
+#include <gtk/gtkprintoperation.h>
 #include "mail/em-popup.h"
 
 #ifdef __cplusplus
@@ -132,7 +133,7 @@ EMPopupTargetSelect *em_folder_view_get_
 int em_folder_view_mark_selected(EMFolderView *emfv, guint32 mask, guint32 set);
 int em_folder_view_open_selected(EMFolderView *emfv);
 
-int em_folder_view_print(EMFolderView *emfv, int preview);
+int em_folder_view_print(EMFolderView *emfv, GtkPrintOperationAction action);
 
 /* this could be on message-list */
 guint32 em_folder_view_disable_mask(EMFolderView *emfv);
Index: configure.in
===================================================================
--- configure.in	(revision 33390)
+++ configure.in	(working copy)
@@ -1202,7 +1202,7 @@ AC_CHECK_HEADERS(libgnomeui/gnome-icon-l
 AC_CHECK_HEADERS(libgnomeui/gnome-thumbnail.h)
 CPPFLAGS="$CPPFLAGS_save"
 
-PKG_CHECK_MODULES(EXTRA_GNOME, libgnomeprint-2.2 >= 2.7.0 libgnomeprintui-2.2 >= 2.2.1 $FULL_GNOME_DEPS)
+PKG_CHECK_MODULES(EXTRA_GNOME, $FULL_GNOME_DEPS)
 AC_SUBST(EXTRA_GNOME_LIBS)
 AC_SUBST(EXTRA_GNOME_CFLAGS)
 
@@ -1245,7 +1245,7 @@ EVO_SET_COMPILE_FLAGS(E_NAME, libgnomeui
 AC_SUBST(E_NAME_CFLAGS)
 AC_SUBST(E_NAME_LIBS)
 
-EVO_SET_COMPILE_FLAGS(E_UTIL, gthread-2.0 gconf-2.0 libxml-2.0 gtk+-unix-print-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 libgnomeprintui-2.2 libedataserver-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $mozilla_nspr $mono_package, $THREADS_CFLAGS $MANUAL_NSPR_CFLAGS, $THREADS_LIBS $MANUAL_NSPR_LIBS)
+EVO_SET_COMPILE_FLAGS(E_UTIL, gthread-2.0 gconf-2.0 libxml-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 libedataserver-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $mozilla_nspr $mono_package, $THREADS_CFLAGS $MANUAL_NSPR_CFLAGS, $THREADS_LIBS $MANUAL_NSPR_LIBS)
 AC_SUBST(E_UTIL_CFLAGS)
 AC_SUBST(E_UTIL_LIBS)
 
@@ -1295,7 +1295,7 @@ AC_SUBST(SHELL_LIBS)
 
 dnl --- evolution-addressbook flags
 
-EVOLUTION_ADDRESSBOOK_DEPS="gconf-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 gtk+-unix-print-2.0 gnome-vfs-2.0 libgnomeprintui-2.2 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED camel-$EDS_PACKAGE"
+EVOLUTION_ADDRESSBOOK_DEPS="gconf-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeui-2.0 libgnome-2.0 libgnomecanvas-2.0 gnome-vfs-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED camel-$EDS_PACKAGE"
 
 EVO_SET_COMPILE_FLAGS(EVOLUTION_ADDRESSBOOK, $EVOLUTION_ADDRESSBOOK_DEPS)
 AC_SUBST(EVOLUTION_ADDRESSBOOK_CFLAGS)
@@ -1333,7 +1333,7 @@ EVO_SET_COMPILE_FLAGS(LIBSOUP, $LIBSOUP 
 AC_SUBST(LIBSOUP_CFLAGS)
 AC_SUBST(LIBSOUP_LIBS)
 
-EVO_SET_COMPILE_FLAGS(EVOLUTION_CALENDAR, libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 libglade-2.0 gnome-vfs-2.0 gtk+-unix-print-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $HAL_REQUIREMENT $libnotify)
+EVO_SET_COMPILE_FLAGS(EVOLUTION_CALENDAR, libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 libglade-2.0 gnome-vfs-2.0 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $HAL_REQUIREMENT $libnotify)
 AC_SUBST(EVOLUTION_CALENDAR_CFLAGS)
 AC_SUBST(EVOLUTION_CALENDAR_LIBS)
 
@@ -1345,7 +1345,7 @@ fi
 
 dnl --- evolution-mail flags
 
-EVO_SET_COMPILE_FLAGS(EVOLUTION_MAIL, camel-provider-$EDS_PACKAGE libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 gnome-vfs-module-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libxml-2.0 bonobo-activation-2.0 gthread-2.0 gconf-2.0 gtk+-unix-print-2.0 $mozilla_nss libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED)
+EVO_SET_COMPILE_FLAGS(EVOLUTION_MAIL, camel-provider-$EDS_PACKAGE libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libxml-2.0 bonobo-activation-2.0 gthread-2.0 gconf-2.0 $mozilla_nss libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED)
 AC_SUBST(EVOLUTION_MAIL_CFLAGS)
 AC_SUBST(EVOLUTION_MAIL_LIBS)
 
@@ -1587,7 +1587,7 @@ if echo ${plugins_enabled} | grep "excha
 		dnl **************************************************
 		dnl * Exchange Operations plugin
 		dnl **************************************************
-		EVO_SET_COMPILE_FLAGS(CAMEL_EXCHANGE, libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 gthread-2.0 gconf-2.0 camel-provider-$EDS_PACKAGE libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE libexchange-storage-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE)
+		EVO_SET_COMPILE_FLAGS(CAMEL_EXCHANGE, libbonoboui-2.0 >= $BONOBOUI_REQUIRED libglade-2.0 gthread-2.0 gconf-2.0 camel-provider-$EDS_PACKAGE libebook-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE libexchange-storage-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE)
 		AC_SUBST(CAMEL_EXCHANGE_CFLAGS)
 		AC_SUBST(CAMEL_EXCHANGE_LIBS)
 	else
Index: e-util/e-print.c
===================================================================
--- e-util/e-print.c	(revision 33390)
+++ e-util/e-print.c	(working copy)
@@ -24,8 +24,9 @@
 #include <stdio.h>
 #include <string.h>
 #include <gtk/gtk.h>
-#include <gtk/gtkprintunixdialog.h>
+#include <glib/gi18n.h>
 #include <gconf/gconf-client.h>
+
 #define PRINTING "/apps/evolution/shell/printing"
 
 static void
@@ -35,21 +36,23 @@ pack_settings (const gchar *key, const g
 	item = g_strdup_printf ("%s=%s", key, value);
 	*p_list = g_slist_prepend (*p_list, item);
 }
+
 static void
 unpack_settings (gchar *item, GtkPrintSettings *settings)
 {
 	gchar *cp, *key, *value;
 	cp = strchr (item, '=');
 	if (cp == NULL)
-	return;	
+		return;	
 	*cp ++ = '\0';
 	key = g_strstrip (item);
 	value = g_strstrip (cp);
 	gtk_print_settings_set (settings, key, value);
 	g_free (item);
 }
-GtkPrintSettings *
-e_print_load_settings (void)
+
+static GtkPrintSettings *
+load_settings (void)
 {
 	GConfClient *client;
 	GtkPrintSettings *settings;
@@ -68,19 +71,22 @@ e_print_load_settings (void)
 		g_warning ("%s: %s", G_STRFUNC, error->message);
 		g_error_free (error);
 	}
+
 	g_object_unref (client);
+
 	return settings;
 }
 
-/* Saves the print settings */
- 
-void
-e_print_save_settings (GtkPrintSettings *settings)
+static void
+save_settings (GtkPrintOperation *operation)
 {
+	GtkPrintSettings *settings;
 	GConfClient *client;
 	GSList *list = NULL;
 	GError *error = NULL;
 	
+	settings = gtk_print_operation_get_print_settings (operation);
+
 	client = gconf_client_get_default ();
 	
 	gtk_print_settings_foreach (
@@ -98,38 +104,60 @@ e_print_save_settings (GtkPrintSettings 
 }
 
 static void
-print_dialog_response(GtkWidget *widget, int resp, gpointer data)
+handle_error (GtkPrintOperation *operation)
 {
-#ifdef G_OS_UNIX		/* Just to get it to build on Win32 */
-	if (resp == GTK_RESPONSE_OK) {
-	    e_print_save_settings (gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG (widget)));	
-	}
-#endif
+	GtkWidget *dialog;
+	GError *error = NULL;
+
+	dialog = gtk_message_dialog_new_with_markup (
+		NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+		"<span weight=\"bold\" size=\"larger\">%s</span>",
+		_("An error occurred while printing"));
+
+	gtk_print_operation_get_error (operation, &error);
+
+	if (error != NULL && error->message != NULL)
+		gtk_message_dialog_format_secondary_text (
+			GTK_MESSAGE_DIALOG (dialog), "%s\n\n%s",
+			_("The printing system reported the "
+			"following details about the error:"),
+			error->message);
+	else
+		gtk_message_dialog_format_secondary_text (
+			GTK_MESSAGE_DIALOG (dialog), "%s",
+			_("The printing system did not report "
+			"any additional details about the error."));
+
+	if (error != NULL)
+		g_error_free (error);
+
+	gtk_dialog_run (GTK_DIALOG (dialog));
+
+	gtk_widget_destroy (dialog);
 }
 
-/* Creates a dialog with the print settings */
-GtkWidget *
-e_print_get_dialog (const char *title, int flags)
+static void
+print_done_cb (GtkPrintOperation *operation, GtkPrintOperationResult result)
 {
-	GtkPrintSettings *settings;
-	GtkWidget *dialog;
-	
-	settings = gtk_print_settings_new ();
-	settings = e_print_load_settings ();
-	dialog = e_print_get_dialog_with_config (title, flags, settings);
-	g_object_unref (settings);
-	return dialog;
+	if (result == GTK_PRINT_OPERATION_RESULT_APPLY)
+		save_settings (operation);
+	if (result == GTK_PRINT_OPERATION_RESULT_ERROR)
+		handle_error (operation);
 }
 
-GtkWidget *
-e_print_get_dialog_with_config (const char *title, int flags, GtkPrintSettings *settings)
+GtkPrintOperation *
+e_print_operation_new (void)
 {
-	GtkWidget *dialog = NULL;
-	
-#ifdef G_OS_UNIX		/* Just to get it to build on Win32 */
-	dialog = gtk_print_unix_dialog_new (title, NULL);
-	gtk_print_unix_dialog_set_settings (GTK_PRINT_UNIX_DIALOG(dialog), settings);
-	g_signal_connect(dialog, "response", G_CALLBACK(print_dialog_response), NULL); 
-#endif
-	return dialog;
+	GtkPrintOperation *operation;
+	GtkPrintSettings *settings;
+
+	operation = gtk_print_operation_new ();
+
+	settings = load_settings ();
+	gtk_print_operation_set_print_settings (operation, settings);
+	g_object_unref (settings);
+
+	g_signal_connect (operation, "done", G_CALLBACK (print_done_cb), NULL);
+
+	return operation;
 }
Index: e-util/e-print.h
===================================================================
--- e-util/e-print.h	(revision 33390)
+++ e-util/e-print.h	(working copy)
@@ -26,11 +26,7 @@
 
 G_BEGIN_DECLS
 
-GtkPrintSettings *e_print_load_settings (void);
-void e_print_save_settings (GtkPrintSettings *settings);
-
-GtkWidget *e_print_get_dialog (const char *title, int flags);
-GtkWidget *e_print_get_dialog_with_config (const char *title, int flags, GtkPrintSettings *settings);
+GtkPrintOperation *	e_print_operation_new		(void);
 
 G_END_DECLS
 
Index: widgets/table/e-cell-tree.c
===================================================================
--- widgets/table/e-cell-tree.c	(revision 33390)
+++ widgets/table/e-cell-tree.c	(working copy)
@@ -695,11 +695,14 @@ ect_leave_edit (ECellView *ecell_view, i
 }
 
 static void
-ect_print (ECellView *ecell_view, GnomePrintContext *context, 
+ect_print (ECellView *ecell_view, GtkPrintContext *context, 
 	   int model_col, int view_col, int row,
 	   double width, double height)
 {
 	ECellTreeView *tree_view = (ECellTreeView *) ecell_view;
+	cairo_t *cr = gtk_print_context_get_cairo_context (context);
+
+	cairo_save (cr);
 
 	if (/* XXX only if we're the active sort */ TRUE) {
 		ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row);
@@ -716,24 +719,20 @@ ect_print (ECellView *ecell_view, GnomeP
 
 			if (!e_tree_model_node_is_root (tree_model, node)
 			    || e_tree_model_node_get_children (tree_model, node, NULL) > 0) {
-				gnome_print_moveto (context,
-						    offset - INDENT_AMOUNT / 2,
-						    height / 2);
-
-				gnome_print_lineto (context,
-						    offset,
-						    height / 2);
+				cairo_move_to (cr,
+					offset - INDENT_AMOUNT / 2,
+					height / 2);
+				cairo_line_to (cr, offset, height / 2);
 			}
 
 			if (visible_depth_of_node (ecell_view->e_table_model, row) != 0) {
-				gnome_print_moveto (context,
-						    offset - INDENT_AMOUNT / 2,
-						    height);
-				gnome_print_lineto (context,
-						    offset - INDENT_AMOUNT / 2,
-						    (e_tree_table_adapter_node_get_next (tree_table_adapter, node)
-						     ? 0
-						     : height / 2));
+				cairo_move_to (cr,
+					offset - INDENT_AMOUNT / 2, height);
+				cairo_line_to (cr,
+					offset - INDENT_AMOUNT / 2,
+					e_tree_table_adapter_node_get_next
+					(tree_table_adapter, node) ? 0 :
+					height / 2);
 			}
 
 			/* now traverse back up to the root of the tree, checking at
@@ -744,12 +743,11 @@ ect_print (ECellView *ecell_view, GnomeP
 			offset -= INDENT_AMOUNT;
 			while (node && depth != 0) {
 				if (e_tree_table_adapter_node_get_next(tree_table_adapter, node)) {
-					gnome_print_moveto (context,
-							    offset - INDENT_AMOUNT / 2,
-							    height);
-					gnome_print_lineto (context,
-							    offset - INDENT_AMOUNT / 2,
-							    0);
+					cairo_move_to (cr,
+						offset - INDENT_AMOUNT / 2,
+						height);
+					cairo_line_to (cr,
+						offset - INDENT_AMOUNT / 2, 0);
 				}
 				node = e_tree_model_node_get_parent (tree_model, node);
 				depth --;
@@ -759,41 +757,40 @@ ect_print (ECellView *ecell_view, GnomeP
 
 		/* now draw our icon if we're expandable */
 		if (expandable) {
-			double image_matrix [6] = {16, 0, 0, 16, 0, 0};
-			GdkPixbuf *image = (expanded 
-					    ? E_CELL_TREE(tree_view->cell_view.ecell)->open_pixbuf
-					    : E_CELL_TREE(tree_view->cell_view.ecell)->closed_pixbuf);
-			int image_width, image_height, image_rowstride;
-			guchar *image_pixels;
-
-			image_width = gdk_pixbuf_get_width(image);
-			image_height = gdk_pixbuf_get_height(image);
-			image_pixels = gdk_pixbuf_get_pixels(image);
-			image_rowstride = gdk_pixbuf_get_rowstride(image);
-
-			image_matrix [4] = subcell_offset - INDENT_AMOUNT / 2 - image_width / 2;
-			image_matrix [5] = height / 2 - image_height / 2;
-
-			gnome_print_gsave (context);
-			gnome_print_concat (context, image_matrix);
-
-			gnome_print_rgbaimage (context, image_pixels, image_width, image_height, image_rowstride);
-			gnome_print_grestore (context);
+			ECellTree *tree;
+			GdkPixbuf *pixbuf;
+			gint image_width;
+			gint image_height;
+
+			tree = E_CELL_TREE (tree_view->cell_view.ecell);
+
+			if (expanded)
+				pixbuf = tree->open_pixbuf;
+			else
+				pixbuf = tree->closed_pixbuf;
+
+			image_width = gdk_pixbuf_get_width (pixbuf);
+			image_height = gdk_pixbuf_get_height (pixbuf);
+
+			gdk_cairo_set_source_pixbuf (
+				cr, pixbuf, subcell_offset -
+				INDENT_AMOUNT / 2 - image_width - 2,
+				height / 2 - image_height / 2);
 		}
 
-		gnome_print_stroke (context);
+		cairo_stroke (cr);
 
-		if (gnome_print_translate(context, subcell_offset, 0) == -1)
-				/* FIXME */;
+		cairo_translate (cr, subcell_offset, 0);
 		width -= subcell_offset;
 	}
 
+	cairo_restore (cr);
 
 	e_cell_print (tree_view->subcell_view, context, model_col, view_col, row, width, height);
 }
 
 static gdouble
-ect_print_height (ECellView *ecell_view, GnomePrintContext *context, 
+ect_print_height (ECellView *ecell_view, GtkPrintContext *context, 
 		  int model_col, int view_col, int row,
 		  double width)
 {
Index: widgets/table/e-cell-pixbuf.c
===================================================================
--- widgets/table/e-cell-pixbuf.c	(revision 33390)
+++ widgets/table/e-cell-pixbuf.c	(working copy)
@@ -50,17 +50,6 @@ enum {
 	PROP_UNSELECTED_COLUMN
 };
 
-static int
-gnome_print_pixbuf (GtkPrintContext *pc, GdkPixbuf *pixbuf)
-{
-	cairo_t *cr = gtk_print_context_get_cairo_context (pc);
-
-        gdk_cairo_set_source_pixbuf (cr, pixbuf, 
-					      (double)gdk_pixbuf_get_width     (pixbuf),
-					      (double)gdk_pixbuf_get_height    (pixbuf));
-	return TRUE;
-}
-
 /*
  * ECellPixbuf functions
  */
Index: widgets/table/e-cell-text.c
===================================================================
--- widgets/table/e-cell-text.c	(revision 33390)
+++ widgets/table/e-cell-text.c	(working copy)
@@ -45,7 +45,6 @@
 #include <gtk/gtk.h>
 #include <libgnomecanvas/gnome-canvas.h>
 #include <libgnomecanvas/gnome-canvas-rect-ellipse.h>
-#include <libgnomeprint/gnome-print-pango.h>
 
 #include "a11y/e-table/gal-a11y-e-cell-registry.h"
 #include "a11y/e-table/gal-a11y-e-cell-text.h"
Index: widgets/table/e-table-group-container.c
===================================================================
--- widgets/table/e-table-group-container.c	(revision 33390)
+++ widgets/table/e-table-group-container.c	(working copy)
@@ -1152,7 +1152,8 @@ e_table_group_container_print_page  (EPr
 	GList *child;
 	EPrintable *child_printable;
 	gchar *string;
-	GnomeFont *font = gnome_font_find_closest ("Helvetica", TEXT_HEIGHT);
+	PangoLayout *layout;
+	PangoFontDescription *desc;
 
 	child_printable = groupcontext->child_printable;
 	child = groupcontext->child;
@@ -1177,22 +1178,30 @@ e_table_group_container_print_page  (EPr
 		}
 	}
 
+	layout = gtk_print_context_create_pango_layout (context);
+
+	desc = pango_font_description_new ();
+	pango_font_description_set_family_static (desc, "Helvetica");
+	pango_font_description_set_size (desc, TEXT_HEIGHT);
+	pango_layout_set_font_description (layout, desc);
+	pango_font_description_free (desc);
+
 	while (1) {
-  		    child_height = e_printable_height(child_printable, context, width,yd + 2 * TEXT_AREA_HEIGHT, quantize);		    
-		    cr = gtk_print_context_get_cairo_context (context);
-		    cairo_save (cr);
-		    cairo_rectangle (cr, 0, 0, width,TEXT_AREA_HEIGHT);
-		    cairo_rectangle (cr, 0, 0, 2 * TEXT_AREA_HEIGHT, child_height + TEXT_AREA_HEIGHT);
-		    cairo_set_source_rgb (cr, .7, .7, .7) ;
-		    cairo_fill(cr) ;
-		    cairo_restore (cr);
-
-		    cairo_save (cr);
-		    cairo_rectangle (cr, 0, 0, width, TEXT_AREA_HEIGHT);
-		    cairo_clip (cr);
-		    cairo_restore (cr);
+		child_height = e_printable_height(child_printable, context, width,yd + 2 * TEXT_AREA_HEIGHT, quantize);		    
+		cr = gtk_print_context_get_cairo_context (context);
+		cairo_save (cr);
+		cairo_rectangle (cr, 0, 0, width,TEXT_AREA_HEIGHT);
+		cairo_rectangle (cr, 0, 0, 2 * TEXT_AREA_HEIGHT, child_height + TEXT_AREA_HEIGHT);
+		cairo_set_source_rgb (cr, .7, .7, .7) ;
+		cairo_fill(cr) ;
+		cairo_restore (cr);
+
+		cairo_save (cr);
+		cairo_rectangle (cr, 0, 0, width, TEXT_AREA_HEIGHT);
+		cairo_clip (cr);
+		cairo_restore (cr);
 								   
-	            cairo_move_to(cr, 0, (gnome_font_get_ascender(font) - gnome_font_get_descender(font)) / 2);
+		cairo_move_to(cr, 0, 0);
 		if (groupcontext->etgc->ecol->text)
 			string = g_strdup_printf ("%s : %s (%d item%s)",
 						  groupcontext->etgc->ecol->text,
@@ -1204,16 +1213,17 @@ e_table_group_container_print_page  (EPr
 						  child_node->string,
 						  (gint) child_node->count,
 						  child_node->count == 1 ? "" : "s");
-		    cairo_show_text (cr, string);
-            	    g_free(string);
-               				 
-                    cairo_translate(cr, 2 * TEXT_AREA_HEIGHT, TEXT_AREA_HEIGHT) ;
-                    cairo_move_to(cr, 0, 0);
-                    cairo_rectangle (cr, 0, 0, width - 2 * TEXT_AREA_HEIGHT,child_height);
-		    cairo_clip(cr);
+		pango_layout_set_text (layout, string, -1);
+		pango_cairo_show_layout (cr, layout);
+		g_free(string);
+ 
+		cairo_translate(cr, 2 * TEXT_AREA_HEIGHT, TEXT_AREA_HEIGHT) ;
+		cairo_move_to(cr, 0, 0);
+		cairo_rectangle (cr, 0, 0, width - 2 * TEXT_AREA_HEIGHT,child_height);
+		cairo_clip(cr);
 		    		
-		    e_printable_print_page (child_printable, context, width-2 * TEXT_AREA_HEIGHT, 0, quantize); 
-		    yd += child_height + TEXT_AREA_HEIGHT;
+		e_printable_print_page (child_printable, context, width-2 * TEXT_AREA_HEIGHT, 0, quantize); 
+		yd += child_height + TEXT_AREA_HEIGHT;
 
 		if (e_printable_data_left(child_printable))
 			break;
@@ -1236,6 +1246,8 @@ e_table_group_container_print_page  (EPr
 		g_object_unref (groupcontext->child_printable);
 	groupcontext->child_printable = child_printable;
 	groupcontext->child = child;
+
+	g_object_unref (layout);
 }
 
 static gboolean
Index: widgets/table/e-cell.h
===================================================================
--- widgets/table/e-cell.h	(revision 33390)
+++ widgets/table/e-cell.h	(working copy)
@@ -27,8 +27,6 @@
 
 #include <gdk/gdktypes.h>
 #include <gtk/gtk.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-font.h>
 #include <table/e-table-model.h>
 #include <table/e-table-tooltip.h>
 
Index: widgets/misc/e-printable.h
===================================================================
--- widgets/misc/e-printable.h	(revision 33390)
+++ widgets/misc/e-printable.h	(working copy)
@@ -25,7 +25,6 @@
 #define _E_PRINTABLE_H_
 
 #include <gtk/gtkobject.h>
-#include <libgnomeprint/gnome-print.h>
 #include <gtk/gtk.h>
 
 G_BEGIN_DECLS
Index: calendar/gui/tasks-control.c
===================================================================
--- calendar/gui/tasks-control.c	(revision 33390)
+++ calendar/gui/tasks-control.c	(working copy)
@@ -34,13 +34,6 @@
 #include <libgnomeui/gnome-dialog.h>
 #include <libgnomeui/gnome-dialog-util.h>
 #include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libgnomeprintui/gnome-print-paper-selector.h>
-#include <libgnomeprintui/gnome-print-preview.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
 #include <bonobo/bonobo-control.h>
 #include <bonobo/bonobo-ui-util.h>
 #include <e-util/e-dialog-utils.h>
@@ -469,30 +462,21 @@ tasks_control_purge_cmd	(BonoboUICompone
 	    e_tasks_delete_completed (tasks);
 }
 
-
-static void
-print_tasks (ETasks *tasks, gboolean preview)
-{
-	ECalendarTable *cal_table;
-	ETable *etable;
-
-	cal_table = e_tasks_get_calendar_table (tasks);
-	etable = e_calendar_table_get_table (E_CALENDAR_TABLE (cal_table));
-
-	print_table (etable, _("Print Tasks"), _("Tasks"), preview);
-}
-
 /* File/Print callback */
 static void
 tasks_control_print_cmd (BonoboUIComponent *uic,
 			 gpointer data,
 			 const char *path)
 {
-	ETasks *tasks;
+	ETasks *tasks = E_TASKS (data);
+	ETable *table;
 
-	tasks = E_TASKS (data);
+	table = e_calendar_table_get_table (
+		E_CALENDAR_TABLE (e_tasks_get_calendar_table (tasks)));
 
-	print_tasks (tasks, FALSE);
+	print_table (
+		table, _("Print Tasks"), _("Tasks"),
+		GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 }
 
 static void
@@ -500,11 +484,15 @@ tasks_control_print_preview_cmd (BonoboU
 				 gpointer data,
 				 const char *path)
 {
-	ETasks *tasks;
+	ETasks *tasks = E_TASKS (data);
+	ETable *table;
 
-	tasks = E_TASKS (data);
+	table = e_calendar_table_get_table (
+		E_CALENDAR_TABLE (e_tasks_get_calendar_table (tasks)));
 
-	print_tasks (tasks, TRUE);
+	print_table (
+		table, _("Print Tasks"), _("Tasks"),
+		GTK_PRINT_OPERATION_ACTION_PREVIEW);
 }
 
 static void
Index: calendar/gui/dialogs/comp-editor.c
===================================================================
--- calendar/gui/dialogs/comp-editor.c	(revision 33390)
+++ calendar/gui/dialogs/comp-editor.c	(working copy)
@@ -1312,7 +1312,7 @@ menu_file_print_cb (BonoboUIComponent *u
 	for (l = priv->pages; l != NULL; l = l->next)
 		 comp_editor_page_fill_component (l->data, comp);
 	
-	print_comp (comp, priv->client, FALSE);
+	print_comp (comp, priv->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 
 	g_object_unref (comp);	
 }
Index: calendar/gui/calendar-commands.c
===================================================================
--- calendar/gui/calendar-commands.c	(revision 33390)
+++ calendar/gui/calendar-commands.c	(working copy)
@@ -88,62 +88,38 @@ file_open_event_cb (BonoboUIComponent *u
 
 /* Prints the calendar at its current view and time range */
 static void
-print (GnomeCalendar *gcal, gboolean preview)
+print (GnomeCalendar *gcal, GtkPrintOperationAction action)
 {
-	time_t start;
-	GnomeCalendarViewType view_type;
-	PrintView print_view;
-	ECalListView *list_view;
-	ETable *etable;
-	
-	gnome_calendar_get_current_time_range (gcal, &start, NULL);
-	view_type = gnome_calendar_get_view (gcal);
-
-	switch (view_type) {
-	case GNOME_CAL_DAY_VIEW:
-		print_view = PRINT_VIEW_DAY;
-		break;
-
-	case GNOME_CAL_WORK_WEEK_VIEW:
-	case GNOME_CAL_WEEK_VIEW:
-		print_view = PRINT_VIEW_WEEK;
-		break;
-
-	case GNOME_CAL_MONTH_VIEW:
-		print_view = PRINT_VIEW_MONTH;
-		break;
+	if (gnome_calendar_get_view (gcal) == GNOME_CAL_LIST_VIEW) {
+		ECalListView *list_view;
+		ETable *table;
 
-	case GNOME_CAL_LIST_VIEW:
 		list_view = E_CAL_LIST_VIEW (gnome_calendar_get_current_view_widget (gcal));
-		etable = e_table_scrolled_get_table (list_view->table_scrolled);
-		print_table (etable, _("Print"), _("Calendar"), preview);
-		return;
+		table = e_table_scrolled_get_table (list_view->table_scrolled);
+		print_table (table, _("Print"), _("Calendar"), action);
+	} else {
+		time_t start;
 
-	default:
-		g_assert_not_reached ();
-		return;
+		gnome_calendar_get_current_time_range (gcal, &start, NULL);
+		print_calendar (gcal, action, start);
 	}
-
-	print_calendar (gcal, preview, start, print_view);
 }
 
 /* File/Print callback */
 static void
 file_print_cb (BonoboUIComponent *uic, gpointer data, const char *path)
 {
-	GnomeCalendar *gcal;
+	GnomeCalendar *gcal = GNOME_CALENDAR (data);
 
-	gcal = GNOME_CALENDAR (data);
-	print (gcal, FALSE);
+	print (gcal, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 }
 
 static void
 file_print_preview_cb (BonoboUIComponent *uic, gpointer data, const char *path)
 {
-	GnomeCalendar *gcal;
+	GnomeCalendar *gcal = GNOME_CALENDAR (data);
 
-	gcal = GNOME_CALENDAR (data);
-	print (gcal, TRUE);
+	print (gcal, GTK_PRINT_OPERATION_ACTION_PREVIEW);
 }
 
 /* Sets a clock cursor for the specified calendar window */
Index: calendar/gui/e-calendar-table.c
===================================================================
--- calendar/gui/e-calendar-table.c	(revision 33390)
+++ calendar/gui/e-calendar-table.c	(working copy)
@@ -1131,7 +1131,7 @@ e_calendar_table_on_print_task (EPopup *
 	
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
-	print_comp (comp, comp_data->client, FALSE);
+	print_comp (comp, comp_data->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 
 	g_object_unref (comp);
 }
Index: calendar/gui/print.c
===================================================================
--- calendar/gui/print.c	(revision 33390)
+++ calendar/gui/print.c	(working copy)
@@ -32,19 +32,11 @@
 #include <string.h>
 #include <time.h>
 #include <glib.h>
-#include <gtk/gtkradiobutton.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <libgnomeui/gnome-dialog.h>
 #include <libgnomeui/gnome-uidefs.h>
 #include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeprint/gnome-print.h>  
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libgnomeprintui/gnome-print-paper-selector.h>
-#include <libgnomeprintui/gnome-print-preview.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
 #include <libedataserver/e-time-utils.h>
 #include <libedataserver/e-data-server-util.h>
 #include <e-util/e-util.h>
@@ -62,135 +54,47 @@
 #include "gnome-cal.h"
 #include "print.h"
 
-#include <libgnomeprint/gnome-print-pango.h>
 #include <glade/glade-xml.h>
-#include <gtk/gtkprintunixdialog.h>
-#include <gtk/gtkwindow.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkpagesetupunixdialog.h>
-#include <gtk/gtkprinter.h>
 
-
-typedef struct EvoCalendarPrintRenderer EvoCalendarPrintRenderer;
 typedef struct PrintCompItem PrintCompItem;
-typedef struct PrintTableItem PrintTableItem;
 typedef struct PrintCalItem PrintCalItem;
 
-struct EvoCalendarPrintRenderer
-{
-	GtkPrintContext *pc;
-
-	/* keep one of these around: */
-	PangoLayout *pl;
+struct PrintCompItem {
+	struct ECal *client;
+	struct ECalComponent *comp;
 };
 
-struct PrintCompItem
-{
-   EvoCalendarPrintRenderer *pr;
-   struct ECal *client;
-   struct ECalComponent *comp;
-   double r,l,b,t;
-};
-
-struct PrintCalItem
-{
-   EvoCalendarPrintRenderer *pr;
-   struct GnomeCalendar *gcal; 
-   PrintView default_view; 
-   double r,l,b,t;	
-   time_t date;
-};
-
-struct PrintTableItem
-{
-	struct  EPrintable *printable;
-	double left_margin,bottom_margin,paper_width,paper_height;
-	GtkPrintContext *context;
+struct PrintCalItem {
+	struct GnomeCalendar *gcal; 
+	time_t start;
 };
 
-static PrintCompItem *
-evo_calendar_print_data_new (GtkPrintContext *pc, PrintCompItem *pci);
-
-static void 
-comp_draw_page (GtkPrintOperation *print, 
-		GtkPrintContext *context,
-		gint page_nr, 
-		PrintCompItem *pci);
-static void
-cal_draw_page (GtkPrintOperation *print,
-	       GtkPrintContext *context,
-	       gint page_nr,
-	       PrintCalItem *pcali);
-static void 
-table_draw_page (GtkPrintOperation *print,
-		 GtkPrintContext *context,
-		 gint page_nr1,
-		 PrintTableItem *pti); 
-
 static double
-evo_calendar_print_renderer_get_width (EvoCalendarPrintRenderer *pr,
+evo_calendar_print_renderer_get_width (GtkPrintContext *context,
 				       PangoFontDescription *font, 
-				       const char *text);
-
-GObject* create_custom_widget (GtkPrintOperation *print, GtkWidget *range);
-static void apply_custom_widget (GtkPrintOperation *print, GtkWidget *dialog, PrintCalItem *cpi);
-static PrintCalItem *
-evo_calendar_print_cal_data_new (GtkPrintContext *pc, PrintCalItem *pcali)
-{
-	g_return_val_if_fail (pc, NULL);
-	
-	pcali->pr = g_new0 (EvoCalendarPrintRenderer, 1);
-	pcali->pr->pc = pc;	
-	pcali->pr->pl = gtk_print_context_create_pango_layout (pc);	
-	
-	return pcali;
-}
-static PrintCompItem *
-evo_calendar_print_data_new (GtkPrintContext *pc,PrintCompItem *pci)
-{
-	g_return_val_if_fail (pc, NULL);
-	
-	pci->pr = g_new0 (EvoCalendarPrintRenderer, 1);
-	pci->pr->pc = pc; 
-	pci->pr->pl = gtk_print_context_create_pango_layout (pc);
-
-	return pci;
-}
-
-static void 
-evo_calendar_print_data_free (EvoCalendarPrintRenderer *pr)
+				       const char *text)
 {
-	g_return_if_fail (pr);
-
-	g_assert (pr->pl);
-	g_object_unref (G_OBJECT (pr->pl));
-
-	g_free (pr);
-}
+	PangoLayout *layout;
+	gint layout_width, layout_height;
 
+	layout = gtk_print_context_create_pango_layout (context);
 
-static double
-evo_calendar_print_renderer_get_width (EvoCalendarPrintRenderer *pr,
-				       PangoFontDescription *font, 
-				       const char *text)
-{
-	int w, h;
+	pango_layout_set_font_description (layout, font);
+	pango_layout_set_text (layout, text, -1);
+	pango_layout_set_indent (layout, 0);
+	pango_layout_get_size (layout, &layout_width, &layout_height);
 
-	pango_layout_set_font_description (pr->pl, font);
-	pango_layout_set_text (pr->pl, text, -1);
-	pango_layout_set_indent (pr->pl, 0);
-	pango_layout_get_size (pr->pl, &w, &h);
+	g_object_unref (layout);
 
-	return w/(double)PANGO_SCALE;
+	return pango_units_to_double (layout_width);
 }
 
-
 static double
 get_font_size (PangoFontDescription *font)
 {
 	g_return_val_if_fail (font, 0.0);
 
-	return ((double)pango_font_description_get_size (font)/(double)PANGO_SCALE);
+	return pango_units_to_double (pango_font_description_get_size (font));
 }
 
 
@@ -208,8 +112,7 @@ get_font_size (PangoFontDescription *fon
 #define TEMP_MARGIN .05
 
 /* The fonts to use */
-#define REGULAR_FONT "Sans Regular"
-#define BOLD_FONT    "Sans Bold"
+#define FONT_FAMILY "Sans"
 
 /* The font size to use for normal text. */
 #define DAY_NORMAL_FONT_SIZE	12
@@ -298,19 +201,6 @@ struct psinfo
 	double header_row_height;
 };
 
-struct ptinfo
-{
-	GList *todos;
-};
-
-struct einfo
-{
-	char *text;
-	time_t start;
-	time_t end;
-	int count;
-};
-
 /* Convenience function to help the transition to timezone functions.
    It converts a time_t to a struct tm. */
 static struct tm*
@@ -386,39 +276,22 @@ build_month (int month, int year, int *d
 }
 
 static PangoFontDescription *
-get_font_for_size (EvoCalendarPrintRenderer *pr, double h, GnomeFontWeight weight, gboolean italic)
+get_font_for_size (double height, PangoWeight weight)
 {
-	PangoFontDescription *font_desc;
-	gchar *font_name;
-
-	if (weight <= GNOME_FONT_BOOK)
-		font_name = REGULAR_FONT;
-	else
-		font_name = BOLD_FONT;
-
-	if (italic)
-		font_name = g_strconcat (font_name, " Italic", NULL);
-
-	font_desc = pango_font_description_from_string (font_name);
+	PangoFontDescription *desc;
+	gint size;
 
 	#define MAGIC_SCALE_FACTOR (0.86)
-	pango_font_description_set_size (font_desc,
-					 h * MAGIC_SCALE_FACTOR * PANGO_SCALE );
+	size = pango_units_from_double (height * MAGIC_SCALE_FACTOR);
 
-	if (italic)
-		g_free (font_name);
+	desc = pango_font_description_new ();
+	pango_font_description_set_size (desc, size);
+	pango_font_description_set_weight (desc, weight);
+	pango_font_description_set_family_static (desc, FONT_FAMILY);
 
-	return font_desc;
+	return desc;
 }
 
-enum align_box {
-	ALIGN_LEFT=1,
-	ALIGN_RIGHT,
-	ALIGN_CENTER,
-	ALIGN_BORDER= 1<<8
-};
-
-
 /* Prints a rectangle, with or without a border, filled or outline, and
    possibly with triangular arrows at one or both horizontal edges.
    width      = width of border, -ve means no border.
@@ -427,32 +300,33 @@ enum align_box {
           point of triangle, or -ve for no triangle. */
 static void
 print_border_with_triangles (GtkPrintContext *pc,
-			     double l, double r, double t, double b,
-			     double width, double red, double green, double blue,
-			     double left_triangle_width,
-			     double right_triangle_width)
+			     gdouble x1, gdouble x2,
+			     gdouble y1, gdouble y2,
+			     gdouble line_width,
+			     gdouble red, gdouble green, gdouble blue,
+			     gdouble left_triangle_width,
+			     gdouble right_triangle_width)
 {
-	cairo_t *cr;
+	cairo_t *cr = gtk_print_context_get_cairo_context (pc);
 
-	cr = gtk_print_context_get_cairo_context (pc);
 	cairo_save (cr);
 
 	/* Fill in the interior of the rectangle, if desired. */
 	if (red >= -EPSILON && green >= -EPSILON && blue >= -EPSILON) {
 		
-		cairo_move_to (cr, l, t);
+		cairo_move_to (cr, x1, y1);
 		
 		if (left_triangle_width > 0.0)
-			cairo_line_to (cr, l - left_triangle_width,
-				      (t + b) / 2);
+			cairo_line_to (cr, x1 - left_triangle_width,
+				      (y1 + y2) / 2);
 
-		cairo_line_to (cr, l, b);
-		cairo_line_to (cr, r, b);
+		cairo_line_to (cr, x1, y2);
+		cairo_line_to (cr, x2, y2);
 		
 		if (right_triangle_width > 0.0)
-			cairo_line_to (cr, r + right_triangle_width, (t + b) / 2);
+			cairo_line_to (cr, x2 + right_triangle_width, (y1 + y2) / 2);
 
-		cairo_line_to (cr, r, t);
+		cairo_line_to (cr, x2, y1);
 		cairo_close_path (cr);
 		cairo_set_source_rgb (cr, red, green, blue);
 		cairo_fill (cr);
@@ -461,28 +335,27 @@ print_border_with_triangles (GtkPrintCon
 	}
 
 	/* Draw the outline, if desired. */
-	if (width >= -EPSILON) {
+	if (line_width >= -EPSILON) {
 
 		cr = gtk_print_context_get_cairo_context (pc);
-		cairo_move_to (cr, l, t);
+		cairo_move_to (cr, x1, y1);
 
 		if (left_triangle_width > 0.0)
-			cairo_line_to (cr, l - left_triangle_width,
-					    (t + b) / 2);
+			cairo_line_to (cr, x1 - left_triangle_width,
+					    (y1 + y2) / 2);
 
-		cairo_line_to (cr, l, b);
-		cairo_line_to (cr, r, b);
+		cairo_line_to (cr, x1, y2);
+		cairo_line_to (cr, x2, y2);
 
 		if (right_triangle_width > 0.0)
-			cairo_line_to (cr, r + right_triangle_width,
-					    (t + b) / 2);
+			cairo_line_to (cr, x2 + right_triangle_width,
+					    (y1 + y2) / 2);
 
-		cairo_line_to (cr, r, t);
+		cairo_line_to (cr, x2, y1);
 		cairo_close_path (cr);
 		cairo_set_source_rgb (cr, 0, 0, 0);
-		cairo_set_line_width (cr, width);
+		cairo_set_line_width (cr, line_width);
 		cairo_stroke (cr);	
-		
 	}
 
 	cairo_restore (cr);
@@ -494,35 +367,39 @@ print_border_with_triangles (GtkPrintCon
    fillcolor = shade of fill,   -ve means no fill. */
 static void
 print_border_rgb (GtkPrintContext *pc,
-	      double l, double r, double t, double b,
-	      double width, double red, double green, double blue)
-{
-	print_border_with_triangles (pc, l, r, t, b, width, red, green, blue, -1.0, -1.0);
+		  gdouble x1, gdouble x2,
+		  gdouble y1, gdouble y2,
+		  gdouble line_width,
+		  gdouble red, gdouble green, gdouble blue)
+{
+	print_border_with_triangles (
+		pc, x1, x2, y1, y2, line_width,
+		red, green, blue, -1.0, -1.0);
 }
 
 static void
 print_border (GtkPrintContext *pc,
-	      double l, double r, double t, double b,
-	      double width, double fillcolor)
+	      gdouble x1, gdouble x2,
+	      gdouble y1, gdouble y2,
+	      gdouble line_width,
+	      gdouble fillcolor)
 {
-	print_border_rgb (pc, l, r, t, b, width, fillcolor, fillcolor, fillcolor);
+	print_border_rgb (
+		pc, x1, x2, y1, y2, line_width,
+		fillcolor, fillcolor, fillcolor);
 }
 
 static void
-print_rectangle (GtkPrintContext *pc,
-		 double l, double r, double t, double b,
-		 double red, double green, double blue)
+print_rectangle (GtkPrintContext *context,
+		 gdouble x, gdouble y,
+		 gdouble width, gdouble height,
+		 gdouble red, gdouble green, gdouble blue)
 {
-	cairo_t *cr;
-	
-	cr = gtk_print_context_get_cairo_context (pc);
+	cairo_t *cr = gtk_print_context_get_cairo_context (context);
+
 	cairo_save (cr);
 
-	cairo_move_to (cr, l, t);
-	cairo_line_to (cr, l, b);
-	cairo_line_to (cr, r, b);
-	cairo_line_to (cr, r, t);
-	cairo_close_path (cr);
+	cairo_rectangle (cr, x, y, width, height);
 	cairo_set_source_rgb (cr, red, green, blue);
 	cairo_fill (cr);
 
@@ -530,74 +407,62 @@ print_rectangle (GtkPrintContext *pc,
 }
 
 /* Prints 1 line of aligned text in a box. It is centered vertically, and
-   the horizontal alignment can be either ALIGN_LEFT, ALIGN_RIGHT, or
-   ALIGN_CENTER. */
+   the horizontal alignment can be either PANGO_ALIGN_LEFT, PANGO_ALIGN_RIGHT,
+   or PANGO_ALIGN_CENTER. */
 static double
-print_text (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, const char *text,
-	   enum align_box align, double l, double r, double t, double b)
+print_text (GtkPrintContext *context, PangoFontDescription *desc,
+            const char *text, PangoAlignment alignment,
+            gdouble x1, gdouble x2, gdouble y1, gdouble y2)
 {
-	double w, x;
-	int pw, ph;
+	PangoLayout *layout;
+	gint layout_width, layout_height;
 	cairo_t *cr;
 
-	cr = gtk_print_context_get_cairo_context (pr->pc);
-	cairo_save (cr);
+	cr = gtk_print_context_get_cairo_context (context);
+	layout = gtk_print_context_create_pango_layout (context);
 
-	pango_layout_set_font_description (pr->pl, font);
-	pango_layout_set_text (pr->pl, text, -1);
-	pango_layout_set_width (pr->pl, -1); /* ensure no line-wrapping occurs */
-	pango_layout_set_indent (pr->pl, 0);
-	pango_layout_get_size (pr->pl, &pw, &ph);
-	w = pw/(double)PANGO_SCALE;
-
-	switch (align & 3) {
-	case ALIGN_LEFT:
-	default:
-		x = l;
-		break;
-	case ALIGN_RIGHT:
-		x = r - w;
-		break;
-	case ALIGN_CENTER:
-		x = l + ((r - l) - w) / 2;
-		break;
-	}
+	pango_layout_set_font_description (layout, desc);
+	pango_layout_set_alignment (layout, alignment);
+	pango_layout_set_text (layout, text, -1);
 
-	/* Make sure we don't go off the left edge. */
-	x = MAX (l, x);
+	/* Grab the width before expanding the layout. */
+	pango_layout_get_size (layout, &layout_width, &layout_height);
+
+	pango_layout_set_width (layout, pango_units_from_double (x2 - x1));
+
+	cairo_save (cr);
 
 	/* Set a clipping rectangle. */
-	cairo_move_to (cr, l, t);	
-	cairo_rectangle (cr, l, t, r, b);
+	cairo_move_to (cr, x1, y1);	
+	cairo_rectangle (cr, x1, y1, x2, y2);
 	cairo_clip (cr);
 
 	cairo_new_path (cr);
 	cairo_set_source_rgb (cr, 0, 0, 0);
 
-	cairo_move_to (cr, x, t);
-	pango_cairo_show_layout (cr, pr->pl);
+	cairo_move_to (cr, x1, y1);
+	pango_cairo_show_layout (cr, layout);
 
 	cairo_stroke(cr);
+
 	cairo_restore (cr);
 
-	return w;
+	g_object_unref (layout);
+
+	return pango_units_to_double (layout_width);
 }
 
-/* gets/frees the font for you, as a book font */
+/* gets/frees the font for you, as a normal font */
 static double
-print_text_size(EvoCalendarPrintRenderer *pr, const char *text,
-		     enum align_box align, double l, double r, double t, double b)
+print_text_size (GtkPrintContext *context, const char *text,
+                 PangoAlignment alignment, gdouble x1, gdouble x2,
+                 gdouble y1, gdouble y2)
 {
 	PangoFontDescription *font;
 	double w;
-	
-	if(t > b)
-	font = get_font_for_size (pr,t - b, GNOME_FONT_BOOK, FALSE);
-	else
-		{
-	font = get_font_for_size (pr, b - t , GNOME_FONT_BOOK, FALSE);	
-	}
-	w = print_text(pr, font, text, align, l, r, t, b);
+
+	font = get_font_for_size (ABS (y2 - y1), PANGO_WEIGHT_NORMAL);
+	w = print_text (context, font, text, alignment, x1, x2, y1, y2);
 	pango_font_description_free (font);
 
 	return w;
@@ -605,42 +470,36 @@ print_text_size(EvoCalendarPrintRenderer
 
 /* gets/frees the font for you, as a bold font */
 static double
-print_text_size_bold(EvoCalendarPrintRenderer *pr, const char *text,
-		     enum align_box align, double l, double r, double t, double b)
+print_text_size_bold (GtkPrintContext *context, const char *text,
+                      PangoAlignment alignment, gdouble x1, gdouble x2,
+                      gdouble y1, gdouble y2)
 {
 	PangoFontDescription *font;
 	double w;
 
-	if (t > b)	
-		font = get_font_for_size (pr, t - b , GNOME_FONT_BOLD, FALSE);
-	else
-		font = get_font_for_size (pr, b - t, GNOME_FONT_BOLD, FALSE);
-
-	w = print_text(pr, font, text, align, l, r, t, b);
+	font = get_font_for_size (ABS (y2 - y1), PANGO_WEIGHT_BOLD);
+	w = print_text (context, font, text, alignment, x1, x2, y1, y2);
 	pango_font_description_free (font);
 
 	return w;
 }
 
 static void
-titled_box (EvoCalendarPrintRenderer *pr, const char *text, PangoFontDescription *font,
-	    enum align_box align, double *l, double *r, double *t, double *b,
-	    double linewidth)
+titled_box (GtkPrintContext *context, const char *text,
+            PangoFontDescription *font, PangoAlignment alignment,
+            gdouble *x1, gdouble *y1, gdouble *x2, gdouble *y2,
+	    gdouble linewidth)
 {
 	double size;
 
 	size = get_font_size (font);
-	if (align & ALIGN_BORDER) {
-		print_border (pr->pc, *l, *r, *t, *t + size * 1.4,
-			      linewidth, 0.9);
-		print_border (pr->pc, *l, *r, *t + size * 1.4, *b,
-			      linewidth, -1.0);
-		*l += 2;
-		*r -= 2;
-		*b += 2;
-	}
-	print_text (pr, font, text, align, *l, *r, *t, *t + size * 1.4);
-	*t += size * 1.4;
+	print_border (context, *x1, *x2, *y1, *y1 + size * 1.4, linewidth, 0.9);
+	print_border (context, *x1, *x2, *y1 + size * 1.4, *y2, linewidth, -1.0);
+	*x1 += 2;
+	*x2 -= 2;
+	*y2 += 2;
+	print_text (context, font, text, alignment, *x1, *x2, *y1, *y1 + size * 1.4);
+	*y1 += size * 1.4;
 }
 
 enum datefmt {
@@ -714,8 +573,8 @@ instance_cb (ECalComponent *comp, time_t
   print out the month small, embolden any days with events.
 */
 static void
-print_month_small (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t month,
-		   double left, double right, double top, double bottom,
+print_month_small (GtkPrintContext *context, GnomeCalendar *gcal, time_t month,
+		   gdouble x1, gdouble y1, gdouble x2, gdouble y2,
 		   int titleflags, time_t greystart, time_t greyend,
 		   int bordertitle)
 {
@@ -731,7 +590,7 @@ print_month_small (EvoCalendarPrintRende
 	double header_size, col_width, row_height, text_xpad, w;
 	double cell_top, cell_bottom, cell_left, cell_right, text_right;
 
-	/* Translators: These are workday abbreviations, e.g. Su=Sunday and Th=Thursday */
+	/* Translators: These are workday abbreviations, e.g. Su=Sunday and Th=thursday */
 	char *daynames[] = { N_("Su"), N_("Mo"), N_("Tu"), N_("We"),
 			     N_("Th"), N_("Fr"), N_("Sa") };
 	cairo_t *cr;
@@ -739,29 +598,21 @@ print_month_small (EvoCalendarPrintRende
 	/* Print the title, e.g. 'June 2001', in the top 16% of the area. */
 	format_date (month, titleflags, buf, 100);
 
-	if(top < bottom)
-		header_size = (bottom - top) * 0.16;
-	else
-		header_size = (top - bottom) * 0.16;
+	header_size = ABS (y2 - y1) * 0.16;
 
-	font = get_font_for_size (pr, header_size, GNOME_FONT_BOLD, FALSE);
-	if (bordertitle) {
-		print_border (pr->pc, left, right, top, top + header_size,
-			      1.0, 0.9);
-	}
-	print_text (pr, font, buf, ALIGN_CENTER, left, right,
-		    top, top + header_size);
+	font = get_font_for_size (header_size, PANGO_WEIGHT_BOLD);
+	if (bordertitle)
+		print_border (context, x1, x2, y1, y1 + header_size, 1.0, 0.9);
+	print_text (context, font, buf, PANGO_ALIGN_CENTER, x1, x2,
+		    y1, y1 + header_size);
 	pango_font_description_free (font);
 
-	top += header_size;
-	col_width = (right - left) / 7;
+	y1 += header_size;
+	col_width = (x2 - x1) / 7;
 
 	/* The top row with the day abbreviations gets an extra bit of
 	   vertical space around it. */
-	if (bottom > top )
-		row_height = (bottom - top) / 7.4; 
-	else
-		row_height = (top - bottom ) / 7.4;
+	row_height = ABS (y2 - y1) / 7.4;
 
 	/* First we need to calculate a reasonable font size. We start with a
 	   rough guess of just under the height of each row. */
@@ -779,39 +630,41 @@ print_month_small (EvoCalendarPrintRende
 	tm = *convert_timet_to_struct_tm (month, zone);
 	build_month (tm.tm_mon, tm.tm_year + 1900, days, 0, 0);
 
-	font_normal = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE);
-	font_bold = get_font_for_size (pr, font_size, GNOME_FONT_BOLD, FALSE);
+	font_normal = get_font_for_size (font_size, PANGO_WEIGHT_NORMAL);
+	font_bold = get_font_for_size (font_size, PANGO_WEIGHT_BOLD);
 
 	/* Get a reasonable estimate of the largest number we will need,
 	   and use it to calculate the offset from the right edge of the
 	   cell that we should put the numbers. */
-	w = evo_calendar_print_renderer_get_width (pr, font_bold, "23");
+	w = evo_calendar_print_renderer_get_width (context, font_bold, "23");
 	text_xpad = (col_width - w) / 2;
 
-	cr = gtk_print_context_get_cairo_context (pr->pc);
+	cr = gtk_print_context_get_cairo_context (context);
 	cairo_set_source_rgb (cr, 0, 0, 0);
 
 	/* Print the abbreviated day names across the top in bold. */
 	week_start_day = calendar_config_get_week_start_day ();
 	weekday = week_start_day;
 	for (x = 0; x < 7; x++) {
-		print_text (pr, font_bold, _(daynames[weekday]), ALIGN_CENTER,
-			    left + x * col_width, left + (x + 1) * col_width,
-			    top, top + row_height * 1.4);
+		print_text (
+			context, font_bold,
+			_(daynames[weekday]), PANGO_ALIGN_RIGHT,
+			x1 + x * col_width, x1 + (x + 1) * col_width,
+			y1, y1 + row_height * 1.4);
 		weekday = (weekday + 1) % 7;
 	}
 
-	top += row_height * 1.4;
+	y1 += row_height * 1.4;
 
 	now = time_month_begin_with_zone (month, zone);
 	for (y = 0; y < 6; y++) {
 
-		cell_top = top + y * row_height;
+		cell_top = y1 + y * row_height;
 		cell_bottom = cell_top + row_height;
 
 		for (x = 0; x < 7; x++) {
 
-			cell_left = left + x * col_width;
+			cell_left = x1 + x * col_width;
 			/* We add a 0.05 to make sure the cells meet up with
 			   each other. Otherwise you sometimes get lines
 			   between them which looks bad. Maybe I'm not using
@@ -834,12 +687,12 @@ print_month_small (EvoCalendarPrintRende
 				next = time_add_day_with_zone (now, 1, zone);
 				if ((now >= greystart && now < greyend) 
 				    || (greystart >= now && greystart < next)) {
-					print_border (pr->pc,
+					print_border (context,
 						      cell_left, cell_right,
 						      cell_top, cell_bottom,
 						      -1.0, 0.75); 
 				}
-				print_text (pr, font, buf, ALIGN_RIGHT,
+				print_text (context, font, buf, PANGO_ALIGN_RIGHT,
 					    cell_left, text_right,
 					    cell_top, cell_bottom);
 
@@ -851,43 +704,49 @@ print_month_small (EvoCalendarPrintRende
 	pango_font_description_free (font_bold);
 }
 
-
 /* wraps text into the print context, not taking up more than its allowed space */
 static double
-bound_text (EvoCalendarPrintRenderer *pr, PangoFontDescription *font, const char *text,
-	   double left, double right, double top, double bottom, double indent)
+bound_text (GtkPrintContext *context,
+            PangoFontDescription *font,
+            const gchar *text,
+	    gdouble x1, gdouble y1,
+	    gdouble x2, gdouble y2)
 {
-	/* Let Pango do all the work: */
-	int w=0, h=0;
+	PangoLayout *layout;
+	gint layout_width, layout_height;
 	cairo_t *cr;
-	
-	cr = gtk_print_context_get_cairo_context (pr->pc);
+
+	cr = gtk_print_context_get_cairo_context (context);
+	layout = gtk_print_context_create_pango_layout (context);
+
+	pango_layout_set_font_description (layout, font);
+	pango_layout_set_text (layout, text, -1);
+	pango_layout_set_width (layout, pango_units_from_double (x2 - x1));
+	pango_layout_get_size (layout, &layout_width, &layout_height);
+
 	cairo_save (cr);
 
 	/* Set a clipping rectangle. */
-	cairo_move_to (cr, left, top);
-	cairo_rectangle (cr, left, top, right, bottom);
+	cairo_move_to (cr, x1, y1);
+	cairo_rectangle (cr, x1, y1, x2, y2);
 	cairo_clip (cr);   
 	cairo_new_path (cr); 
 
-	pango_layout_set_font_description (pr->pl, font);
-	pango_layout_set_text (pr->pl, text, -1);
-	pango_layout_set_indent (pr->pl, indent * PANGO_SCALE);
-	pango_layout_set_width (pr->pl, (right-left)*PANGO_SCALE);
-
-	cairo_move_to (cr, left, top);
-	pango_cairo_show_layout (cr, pr->pl);
+	cairo_move_to (cr, x1, y1);
+	pango_cairo_show_layout (cr, layout);
 	cairo_stroke (cr);
 
 	cairo_restore (cr);
-	pango_layout_get_size (pr->pl, &w, &h);
-	return top + ((double)h/(double)PANGO_SCALE);
+
+	g_object_unref (layout);
+
+	return y1 + pango_units_to_double (layout_height);
 }
 
 
 /* Draw the borders, lines, and times down the left of the day view. */
 static void
-print_day_background (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
+print_day_background (GtkPrintContext *context, GnomeCalendar *gcal,
 		      time_t whence, struct pdinfo *pdi,
 		      double left, double right, double top, double bottom)
 {
@@ -903,16 +762,16 @@ print_day_background (EvoCalendarPrintRe
 	cairo_t *cr;
 	
 	/* Fill the time column in light-gray. */
-	print_border (pr->pc, left, left + width, top, bottom, -1.0, 0.9);
+	print_border (context, left, left + width, top, bottom, -1.0, 0.9);
 
 	/* Draw the border around the entire view. */
-	cr = gtk_print_context_get_cairo_context (pr->pc);
+	cr = gtk_print_context_get_cairo_context (context);
 
 	cairo_set_source_rgb (cr, 0, 0, 0);
-	print_border (pr->pc, left, right, top, bottom, 1.0, -1.0);   
+	print_border (context, left, right, top, bottom, 1.0, -1.0);   
 
 	/* Draw the vertical line on the right of the time column. */
-	cr = gtk_print_context_get_cairo_context (pr->pc);
+	cr = gtk_print_context_get_cairo_context (context);
 	cairo_set_line_width (cr, 0.0);
 	cairo_move_to (cr, left + width, bottom);
 	cairo_line_to (cr, left + width, top);
@@ -928,12 +787,12 @@ print_day_background (EvoCalendarPrintRe
 	font_size = yinc * 0.6;
 	max_font_size = width * 0.5;
 	hour_font_size = MIN (font_size, max_font_size);
-	font_hour = get_font_for_size (pr, hour_font_size, GNOME_FONT_BOLD, FALSE);
+	font_hour = get_font_for_size (hour_font_size, PANGO_WEIGHT_BOLD);
 
 	font_size = yinc * 0.33;
 	max_font_size = width * 0.25;
 	minute_font_size = MIN (font_size, max_font_size);
-	font_minute = get_font_for_size (pr, minute_font_size, GNOME_FONT_BOLD, FALSE);
+	font_minute = get_font_for_size (minute_font_size, PANGO_WEIGHT_BOLD);
 
 	use_24_hour = calendar_config_get_24_hour_format ();
 
@@ -941,7 +800,7 @@ print_day_background (EvoCalendarPrintRe
 	hour_minute_x = left + width * 0.58;
 	for (i = pdi->start_hour; i < pdi->end_hour; i++) {
 		y = top + yinc * (row + 1) ; 
-		cr = gtk_print_context_get_cairo_context (pr->pc);
+		cr = gtk_print_context_get_cairo_context (context);
 		cairo_set_source_rgb (cr, 0, 0, 0);
 
 		if (use_24_hour) {
@@ -960,16 +819,16 @@ print_day_background (EvoCalendarPrintRe
 
 		/* the hour label/minute */
 		sprintf (buf, "%d", hour);
-		print_text (pr, font_hour, buf, ALIGN_RIGHT,
+		print_text (context, font_hour, buf, PANGO_ALIGN_RIGHT,
 			    left, hour_minute_x,
 			    y - yinc + yinc / 2, y - yinc + yinc / 2 + hour_font_size);
-		print_text (pr, font_minute, minute, ALIGN_LEFT,
+		print_text (context, font_minute, minute, PANGO_ALIGN_LEFT,
 			    hour_minute_x, left + width - 3,
 			    y - yinc + yinc / 2, y - yinc + yinc / 2 + minute_font_size);
 		
                 /* Draw the horizontal line between hours, across the entire
 		   width of the day view. */
-		cr = gtk_print_context_get_cairo_context (pr->pc);
+		cr = gtk_print_context_get_cairo_context (context);
 		cairo_move_to (cr, left, y);
 		cairo_line_to (cr, right, y);
 		cairo_set_line_width (cr, 1);
@@ -1096,7 +955,7 @@ free_event_array (GArray *array)
 
 
 static void
-print_day_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_day_long_event (GtkPrintContext *context, PangoFontDescription *font,
 		      double left, double right, double top, double bottom,
 		      double row_height, EDayViewEvent *event,
 		      struct pdinfo *pdi, ECalModel *model)
@@ -1126,7 +985,7 @@ print_day_long_event (EvoCalendarPrintRe
 	y2 = y1 + row_height-7;
 	red = green = blue = 0.95;
 	e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
-	print_border_with_triangles (pr->pc, x1, x2, y1, y2, 0.5, red, green, blue,
+	print_border_with_triangles (context, x1, x2, y1, y2, 0.5, red, green, blue,
 				     left_triangle_width,
 				     right_triangle_width);
 
@@ -1145,7 +1004,7 @@ print_day_long_event (EvoCalendarPrintRe
 				    buffer, sizeof (buffer));
 
 		x1 += 4;
-		x1 += print_text (pr, font, buffer, ALIGN_LEFT, x1, x2, y1, y2);
+		x1 += print_text (context, font, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2);
 	}
 
 	/* If the event ends before the end of the last day being printed,
@@ -1163,7 +1022,7 @@ print_day_long_event (EvoCalendarPrintRe
 				    buffer, sizeof (buffer));
 
 		x2 -= 4;
-		x2 -= print_text (pr, font, buffer, ALIGN_RIGHT, x1, x2, y1, y2);
+		x2 -= print_text (context, font, buffer, PANGO_ALIGN_RIGHT, x1, x2, y1, y2);
 	}
 
 	/* Print the text. */
@@ -1172,12 +1031,12 @@ print_day_long_event (EvoCalendarPrintRe
 
 	x1 += 4;
 	x2 -= 4;
-	print_text (pr, font, text, ALIGN_CENTER, x1, x2, y1, y2);
+	print_text (context, font, text, PANGO_ALIGN_CENTER, x1, x2, y1, y2);
 }
 
 
 static void
-print_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_day_event (GtkPrintContext *context, PangoFontDescription *font,
 		 double left, double right, double top, double bottom,
 		 EDayViewEvent *event, struct pdinfo *pdi, ECalModel *model)
 {
@@ -1219,7 +1078,7 @@ print_day_event (EvoCalendarPrintRendere
 
 	red = green = blue = 0.95;
 	e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
-	print_border_rgb (pr->pc, x1, x2, y1, y2, 1.0, red, green, blue);
+	print_border_rgb (context, x1, x2, y1, y2, 1.0, red, green, blue);
 
 	summary = icalcomponent_get_summary (event->comp_data->icalcomp);
 	text = summary ? (char*) summary : "";
@@ -1249,7 +1108,7 @@ print_day_event (EvoCalendarPrintRendere
 		free_text = TRUE;
 	}
 
-	bound_text (pr, font, text, x1 + 2, x2 - 2, y1, y2, 0);
+	bound_text (context, font, text, x1 + 2, y1, x2 - 2, y2);
 
 	if (free_text)
 		g_free (text);
@@ -1257,7 +1116,7 @@ print_day_event (EvoCalendarPrintRendere
 
 
 static void
-print_day_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whence,
+print_day_details (GtkPrintContext *context, GnomeCalendar *gcal, time_t whence,
 		   double left, double right, double top, double bottom)
 {
 	icaltimezone *zone = calendar_config_get_icaltimezone ();
@@ -1323,10 +1182,10 @@ print_day_details (EvoCalendarPrintRende
 				       pdi.day_starts, &rows_in_top_display);
 
 	 /*Print the long events. */
-	font = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE);
+	font = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
 	for (i = 0; i < pdi.long_events->len; i++) {
 		event = &g_array_index (pdi.long_events, EDayViewEvent, i);
-		print_day_long_event (pr, font, left, right, top, bottom,
+		print_day_long_event (context, font, left, right, top, bottom,
 				      DAY_VIEW_ROW_HEIGHT, event, &pdi, model);
 	}
 	
@@ -1337,10 +1196,10 @@ print_day_details (EvoCalendarPrintRende
 				   DAY_VIEW_MIN_ROWS_IN_TOP_DISPLAY);
 
 	/* Draw the border around the long events. */
-	cr = gtk_print_context_get_cairo_context (pr->pc);
+	cr = gtk_print_context_get_cairo_context (context);
 
 	cairo_set_source_rgb (cr, 0, 0, 0);
-		print_border (pr->pc, left, right,
+		print_border (context, left, right,
 		      top, top + rows_in_top_display * DAY_VIEW_ROW_HEIGHT - 4,
 		      1.0, -1.0); 
 		
@@ -1348,7 +1207,7 @@ print_day_details (EvoCalendarPrintRende
 	top += rows_in_top_display * DAY_VIEW_ROW_HEIGHT - 2;
 	
 	/* Draw the borders, lines, and times down the left. */
-	print_day_background (pr, gcal, whence, &pdi,
+	print_day_background (context, gcal, whence, &pdi,
 			      left, right, top, bottom);
 	/* Now adjust to get rid of the time column. */
 	left += DAY_VIEW_TIME_COLUMN_WIDTH;
@@ -1364,11 +1223,11 @@ print_day_details (EvoCalendarPrintRende
 	else
 		max_font_size = ((bottom - top ) / pdi.rows) - 4;
  	font_size = MIN(DAY_NORMAL_FONT_SIZE, max_font_size);
-	font = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE);
+	font = get_font_for_size (font_size, PANGO_WEIGHT_NORMAL);
 
 	for (i = 0; i < pdi.events[0]->len; i++) {
 		event = &g_array_index (pdi.events[0], EDayViewEvent, i);
-		print_day_event (pr, font, left, right, top, bottom,
+		print_day_event (context, font, left, right, top, bottom,
 				 event, &pdi, model);
 	}
 	
@@ -1400,7 +1259,7 @@ print_is_one_day_week_event (EWeekViewEv
 
 
 static void
-print_week_long_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_long_event (GtkPrintContext *context, PangoFontDescription *font,
 		       struct psinfo *psi,
 		       double x1, double x2, double y1, double y2,
 		       EWeekViewEvent *event, EWeekViewEventSpan *span,
@@ -1420,7 +1279,7 @@ print_week_long_event (EvoCalendarPrintR
 	if (event->end > psi->day_starts[span->start_day + span->num_days])
 		right_triangle_width = 4;
 
-	 print_border_with_triangles (pr->pc, x1, x2, y1, y2 + 4, 0.5, red, green, blue,
+	 print_border_with_triangles (context, x1, x2, y1, y2 + 4, 0.5, red, green, blue,
 				     left_triangle_width,
 				     right_triangle_width);
 
@@ -1439,7 +1298,7 @@ print_week_long_event (EvoCalendarPrintR
 				    buffer, sizeof (buffer));
 
 		x1 += 4;
-		x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2);
+		x1 += print_text_size (context, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2);
 	}
 
 	/* If the event ends before the end of the last day being printed,
@@ -1457,17 +1316,17 @@ print_week_long_event (EvoCalendarPrintR
 				    buffer, sizeof (buffer));
 
 		x2 -= 4;
-		x2 -= print_text_size (pr, buffer, ALIGN_RIGHT, x1, x2, y1, y2);
+		x2 -= print_text_size (context, buffer, PANGO_ALIGN_RIGHT, x1, x2, y1, y2);
 	}
 
 	x1 += 4;
 	x2 -= 4;
-	print_text_size (pr, text, ALIGN_CENTER, x1, x2, y1, y2);
+	print_text_size (context, text, PANGO_ALIGN_CENTER, x1, x2, y1, y2);
 }
 
 
 static void
-print_week_day_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_day_event (GtkPrintContext *context, PangoFontDescription *font,
 		      struct psinfo *psi,
 		      double x1, double x2, double y1, double y2,
 		      EWeekViewEvent *event, EWeekViewEventSpan *span,
@@ -1486,24 +1345,24 @@ print_week_day_event (EvoCalendarPrintRe
 
 	e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE,
 			    buffer, sizeof (buffer));
-	print_rectangle (pr->pc, x1, x2 + 6, y1, y2 + 4, red, green, blue);
-	x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2 + 3 ) + 4;
-	print_text_size (pr, text, ALIGN_LEFT, x1, x2, y1, y2 + 3);    
-		
+	print_rectangle (context, x1, y1, (x2 + 6) - x1, (y2 + 4) - y1, red, green, blue);
+	x1 += print_text_size (context, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3 ) + 4;
+	print_text_size (context, text, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3);    
+
 	date_tm.tm_hour = event->end_minute / 60;
 	date_tm.tm_min = event->end_minute % 60;
 
 	e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE,
 			    buffer, sizeof (buffer));
 
-	print_rectangle (pr->pc, x1, x2 + 6, y1, y2 + 4, red, green, blue); 
-	x1 += print_text_size (pr, buffer, ALIGN_LEFT, x1, x2, y1, y2 + 3) + 4;
-	print_text_size (pr, text, ALIGN_LEFT, x1, x2, y1, y2 + 3);  
+	print_rectangle (context, x1, y1, (x2 + 6) - x1, (y2 + 4) - y1, red, green, blue); 
+	x1 += print_text_size (context, buffer, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3) + 4;
+	print_text_size (context, text, PANGO_ALIGN_LEFT, x1, x2, y1, y2 + 3);  
 }
 
 
 static void
-print_week_event (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_event (GtkPrintContext *context, PangoFontDescription *font,
 		  struct psinfo *psi,
 		  double left, double top,
 		  double cell_width, double cell_height,
@@ -1570,11 +1429,11 @@ print_week_event (EvoCalendarPrintRender
 			e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue);
 			if (print_is_one_day_week_event (event, span,
 							 psi->day_starts)) {
-				print_week_day_event (pr, font, psi,
+				print_week_day_event (context, font, psi,
 						      x1, x2, y1, y2,
 						      event, span, text, red, green, blue); 
 			} else {
-				print_week_long_event (pr, font, psi,
+				print_week_long_event (context, font, psi,
 						       x1, x2, y1, y2,
 						       event, span, text, red, green, blue);
 			} 
@@ -1584,7 +1443,8 @@ print_week_event (EvoCalendarPrintRender
 
 
 static void
-print_week_view_background (EvoCalendarPrintRenderer *pr, PangoFontDescription *font,
+print_week_view_background (GtkPrintContext *context,
+                            PangoFontDescription *font,
 			    struct psinfo *psi,
 			    double left, double top,
 			    double cell_width, double cell_height)
@@ -1617,7 +1477,7 @@ print_week_view_background (EvoCalendarP
 		if (psi->multi_week_view && (tm.tm_mon != psi->month))
 			fillcolor = 0.9;
 
-		print_border (pr->pc, x1, x2, y1, y2, 1.0, fillcolor);
+		print_border (context, x1, x2, y1, y2, 1.0, fillcolor);
 
 		if (psi->multi_week_view) {
 			if (tm.tm_mday == 1)
@@ -1625,7 +1485,7 @@ print_week_view_background (EvoCalendarP
 			else
 				format_string = "%d";
 		} else {
-			cr = gtk_print_context_get_cairo_context (pr->pc);
+			cr = gtk_print_context_get_cairo_context (context);
 
 			cairo_move_to (cr, x1 + 0.1 * cell_width,
 					    y1 + psi->header_row_height - 4);
@@ -1646,7 +1506,7 @@ print_week_view_background (EvoCalendarP
 
 		e_utf8_strftime (buffer, sizeof (buffer), format_string, &tm);
 		
-		 print_text_size (pr, buffer, ALIGN_RIGHT,
+		 print_text_size (context, buffer, PANGO_ALIGN_RIGHT,
 				 x1, x2 - 4, y1 + 2, y1 + 2 + font_size); 
 	}
 }
@@ -1698,7 +1558,7 @@ print_week_summary_cb (ECalComponent *co
 }
 
 static void
-print_week_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
+print_week_summary (GtkPrintContext *context, GnomeCalendar *gcal,
 		    time_t whence, gboolean multi_week_view, int weeks_shown,
 		    int month, double font_size,
 		    double left, double right, double top, double bottom)
@@ -1776,14 +1636,14 @@ print_week_summary (EvoCalendarPrintRend
 	psi.rows_per_compressed_cell = (cell_height - psi.header_row_height)
 		/ psi.row_height;
 
-	font = get_font_for_size (pr, font_size, GNOME_FONT_BOOK, FALSE);
+	font = get_font_for_size (font_size, PANGO_WEIGHT_NORMAL);
 	/* Draw the grid and the day names/numbers. */
-	print_week_view_background (pr, font, &psi, left, top,
+	print_week_view_background (context, font, &psi, left, top,
 				    cell_width, cell_height);
 	/* Print the events. */
 	for (event_num = 0; event_num < psi.events->len; event_num++) {
 		event = &g_array_index (psi.events, EWeekViewEvent, event_num);
-		print_week_event (pr, font, &psi, left, top,
+		print_week_event (context, font, &psi, left, top,
 				  cell_width, cell_height, model, event, spans);
 	}
 
@@ -1799,7 +1659,7 @@ print_week_summary (EvoCalendarPrintRend
 
 
 static void
-print_year_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whence,
+print_year_summary (GtkPrintContext *context, GnomeCalendar *gcal, time_t whence,
 		    double left, double right, double top, double bottom,
 		    int morerows)
 {
@@ -1833,8 +1693,8 @@ print_year_summary (EvoCalendarPrintRend
 		for (col = 0; col < cols; col++) {
 			l = left + col_width * col;
 			r = l + col_width;
-			print_month_small (pr, gcal, now,
-					   l + 8, r - 8, t - 8, b + 8,
+			print_month_small (context, gcal, now,
+					   l + 8, t - 8, r - 8, b + 8,
 					   DATE_MONTH, 0, 0, TRUE);
 			now = time_add_month_with_zone (now, 1, zone);
 		}
@@ -1842,7 +1702,7 @@ print_year_summary (EvoCalendarPrintRend
 }
 
 static void
-print_month_summary (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t whence,
+print_month_summary (GtkPrintContext *context, GnomeCalendar *gcal, time_t whence,
 		     double left, double right, double top, double bottom)
 {
 	icaltimezone *zone = calendar_config_get_icaltimezone ();
@@ -1880,7 +1740,7 @@ print_month_summary (EvoCalendarPrintRen
 	tm = *convert_timet_to_struct_tm (date, zone);
 	tm.tm_mday = (tm.tm_mday % 7) + 7;
 
-	font = get_font_for_size (pr, MONTH_NORMAL_FONT_SIZE, GNOME_FONT_BOLD, FALSE);
+	font = get_font_for_size (MONTH_NORMAL_FONT_SIZE, PANGO_WEIGHT_BOLD);
 	font_size = get_font_size (font);
 
 	columns = compress_weekend ? 6 : 7;
@@ -1903,8 +1763,8 @@ print_month_summary (EvoCalendarPrintRen
 		x1 = left + cell_width * col;
 		x2 = x1 + cell_width;
 
-		print_border (pr->pc, x1, x2, y1, y2, 1.0, -1.0);
-		print_text_size (pr, buffer, ALIGN_CENTER, x1, x2, y1, y2);
+		print_border (context, x1, x2, y1, y2, 1.0, -1.0);
+		print_text_size (context, buffer, PANGO_ALIGN_CENTER, x1, x2, y1, y2);
 
 		tm.tm_mday++;
 		tm.tm_wday = (tm.tm_wday + 1) % 7;
@@ -1912,14 +1772,14 @@ print_month_summary (EvoCalendarPrintRen
 	pango_font_description_free (font);
 
 	top = y2;
-	print_week_summary (pr, gcal, date, TRUE, 6, month,
+	print_week_summary (context, gcal, date, TRUE, 6, month,
 			    MONTH_NORMAL_FONT_SIZE,
 			    left, right, top, bottom);
 }
 
 
 static void
-print_todo_details (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal,
+print_todo_details (GtkPrintContext *context, GnomeCalendar *gcal,
 		    time_t start, time_t end,
 		    double left, double right, double top, double bottom)
 {
@@ -1938,16 +1798,16 @@ print_todo_details (EvoCalendarPrintRend
 	table = e_calendar_table_get_table (task_pad);
 	model = e_calendar_table_get_model (task_pad);
 
-	font_summary = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE);
+	font_summary = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
 
-	cr = gtk_print_context_get_cairo_context (pr->pc);
+	cr = gtk_print_context_get_cairo_context (context);
 
 	cairo_set_source_rgb (cr, 0, 0, 0);
 	cairo_set_line_width (cr, 0.0);
 	top +=2;
 
-	titled_box (pr, _("Tasks"), font_summary, ALIGN_CENTER | ALIGN_BORDER,
-		    &left, &right, &top, &bottom, 1.0);
+	titled_box (context, _("Tasks"), font_summary, PANGO_ALIGN_CENTER,
+		    &left, &top, &right, &bottom, 1.0);
 
 	y = top;
 	yend = bottom - 2;
@@ -1979,14 +1839,14 @@ print_todo_details (EvoCalendarPrintRend
 			break;
 
 		/* Print the box to put the tick in. */
-		print_border (pr->pc, x + 2, x + 8, y + 6, y + 15, 0.1, -1.0);
+		print_border (context, x + 2, x + 8, y + 6, y + 15, 0.1, -1.0);
 
 		/* If the task is complete, print a tick in the box. */
 		e_cal_component_get_completed (comp, &tt);
 		if (tt) {
 			e_cal_component_free_icaltimetype (tt);
 
-			cr = gtk_print_context_get_cairo_context (pr->pc);
+			cr = gtk_print_context_get_cairo_context (context);
 			cairo_set_source_rgb (cr, 0, 0, 0);
 			cairo_move_to (cr, x + 3, y + 11);
 			cairo_line_to (cr, x + 5, y + 14);
@@ -1995,12 +1855,12 @@ print_todo_details (EvoCalendarPrintRend
 			cairo_stroke (cr);
 		}
 
-		y = bound_text (pr, font_summary, summary.value,
-				x + 14, xend, y+4, yend, 0);
+		y = bound_text (context, font_summary, summary.value,
+				x + 14, y + 4, xend, yend);
 
 
 		y += get_font_size (font_summary)-5;
-		cr = gtk_print_context_get_cairo_context (pr->pc);
+		cr = gtk_print_context_get_cairo_context (context);
 		cairo_move_to (cr, x, y);
 		cairo_line_to (cr, xend, y);
 		cairo_set_line_width (cr, 1);
@@ -2012,146 +1872,53 @@ print_todo_details (EvoCalendarPrintRend
 	pango_font_description_free (font_summary);
 }
 
-
-/* Value for the PrintView enum */
-static const int print_view_map[] = {
-	PRINT_VIEW_DAY,
-	PRINT_VIEW_WEEK,
-	PRINT_VIEW_MONTH,
-	PRINT_VIEW_YEAR,
-	-1
-};
-
-/* Creates the range selector widget for printing a calendar */
-static GtkWidget *
-range_selector_new (GtkWidget *dialog, time_t at, int *view)
-{
-	icaltimezone *zone = calendar_config_get_icaltimezone ();
-	GtkWidget *box;
-	GtkWidget *radio;
-	GSList *group;
-	char text[1024];
-	char str1[512];
-	char str2[512];
-	struct tm tm;
-	time_t week_begin, week_end;
-	struct tm week_begin_tm, week_end_tm;
-	gint week_start_day;
-
-	box = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
-
-	tm = *convert_timet_to_struct_tm (at, zone);
-
-	/* Day */
-
-	e_utf8_strftime (text, sizeof (text), _("Selected day (%a %b %d %Y)"), &tm);
-	radio = gtk_radio_button_new_with_label (NULL, text);
-	group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
-	gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
-	/* Week */
-
-	week_start_day = calendar_config_get_week_start_day ();
-	week_begin = time_week_begin_with_zone (at, week_start_day, zone);
-	/* If the week starts on a Sunday, we have to show the Saturday first,
-	   since the weekend is compressed. If the original date passed in was
-	   a Saturday, we need to move on to the next Saturday, else we move
-	   back to the last one. */
-	if (week_start_day == 0) {
-		if (tm.tm_wday == 6)
-			week_begin = time_add_day_with_zone (week_begin, 6, zone);
-		else
-			week_begin = time_add_day_with_zone (week_begin, -1, zone);
-	}
-	week_end = time_add_day_with_zone (week_begin, 6, zone);
-
-	week_begin_tm = *convert_timet_to_struct_tm (week_begin, zone);
-	week_end_tm = *convert_timet_to_struct_tm (week_end, zone);
-
-	if (week_begin_tm.tm_mon == week_end_tm.tm_mon) {
-		e_utf8_strftime (str1, sizeof (str1), _("%a %b %d"), &week_begin_tm);
-		e_utf8_strftime (str2, sizeof (str2), _("%a %d %Y"), &week_end_tm);
-	} else {
-		if (week_begin_tm.tm_year == week_end_tm.tm_year) {
-			e_utf8_strftime (str1, sizeof (str1), _("%a %b %d"), &week_begin_tm);
-			e_utf8_strftime (str2, sizeof (str2), _("%a %b %d %Y"), &week_end_tm);
-		} else {
-			e_utf8_strftime (str1, sizeof (str1), _("%a %b %d %Y"), &week_begin_tm);
-			e_utf8_strftime (str2, sizeof (str2), _("%a %b %d %Y"), &week_end_tm);
-		}
-	}
-
-	g_snprintf (text, sizeof (text), _("Selected week (%s - %s)"), str1, str2);
-
-	radio = gtk_radio_button_new_with_label (group, text);
-	group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
-	gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
-	/* Month */
-
-	e_utf8_strftime (text, sizeof (text), _("Selected month (%b %Y)"), &tm);
-	radio = gtk_radio_button_new_with_label (group, text);
-	group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
-	gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
-	/* Year */
-
-	e_utf8_strftime (text, sizeof (text), _("Selected year (%Y)"), &tm);
-	radio = gtk_radio_button_new_with_label (group, text);
-	group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio));
-	gtk_box_pack_start (GTK_BOX (box), radio, FALSE, FALSE, 0);
-
-	/* Select default */
-
-	e_dialog_widget_hook_value (dialog, radio, view, (gpointer) print_view_map);
-
-	gtk_widget_show_all (box);
-	return box;
-}
-
-
 static void
-print_day_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
-		double left, double right, double top, double bottom)
+print_day_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
 {
+	GtkPageSetup *setup;
 	icaltimezone *zone = calendar_config_get_icaltimezone ();
 	int i, days = 1;
-	double todo, header, l;
+	double todo, l;
 	char buf[100];
 	cairo_t *cr;
+	gdouble width, height;
+
+	setup = gtk_print_context_get_page_setup (context);
+
+	width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+	height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
 
 	for (i = 0; i < days; i++) {
-		todo = (right - left) * 0.75 + left;
- 	/*		header = top - HEADER_HEIGHT;*/
-		header = HEADER_HEIGHT + top;
+		todo = width * 0.75;
 
-		cr = gtk_print_context_get_cairo_context (pr->pc);
+		cr = gtk_print_context_get_cairo_context (context);
 
 		/* Print the main view with all the events in. */
-		print_day_details (pr, gcal, date,
-				   left, todo - 2.0, header, bottom);
+		print_day_details (context, gcal, date,
+				   0.0, todo - 2.0, HEADER_HEIGHT,
+				   height);
 		
 		 /* Print the TaskPad down the right. */
-		print_todo_details (pr, gcal, 0, INT_MAX,
-				    todo, right, header, bottom);
+		print_todo_details (context, gcal, 0, INT_MAX,
+				    todo, width, HEADER_HEIGHT,
+				    height);
 	
 		/* Print the filled border around the header. */
-		print_border (pr->pc, left, right, top, header + 2.0, 1.0, 0.9);
+		print_border (context, 0.0, width,
+			      0.0, HEADER_HEIGHT + 2.0, 1.0, 0.9);
 		
 		/* Print the 2 mini calendar-months. */
-		l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2  - SMALL_MONTH_SPACING;
+		l = width - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2  - SMALL_MONTH_SPACING;
 
-		 print_month_small (pr, gcal, date,
-				   l, l + SMALL_MONTH_WIDTH,
-				   top + 4, header + 4,
+		 print_month_small (context, gcal, date,
+				   l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 4,
 				   DATE_MONTH | DATE_YEAR, date, date, FALSE);
 		
 
 		l += SMALL_MONTH_SPACING + SMALL_MONTH_WIDTH;
-		print_month_small (pr, gcal,
+		print_month_small (context, gcal,
 				   time_add_month_with_zone (date, 1, zone),
-				   l, l + SMALL_MONTH_WIDTH,
-				   top + 4, header + 4,
+				   l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 4,
 				   DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
 	  
 	 
@@ -2159,32 +1926,38 @@ print_day_view (EvoCalendarPrintRenderer
 		format_date (date, DATE_DAY | DATE_MONTH | DATE_YEAR,
 			     buf, 100);
 
-		print_text_size_bold (pr, buf, ALIGN_LEFT,
-				      left + 4, todo, top + 4, top + 4 + 24);
+		print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+				      4, todo, 4,
+                                      4 + 24);
 
 		/* Print the day, e.g. 'Tuesday'. */
 		format_date (date, DATE_DAYNAME, buf, 100);
 
-		print_text_size_bold (pr, buf, ALIGN_LEFT,
-				 left + 4, todo, top + 32, top + 32 + 18);
+		print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+				 4, todo, 32,
+                                 32 + 18);
 
 		date = time_add_day_with_zone (date, 1, zone);
 	 }
 }
 
-
 static void
-print_week_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
-		 double left, double right, double top, double bottom)
+print_week_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
 {
+	GtkPageSetup *setup;
 	icaltimezone *zone = calendar_config_get_icaltimezone ();
-	double header, l;
+	double l;
 	char buf[100];
 	time_t when;
 	gint week_start_day;
 	struct tm tm;
+	gdouble width, height;
+
+	setup = gtk_print_context_get_page_setup (context);
+
+	width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+	height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
 
-	header = HEADER_HEIGHT - top;
 	tm = *convert_timet_to_struct_tm (date, zone);
 	week_start_day = calendar_config_get_week_start_day ();
 	when = time_week_begin_with_zone (date, week_start_day, zone);
@@ -2199,101 +1972,115 @@ print_week_view (EvoCalendarPrintRendere
 	}
 
 	/* Print the main week view. */
-	print_week_summary (pr, gcal, when, FALSE, 1, 0,
+	print_week_summary (context, gcal, when, FALSE, 1, 0,
 			    WEEK_NORMAL_FONT_SIZE,
-			    left, right, header + 20, bottom);
+			    0.0, width,
+			    HEADER_HEIGHT + 20, height);
 	
 	
 	/* Print the border around the main view. */
-	print_border (pr->pc, left, right, header , bottom, 1.0, -1.0);
+	print_border (context, 0.0, width, HEADER_HEIGHT ,
+		      height, 1.0, -1.0);
 
 	/* Print the border around the header area. */
-	print_border (pr->pc, left, right, top, header + 2.0 + 20, 1.0, 0.9);
+	print_border (context, 0.0, width,
+                      0.0, HEADER_HEIGHT + 2.0 + 20, 1.0, 0.9);
 
 	/* Print the 2 mini calendar-months. */
-	l = right - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2
+	l = width - SMALL_MONTH_PAD - SMALL_MONTH_WIDTH * 2
 		- SMALL_MONTH_SPACING;
-	print_month_small (pr, gcal, when,
-			   l, l + SMALL_MONTH_WIDTH,
-			   top + 4, header + 30,
+	print_month_small (context, gcal, when,
+			   l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 30,
 			   DATE_MONTH | DATE_YEAR, when,
 			   time_add_week_with_zone (when, 1, zone), FALSE);
 
 	l += SMALL_MONTH_SPACING + SMALL_MONTH_WIDTH;
-	print_month_small (pr, gcal,
+	print_month_small (context, gcal,
 			   time_add_month_with_zone (when, 1, zone),
-			   l, l + SMALL_MONTH_WIDTH,
-			   top + 4, header + 30,
+			   l, 4, l + SMALL_MONTH_WIDTH, HEADER_HEIGHT + 30,
 			   DATE_MONTH | DATE_YEAR, when,
 			   time_add_week_with_zone (when, 1, zone), FALSE);
 
 	/* Print the start day of the week, e.g. '7th May 2001'. */
 	format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
-	print_text_size_bold (pr, buf, ALIGN_LEFT,
-			      left + 3, right, top + 4, top + 4 + 24);
+	print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+			      3, width,
+			      4, 4 + 24);
 
 	/* Print the end day of the week, e.g. '13th May 2001'. */
 	when = time_add_day_with_zone (when, 6, zone);
 	format_date (when, DATE_DAY | DATE_MONTH | DATE_YEAR, buf, 100);
-	print_text_size_bold (pr, buf, ALIGN_LEFT,
-			      left + 3, right, top + 24 + 3, top + 24 + 3 + 24);
+	print_text_size_bold (context, buf, PANGO_ALIGN_LEFT,
+			      3, width,
+			      24 + 3, 24 + 3 + 24);
 }
 
 
 static void
-print_month_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
-		  double left, double right, double top, double bottom)
+print_month_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
 {
+	GtkPageSetup *setup;
 	icaltimezone *zone = calendar_config_get_icaltimezone ();
-	double header;
 	char buf[100];
+	gdouble width, height;
+
+	setup = gtk_print_context_get_page_setup (context);
 
-	header = top + HEADER_HEIGHT;
+	width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+	height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
 
 	/* Print the main month view. */
-	print_month_summary (pr, gcal, date, left, right, header, bottom);
+	print_month_summary (context, gcal, date, 0.0, width, HEADER_HEIGHT, height);
 
 	/* Print the border around the header. */
-	print_border (pr->pc, left, right, top, header, 1.0, 0.9);
+	print_border (context, 0.0, width, 0.0, HEADER_HEIGHT, 1.0, 0.9);
 
 	/* Print the 2 mini calendar-months. */
-	print_month_small (pr, gcal,
+	print_month_small (context, gcal,
 			   time_add_month_with_zone (date, 1, zone),
-			   right - (right - left) / 7 + 2, right - 8,
-			   top + 4, header,
+			   width - width / 7 + 2, 4,
+			   width - 8, HEADER_HEIGHT,
 			   DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
-	print_month_small (pr, gcal,
+	print_month_small (context, gcal,
 			   time_add_month_with_zone (date, -1, zone),
-			   left + 8, left + (right - left) / 7 - 2,
-			   top + 4, header,
+			   8, 4, width / 7 - 2, HEADER_HEIGHT,
 			   DATE_MONTH | DATE_YEAR, 0, 0, FALSE);
 
 	/* Print the month, e.g. 'May 2001'. */
 	format_date (date, DATE_MONTH | DATE_YEAR, buf, 100);
-	print_text_size_bold (pr, buf, ALIGN_CENTER,
-			      left + 3, right - 3, top + 3, top + 3 + 24);
+	print_text_size_bold (context, buf, PANGO_ALIGN_CENTER,
+			      3, width - 3,
+                              3, 3 + 24);
 
 }
 
-
+/* XXX Evolution doesn't have a "year" view. */
 static void
-print_year_view (EvoCalendarPrintRenderer *pr, GnomeCalendar *gcal, time_t date,
-		 double left, double right, double top, double bottom)
+print_year_view (GtkPrintContext *context, GnomeCalendar *gcal, time_t date)
 {
+	GtkPageSetup *setup;
 	char buf[100];
 	cairo_t *cr;
+	gdouble width, height;
+
+	setup = gtk_print_context_get_page_setup (context);
 
-	cr = gtk_print_context_get_cairo_context (pr->pc); 
+	width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+	height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
+
+	cr = gtk_print_context_get_cairo_context (context); 
 
 	cairo_show_page (cr);
-	print_year_summary (pr, gcal, date, left, right, top + 50, bottom,
-			    TRUE);
+	print_year_summary (context, gcal, date, 0.0,
+			    width, 50,
+			    height, TRUE);
 
 	/* centered title */
 	format_date (date, DATE_YEAR, buf, 100);
-	print_text_size_bold (pr, buf, ALIGN_CENTER,
-			      left+3, right, top+3, top + 27);
-	cr=gtk_print_context_get_cairo_context (pr->pc);
+	print_text_size_bold (context, buf, PANGO_ALIGN_CENTER,
+			      3, width,
+			      3, 27);
+	cr=gtk_print_context_get_cairo_context (context);
 	cairo_show_page (cr);
 }
 
@@ -2337,7 +2124,7 @@ get_zone_from_tzid (ECal *client, const 
 }
 
 static void
-print_date_label (EvoCalendarPrintRenderer *pr, ECalComponent *comp, ECal *client,
+print_date_label (GtkPrintContext *context, ECalComponent *comp, ECal *client,
 		  double left, double right, double top, double bottom)
 {
 	icaltimezone *start_zone, *end_zone, *due_zone, *completed_zone;
@@ -2405,16 +2192,65 @@ print_date_label (EvoCalendarPrintRender
 			write_label_piece (due, buffer, 1024, _("Due "), NULL);
 	}
 
-	print_text_size_bold (pr, buffer, ALIGN_LEFT,
+	print_text_size_bold (context, buffer, PANGO_ALIGN_LEFT,
 			      left, right, top, top - 15);
 }
 
 static void
-print_comp_item (PrintCompItem *pci)
-		 
+print_calendar_draw_page (GtkPrintOperation *operation,
+                          GtkPrintContext *context,
+                          gint page_nr,
+                          PrintCalItem *pcali)
+{
+	switch (gnome_calendar_get_view (pcali->gcal)) {
+		case GNOME_CAL_DAY_VIEW:
+			print_day_view (context, pcali->gcal, pcali->start);
+			break;
+		case GNOME_CAL_WORK_WEEK_VIEW:
+		case GNOME_CAL_WEEK_VIEW:
+			print_week_view (context, pcali->gcal, pcali->start);
+			break;
+		case GNOME_CAL_MONTH_VIEW:
+			print_month_view (context, pcali->gcal, pcali->start);
+			break;
+		default:
+			g_assert_not_reached ();
+	}  
+}
+
+void
+print_calendar (GnomeCalendar *gcal, GtkPrintOperationAction action,
+                time_t start)
+{
+	GtkPrintOperation *operation;
+	PrintCalItem pcali;
+
+	g_return_if_fail (gcal != NULL);
+	g_return_if_fail (GNOME_IS_CALENDAR (gcal));
+
+	pcali.gcal = gcal;
+	pcali.start = start;
+
+	operation = e_print_operation_new ();
+	gtk_print_operation_set_n_pages (operation, 1);
+
+        g_signal_connect (
+		operation, "draw_page",
+		G_CALLBACK (print_calendar_draw_page), &pcali);
+
+	gtk_print_operation_run (operation, action, NULL, NULL);
+
+	g_object_unref (operation);
+}
+
+static void
+print_comp_draw_page (GtkPrintOperation *operation,
+                      GtkPrintContext *context,
+                      gint page_nr,
+                      PrintCompItem *pci)
 {
+	GtkPageSetup *setup;
 	PangoFontDescription *font;
-	EvoCalendarPrintRenderer *pr;
 	ECal *client;
 	ECalComponent *comp;
 	ECalComponentVType vtype;
@@ -2426,20 +2262,19 @@ print_comp_item (PrintCompItem *pci)
 	char *categories_string, *location_string, *summary_string;
 	double header_size;
 	cairo_t *cr;
-	double left, right, top, bottom;
+	gdouble width, height;
+	double top;
+
+	setup = gtk_print_context_get_page_setup (context);
+
+	width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
+	height = gtk_page_setup_get_page_height (setup, GTK_UNIT_POINTS);
 
         /* PrintCompItem structure contains elements to be used 
          * with the Print Context , obtained in comp_draw_page
          */    
-	comp = g_new0 (ECalComponent, 1);
-	client = g_new0 (ECal, 1);
-	pr = pci->pr;
 	client = pci->client;
 	comp = pci->comp;
-	left = pci->l;
-	right = pci->r;
-	top = pci->t;
-	bottom = pci->b;
 
 	vtype = e_cal_component_get_vtype (comp);
 
@@ -2453,25 +2288,25 @@ print_comp_item (PrintCompItem *pci)
 	else
 		return;
 
-	cr = gtk_print_context_get_cairo_context (pr->pc);
+	cr = gtk_print_context_get_cairo_context (context);
 	    
 	/* Print the title in a box at the top of the page. */
-	font = get_font_for_size (pr, 18, GNOME_FONT_BOLD, FALSE);
+	font = get_font_for_size (18, PANGO_WEIGHT_BOLD);
 	header_size = 40;
-	print_border (pr->pc, left, right, top, top+header_size,
+	print_border (context, 0.0, width, 0.0, header_size,
 		      1.0, 0.9);
-	print_text (pr, font, title, ALIGN_CENTER, left, right,
-		    top + 0.1, top +header_size - 0.1);
+	print_text (context, font, title, PANGO_ALIGN_CENTER, 0.0, width,
+		    0.1, header_size - 0.1);
 	pango_font_description_free (font);
 
-	top += header_size + 30;
+	top = header_size + 30;
 	
 	/* Summary */
-	font = get_font_for_size (pr, 18, GNOME_FONT_BOLD, FALSE);
+	font = get_font_for_size (18, PANGO_WEIGHT_BOLD);
 	e_cal_component_get_summary (comp, &text);
 	summary_string = g_strdup_printf (_("Summary: %s"), text.value);
-	top = bound_text (pr, font, summary_string, left, right,
-			  top, bottom, 0);
+	top = bound_text (context, font, summary_string, 0.0, top, width,
+			  height);
 	
 	g_free (summary_string);
 
@@ -2480,16 +2315,16 @@ print_comp_item (PrintCompItem *pci)
 	if (location && location[0]) {
 		location_string = g_strdup_printf (_("Location: %s"),
 						   location);
-		top = bound_text (pr, font, location_string, left, right,
-				  top + 3, bottom, 0);
+		top = bound_text (context, font, location_string, 0.0,
+				  top + 3, width, height);
 		g_free (location_string);
 	}
 	pango_font_description_free (font);
 	
 	/* Date information */
-	print_date_label (pr, comp, client, left, right, top + 3, top + 15);
+	print_date_label (context, comp, client, 0.0, width, top + 3, top + 15);
 	top += 20;
-	font = get_font_for_size (pr, 12, GNOME_FONT_BOOK, FALSE);
+	font = get_font_for_size (12, PANGO_WEIGHT_NORMAL);
 	
 	/* For a VTODO we print the Status, Priority, % Complete and URL. */
 	if (vtype == E_CAL_COMPONENT_TODO) {
@@ -2522,8 +2357,8 @@ print_comp_item (PrintCompItem *pci)
 			if (status_string) {
 				char *status_text = g_strdup_printf (_("Status: %s"),
 							      status_string);
-				top = bound_text (pr, font, status_text,
-						  left, right, top, bottom, 0);
+				top = bound_text (context, font, status_text,
+						  0.0, top, width, height);
 				top += get_font_size (font) - 6;
 				g_free (status_text);
 			}
@@ -2538,8 +2373,8 @@ print_comp_item (PrintCompItem *pci)
 			e_cal_component_free_priority (priority);
 
 			pri_text = g_strdup_printf (_("Priority: %s"), priority_string);
-			top = bound_text (pr, font, pri_text,
-					  left, right, top, bottom, 0);
+			top = bound_text (context, font, pri_text,
+					  0.0, top, width, height);
 			top += get_font_size (font) - 6;
 			g_free (pri_text);
 		}
@@ -2552,8 +2387,8 @@ print_comp_item (PrintCompItem *pci)
 			percent_string = g_strdup_printf (_("Percent Complete: %i"), *percent);
 			e_cal_component_free_percent (percent);
 
-			top = bound_text (pr, font, percent_string,
-					  left, right, top, bottom, 0);
+			top = bound_text (context, font, percent_string,
+					  0.0, top, width, height);
 			top += get_font_size (font) - 6;
 		}
 
@@ -2564,8 +2399,8 @@ print_comp_item (PrintCompItem *pci)
 			char *url_string = g_strdup_printf (_("URL: %s"),
 							    url);
 
-			top = bound_text (pr, font, url_string,
-					  left, right, top, bottom, 0);
+			top = bound_text (context, font, url_string,
+					  0.0, top, width, height);
 			top += get_font_size (font) - 6;
 			g_free (url_string);
 		}
@@ -2576,8 +2411,8 @@ print_comp_item (PrintCompItem *pci)
 	if (categories && categories[0]) {
 		categories_string = g_strdup_printf (_("Categories: %s"),
 						     categories);
-		top = bound_text (pr, font, categories_string,
-				  left, right, top, bottom, 0);
+		top = bound_text (context, font, categories_string,
+				  0.0, top, width, height);
 		top += get_font_size (font) - 6 ;
 		g_free (categories_string);
 	}
@@ -2595,8 +2430,8 @@ print_comp_item (PrintCompItem *pci)
 		}
 		e_cal_component_free_text_list (contact_list);
 
-		top = bound_text (pr, font, contacts->str,
-				  left, right, top, bottom, 0);
+		top = bound_text (context, font, contacts->str,
+				  0.0, top, width, height);
 		top += get_font_size (font) - 6;
 		g_string_free (contacts, TRUE);
 	}
@@ -2606,12 +2441,12 @@ print_comp_item (PrintCompItem *pci)
 	e_cal_component_get_description_list (comp, &desc);
 	for (l = desc; l != NULL; l = l->next) {
 		ECalComponentText *text = l->data;
-		if (top > bottom) {
+		if (top > height) {
 		top = 10; //FIXME
 		cairo_show_page (cr);
 		}
 		if (text->value != NULL) 
-			top = bound_text (pr, font, text->value, left, right, top + 3, bottom, 0) + 30;
+			top = bound_text (context, font, text->value, 0.0, top + 3, width, height) + 30;
 
 	}
 
@@ -2621,312 +2456,99 @@ print_comp_item (PrintCompItem *pci)
 }
 
 void
-print_calendar (GnomeCalendar *gcal, gboolean preview, time_t date,
-		PrintView default_view)
+print_comp (ECalComponent *comp, ECal *client, GtkPrintOperationAction action)
 {
-	GtkPrintSettings *settings;
-	GtkPrintOperationResult res;
-	GtkPrintOperation *print;
-	GtkPaperSize *paper_size;
-	GtkPageSetup *page_setup;
-	GtkWidget *gpd;
-	GtkWidget *range;
-	PrintCalItem *pcali;
-	int view;
-	double  r, t, w, h;
+	GtkPrintOperation *operation;
+	PrintCompItem pci;
 
-	g_return_if_fail (gcal != NULL);
-	g_return_if_fail (GNOME_IS_CALENDAR (gcal));
-	
-	view = (int) default_view;
+	g_return_if_fail (E_IS_CAL_COMPONENT (comp));
 
-	pcali = g_new0 (PrintCalItem, 1);
-	pcali->gcal = g_new0 (GnomeCalendar, 1);
+	pci.comp = comp;
+	pci.client = client;
 
-	print = gtk_print_operation_new ();
-	paper_size = gtk_paper_size_new ("iso_a4");
-	page_setup = gtk_page_setup_new();
-	gtk_page_setup_set_paper_size(page_setup, paper_size);
-
-	settings = gtk_print_settings_new ();
-	settings = e_print_load_settings ();
-	gpd = e_print_get_dialog_with_config (_("Print Item"), 0, settings);
-	range = range_selector_new (gpd, date, &view);
-
-	t = gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_POINTS);
-	r = gtk_paper_size_get_default_right_margin (paper_size, GTK_UNIT_POINTS);
-	w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
-	h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
-	
-	pcali->b = h * (1.0 - TEMP_MARGIN);  
-        pcali->l = r * TEMP_MARGIN;
-        pcali->t = t * (1.0 - TEMP_MARGIN); 
-        pcali->r = w * (1.0 - TEMP_MARGIN);
-	pcali->default_view = default_view;
-	pcali->gcal = gcal;
-	pcali->date = date;
-
-	gtk_print_operation_set_default_page_setup (print, page_setup);
-	gtk_print_operation_set_n_pages (print, 1);
-        	
-	/* FIX ME ,Allow it to use the default settings for the first time */
-        gtk_print_operation_set_print_settings (print, settings); 
-
-	g_signal_connect (print, "create-custom-widget", G_CALLBACK (create_custom_widget), range);
-	g_signal_connect (print, "custom-widget-apply", G_CALLBACK (apply_custom_widget), NULL);
-        g_signal_connect (print, "draw_page", G_CALLBACK (cal_draw_page), pcali);
-
-		/* Runs the print dialog, recursively, emitting signals */
-	if (preview)
-		gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);
-	else
-		res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);   
-    
-	/* Save the user configured settings back to the gconf */
-	settings = gtk_print_operation_get_print_settings (print);
-	e_print_save_settings (settings); 
-	
-	if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
-		   g_object_unref (print); 
-	}
-	else if (res == GTK_PRINT_OPERATION_RESULT_ERROR) {
-		/* FIX ME */
-		     
-	}
+	operation = e_print_operation_new ();
 
-}
+	g_signal_connect (
+		operation, "draw-page",
+		G_CALLBACK (print_comp_draw_page), &pci);
 
-void
-print_comp (ECalComponent *comp, ECal *client, gboolean preview)
-{
-        GtkPrintOperation *print;
-	GtkPrintSettings *settings;
-	GtkPaperSize *paper_size;
-        PrintCompItem *pci;
-	GtkPrintOperationResult res;
-	GtkPageSetup *page_setup;
-        gdouble t, r, w,h;
-        GtkWidget *gpd;
-
-        g_return_if_fail (comp != NULL);
-        g_return_if_fail (E_IS_CAL_COMPONENT (comp));
-
-	pci = g_new0 (PrintCompItem, 1);
-
-	print = gtk_print_operation_new ();
-	paper_size = gtk_paper_size_new ("iso_a4");
-	page_setup = gtk_page_setup_new();
-	gtk_page_setup_set_paper_size(page_setup, paper_size);
-
-	settings = gtk_print_settings_new ();
-	settings = e_print_load_settings ();
-	gpd = e_print_get_dialog_with_config (_("Print Item"), 0, settings);
-	
-	/* Values using the print context , used in comp_draw_page */
-	t = gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_POINTS);
-	r = gtk_paper_size_get_default_right_margin (paper_size, GTK_UNIT_POINTS);
-	w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
-	h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
-	pci->b = h * (1.0 - TEMP_MARGIN);
-        pci->l = r * TEMP_MARGIN;
-        pci->t = t * (1.0 - TEMP_MARGIN);
-        pci->r = w * (1.0 - TEMP_MARGIN);
-        pci->comp = comp;
-        pci->client = client;
-
-	gtk_print_operation_set_default_page_setup (print, page_setup);
-	gtk_print_operation_set_n_pages (print, 1);
-	
-        /* FIX ME ,Allow it to use the default settings for the first time */
-        gtk_print_operation_set_print_settings (print, settings); 
-
-        g_signal_connect (print, "draw_page", G_CALLBACK (comp_draw_page), pci);
-	
-	gtk_print_operation_set_print_settings (print, settings);
-	
-	/* Runs a dialog , emitting various signals based on user response */
-	if (preview)
-		gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
-	else
-		res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG , NULL, NULL); 
+	gtk_print_operation_run (operation, action, NULL, NULL);
 
-	/* Saves the user configuration in gconf */
-	settings = gtk_print_operation_get_print_settings (print);
-	e_print_save_settings (settings);
-
-	 if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
-		  g_object_unref (print);
-	      }
-	 else if ( res == GTK_PRINT_OPERATION_RESULT_ERROR) {
-		 /* FIX ME */
-	 }	  
+	g_object_unref (operation);
 }
 
 static void
-print_title (GtkPrintContext *context, const char *title,
-	     double page_width, double page_height, double left_margin, double bottom_margin)
+print_title (GtkPrintContext *context, const gchar *text, gdouble page_width)
 {
-	PangoFontDescription *font;
-	PangoLayout *pl;
-	double w, x, y;
+	PangoFontDescription *desc;
+	PangoLayout *layout;
 	cairo_t *cr;
 
 	cr = gtk_print_context_get_cairo_context (context);
-	cairo_save (cr);
 
-	pl = gtk_print_context_create_pango_layout (context);
-	font = pango_font_description_from_string("Sans Bold 18");
-	pango_layout_set_font_description (pl, font);
-	pango_layout_set_text (pl, title, -1);
-	
-	w = pango_layout_get_width (pl)/(double)PANGO_SCALE;
-	y = page_height ;
-	x = (page_width - w) / 2;
+	desc = pango_font_description_from_string (FONT_FAMILY " Bold 18");
 
-	cairo_move_to (cr, x, y );
-	pango_cairo_show_layout (cr, pl);
+	layout = gtk_print_context_create_pango_layout (context);
+	pango_layout_set_text (layout, text, -1);
+	pango_layout_set_font_description (layout, desc);
+	pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+	pango_layout_set_width (layout, pango_units_from_double (page_width));
 
-	cairo_restore (cr);
-	pango_font_description_free (font); 
+	cairo_save (cr);
 
-}
+	cairo_move_to (cr, 0.0, 0.0);
+	pango_cairo_show_layout (cr, layout);
 
-void
-print_table (ETable *etable, const char *dialog_title, const char *print_header, gboolean preview)
-{
-	EPrintable *printable;
-	GtkPrintOperationResult res;
-	GtkPrintSettings *settings;
-	GtkPrintOperation *print;
-	GtkPageSetup *page_setup;
-	GtkPaperSize *paper_size;
-	GtkWidget *gpd;
-	PrintTableItem *pti;
-	double w, h, t, r, l, b;
-
-	pti = g_new0 (PrintTableItem, 1);
-
-	print = gtk_print_operation_new ();
- 	paper_size = gtk_paper_size_new ("iso_a4");
-	page_setup = gtk_page_setup_new();
-	gtk_page_setup_set_paper_size(page_setup, paper_size);
-
-	w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
-	h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
-	t = gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_POINTS);
-	r = gtk_paper_size_get_default_right_margin (paper_size, GTK_UNIT_POINTS);
-
-	b =h * (1.0 - TEMP_MARGIN);  
-        l =r * TEMP_MARGIN;
-        t =t * (1.0 - TEMP_MARGIN); 
-        r =w * (1.0 - TEMP_MARGIN);
-	
-	pti->left_margin = l;
-	pti->bottom_margin = b;
-	pti->paper_width = r - l;
-	pti->paper_height= t + 10;
-
-	settings = e_print_load_settings ();
-	gpd = e_print_get_dialog_with_config (dialog_title, 0, settings);
-	printable = e_table_get_printable (etable);
+	cairo_restore (cr);
 
-	g_object_ref (printable);
-	gtk_object_sink (GTK_OBJECT (printable));
-	e_printable_reset (printable);
-	pti->printable = printable;
+	g_object_unref (layout);
 
-	gtk_print_operation_set_default_page_setup (print, page_setup);
-	gtk_print_operation_set_n_pages (print, 1);
+	pango_font_description_free (desc);
+}
 
-	/* FIX ME ,Allow it to use the default settings for the first time */
-        gtk_print_operation_set_print_settings (print, settings); 
+static void
+print_table_draw_page (GtkPrintOperation *operation,
+                       GtkPrintContext *context,
+                       gint page_nr,
+                       EPrintable *printable)
+{
+	GtkPageSetup *setup;
+	gdouble width, height;
 
-	/* runs the dialog emitting the signals based on user response */
-	g_signal_connect (print, "draw_page", G_CALLBACK (table_draw_page), pti);
-	if (!preview)
-		res = gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, NULL);
-	else
-		gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PREVIEW, NULL, NULL);     
-	
+	setup = gtk_print_context_get_page_setup (context);
 
-	/* Saves the user configuration in gconf */
-	settings = gtk_print_operation_get_print_settings (print);
-	e_print_save_settings (settings);
+	width = gtk_page_setup_get_page_width (setup, GTK_UNIT_POINTS);
 
-	 if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
-		  g_object_unref (print);
-	      }
-	 else if ( res == GTK_PRINT_OPERATION_RESULT_ERROR) {
-		 /* FIX ME */
-	 }	  
-}
+	do {
+		/* TODO Allow the user to customize the title. */
+		print_title (context, _("Upcoming Appointments"), width);
 
-static void
-comp_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, PrintCompItem *pci)
-{
-	pci = evo_calendar_print_data_new (context, pci);
-	print_comp_item (pci);
-}
+		if (e_printable_data_left (printable))
+			e_printable_print_page (
+				printable, context, width, 24, TRUE);
 
-static void
-cal_draw_page(GtkPrintOperation *print1, GtkPrintContext *context, gint page_nr1, PrintCalItem *pcali)
-{
-	pcali = evo_calendar_print_cal_data_new (context, pcali);
-		
-	switch (pcali->default_view) {
-	case PRINT_VIEW_DAY:
-		print_day_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
-		break;
-	case PRINT_VIEW_WEEK:
-		print_week_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
-		break;
-	case PRINT_VIEW_MONTH:
-		print_month_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
-		break;
-	case PRINT_VIEW_YEAR:
-		print_year_view (pcali->pr, pcali->gcal, pcali->date, pcali->l, pcali->r, pcali->t, pcali->b);
-		break;
-	default:
-		g_assert_not_reached ();
-	}  
+	} while (e_printable_data_left (printable));
 }
 
-static void
-table_draw_page (GtkPrintOperation *print, GtkPrintContext *context, gint page_nr, PrintTableItem *pti)
+void
+print_table (ETable *table, const gchar *dialog_title,
+             const gchar *print_header, GtkPrintOperationAction action)
 {
-		pti->context = context;
-	
-	do {
-		print_title (context,"Table", pti->paper_width, pti->paper_height, pti->left_margin, pti->bottom_margin);
-		
-		if (e_printable_data_left (pti->printable))
-			e_printable_print_page (pti->printable, pti->context,
-						pti->paper_width, pti->paper_height + 24, TRUE);
+	GtkPrintOperation *operation;
+	EPrintable *printable;
 
-          } while (e_printable_data_left (pti->printable));
-}
+	printable = e_table_get_printable (table);
+	g_object_ref_sink (printable);
+	e_printable_reset (printable);
 
-/*
- * This callback creates a custom widget that gets inserted into the
- * print operation dialog, the custom widget contains the range,
- * day, view, month, or year
- */
+	operation = e_print_operation_new ();
+	gtk_print_operation_set_n_pages (operation, 1);
 
-GObject* create_custom_widget (GtkPrintOperation *print,GtkWidget *range)
-{
-	return range;
-}
+	g_signal_connect (
+		operation, "draw_page",
+		G_CALLBACK (print_table_draw_page), printable);
 
-/*
- * Read the information from the custom widget and print day, view, or 
- * month based on user selection 
- */
+	gtk_print_operation_run (operation, action, NULL, NULL);
 
-static void
-apply_custom_widget (GtkPrintOperation *print, GtkWidget *dialog, PrintCalItem *cpi)
-{
-	gchar str;
-	str = e_dialog_editable_get (dialog);	
-	printf("%sValue of Radio Button \n", str);
+	g_object_unref (operation);
 }
-
Index: calendar/gui/print.h
===================================================================
--- calendar/gui/print.h	(revision 33390)
+++ calendar/gui/print.h	(working copy)
@@ -34,10 +34,15 @@ typedef enum {
 	PRINT_VIEW_LIST
 } PrintView;
 
-void print_calendar (GnomeCalendar *gcal, gboolean preview, time_t at, PrintView default_view);
-void print_comp (ECalComponent *comp, ECal *client, gboolean preview);
-void print_table (ETable *etable, const char *dialog_title, const char *print_header, gboolean preview);
-
-
+void		print_calendar                (GnomeCalendar *gcal,
+                                               GtkPrintOperationAction action,
+                                               time_t start);
+void		print_comp                    (ECalComponent *comp,
+                                               ECal *client,
+                                               GtkPrintOperationAction action);
+void		print_table                   (ETable *table,
+                                               const gchar *dialog_title,
+                                               const gchar *print_header,
+                                               GtkPrintOperationAction action);
 
 #endif
Index: calendar/gui/e-calendar-view.c
===================================================================
--- calendar/gui/e-calendar-view.c	(revision 33390)
+++ calendar/gui/e-calendar-view.c	(working copy)
@@ -1204,32 +1204,13 @@ on_print (EPopup *ep, EPopupItem *pitem,
 {
 	ECalendarView *cal_view = data;
 	time_t start, end;
-	GnomeCalendarViewType view_type;
-	PrintView print_view;
 
 	e_calendar_view_get_visible_time_range (cal_view, &start, &end);
-	view_type = gnome_calendar_get_view (cal_view->priv->calendar);
 
-	switch (view_type) {
-	case GNOME_CAL_DAY_VIEW :
-		print_view = PRINT_VIEW_DAY;
-		break;
-
-	case GNOME_CAL_WORK_WEEK_VIEW :
-	case GNOME_CAL_WEEK_VIEW:
-		print_view = PRINT_VIEW_WEEK;
-		break;
-
-	case GNOME_CAL_MONTH_VIEW:
-		print_view = PRINT_VIEW_MONTH;
-		break;
-
-	default:
-		g_assert_not_reached ();
-		return;
-	}
-
-	print_calendar (cal_view->priv->calendar, FALSE, start, print_view);
+	print_calendar (
+		cal_view->priv->calendar,
+		GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
+		start);
 }
 
 static void
@@ -1278,7 +1259,7 @@ on_print_event (EPopup *ep, EPopupItem *
 
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-	print_comp (comp, event->comp_data->client, FALSE);
+	print_comp (comp, event->comp_data->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 
 	g_object_unref (comp);
 	g_list_free (selected);
Index: calendar/gui/memos-control.c
===================================================================
--- calendar/gui/memos-control.c	(revision 33390)
+++ calendar/gui/memos-control.c	(working copy)
@@ -35,13 +35,6 @@
 #include <libgnomeui/gnome-dialog.h>
 #include <libgnomeui/gnome-dialog-util.h>
 #include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeprint/gnome-print.h>
-#include <libgnomeprint/gnome-print-paper.h>
-#include <libgnomeprint/gnome-print-job.h>
-#include <libgnomeprintui/gnome-print-job-preview.h>
-#include <libgnomeprintui/gnome-print-paper-selector.h>
-#include <libgnomeprintui/gnome-print-preview.h>
-#include <libgnomeprintui/gnome-print-dialog.h>
 #include <bonobo/bonobo-control.h>
 #include <bonobo/bonobo-ui-util.h>
 #include <e-util/e-dialog-utils.h>
@@ -327,30 +320,21 @@ memos_control_delete_cmd		(BonoboUICompo
 	e_memos_delete_selected (memos);
 }
 
-
-static void
-print_memos (EMemos *memos, gboolean preview)
-{
-	EMemoTable *cal_table;
-	ETable *etable;
-
-	cal_table = e_memos_get_calendar_table (memos);
-	etable = e_memo_table_get_table (E_MEMO_TABLE (cal_table));
-
-	print_table (etable, _("Print Memos"), _("Memos"), preview);
-}
-
 /* File/Print callback */
 static void
 memos_control_print_cmd (BonoboUIComponent *uic,
 			 gpointer data,
 			 const char *path)
 {
-	EMemos *memos;
+	EMemos *memos = E_MEMOS (data);
+	ETable *table;
 
-	memos = E_MEMOS (data);
+	table = e_memo_table_get_table (
+		E_MEMO_TABLE (e_memos_get_calendar_table (memos)));
 
-	print_memos (memos, FALSE);
+	print_table (
+		table, _("Print Memos"), _("Memos"),
+		GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 }
 
 static void
@@ -358,10 +342,13 @@ memos_control_print_preview_cmd (BonoboU
 				 gpointer data,
 				 const char *path)
 {
-	EMemos *memos;
+	EMemos *memos = E_MEMOS (data);
+	ETable *table;
 
-	memos = E_MEMOS (data);
+	table = e_memo_table_get_table (
+		E_MEMO_TABLE (e_memos_get_calendar_table (memos)));
 
-	print_memos (memos, TRUE);
+	print_table (
+		table, _("Print Memos"), _("Memos"),
+		GTK_PRINT_OPERATION_ACTION_PREVIEW);
 }
-
Index: calendar/gui/e-memo-table.c
===================================================================
--- calendar/gui/e-memo-table.c	(revision 33390)
+++ calendar/gui/e-memo-table.c	(working copy)
@@ -822,7 +822,7 @@ e_memo_table_on_print_memo (EPopup *ep, 
 	
 	comp = e_cal_component_new ();
 	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp));
-	print_comp (comp, comp_data->client, FALSE);
+	print_comp (comp, comp_data->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
 
 	g_object_unref (comp);
 }
