diff --git a/calendar/gui/weekday-picker.c b/calendar/gui/weekday-picker.c
index 8cf6367..72be0c1 100644
--- a/calendar/gui/weekday-picker.c
+++ b/calendar/gui/weekday-picker.c
@@ -222,8 +222,9 @@ weekday_picker_realize (GtkWidget *widget)
 }
 
 static void
-weekday_picker_size_request (GtkWidget *widget,
-                             GtkRequisition *requisition)
+weekday_picker_get_preferred_width (GtkWidget *widget,
+                             	    gint *minimum_width,
+				    gint *natural_width)
 {
 	WeekdayPicker *wp;
 	WeekdayPickerPrivate *priv;
@@ -231,8 +232,20 @@ weekday_picker_size_request (GtkWidget *widget,
 	wp = WEEKDAY_PICKER (widget);
 	priv = wp->priv;
 
-	requisition->width = (priv->max_letter_width + 2 * PADDING + 1) * 7 + 1;
-	requisition->height = (priv->font_ascent + priv->font_descent + 2 * PADDING + 2);
+	*minimum_width = *natural_width = (priv->max_letter_width + 2 * PADDING + 1) * 7 + 1;
+}
+static void
+weekday_picker_get_preferred_height (GtkWidget *widget,
+                             	    gint *minimum_height,
+				    gint *natural_height)
+{
+	WeekdayPicker *wp;
+	WeekdayPickerPrivate *priv;
+
+	wp = WEEKDAY_PICKER (widget);
+	priv = wp->priv;
+
+	*minimum_height = *natural_height = (priv->font_ascent + priv->font_descent + 2 * PADDING + 2);
 }
 
 static void
@@ -349,7 +362,8 @@ weekday_picker_class_init (WeekdayPickerClass *class)
 
 	widget_class = GTK_WIDGET_CLASS (class);
 	widget_class->realize = weekday_picker_realize;
-	widget_class->size_request = weekday_picker_size_request;
+	widget_class->get_preferred_width = weekday_picker_get_preferred_width;
+	widget_class->get_preferred_height = weekday_picker_get_preferred_height;
 	widget_class->size_allocate = weekday_picker_size_allocate;
 	widget_class->style_set = weekday_picker_style_set;
 	widget_class->focus = weekday_picker_focus;
diff --git a/mail/e-mail-attachment-bar.c b/mail/e-mail-attachment-bar.c
index 8ba46cd..a9d0235 100644
--- a/mail/e-mail-attachment-bar.c
+++ b/mail/e-mail-attachment-bar.c
@@ -323,8 +323,9 @@ mail_attachment_bar_constructed (GObject *object)
 }
 
 static void
-mail_attachment_bar_size_request (GtkWidget *widget,
-                                  GtkRequisition *requisition)
+mail_attachment_bar_get_preferred_height (GtkWidget *widget,
+                                  	gint *minimum_height,
+					gint *natural_height)
 {
 	/* XXX This works around GtkHTMLEmbedded not taking visibility
 	 *     into account when calculating its size (at least I think
@@ -333,13 +334,31 @@ mail_attachment_bar_size_request (GtkWidget *widget,
 	 *     widget is invisible.  Once we finally move to WebKit,
 	 *     remove this. */
 	if (!gtk_widget_get_visible (widget)) {
-		requisition->width = 0;
-		requisition->height = 0;
+		*minimum_height = *natural_height = 0;
 		return;
 	}
 
 	/* Chain up to parent's size_request() method. */
-	GTK_WIDGET_CLASS (parent_class)->size_request (widget, requisition);
+	GTK_WIDGET_CLASS (parent_class)->get_preferred_height (widget, minimum_height, natural_height);
+}
+static void
+mail_attachment_bar_get_preferred_width (GtkWidget *widget,
+                                  	gint *minimum_width,
+					gint *natural_width)
+{
+	/* XXX This works around GtkHTMLEmbedded not taking visibility
+	 *     into account when calculating its size (at least I think
+	 *     that's where it's broken).  Without the workaround, we
+	 *     get a sizable gap between the headers and body when this
+	 *     widget is invisible.  Once we finally move to WebKit,
+	 *     remove this. */
+	if (!gtk_widget_get_visible (widget)) {
+		*minimum_width = *natural_width = 0;
+		return;
+	}
+
+	/* Chain up to parent's size_request() method. */
+	GTK_WIDGET_CLASS (parent_class)->get_preferred_width (widget, minimum_width, natural_width);
 }
 
 static EAttachmentViewPrivate *
@@ -473,7 +492,8 @@ mail_attachment_bar_class_init (EMailAttachmentBarClass *class)
 	object_class->constructed = mail_attachment_bar_constructed;
 
 	widget_class = GTK_WIDGET_CLASS (class);
-	widget_class->size_request = mail_attachment_bar_size_request;
+	widget_class->get_preferred_width = mail_attachment_bar_get_preferred_width;
+	widget_class->get_preferred_height = mail_attachment_bar_get_preferred_height;
 
 	g_object_class_install_property (
 		object_class,
diff --git a/modules/mail/e-mail-shell-sidebar.c b/modules/mail/e-mail-shell-sidebar.c
index 2b24aae..7c538de 100644
--- a/modules/mail/e-mail-shell-sidebar.c
+++ b/modules/mail/e-mail-shell-sidebar.c
@@ -231,8 +231,17 @@ guess_screen_width (EMailShellSidebar *sidebar)
 }
 
 static void
-mail_shell_sidebar_size_request (GtkWidget *widget,
-                                 GtkRequisition *requisition)
+mail_shell_sidebar_get_preferred_height (GtkWidget *widget,
+					 gint *minimum_height,
+					 gint *natural_height)
+{
+	GTK_WIDGET_CLASS (parent_class)->get_preferred_height (widget, minimum_height, natural_height);
+}
+
+static void
+mail_shell_sidebar_get_preferred_width (GtkWidget *widget,
+					gint *minimum_width,
+					gint *natural_width)
 {
 	/* We override the normal size-request handler so that we can
 	 * spit out a treeview with a suitable width.  We measure the
@@ -258,7 +267,7 @@ mail_shell_sidebar_size_request (GtkWidget *widget,
 
 	sidebar = E_MAIL_SHELL_SIDEBAR (widget);
 
-	GTK_WIDGET_CLASS (parent_class)->size_request (widget, requisition);
+	GTK_WIDGET_CLASS (parent_class)->get_preferred_width (widget, minimum_width, natural_width);
 
 	/* This string is a mockup only; it doesn't need to be translated */
 	layout = gtk_widget_create_pango_layout (
@@ -274,7 +283,7 @@ mail_shell_sidebar_size_request (GtkWidget *widget,
 	border = 2 * style->xthickness + 4;
 	sidebar_width = ink_rect.width + border;
 	sidebar_width = MIN (sidebar_width, screen_width / 4);
-	requisition->width = MAX (requisition->width, sidebar_width);
+	*minimum_width = *natural_width = MAX (*natural_width, sidebar_width);
 }
 
 static guint32
@@ -305,7 +314,8 @@ mail_shell_sidebar_class_init (EMailShellSidebarClass *class)
 	object_class->constructed = mail_shell_sidebar_constructed;
 
 	widget_class = GTK_WIDGET_CLASS (class);
-	widget_class->size_request = mail_shell_sidebar_size_request;
+	widget_class->get_preferred_width = mail_shell_sidebar_get_preferred_width;
+	widget_class->get_preferred_height = mail_shell_sidebar_get_preferred_height;
 
 	shell_sidebar_class = E_SHELL_SIDEBAR_CLASS (class);
 	shell_sidebar_class->check_state = mail_shell_sidebar_check_state;
diff --git a/shell/e-shell-content.c b/shell/e-shell-content.c
index 7d0dd87..1bfa148 100644
--- a/shell/e-shell-content.c
+++ b/shell/e-shell-content.c
@@ -210,8 +210,9 @@ shell_content_constructed (GObject *object)
 }
 
 static void
-shell_content_size_request (GtkWidget *widget,
-                            GtkRequisition *requisition)
+shell_content_get_preferred_height (GtkWidget *widget,
+				   gint *minimum_height,
+				   gint *natural_height)
 {
 	EShellContentPrivate *priv;
 	GtkRequisition child_requisition;
@@ -219,22 +220,46 @@ shell_content_size_request (GtkWidget *widget,
 
 	priv = E_SHELL_CONTENT_GET_PRIVATE (widget);
 
-	requisition->width = 0;
-	requisition->height = 0;
+	*minimum_height = *natural_height = 0;
 
 	child = gtk_bin_get_child (GTK_BIN (widget));
-	gtk_widget_size_request (child, requisition);
+	gtk_widget_get_preferred_height (child, minimum_height, natural_height);
 
 	gtk_widget_size_request (priv->alert_bar, &child_requisition);
-	requisition->width = MAX (requisition->width, child_requisition.width);
-	requisition->height += child_requisition.height;
+	*natural_height += child_requisition.height;
 
 	if (priv->searchbar == NULL)
 		return;
 
 	gtk_widget_size_request (priv->searchbar, &child_requisition);
-	requisition->width = MAX (requisition->width, child_requisition.width);
-	requisition->height += child_requisition.height;
+	*natural_height += child_requisition.height;
+	*minimum_height = *natural_height;
+}
+static void
+shell_content_get_preferred_width (GtkWidget *widget,
+				   gint *minimum_width,
+				   gint *natural_width)
+{
+	EShellContentPrivate *priv;
+	GtkRequisition child_requisition;
+	GtkWidget *child;
+
+	priv = E_SHELL_CONTENT_GET_PRIVATE (widget);
+
+	*minimum_width = *natural_width = 0;
+
+	child = gtk_bin_get_child (GTK_BIN (widget));
+	gtk_widget_get_preferred_width (child, minimum_width, natural_width);
+
+	gtk_widget_size_request (priv->alert_bar, &child_requisition);
+	*natural_width = MAX (*natural_width, child_requisition.width);
+
+	if (priv->searchbar == NULL)
+		return;
+
+	gtk_widget_size_request (priv->searchbar, &child_requisition);
+	*natural_width = MAX (*natural_width, child_requisition.width);
+	*minimum_width = *natural_width;
 }
 
 static void
@@ -395,7 +420,8 @@ e_shell_content_class_init (EShellContentClass *class)
 	object_class->constructed = shell_content_constructed;
 
 	widget_class = GTK_WIDGET_CLASS (class);
-	widget_class->size_request = shell_content_size_request;
+	widget_class->get_preferred_width = shell_content_get_preferred_width;
+	widget_class->get_preferred_height = shell_content_get_preferred_height;
 	widget_class->size_allocate = shell_content_size_allocate;
 
 	container_class = GTK_CONTAINER_CLASS (class);
diff --git a/shell/e-shell-sidebar.c b/shell/e-shell-sidebar.c
index b56e4c0..a796141 100644
--- a/shell/e-shell-sidebar.c
+++ b/shell/e-shell-sidebar.c
@@ -217,8 +217,9 @@ shell_sidebar_constructed (GObject *object)
 }
 
 static void
-shell_sidebar_size_request (GtkWidget *widget,
-                            GtkRequisition *requisition)
+shell_sidebar_get_preferred_width (GtkWidget *widget,
+				   gint *minimum_width,
+				   gint *natural_width)
 {
 	EShellSidebarPrivate *priv;
 	GtkRequisition child_requisition;
@@ -226,16 +227,37 @@ shell_sidebar_size_request (GtkWidget *widget,
 
 	priv = E_SHELL_SIDEBAR_GET_PRIVATE (widget);
 
-	requisition->width = 0;
-	requisition->height = 0;
+	*minimum_width = *natural_width = 0;
 
 	child = gtk_bin_get_child (GTK_BIN (widget));
-	gtk_widget_size_request (child, requisition);
+	gtk_widget_get_preferred_width (child, minimum_width, natural_width);
 
 	child = priv->event_box;
 	gtk_widget_size_request (child, &child_requisition);
-	requisition->width = MAX (requisition->width, child_requisition.width);
-	requisition->height += child_requisition.height;
+	*natural_width = MAX (*natural_width, child_requisition.width);
+	*minimum_width = *natural_width;
+}
+
+static void
+shell_sidebar_get_preferred_height (GtkWidget *widget,
+				   gint *minimum_height,
+				   gint *natural_height)
+{
+	EShellSidebarPrivate *priv;
+	GtkRequisition child_requisition;
+	GtkWidget *child;
+
+	priv = E_SHELL_SIDEBAR_GET_PRIVATE (widget);
+
+	*minimum_height = *natural_height = 0;
+
+	child = gtk_bin_get_child (GTK_BIN (widget));
+	gtk_widget_get_preferred_height (child, minimum_height, natural_height );
+
+	child = priv->event_box;
+	gtk_widget_size_request (child, &child_requisition);
+	*natural_height += child_requisition.height;
+	*minimum_height = *natural_height;
 }
 
 static void
@@ -305,7 +327,8 @@ e_shell_sidebar_class_init (EShellSidebarClass *class)
 	object_class->constructed = shell_sidebar_constructed;
 
 	widget_class = GTK_WIDGET_CLASS (class);
-	widget_class->size_request = shell_sidebar_size_request;
+	widget_class->get_preferred_width = shell_sidebar_get_preferred_width;
+	widget_class->get_preferred_height = shell_sidebar_get_preferred_height;
 	widget_class->size_allocate = shell_sidebar_size_allocate;
 
 	container_class = GTK_CONTAINER_CLASS (class);
diff --git a/shell/e-shell-switcher.c b/shell/e-shell-switcher.c
index fec943c..9011e72 100644
--- a/shell/e-shell-switcher.c
+++ b/shell/e-shell-switcher.c
@@ -247,8 +247,9 @@ shell_switcher_dispose (GObject *object)
 }
 
 static void
-shell_switcher_size_request (GtkWidget *widget,
-                             GtkRequisition *requisition)
+shell_switcher_get_preferred_width (GtkWidget *widget,
+                             	    gint *minimum_width,
+				    gint *natural_width)
 {
 	EShellSwitcherPrivate *priv;
 	GtkWidget *child;
@@ -256,12 +257,11 @@ shell_switcher_size_request (GtkWidget *widget,
 
 	priv = E_SHELL_SWITCHER_GET_PRIVATE (widget);
 
-	requisition->width = 0;
-	requisition->height = 0;
+	*natural_width = 0;
 
 	child = gtk_bin_get_child (GTK_BIN (widget));
 	if (child != NULL)
-		gtk_widget_size_request (child, requisition);
+		gtk_widget_get_preferred_width (child, minimum_width, natural_width);
 
 	if (!priv->toolbar_visible)
 		return;
@@ -273,12 +273,44 @@ shell_switcher_size_request (GtkWidget *widget,
 		gtk_widget_size_request (widget, &child_requisition);
 
 		child_requisition.width += H_PADDING;
+
+		*natural_width = MAX (
+			*natural_width, child_requisition.width);
+	}
+	*minimum_width = *natural_width;
+}
+
+static void
+shell_switcher_get_preferred_height (GtkWidget *widget,
+                             	    gint *minimum_height,
+				    gint *natural_height)
+{
+	EShellSwitcherPrivate *priv;
+	GtkWidget *child;
+	GList *iter;
+
+	priv = E_SHELL_SWITCHER_GET_PRIVATE (widget);
+
+	*natural_height = 0;
+
+	child = gtk_bin_get_child (GTK_BIN (widget));
+	if (child != NULL)
+		gtk_widget_get_preferred_height (child, minimum_height, natural_height);
+
+	if (!priv->toolbar_visible)
+		return;
+
+	for (iter = priv->proxies; iter != NULL; iter = iter->next) {
+		GtkWidget *widget = iter->data;
+		GtkRequisition child_requisition;
+
+		gtk_widget_size_request (widget, &child_requisition);
+
 		child_requisition.height += V_PADDING;
 
-		requisition->width = MAX (
-			requisition->width, child_requisition.width);
-		requisition->height += child_requisition.height;
+		*natural_height += child_requisition.height;
 	}
+	*minimum_height = *natural_height;
 }
 
 static void
@@ -451,7 +483,8 @@ e_shell_switcher_class_init (EShellSwitcherClass *class)
 	object_class->dispose = shell_switcher_dispose;
 
 	widget_class = GTK_WIDGET_CLASS (class);
-	widget_class->size_request = shell_switcher_size_request;
+	widget_class->get_preferred_width = shell_switcher_get_preferred_width;
+	widget_class->get_preferred_height = shell_switcher_get_preferred_height;
 	widget_class->size_allocate = shell_switcher_size_allocate;
 	widget_class->screen_changed = shell_switcher_screen_changed;
 
diff --git a/widgets/misc/e-calendar.c b/widgets/misc/e-calendar.c
index d835ba8..0a44354 100644
--- a/widgets/misc/e-calendar.c
+++ b/widgets/misc/e-calendar.c
@@ -69,8 +69,12 @@ static void e_calendar_dispose		(GObject	*object);
 static void e_calendar_realize		(GtkWidget	*widget);
 static void e_calendar_style_set	(GtkWidget	*widget,
 					 GtkStyle	*previous_style);
-static void e_calendar_size_request	(GtkWidget      *widget,
-					 GtkRequisition *requisition);
+static void e_calendar_get_preferred_width	(GtkWidget      *widget,
+						 gint *minimum_width,
+						 gint *natural_width);
+static void e_calendar_get_preferred_height	(GtkWidget      *widget,
+						 gint *minimum_height,
+						 gint *natural_height);
 static void e_calendar_size_allocate	(GtkWidget	*widget,
 					 GtkAllocation	*allocation);
 static gint e_calendar_drag_motion	(GtkWidget      *widget,
@@ -115,7 +119,8 @@ e_calendar_class_init (ECalendarClass *class)
 
 	widget_class->realize		   = e_calendar_realize;
 	widget_class->style_set		   = e_calendar_style_set;
-	widget_class->size_request	   = e_calendar_size_request;
+	widget_class->get_preferred_width  = e_calendar_get_preferred_width;
+	widget_class->get_preferred_height  = e_calendar_get_preferred_height;
 	widget_class->size_allocate	   = e_calendar_size_allocate;
 	widget_class->drag_motion	   = e_calendar_drag_motion;
 	widget_class->drag_leave	   = e_calendar_drag_leave;
@@ -281,26 +286,44 @@ e_calendar_style_set		(GtkWidget	*widget,
 }
 
 static void
-e_calendar_size_request		(GtkWidget      *widget,
-				 GtkRequisition *requisition)
+e_calendar_get_preferred_height	(GtkWidget      *widget,
+				 gint *minimum_height,
+				 gint *natural_height)
 {
 	ECalendar *cal;
 	GtkStyle *style;
-	gint col_width, row_height, width, height;
+	gint row_height, height;
 
 	cal = E_CALENDAR (widget);
 	style = gtk_widget_get_style (GTK_WIDGET (cal));
 
 	g_object_get ((cal->calitem),
 			"row_height", &row_height,
-			"column_width", &col_width,
 			NULL);
 
 	height = row_height * cal->min_rows;
+
+	*minimum_height = *natural_height = height + style->ythickness * 2;
+}
+static void
+e_calendar_get_preferred_width	(GtkWidget      *widget,
+				 gint *minimum_width,
+				 gint *natural_width)
+{
+	ECalendar *cal;
+	GtkStyle *style;
+	gint col_width, width;
+
+	cal = E_CALENDAR (widget);
+	style = gtk_widget_get_style (GTK_WIDGET (cal));
+
+	g_object_get ((cal->calitem),
+			"column_width", &col_width,
+			NULL);
+
 	width = col_width * cal->min_cols;
 
-	requisition->width = width + style->xthickness * 2;
-	requisition->height = height + style->ythickness * 2;
+	*minimum_width = *natural_width = width + style->xthickness * 2;
 }
 
 static void
diff --git a/widgets/misc/e-map.c b/widgets/misc/e-map.c
index b18b608..0f9aa18 100644
--- a/widgets/misc/e-map.c
+++ b/widgets/misc/e-map.c
@@ -447,23 +447,35 @@ e_map_unrealize (GtkWidget *widget)
 }
 
 static void
-e_map_size_request (GtkWidget *widget, GtkRequisition *requisition)
+e_map_get_preferred_width (GtkWidget *widget, gint *minimum_width, gint *natural_width)
 {
 	EMap *map;
 
 	g_return_if_fail (widget != NULL);
 	g_return_if_fail (E_IS_MAP (widget));
-	g_return_if_fail (requisition != NULL);
 
 	map = E_MAP (widget);
 
-	/* TODO: Put real sizes here. */
+//	 TODO: Put real sizes here.
 
-	requisition->width = gdk_pixbuf_get_width (map->priv->map_pixbuf);
-	requisition->height = gdk_pixbuf_get_height (map->priv->map_pixbuf);
+	*minimum_width = *natural_width = gdk_pixbuf_get_width (map->priv->map_pixbuf);
 }
 
 static void
+e_map_get_preferred_height (GtkWidget *widget, gint *minimum_height, gint *natural_height)
+{
+	EMap *map;
+
+	g_return_if_fail (widget != NULL);
+	g_return_if_fail (E_IS_MAP (widget));
+
+	map = E_MAP (widget);
+
+//	 TODO: Put real sizes here.
+
+	*minimum_height = *natural_height = gdk_pixbuf_get_height (map->priv->map_pixbuf);
+}
+static void
 e_map_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
 {
 	EMap *map;
@@ -609,7 +621,8 @@ e_map_class_init (EMapClass *class)
 	widget_class = GTK_WIDGET_CLASS (class);
 	widget_class->realize = e_map_realize;
 	widget_class->unrealize = e_map_unrealize;
-	widget_class->size_request = e_map_size_request;
+	widget_class->get_preferred_width = e_map_get_preferred_width;
+	widget_class->get_preferred_height = e_map_get_preferred_height;
 	widget_class->size_allocate = e_map_size_allocate;
 	widget_class->draw = e_map_draw;
 	widget_class->button_press_event = e_map_button_press;
diff --git a/widgets/misc/e-menu-tool-button.c b/widgets/misc/e-menu-tool-button.c
index 612ed80..0544fb1 100644
--- a/widgets/misc/e-menu-tool-button.c
+++ b/widgets/misc/e-menu-tool-button.c
@@ -100,14 +100,28 @@ menu_tool_button_update_button (GtkToolButton *tool_button)
 }
 
 static void
-menu_tool_button_size_request (GtkWidget *widget,
-                               GtkRequisition *requisition)
+menu_tool_button_get_preferred_height 	(GtkWidget *widget,
+					gint *minimum_height,
+                               		gint *natural_height)
 {
-	gint minimum_width;
+	/* Chain up to parent's get_preferred_height() method. */
+	GTK_WIDGET_CLASS (e_menu_tool_button_parent_class)->
+		get_preferred_height (widget, minimum_height, natural_height);
+}
+
+static void
+menu_tool_button_get_preferred_width 	(GtkWidget *widget,
+					gint *minimum_width,
+                               		gint *natural_width)
+{
+	gint minimum_height, natural_height;
+
+	/* Chain up to parent's get_preferred_width() method. */
+	GTK_WIDGET_CLASS (e_menu_tool_button_parent_class)->
+		get_preferred_width (widget, minimum_width, natural_width);
 
-	/* Chain up to parent's size_request() method. */
 	GTK_WIDGET_CLASS (e_menu_tool_button_parent_class)->
-		size_request (widget, requisition);
+		get_preferred_height (widget, &minimum_height, &natural_height);
 
 	/* XXX This is a hack.  This widget is only used for the New
 	 *     button in the main window toolbar.  The New button is
@@ -117,8 +131,8 @@ menu_tool_button_size_request (GtkWidget *widget,
 	 *
 	 *     We can't go hard-coding a width, but we -can- use a
 	 *     heuristic based on the toolbar button height. */
-	minimum_width = requisition->height * 2;
-	requisition->width = MAX (minimum_width, requisition->width);
+	*minimum_width = natural_height * 2;
+	*natural_width = MAX (*minimum_width, *natural_width);
 }
 
 static void
@@ -141,7 +155,7 @@ e_menu_tool_button_class_init (EMenuToolButtonClass *class)
 	GtkToolButtonClass *tool_button_class;
 
 	widget_class = GTK_WIDGET_CLASS (class);
-	widget_class->size_request = menu_tool_button_size_request;
+	widget_class->get_preferred_width = menu_tool_button_get_preferred_width;
 
 	tool_button_class = GTK_TOOL_BUTTON_CLASS (class);
 	tool_button_class->clicked = menu_tool_button_clicked;
diff --git a/widgets/table/e-table.c b/widgets/table/e-table.c
index 00cd7f7..f267a0c 100644
--- a/widgets/table/e-table.c
+++ b/widgets/table/e-table.c
@@ -229,13 +229,20 @@ current_search_col (ETable *et)
 }
 
 static void
-et_size_request (GtkWidget *widget, GtkRequisition *request)
+et_get_preferred_height (GtkWidget *widget, gint *minimum_height, gint *natural_height)
+{
+	if (GTK_WIDGET_CLASS (e_table_parent_class)->get_preferred_height)
+		GTK_WIDGET_CLASS (e_table_parent_class)->get_preferred_height (widget, minimum_height, natural_height);
+}
+
+static void
+et_get_preferred_width (GtkWidget *widget, gint *minimum_width, gint *natural_width)
 {
 	ETable *et = E_TABLE (widget);
-	if (GTK_WIDGET_CLASS (e_table_parent_class)->size_request)
-		GTK_WIDGET_CLASS (e_table_parent_class)->size_request (widget, request);
+	if (GTK_WIDGET_CLASS (e_table_parent_class)->get_preferred_width)
+		GTK_WIDGET_CLASS (e_table_parent_class)->get_preferred_width (widget, minimum_width, natural_width);
 	if (et->horizontal_resize)
-		request->width = MAX (request->width, et->header_width);
+		*minimum_width = *natural_width = MAX (*natural_width, et->header_width);
 }
 
 static void
@@ -3242,7 +3249,8 @@ e_table_class_init (ETableClass *class)
 
 	widget_class->grab_focus        = et_grab_focus;
 	widget_class->unrealize         = et_unrealize;
-	widget_class->size_request      = et_size_request;
+	widget_class->get_preferred_width = et_get_preferred_width;
+	widget_class->get_preferred_height = et_get_preferred_height;
 
 	widget_class->focus             = et_focus;
 
