diff -rup gtk+/gtk/gtkaction.c my_gtk+/gtk/gtkaction.c
--- gtk+/gtk/gtkaction.c	2006-12-04 01:57:31.000000000 -0500
+++ my_gtk+/gtk/gtkaction.c	2006-12-03 23:26:19.000000000 -0500
@@ -111,6 +111,7 @@ enum 
 /* GtkBuildable */
 static void gtk_action_buildable_init           (GtkBuildableIface *iface);
 static void gtk_action_buildable_set_name       (GtkBuildable *buildable,
+						 GtkBuilder   *builder,
 						 const gchar  *name);
 
 G_DEFINE_TYPE_WITH_CODE (GtkAction, gtk_action, G_TYPE_OBJECT,
@@ -384,6 +385,7 @@ gtk_action_buildable_init (GtkBuildableI
 
 static void
 gtk_action_buildable_set_name (GtkBuildable *buildable,
+			       GtkBuilder   *builder,
 			       const gchar  *name)
 {
   gchar *tmp;
diff -rup gtk+/gtk/gtkactiongroup.c my_gtk+/gtk/gtkactiongroup.c
--- gtk+/gtk/gtkactiongroup.c	2006-12-04 01:57:31.000000000 -0500
+++ my_gtk+/gtk/gtkactiongroup.c	2006-12-03 23:26:27.000000000 -0500
@@ -95,6 +95,7 @@ static void gtk_action_group_buildable_a
 					    GObject       *child,
 					    const gchar   *type);
 static void gtk_action_group_buildable_set_name (GtkBuildable *buildable,
+						 GtkBuilder   *builder,
 						 const gchar  *name);
 
 GType
@@ -310,6 +311,7 @@ gtk_action_group_buildable_add (GtkBuild
 
 static void
 gtk_action_group_buildable_set_name (GtkBuildable *buildable,
+				     GtkBuilder   *builder,
 				     const gchar  *name)
 {
   GtkActionGroup *self = GTK_ACTION_GROUP (buildable);
diff -rup gtk+/gtk/gtkbutton.c my_gtk+/gtk/gtkbutton.c
--- gtk+/gtk/gtkbutton.c	2006-10-08 01:06:29.000000000 -0400
+++ my_gtk+/gtk/gtkbutton.c	2006-12-03 22:57:13.000000000 -0500
@@ -36,6 +36,7 @@
 #include "gtkvbox.h"
 #include "gtkstock.h"
 #include "gtkiconfactory.h"
+#include "gtkbuildable.h"
 #include "gtkprivate.h"
 #include "gtkintl.h"
 #include "gtkalias.h"
@@ -142,9 +143,20 @@ static void gtk_button_grab_notify     (
 					gboolean               was_grabbed);
 
 
+static void gtk_button_buildable_init (GtkBuildableIface *iface);
+static void gtk_button_buildable_set_property (GtkBuildable *buildable,
+					       GtkBuilder   *builder,
+					       const gchar  *name,
+					       const GValue *value);
+
+
 static guint button_signals[LAST_SIGNAL] = { 0 };
 
-G_DEFINE_TYPE (GtkButton, gtk_button, GTK_TYPE_BIN)
+static GtkBuildableIface *parent_buildable_iface = NULL;
+
+G_DEFINE_TYPE_WITH_CODE (GtkButton, gtk_button, GTK_TYPE_BIN,
+			 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, 
+						gtk_button_buildable_init));
 
 static void
 gtk_button_class_init (GtkButtonClass *klass)
@@ -518,6 +530,48 @@ gtk_button_init (GtkButton *button)
 }
 
 static void
+gtk_button_buildable_init (GtkBuildableIface *iface)
+{
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+
+  iface->set_property = gtk_button_buildable_set_property;
+}
+
+static void
+gtk_button_buildable_set_property (GtkBuildable *buildable,
+				   GtkBuilder   *builder,
+				   const gchar  *name,
+				   const GValue *value)
+{
+  if (!strcmp (name, "response-id"))
+    {
+      if (gtk_builder_file_version (builder) <= 1)
+	{
+	  GValue val = { 0, };
+
+	  /* For version 1 glade files, support dialog buttons
+	   * the old fashioned way.
+	   */
+	  if (gtk_builder_value_from_string_type  (builder, G_TYPE_INT,
+						   g_value_get_string (value),
+						   &val))
+	    {
+	      g_object_set_data (buildable, "gtk-button-buildable-response-id",
+				 GINT_TO_POINTER (g_value_get_int (&val)));
+	      g_value_unset (&val);
+	    }
+	}
+      else
+	g_warning ("virtual response-id property on GtkButton is "
+		   "unsupported in builder file version %d\n",
+		   gtk_builder_file_version (builder));
+    }
+  else
+    parent_buildable_iface->set_property (buildable, builder, name, value);
+}
+
+
+static void
 gtk_button_destroy (GtkObject *object)
 {
   GtkButton *button = GTK_BUTTON (object);
diff -rup gtk+/gtk/gtkcalendar.c my_gtk+/gtk/gtkcalendar.c
--- gtk+/gtk/gtkcalendar.c	2006-10-10 17:51:11.000000000 -0400
+++ my_gtk+/gtk/gtkcalendar.c	2006-12-04 02:18:49.000000000 -0500
@@ -53,6 +53,7 @@
 #include "gtkdnd.h"
 #include "gtkintl.h"
 #include "gtkmain.h"
+#include "gtkbuildable.h"
 #include "gtkmarshalers.h"
 #include "gtkprivate.h"
 #include "gdk/gdkkeysyms.h"
@@ -352,6 +353,12 @@ static gboolean gtk_calendar_drag_drop  
 						 gint              y,
 						 guint             time);
 
+static void     gtk_calender_buildable_init         (GtkBuildableIface *iface);
+static void     gtk_calender_buildable_set_property (GtkBuildable *buildable,
+						     GtkBuilder   *builder,
+						     const gchar  *name,
+						     const GValue *value);
+
 static void calendar_start_spinning (GtkCalendar *calendar,
 				     gint         click_child);
 static void calendar_stop_spinning  (GtkCalendar *calendar);
@@ -366,10 +373,16 @@ static void calendar_invalidate_arrow   
 
 static void calendar_compute_days      (GtkCalendar *calendar);
      
+
+
 static char    *default_abbreviated_dayname[7];
 static char    *default_monthname[12];
 
-G_DEFINE_TYPE (GtkCalendar, gtk_calendar, GTK_TYPE_WIDGET)
+static GtkBuildableIface *parent_buildable_iface = NULL;
+
+G_DEFINE_TYPE_WITH_CODE (GtkCalendar, gtk_calendar, GTK_TYPE_WIDGET,
+			 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, 
+						gtk_calender_buildable_init));
 
 static void
 gtk_calendar_class_init (GtkCalendarClass *class)
@@ -723,7 +736,41 @@ gtk_calendar_init (GtkCalendar *calendar
   calendar_compute_days (calendar);
 }
 
-
+
+static void
+gtk_calender_buildable_init (GtkBuildableIface *iface)
+{
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+
+  iface->set_property = gtk_calender_buildable_set_property;
+}
+
+static void
+gtk_calender_buildable_set_property (GtkBuildable *buildable,
+				     GtkBuilder   *builder,
+				     const gchar  *name,
+				     const GValue *value)
+{
+  if (!strcmp (name, "display-options"))
+    {
+      GValue val = { 0, };
+
+      if (gtk_builder_value_from_string_type  (builder, GTK_TYPE_CALENDAR_DISPLAY_OPTIONS,
+					       g_value_get_string (value),
+					       &val))
+	{
+	  gtk_calendar_display_options (GTK_CALENDAR (buildable),
+					g_value_get_flags (&val));
+	  
+	  g_value_unset (&val);
+	}
+    }
+  else
+    parent_buildable_iface->set_property (buildable, builder, name, value);
+}
+
+
+
 /****************************************
  *          Utility Functions           *
  ****************************************/
diff -rup gtk+/gtk/gtkcheckmenuitem.c my_gtk+/gtk/gtkcheckmenuitem.c
--- gtk+/gtk/gtkcheckmenuitem.c	2006-05-14 00:25:28.000000000 -0400
+++ my_gtk+/gtk/gtkcheckmenuitem.c	2006-12-03 16:11:10.000000000 -0500
@@ -25,8 +25,10 @@
  */
 
 #include <config.h>
+#include <string.h>
 #include "gtkcheckmenuitem.h"
 #include "gtkaccellabel.h"
+#include "gtkbuildable.h"
 #include "gtkmarshalers.h"
 #include "gtkprivate.h"
 #include "gtkintl.h"
@@ -62,10 +64,19 @@ static void gtk_check_menu_item_get_prop
 					      GValue          *value,
 					      GParamSpec      *pspec);
 
+static void gtk_check_menu_item_buildable_init         (GtkBuildableIface *iface);
+static void gtk_check_menu_item_buildable_set_property (GtkBuildable      *buildable,
+							GtkBuilder        *builder,
+							const gchar       *name,
+							const GValue      *value);
+
+static GtkBuildableIface *parent_buildable_iface = NULL;
 
 static guint check_menu_item_signals[LAST_SIGNAL] = { 0 };
 
-G_DEFINE_TYPE (GtkCheckMenuItem, gtk_check_menu_item, GTK_TYPE_MENU_ITEM)
+G_DEFINE_TYPE_WITH_CODE (GtkCheckMenuItem, gtk_check_menu_item, GTK_TYPE_MENU_ITEM,
+			 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, 
+						gtk_check_menu_item_buildable_init));
 
 static void
 gtk_check_menu_item_class_init (GtkCheckMenuItemClass *klass)
@@ -134,6 +145,39 @@ gtk_check_menu_item_class_init (GtkCheck
 		  G_TYPE_NONE, 0);
 }
 
+
+static void
+gtk_check_menu_item_buildable_init (GtkBuildableIface *iface)
+{
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+
+  iface->set_property = gtk_check_menu_item_buildable_set_property;
+}
+
+static void 
+gtk_check_menu_item_buildable_set_property (GtkBuildable *buildable,
+					    GtkBuilder   *builder,
+					    const gchar  *name,
+					    const GValue *value)
+{
+  if (!strcmp (name, "always-show-toggle"))
+    {
+      GValue val = { 0, };
+
+      if (gtk_builder_value_from_string_type  (builder, G_TYPE_BOOLEAN,
+					       g_value_get_string (value),
+					       &val))
+	{
+	  gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (buildable), 
+					       g_value_get_boolean (&val));
+	  g_value_unset (&val);
+	}
+    }
+  else
+    parent_buildable_iface->set_property (buildable, builder, name, value);
+}
+
+
 GtkWidget*
 gtk_check_menu_item_new (void)
 {
diff -rup gtk+/gtk/gtkcombobox.c.orig my_gtk+/gtk/gtkcombobox.c.orig
--- gtk+/gtk/gtkcombobox.c.orig	2006-11-16 07:56:29.000000000 -0500
+++ my_gtk+/gtk/gtkcombobox.c.orig	2006-11-09 09:58:07.000000000 -0500
@@ -4978,10 +4978,7 @@ gtk_combo_box_real_move_active (GtkCombo
   gboolean    found;
 
   if (!combo_box->priv->model)
-    {
-      gtk_widget_error_bell (GTK_WIDGET (combo_box));
-      return;
-    }
+    return;
 
   active_iter = gtk_combo_box_get_active_iter (combo_box, &iter);
 
@@ -5027,28 +5024,28 @@ gtk_combo_box_real_move_active (GtkCombo
       return;
     }
 
-  if (found && active_iter)
+  if (found)
     {
-      GtkTreePath *old_path;
-      GtkTreePath *new_path;
+      if (active_iter)
+        {
+          GtkTreePath *old_path;
+          GtkTreePath *new_path;
 
-      old_path = gtk_tree_model_get_path (combo_box->priv->model, &iter);
-      new_path = gtk_tree_model_get_path (combo_box->priv->model, &new_iter);
+          old_path = gtk_tree_model_get_path (combo_box->priv->model, &iter);
+          new_path = gtk_tree_model_get_path (combo_box->priv->model, &new_iter);
 
-      if (gtk_tree_path_compare (old_path, new_path) == 0)
-        found = FALSE;
+          if (gtk_tree_path_compare (old_path, new_path) == 0)
+            found = FALSE;
 
-      gtk_tree_path_free (old_path);
-      gtk_tree_path_free (new_path);
-    }
+          gtk_tree_path_free (old_path);
+          gtk_tree_path_free (new_path);
+        }
 
-  if (found)
-    {
-      gtk_combo_box_set_active_iter (combo_box, &new_iter);
-    }
-  else
-    {
-      gtk_widget_error_bell (GTK_WIDGET (combo_box));
+      if (found)
+        {
+          gtk_combo_box_set_active_iter (combo_box, &new_iter);
+          return;
+        }
     }
 }
 
diff -rup gtk+/gtk/gtkcontainer.c my_gtk+/gtk/gtkcontainer.c
--- gtk+/gtk/gtkcontainer.c	2006-12-04 01:57:31.000000000 -0500
+++ my_gtk+/gtk/gtkcontainer.c	2006-12-03 23:54:14.000000000 -0500
@@ -106,18 +106,11 @@ static void gtk_container_buildable_add 
 						    GtkBuilder   *builder,
 						    GObject      *child,
 						    const gchar  *type);
-static gboolean gtk_container_buildable_custom_tag_start (GtkBuildable  *buildable,
-							  GtkBuilder    *builder,
-							  GObject       *child,
-							  const gchar   *tagname,
-							  GMarkupParser *parser,
-							  gpointer      *data);
-static void    gtk_container_buildable_custom_tag_end (GtkBuildable *buildable,
-						       GtkBuilder   *builder,
-						       GObject      *child,
-						       const gchar  *tagname,
-						       gpointer      data);
-
+static void gtk_container_buildable_child_set_property (GtkBuildable *buildable,
+							GtkBuilder   *builder,
+							GObject      *child,
+							const gchar  *name,
+							const GValue *value);
 
 /* --- variables --- */
 static const gchar           vadjustment_key[] = "gtk-vadjustment";
@@ -293,12 +286,23 @@ gtk_container_class_init (GtkContainerCl
 }
 
 static void
+gtk_container_buildable_child_set_property (GtkBuildable *buildable,
+					    GtkBuilder   *builder,
+					    GObject      *child,
+					    const gchar  *name,
+					    const GValue *value)
+{
+  gtk_container_child_set_property (GTK_CONTAINER (buildable), 
+				    GTK_WIDGET (child), name, value);
+}
+
+static void
 gtk_container_buildable_init (GtkBuildableIface *iface)
 {
   parent_buildable_iface = g_type_interface_peek_parent (iface);
-  iface->add = gtk_container_buildable_add;
-  iface->custom_tag_start = gtk_container_buildable_custom_tag_start;
-  iface->custom_tag_end = gtk_container_buildable_custom_tag_end;
+
+  iface->add                = gtk_container_buildable_add;
+  iface->child_set_property = gtk_container_buildable_child_set_property;
 }
 
 static void
@@ -312,141 +316,6 @@ gtk_container_buildable_add (GtkBuildabl
   gtk_container_add (GTK_CONTAINER (buildable), GTK_WIDGET (child));
 }
 
-static void
-gtk_container_buildable_set_child_property (GtkContainer *container,
-					    GtkBuilder   *builder,
-					    GtkWidget    *child,
-					    gchar        *name,
-					    const gchar  *value)
-{
-  GParamSpec *pspec;
-  GValue gvalue = { 0, };
-
-  pspec = gtk_container_class_find_child_property
-    (G_OBJECT_GET_CLASS (container), name);
-  if (!pspec)
-    {
-      g_warning ("%s does not have a property called %s",
-		 g_type_name (G_OBJECT_TYPE (container)), name);
-      return;
-    }
-
-  if (!gtk_builder_value_from_string (pspec, value, &gvalue))
-    {
-      g_warning ("Could not read property %s:%s with value %s of type %s",
-		 g_type_name (G_OBJECT_TYPE (container)),
-		 name,
-		 value,
-		 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)));
-      return;
-    }
-
-  gtk_container_child_set_property (container, child, name, &gvalue);
-  g_value_unset (&gvalue);
-}
-
-typedef struct {
-  GtkBuilder   *builder;
-  GtkContainer *container;
-  GtkWidget    *child;
-  gchar        *child_prop_name;
-} PackingPropertiesData;
-
-static void
-attributes_start_element (GMarkupParseContext *context,
-			  const gchar         *element_name,
-			  const gchar        **names,
-			  const gchar        **values,
-			  gpointer             user_data,
-			  GError             **error)
-{
-  PackingPropertiesData *parser_data = (PackingPropertiesData*)user_data;
-  guint i;
-
-  if (!strcmp (element_name, "property"))
-    for (i = 0; names[i]; i++)
-      if (!strcmp (names[i], "name"))
-	parser_data->child_prop_name = g_strdup (values[i]);
-  else if (!strcmp (element_name, "packing"))
-    return;
-  else
-    g_warning ("Unsupported tag for GtkContainer: %s\n", element_name);
-}
-
-static void
-attributes_text_element (GMarkupParseContext *context,
-			 const gchar         *text,
-			 gsize                text_len,
-			 gpointer             user_data,
-			 GError             **error)
-{
-  PackingPropertiesData *parser_data = (PackingPropertiesData*)user_data;
-
-  if (!parser_data->child_prop_name)
-    return;
-
-  gtk_container_buildable_set_child_property (parser_data->container,
-					      parser_data->builder,
-					      parser_data->child,
-					      parser_data->child_prop_name,
-					      text);
-
-  g_free (parser_data->child_prop_name);
-  parser_data->child_prop_name = NULL;
-}
-
-static const GMarkupParser attributes_parser =
-  {
-    attributes_start_element,
-    NULL,
-    attributes_text_element,
-  };
-
-static gboolean
-gtk_container_buildable_custom_tag_start (GtkBuildable  *buildable,
-					  GtkBuilder    *builder,
-					  GObject       *child,
-					  const gchar   *tagname,
-					  GMarkupParser *parser,
-					  gpointer      *data)
-{
-  PackingPropertiesData *parser_data;
-
-  if (parent_buildable_iface->custom_tag_start (buildable, builder, child,
-						tagname, parser, data))
-    return TRUE;
-
-  if (child && !strcmp (tagname, "packing"))
-    {
-      parser_data = g_slice_new0 (PackingPropertiesData);
-      parser_data->builder = builder;
-      parser_data->container = GTK_CONTAINER (buildable);
-      parser_data->child = GTK_WIDGET (child);
-      parser_data->child_prop_name = NULL;
-
-      *parser = attributes_parser;
-      *data = parser_data;
-      return TRUE;
-    }
-
-  return FALSE;
-}
-
-static void
-gtk_container_buildable_custom_tag_end (GtkBuildable *buildable,
-					GtkBuilder   *builder,
-					GObject      *child,
-					const gchar  *tagname,
-					gpointer      data)
-{
-  if (!strcmp (tagname, "packing"))
-      g_slice_free (PackingPropertiesData, data);
-  else
-    parent_buildable_iface->custom_tag_end (buildable, builder,
-					    child, tagname, data);
-
-}
-
 /**
  * gtk_container_child_type: 
  * @container: a #GtkContainer.
diff -rup gtk+/gtk/gtkdialog.c my_gtk+/gtk/gtkdialog.c
--- gtk+/gtk/gtkdialog.c	2006-12-04 01:57:31.000000000 -0500
+++ my_gtk+/gtk/gtkdialog.c	2006-12-04 00:08:56.000000000 -0500
@@ -45,7 +45,9 @@
 #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_DIALOG, GtkDialogPrivate))
 
 typedef struct {
-  guint ignore_separator : 1;
+  guint  ignore_separator : 1;
+  gulong finish_cb_id;
+  gulong builder_support_id;
 } GtkDialogPrivate;
 
 typedef struct _ResponseData ResponseData;
@@ -79,21 +81,25 @@ static void gtk_dialog_close            
 
 static ResponseData* get_response_data   (GtkWidget        *widget,
 					  gboolean          create);
-static void gtk_dialog_buildable_interface_init     (GtkBuildableIface *iface);
-static GObject * gtk_dialog_buildable_get_internal_child (GtkBuildable *buildable,
-						     GtkBuilder   *builder,
-						     const gchar  *childname);
-static gboolean gtk_dialog_buildable_custom_tag_start (GtkBuildable  *buildable,
-						       GtkBuilder    *builder,
-						       GObject       *child,
-						       const gchar   *tagname,
-						       GMarkupParser *parser,
-						       gpointer      *data);
-static void gtk_dialog_buildable_custom_tag_end (GtkBuildable *buildable,
-						 GtkBuilder   *builder,
-						 GObject      *child,
-						 const gchar  *tagname,
-						 gpointer      data);
+
+static void     gtk_dialog_buildable_init               (GtkBuildableIface *iface);
+static void     gtk_dialog_buildable_set_name           (GtkBuildable      *buildable,
+							 GtkBuilder        *builder,
+							 const gchar       *name);
+static GObject *gtk_dialog_buildable_get_internal_child (GtkBuildable      *buildable,
+							 GtkBuilder        *builder,
+							 const gchar       *childname);
+static gboolean gtk_dialog_buildable_custom_tag_start   (GtkBuildable      *buildable,
+							 GtkBuilder        *builder,
+							 GObject           *child,
+							 const gchar       *tagname,
+							 GMarkupParser     *parser,
+							 gpointer          *data);
+static void     gtk_dialog_buildable_custom_tag_end     (GtkBuildable      *buildable,
+							 GtkBuilder        *builder,
+							 GObject           *child,
+							 const gchar       *tagname,
+							 gpointer           data);
 
 
 enum {
@@ -109,9 +115,11 @@ enum {
 
 static guint dialog_signals[LAST_SIGNAL];
 
+static GtkBuildableIface *parent_buildable_iface = NULL;
+
 G_DEFINE_TYPE_WITH_CODE (GtkDialog, gtk_dialog, GTK_TYPE_WINDOW,
 			 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
-						gtk_dialog_buildable_interface_init))
+						gtk_dialog_buildable_init))
 
 static void
 gtk_dialog_class_init (GtkDialogClass *class)
@@ -223,6 +231,8 @@ gtk_dialog_init (GtkDialog *dialog)
 
   priv = GET_PRIVATE (dialog);
   priv->ignore_separator = FALSE;
+  priv->finish_cb_id = 0;
+  priv->builder_support_id = 0;
 
   /* To avoid breaking old code that prevents destroy on delete event
    * by connecting a handler, we have to have the FIRST signal
@@ -257,13 +267,83 @@ gtk_dialog_init (GtkDialog *dialog)
 }
 
 static void
-gtk_dialog_buildable_interface_init (GtkBuildableIface *iface)
+gtk_dialog_buildable_init (GtkBuildableIface *iface)
 {
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+
+  iface->set_name = gtk_dialog_buildable_set_name;
   iface->get_internal_child = gtk_dialog_buildable_get_internal_child;
   iface->custom_tag_start = gtk_dialog_buildable_custom_tag_start;
   iface->custom_tag_end = gtk_dialog_buildable_custom_tag_end;
 }
 
+static void
+old_dialog_support_finish_cb (GtkBuilder   *builder,
+			      GtkBuildable *buildable)
+{
+  GtkDialog *dialog = GTK_DIALOG (buildable);
+  GList *children, *list;
+  GtkDialogPrivate *priv;
+  
+  priv = GET_PRIVATE (buildable);
+  
+  if (dialog->action_area == NULL)
+    return;
+  
+  /* repack children of action_area */
+  children = gtk_container_get_children(GTK_CONTAINER(dialog->action_area));
+  for (list = children; list; list = list->next) {
+    GtkWidget *child = GTK_WIDGET(list->data);
+    
+    g_object_ref(child);
+    gtk_container_remove (GTK_CONTAINER (dialog->action_area), child);
+  }
+  for (list = children; list; list = list->next) {
+    GtkWidget *child = GTK_WIDGET(list->data);
+    gint response_id;
+    
+    g_print ("Setting a custom dialog response id to %d\n", 
+	     GPOINTER_TO_INT(g_object_get_data(G_OBJECT(child),
+					       "gtk-button-buildable-response-id")));
+
+    response_id = GPOINTER_TO_INT(g_object_steal_data(G_OBJECT(child),
+						      "gtk-button-buildable-response-id"));
+
+
+    gtk_dialog_add_action_widget(dialog, child, response_id);
+    g_object_unref(child);
+    
+  }
+  g_list_free (children);
+  
+  g_signal_handler_disconnect (builder, priv->builder_support_id);
+  priv->builder_support_id = 0;
+}
+
+static void
+gtk_dialog_buildable_set_name (GtkBuildable *buildable,
+			       GtkBuilder   *builder,
+			       const gchar  *name)
+{
+  if (gtk_builder_file_version (builder) <= 1)
+    {
+      GtkDialogPrivate *priv;
+
+      priv = GET_PRIVATE (buildable);
+
+      /* For version 1 glade files, support dialog buttons
+       * the old fashioned way.
+       */
+      if (priv->builder_support_id == 0)
+	priv->builder_support_id =
+	  g_signal_connect (builder, "finish",
+			    G_CALLBACK (old_dialog_support_finish_cb),
+			    buildable);
+    }
+  parent_buildable_iface->set_name (buildable, builder, name);
+}
+
+
 static GObject *
 gtk_dialog_buildable_get_internal_child (GtkBuildable *buildable,
 					 GtkBuilder   *builder,
@@ -1345,11 +1425,13 @@ static void
 builder_finish_cb (GtkBuilder *builder,
 		   gpointer user_data)
 {
+  GtkDialogPrivate *priv;
   GSList *l;
   ActionWidgetsSubParserData *parser_data = (ActionWidgetsSubParserData*)user_data;
   GObject *object;
   ResponseData* data;
 
+  priv = GET_PRIVATE (parser_data->dialog);
   parser_data->items = g_slist_reverse (parser_data->items);
 
   for (l = parser_data->items; l; l = l->next)
@@ -1374,6 +1456,9 @@ builder_finish_cb (GtkBuilder *builder,
     }
   g_slist_free (parser_data->items);
   g_slice_free (ActionWidgetsSubParserData, parser_data);
+
+  g_signal_handler_disconnect (builder, priv->finish_cb_id);
+  priv->finish_cb_id = 0;
 }
 
 static void
@@ -1383,8 +1468,15 @@ gtk_dialog_buildable_custom_tag_end (Gtk
 				     const gchar  *tagname,
 				     gpointer      data)
 {
-  g_signal_connect (builder, "finish",
-		    (GCallback)builder_finish_cb, data);
+
+  GtkDialogPrivate *priv;
+
+  priv = GET_PRIVATE (buildable);
+
+  if (priv->finish_cb_id == 0)
+    priv->finish_cb_id = 
+      g_signal_connect (builder, "finish",
+			(GCallback)builder_finish_cb, data);
 }
 
 #define __GTK_DIALOG_C__
diff -rup gtk+/gtk/gtkframe.c my_gtk+/gtk/gtkframe.c
--- gtk+/gtk/gtkframe.c	2006-12-04 01:57:31.000000000 -0500
+++ my_gtk+/gtk/gtkframe.c	2006-12-04 01:32:17.000000000 -0500
@@ -171,7 +171,11 @@ gtk_frame_buildable_add (GtkBuildable *b
 			 GObject      *child,
 			 const gchar  *type)
 {
-  if (type && !strcmp (type, "label"))
+  if (type && 
+      (!strcmp (type, "label") ||
+       /* Support for older glade files */
+       !strcmp (type, "label_item") || 
+       !strcmp (type, "label-item")))
     gtk_frame_set_label_widget (GTK_FRAME (buildable), GTK_WIDGET (child));
   else if (!type)
     gtk_container_add (GTK_CONTAINER (buildable), GTK_WIDGET (child));
diff -rup gtk+/gtk/gtkimagemenuitem.c my_gtk+/gtk/gtkimagemenuitem.c
--- gtk+/gtk/gtkimagemenuitem.c	2006-10-08 01:07:03.000000000 -0400
+++ my_gtk+/gtk/gtkimagemenuitem.c	2006-12-04 02:19:07.000000000 -0500
@@ -25,6 +25,7 @@
  */
 
 #include <config.h>
+#include <string.h>
 #include "gtkimagemenuitem.h"
 #include "gtkaccellabel.h"
 #include "gtkintl.h"
@@ -34,6 +35,7 @@
 #include "gtkmenubar.h"
 #include "gtkcontainer.h"
 #include "gtkwindow.h"
+#include "gtkbuildable.h"
 #include "gtkprivate.h"
 #include "gtkalias.h"
 
@@ -62,13 +64,30 @@ static void gtk_image_menu_item_get_prop
 static void gtk_image_menu_item_screen_changed (GtkWidget        *widget,
 						GdkScreen        *previous_screen);
 
+static void gtk_image_menu_item_buildable_init (GtkBuildableIface *iface);
+
+static void gtk_image_menu_item_buildable_set_property (GtkBuildable *buildable,
+							GtkBuilder   *builder,
+							const gchar  *name,
+							const GValue *value);
+
+static GObject *gtk_image_menu_item_buildable_get_internal_child (GtkBuildable *buildable,
+								  GtkBuilder   *builder,
+								  const gchar  *childname);
+
+
+extern GtkWidget *_gtk_menu_item_ensure_child_label (GtkMenuItem *menu_item);
 
 enum {
   PROP_ZERO,
   PROP_IMAGE
 };
 
-G_DEFINE_TYPE (GtkImageMenuItem, gtk_image_menu_item, GTK_TYPE_MENU_ITEM)
+static GtkBuildableIface *parent_buildable_iface = NULL;
+
+G_DEFINE_TYPE_WITH_CODE (GtkImageMenuItem, gtk_image_menu_item, GTK_TYPE_MENU_ITEM, 
+			 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, 
+						gtk_image_menu_item_buildable_init));
 
 static void
 gtk_image_menu_item_class_init (GtkImageMenuItemClass *klass)
@@ -112,6 +131,97 @@ gtk_image_menu_item_class_init (GtkImage
 }
 
 static void
+gtk_image_menu_item_buildable_init (GtkBuildableIface *iface)
+{
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+
+  iface->set_property = gtk_image_menu_item_buildable_set_property;
+  iface->get_internal_child = gtk_image_menu_item_buildable_get_internal_child;
+}
+
+static void
+gtk_image_menu_item_buildable_set_property (GtkBuildable *buildable,
+					    GtkBuilder   *builder,
+					    const gchar  *name,
+					    const GValue *value)
+{
+  GtkWidget *menu_item = GTK_WIDGET (buildable);
+  GValue     val = { 0, };
+
+  if (!strcmp (name, "use-stock"))
+    {
+      GtkWidget *child = _gtk_menu_item_ensure_child_label (GTK_MENU_ITEM (menu_item));
+      
+      gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN,
+					  g_value_get_string (value), &val);
+
+      if (GTK_IS_LABEL (child) && g_value_get_boolean (&val)) 
+	{
+	  const gchar *stock_id = gtk_label_get_label(GTK_LABEL(child));
+	  GtkStockItem stock_item;
+	  
+	  if (gtk_stock_lookup(stock_id, &stock_item)) 
+	    {
+	      /* put in the stock image next to the text.  Done before
+	       * messing with the label child, so that stock_id doesn't
+	       * become invalid. */
+	      GtkWidget *image =
+		gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
+	      
+	      gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
+	      gtk_widget_show(image);
+	      
+	      gtk_label_set_text(GTK_LABEL(child), stock_item.label);
+	      gtk_label_set_use_underline(GTK_LABEL(child), TRUE);
+	  
+	      if (stock_item.keyval)
+		gtk_widget_add_accelerator (GTK_WIDGET (buildable),
+					    "activate",
+					    gtk_builder_ensure_accel_group (builder),
+					    stock_item.keyval,
+					    stock_item.modifier,
+					    GTK_ACCEL_VISIBLE);
+	      
+	    } 
+	  else 
+	    {
+	      g_warning("could not look up stock id '%s'", stock_id);
+	    }
+	}
+      g_value_unset (&val);
+    }
+  else
+    parent_buildable_iface->set_property (buildable, builder, name, value);
+
+}
+
+static GObject *
+gtk_image_menu_item_buildable_get_internal_child (GtkBuildable *buildable,
+						  GtkBuilder   *builder,
+						  const gchar  *childname)
+{
+  if (!strcmp(childname, "image")) 
+    {
+      GtkWidget *pl;
+
+      pl = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (buildable));
+      if (!pl) 
+	{
+	  pl = gtk_image_new ();
+	  
+	  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (buildable), pl);
+	}
+      return G_OBJECT (pl);
+    }
+  else if (parent_buildable_iface->get_internal_child)
+    return parent_buildable_iface->get_internal_child (buildable,
+						       builder,
+						       childname);
+  return NULL; 
+}
+
+
+static void
 gtk_image_menu_item_init (GtkImageMenuItem *image_menu_item)
 {
   image_menu_item->image = NULL;
diff -rup gtk+/gtk/gtklistitem.c my_gtk+/gtk/gtklistitem.c
--- gtk+/gtk/gtklistitem.c	2005-09-13 15:57:41.000000000 -0400
+++ my_gtk+/gtk/gtklistitem.c	2006-12-03 17:02:54.000000000 -0500
@@ -27,10 +27,12 @@
 #undef GTK_DISABLE_DEPRECATED
 
 #include <config.h>
+#include <string.h>
 #include "gtkbindings.h"
 #include "gtklabel.h"
 #include "gtklistitem.h"
 #include "gtklist.h"
+#include "gtkbuildable.h"
 #include "gtkmarshalers.h"
 #include "gtksignal.h"
 #include "gtkintl.h"
@@ -71,9 +73,16 @@ static void gtk_real_list_item_deselect 
 static void gtk_real_list_item_toggle       (GtkItem          *item);
 
 
+static void gtk_list_item_buildable_init    (GtkBuildableIface *iface);
+static void gtk_list_item_buildable_set_property (GtkBuildable *buildable,
+						  GtkBuilder   *builder,
+						  const gchar  *name,
+						  const GValue *value);
+
 static GtkItemClass *parent_class = NULL;
 static guint list_item_signals[LAST_SIGNAL] = {0};
 
+static GtkBuildableIface *parent_buildable_iface = NULL;
 
 GtkType
 gtk_list_item_get_type (void)
@@ -94,8 +103,19 @@ gtk_list_item_get_type (void)
         (GtkClassInitFunc) NULL,
       };
 
+      static const GInterfaceInfo buildable_info =
+      {
+	(GInterfaceInitFunc) gtk_list_item_buildable_init,
+	NULL,
+	NULL
+      };
+
       I_("GtkListItem");
       list_item_type = gtk_type_unique (gtk_item_get_type (), &list_item_info);
+
+      g_type_add_interface_static (list_item_type,
+				   GTK_TYPE_BUILDABLE,
+				   &buildable_info);
     }
 
   return list_item_type;
@@ -381,6 +401,40 @@ gtk_list_item_init (GtkListItem *list_it
   GTK_WIDGET_SET_FLAGS (list_item, GTK_CAN_FOCUS);
 }
 
+
+static void
+gtk_list_item_buildable_init (GtkBuildableIface *iface)
+{
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+
+  iface->set_property = gtk_list_item_buildable_set_property;
+}
+
+static void
+gtk_list_item_buildable_set_property (GtkBuildable *buildable,
+				      GtkBuilder   *builder,
+				      const gchar  *name,
+				      const GValue *value)
+{
+  if (!strcmp (name, "label"))
+    {
+      GtkWidget *child;
+
+      child = gtk_bin_get_child (GTK_BIN (buildable));
+      if (child)
+	gtk_container_remove (GTK_CONTAINER (buildable), child);
+      
+      child = gtk_label_new (g_value_get_string (value));
+      gtk_misc_set_alignment (GTK_MISC (child), 0.0, 0.5);
+      gtk_misc_set_padding (GTK_MISC (child), 0, 1);
+      
+      gtk_container_add (GTK_CONTAINER (buildable), child);
+      gtk_widget_show (child);
+    }
+  else
+    parent_buildable_iface->set_property (buildable, builder, name, value);
+}
+
 GtkWidget*
 gtk_list_item_new (void)
 {
