diff --git a/README.in b/README.in
index 9c2cfe5..c499f5f 100644
--- a/README.in
+++ b/README.in
@@ -27,6 +27,17 @@ Installation
 See the file 'INSTALL'
 
 
+Release notes for 2.16
+======================
+
+* GtkButton implements the following as virtual functions now:
+  gtk_button_set_label
+  gtk_button_get_label
+  gtk_button_set_image
+  gtk_button_get_image
+  Subclasses can now override these functions to allow developers
+  to use regular button API even with different child widgets.
+
 Release notes for 2.14
 ======================
 
diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
index 234f036..07b32d5 100644
--- a/gtk/gtkbutton.c
+++ b/gtk/gtkbutton.c
@@ -125,6 +125,12 @@ static gint gtk_button_leave_notify   (GtkWidget          *widget,
 static void gtk_real_button_pressed   (GtkButton          *button);
 static void gtk_real_button_released  (GtkButton          *button);
 static void gtk_real_button_activate  (GtkButton          *button);
+static void gtk_real_button_set_label (GtkButton          *button,
+                                       const gchar        *label);
+static const gchar* gtk_real_button_get_label (GtkButton  *button);
+static void gtk_real_button_set_image (GtkButton          *button,
+                                       GtkWidget          *image);
+static GtkWidget* gtk_real_button_get_image (GtkButton    *button);
 static void gtk_button_update_state   (GtkButton          *button);
 static void gtk_button_add            (GtkContainer       *container,
 			               GtkWidget          *widget);
@@ -192,6 +198,10 @@ gtk_button_class_init (GtkButtonClass *klass)
   klass->enter = gtk_button_update_state;
   klass->leave = gtk_button_update_state;
   klass->activate = gtk_real_button_activate;
+  klass->set_label = gtk_real_button_set_label;
+  klass->get_label = gtk_real_button_get_label;
+  klass->set_image = gtk_real_button_set_image;
+  klass->get_image = gtk_real_button_get_image;
 
   g_object_class_install_property (gobject_class,
                                    PROP_LABEL,
@@ -1560,6 +1570,21 @@ gtk_button_finish_activate (GtkButton *button,
     gtk_button_clicked (button);
 }
 
+static void
+gtk_real_button_set_label (GtkButton   *button,
+                           const gchar *label)
+{
+  gchar *new_label;
+
+  new_label = g_strdup (label);
+  g_free (button->label_text);
+  button->label_text = new_label;
+  
+  gtk_button_construct_child (button);
+  
+  g_object_notify (G_OBJECT (button), "label");
+}
+
 /**
  * gtk_button_set_label:
  * @button: a #GtkButton
@@ -1575,17 +1600,15 @@ void
 gtk_button_set_label (GtkButton   *button,
 		      const gchar *label)
 {
-  gchar *new_label;
-  
   g_return_if_fail (GTK_IS_BUTTON (button));
 
-  new_label = g_strdup (label);
-  g_free (button->label_text);
-  button->label_text = new_label;
-  
-  gtk_button_construct_child (button);
-  
-  g_object_notify (G_OBJECT (button), "label");
+  GTK_BUTTON_CLASS (gtk_button_parent_class)->set_label (button, label);
+}
+
+static G_CONST_RETURN gchar *
+gtk_real_button_get_label (GtkButton *button)
+{
+  return button->label_text;
 }
 
 /**
@@ -1605,8 +1628,8 @@ G_CONST_RETURN gchar *
 gtk_button_get_label (GtkButton *button)
 {
   g_return_val_if_fail (GTK_IS_BUTTON (button), NULL);
-  
-  return button->label_text;
+
+  return GTK_BUTTON_CLASS (gtk_button_parent_class)->get_label (button);
 }
 
 /**
@@ -1954,6 +1977,25 @@ gtk_button_grab_notify (GtkWidget *widget,
     }
 }
 
+static void
+gtk_real_button_set_image (GtkButton *button,
+                           GtkWidget *image)
+{
+  GtkButtonPrivate *priv;
+
+  priv = GTK_BUTTON_GET_PRIVATE (button);
+
+  if (priv->image && priv->image->parent)
+    gtk_container_remove (GTK_CONTAINER (priv->image->parent), priv->image);
+
+  priv->image = image;
+  priv->image_is_stock = (image == NULL);
+
+  gtk_button_construct_child (button);
+
+  g_object_notify (G_OBJECT (button), "image");
+}
+
 /**
  * gtk_button_set_image:
  * @button: a #GtkButton
@@ -1961,7 +2003,7 @@ gtk_button_grab_notify (GtkWidget *widget,
  *
  * Set the image of @button to the given widget. Note that
  * it depends on the #GtkSettings:gtk-button-images setting whether the
- * image will be displayed or not, you don't have to call
+ * image will be displayed or not, you shouldn't call
  * gtk_widget_show() on @image yourself.
  *
  * Since: 2.6
@@ -1970,22 +2012,20 @@ void
 gtk_button_set_image (GtkButton *button,
 		      GtkWidget *image)
 {
-  GtkButtonPrivate *priv;
-
   g_return_if_fail (GTK_IS_BUTTON (button));
   g_return_if_fail (image == NULL || GTK_IS_WIDGET (image));
 
-  priv = GTK_BUTTON_GET_PRIVATE (button);
-
-  if (priv->image && priv->image->parent)
-    gtk_container_remove (GTK_CONTAINER (priv->image->parent), priv->image);
-
-  priv->image = image;
-  priv->image_is_stock = (image == NULL);
+  GTK_BUTTON_CLASS (gtk_button_parent_class)->set_image (button, image);
+}
 
-  gtk_button_construct_child (button);
+static GtkWidget *
+gtk_real_button_get_image (GtkButton *button)
+{
+  GtkButtonPrivate *priv;
 
-  g_object_notify (G_OBJECT (button), "image");
+  priv = GTK_BUTTON_GET_PRIVATE (button);
+  
+  return priv->image;
 }
 
 /**
@@ -2007,9 +2047,7 @@ gtk_button_get_image (GtkButton *button)
 
   g_return_val_if_fail (GTK_IS_BUTTON (button), NULL);
 
-  priv = GTK_BUTTON_GET_PRIVATE (button);
-  
-  return priv->image;
+  return GTK_BUTTON_CLASS (gtk_button_parent_class)->get_image (button);
 }
 
 /**
diff --git a/gtk/gtkbutton.h b/gtk/gtkbutton.h
index a8c1e8e..cbd16ee 100644
--- a/gtk/gtkbutton.h
+++ b/gtk/gtkbutton.h
@@ -81,12 +81,12 @@ struct _GtkButtonClass
   void (* enter)    (GtkButton *button);
   void (* leave)    (GtkButton *button);
   void (* activate) (GtkButton *button);
-  
-  /* Padding for future expansion */
-  void (*_gtk_reserved1) (void);
-  void (*_gtk_reserved2) (void);
-  void (*_gtk_reserved3) (void);
-  void (*_gtk_reserved4) (void);
+  void          (* set_label) (GtkButton   *button,
+                               const gchar *label);
+  const gchar * (* get_label) (GtkButton   *button);
+  void          (* set_image) (GtkButton   *button,
+                               GtkWidget   *image);
+  GtkWidget *   (* get_image) (GtkButton   *button);
 };
 
 
