diff --git a/pidgin/minidialog.h b/pidgin/minidialog.h
--- a/pidgin/minidialog.h
+++ b/pidgin/minidialog.h
@@ -23,8 +23,8 @@
 # error "only <pidgin.h> may be included directly"
 #endif
 
-#ifndef __PIDGIN_MINI_DIALOG_H__
-#define __PIDGIN_MINI_DIALOG_H__
+#ifndef PIDGIN_MINI_DIALOG_H
+#define PIDGIN_MINI_DIALOG_H
 /**
  * SECTION:minidialog
  * @section_id: pidgin-minidialog
@@ -37,27 +37,8 @@
 
 G_BEGIN_DECLS
 
-#define PIDGIN_TYPE_MINI_DIALOG pidgin_mini_dialog_get_type()
-
-#define PIDGIN_MINI_DIALOG(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
-  PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialog))
-
-#define PIDGIN_MINI_DIALOG_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST ((klass), \
-  PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialogClass))
-
-#define PIDGIN_IS_MINI_DIALOG(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
-  PIDGIN_TYPE_MINI_DIALOG))
-
-#define PIDGIN_IS_MINI_DIALOG_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE ((klass), \
-  PIDGIN_TYPE_MINI_DIALOG))
-
-#define PIDGIN_MINI_DIALOG_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), \
-  PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialogClass))
+#define PIDGIN_TYPE_MINI_DIALOG (pidgin_mini_dialog_get_type())
+G_DECLARE_FINAL_TYPE(PidginMiniDialog, pidgin_mini_dialog, PIDGIN, MINI_DIALOG, GtkBox)
 
 /**
  * PidginMiniDialog:
@@ -93,28 +74,12 @@ G_BEGIN_DECLS
  *   </tbody></tgroup>
  * </informaltable>
  */
-typedef struct {
+struct _PidginMiniDialog {
 	GtkBox parent;
-	gpointer priv;
 
 	/*< public >*/
 	GtkBox *contents;
-} PidginMiniDialog;
-
-/**
- * PidginMiniDialogClass:
- *
- * The class of #PidginMiniDialog objects.
- */
-typedef struct {
-	GtkBoxClass parent_class;
-
-	/*< private >*/
-	void (*_purple_reserved1) (void);
-	void (*_purple_reserved2) (void);
-	void (*_purple_reserved3) (void);
-	void (*_purple_reserved4) (void);
-} PidginMiniDialogClass;
+};
 
 /**
  * PidginMiniDialogCallback:
@@ -134,7 +99,6 @@ typedef void (*PidginMiniDialogCallback)
  *
  * Get the GType of #PidginMiniDialog.
  */
-GType pidgin_mini_dialog_get_type (void);
 
 /**
  * pidgin_mini_dialog_new:
@@ -167,7 +131,7 @@ PidginMiniDialog *pidgin_mini_dialog_new
  * Shortcut for setting a mini-dialog's title via GObject properties.
  */
 void pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog,
-	const char *title);
+	const gchar *title);
 
 /**
  * pidgin_mini_dialog_set_description:
@@ -178,7 +142,7 @@ void pidgin_mini_dialog_set_title(Pidgin
  * Shortcut for setting a mini-dialog's description via GObject properties.
  */
 void pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog,
-	const char *description);
+	const gchar *description);
 
 /**
  * pidgin_mini_dialog_enable_description_markup:
@@ -206,7 +170,7 @@ void pidgin_mini_dialog_set_link_callbac
  * Shortcut for setting a mini-dialog's icon via GObject properties.
  */
 void pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog,
-	const char *icon_name);
+	const gchar *icon_name);
 
 /**
  * pidgin_mini_dialog_set_custom_icon:
@@ -231,7 +195,7 @@ void pidgin_mini_dialog_set_custom_icon(
  * is destroyed.
  */
 void pidgin_mini_dialog_add_button(PidginMiniDialog *mini_dialog,
-	const char *text, PidginMiniDialogCallback clicked_cb,
+	const gchar *text, PidginMiniDialogCallback clicked_cb,
 	gpointer user_data);
 
 /**
@@ -246,7 +210,7 @@ void pidgin_mini_dialog_add_button(Pidgi
  * is that the mini-dialog won't be closed after the button is clicked.
  */
 void pidgin_mini_dialog_add_non_closing_button(PidginMiniDialog *mini_dialog,
-	const char *text, PidginMiniDialogCallback clicked_cb,
+	const gchar *text, PidginMiniDialogCallback clicked_cb,
 	gpointer user_data);
 
 /**
@@ -261,4 +225,4 @@ guint pidgin_mini_dialog_get_num_childre
 
 G_END_DECLS
 
-#endif /* __PIDGIN_MINI_DIALOG_H__ */
+#endif /* PIDGIN_MINI_DIALOG_H */
diff --git a/pidgin/minidialog.c b/pidgin/minidialog.c
--- a/pidgin/minidialog.c
+++ b/pidgin/minidialog.c
@@ -25,57 +25,19 @@
 
 #include "minidialog.h"
 
-static void     pidgin_mini_dialog_init       (PidginMiniDialog      *self);
-static void     pidgin_mini_dialog_class_init (PidginMiniDialogClass *klass);
-
-static gpointer pidgin_mini_dialog_parent_class = NULL;
-
-static void
-pidgin_mini_dialog_class_intern_init (gpointer klass)
-{
-	pidgin_mini_dialog_parent_class = g_type_class_peek_parent (klass);
-	pidgin_mini_dialog_class_init ((PidginMiniDialogClass*) klass);
-}
-
-GType
-pidgin_mini_dialog_get_type (void)
-{
-	static GType g_define_type_id = 0;
-	if (g_define_type_id == 0)
-	{
-		static const GTypeInfo g_define_type_info = {
-			sizeof (PidginMiniDialogClass),
-			(GBaseInitFunc) NULL,
-			(GBaseFinalizeFunc) NULL,
-			(GClassInitFunc) pidgin_mini_dialog_class_intern_init,
-			(GClassFinalizeFunc) NULL,
-			NULL,   /* class_data */
-			sizeof (PidginMiniDialog),
-			0,      /* n_preallocs */
-			(GInstanceInitFunc) pidgin_mini_dialog_init,
-			NULL,
-		};
-		g_define_type_id = g_type_register_static(GTK_TYPE_BOX,
-			"PidginMiniDialog", &g_define_type_info, 0);
-	}
-	return g_define_type_id;
-}
-
-enum
-{
-	PROP_TITLE = 1,
+enum {
+	PROP_0,
+	PROP_TITLE,
 	PROP_DESCRIPTION,
 	PROP_ICON_NAME,
 	PROP_CUSTOM_ICON,
 	PROP_ENABLE_DESCRIPTION_MARKUP,
-
-	LAST_PROPERTY
-} HazeConnectionProperties;
+	PROP_LAST
+};
 
-static GParamSpec *properties[LAST_PROPERTY];
+static GParamSpec *properties[PROP_LAST] = {NULL};
 
-typedef struct
-{
+typedef struct {
 	GtkImage *icon;
 	GtkBox *title_box;
 	GtkLabel *title;
@@ -86,94 +48,18 @@ typedef struct
 	guint idle_destroy_cb_id;
 } PidginMiniDialogPrivate;
 
-#define PIDGIN_MINI_DIALOG_GET_PRIVATE(dialog) \
-	((PidginMiniDialogPrivate *) ((dialog)->priv))
-
-static PidginMiniDialog *
-mini_dialog_new(const gchar *title, const gchar *description)
-{
-	return g_object_new(PIDGIN_TYPE_MINI_DIALOG,
-		"title", title,
-		"description", description,
-		NULL);
-}
-
-PidginMiniDialog *
-pidgin_mini_dialog_new(const gchar *title,
-                       const gchar *description,
-                       const gchar *icon_name)
-{
-	PidginMiniDialog *mini_dialog = mini_dialog_new(title, description);
-	pidgin_mini_dialog_set_icon_name(mini_dialog, icon_name);
-	return mini_dialog;
-}
-
-PidginMiniDialog *
-pidgin_mini_dialog_new_with_custom_icon(const gchar *title,
-					const gchar *description,
-					GdkPixbuf *custom_icon)
-{
-	PidginMiniDialog *mini_dialog = mini_dialog_new(title, description);
-	pidgin_mini_dialog_set_custom_icon(mini_dialog, custom_icon);
-	return mini_dialog;
-}
+G_DEFINE_TYPE_WITH_PRIVATE(PidginMiniDialog, pidgin_mini_dialog, GTK_TYPE_BOX)
 
-void
-pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog,
-                             const char *title)
-{
-	g_object_set(G_OBJECT(mini_dialog), "title", title, NULL);
-}
-
-void
-pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog,
-                                   const char *description)
-{
-	g_object_set(G_OBJECT(mini_dialog), "description", description, NULL);
-}
-
-void
-pidgin_mini_dialog_enable_description_markup(PidginMiniDialog *mini_dialog)
-{
-	g_object_set(G_OBJECT(mini_dialog), "enable-description-markup", TRUE, NULL);
-}
-
-void pidgin_mini_dialog_set_link_callback(PidginMiniDialog *mini_dialog, GCallback cb, gpointer user_data)
-{
-	g_signal_connect(PIDGIN_MINI_DIALOG_GET_PRIVATE(mini_dialog)->desc, "activate-link", cb, user_data);
-}
-
-void
-pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog,
-                                 const char *icon_name)
-{
-	g_object_set(G_OBJECT(mini_dialog), "icon-name", icon_name, NULL);
-}
-
-void
-pidgin_mini_dialog_set_custom_icon(PidginMiniDialog *mini_dialog, GdkPixbuf *custom_icon)
-{
-	g_object_set(G_OBJECT(mini_dialog), "custom-icon", custom_icon, NULL);
-}
-
-struct _mini_dialog_button_clicked_cb_data
-{
+struct _mini_dialog_button_clicked_cb_data {
 	PidginMiniDialog *mini_dialog;
 	PidginMiniDialogCallback callback;
 	gpointer user_data;
 	gboolean close_dialog_after_click;
 };
 
-guint
-pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog)
-{
-	GList *tmp;
-	guint len;
-	tmp = gtk_container_get_children(GTK_CONTAINER(mini_dialog->contents));
-	len = g_list_length(tmp);
-	g_list_free(tmp);
-	return len;
-}
+/******************************************************************************
+ * Callbacks
+ *****************************************************************************/
 
 static gboolean
 idle_destroy_cb(GtkWidget *mini_dialog)
@@ -188,7 +74,7 @@ mini_dialog_button_clicked_cb(GtkButton 
 {
 	struct _mini_dialog_button_clicked_cb_data *data = user_data;
 	PidginMiniDialogPrivate *priv =
-		PIDGIN_MINI_DIALOG_GET_PRIVATE(data->mini_dialog);
+		pidgin_mini_dialog_get_instance_private(data->mini_dialog);
 
 	if (data->close_dialog_after_click) {
 		/* Set up the destruction callback before calling the clicked callback,
@@ -196,84 +82,115 @@ mini_dialog_button_clicked_cb(GtkButton 
 		 * the idle_destroy_cb is correctly removed by _finalize.
 		 */
 		priv->idle_destroy_cb_id =
-			g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog);
+			g_idle_add((GSourceFunc)idle_destroy_cb, data->mini_dialog);
 	}
 
-	if (data->callback != NULL)
+	if (data->callback != NULL) {
 		data->callback(data->mini_dialog, button, data->user_data);
-
-}
-
-static void
-mini_dialog_button_destroy_cb(GtkButton *button,
-                              gpointer user_data)
-{
-	struct _mini_dialog_button_clicked_cb_data *data = user_data;
-	g_free(data);
+	}
 }
 
+/******************************************************************************
+ * Helpers
+ *****************************************************************************/
 static void
-mini_dialog_add_button(PidginMiniDialog *self,
-                       const char *text,
-                       PidginMiniDialogCallback clicked_cb,
-                       gpointer user_data,
+mini_dialog_add_button(PidginMiniDialog *self, const gchar *text,
+                       PidginMiniDialogCallback clicked_cb, gpointer user_data,
                        gboolean close_dialog_after_click)
 {
-	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
-	struct _mini_dialog_button_clicked_cb_data *callback_data
-		= g_new0(struct _mini_dialog_button_clicked_cb_data, 1);
-	GtkWidget *button = gtk_button_new();
-	GtkWidget *label = gtk_label_new(NULL);
-	char *button_text =
-		g_strdup_printf("<span size=\"smaller\">%s</span>", text);
+	PidginMiniDialogPrivate *priv =
+		pidgin_mini_dialog_get_instance_private(self);
+	struct _mini_dialog_button_clicked_cb_data *callback_data = NULL;
+	GtkWidget *button = NULL;
+	GtkWidget *label = NULL;
+	char *button_text = NULL;
 
+	label = gtk_label_new(NULL);
+	button_text = g_strdup_printf("<span size=\"smaller\">%s</span>", text);
 	gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), button_text);
 	g_free(button_text);
 
+	callback_data = g_new0(struct _mini_dialog_button_clicked_cb_data, 1);
 	callback_data->mini_dialog = self;
 	callback_data->callback = clicked_cb;
 	callback_data->user_data = user_data;
 	callback_data->close_dialog_after_click = close_dialog_after_click;
-	g_signal_connect(G_OBJECT(button), "clicked",
-		(GCallback) mini_dialog_button_clicked_cb, callback_data);
-	g_signal_connect(G_OBJECT(button), "destroy",
-		(GCallback) mini_dialog_button_destroy_cb, callback_data);
 
+	button = gtk_button_new();
 	gtk_container_add(GTK_CONTAINER(button), label);
+	g_signal_connect_data(G_OBJECT(button), "clicked",
+	                      G_CALLBACK(mini_dialog_button_clicked_cb),
+	                      callback_data, (GClosureNotify)g_free, 0);
 
-	gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE,
-		0);
-	gtk_widget_show_all(GTK_WIDGET(button));
+	gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE, 0);
+	gtk_widget_show_all(button);
 }
 
-void
-pidgin_mini_dialog_add_button(PidginMiniDialog *self,
-                              const char *text,
-                              PidginMiniDialogCallback clicked_cb,
-                              gpointer user_data)
+static void
+mini_dialog_set_title(PidginMiniDialog *self, const gchar *title)
 {
-	mini_dialog_add_button(self, text, clicked_cb, user_data, TRUE);
-}
+	PidginMiniDialogPrivate *priv =
+		pidgin_mini_dialog_get_instance_private(self);
 
-void
-pidgin_mini_dialog_add_non_closing_button(PidginMiniDialog *self,
-                                          const char *text,
-                                          PidginMiniDialogCallback clicked_cb,
-                                          gpointer user_data)
-{
-	mini_dialog_add_button(self, text, clicked_cb, user_data, FALSE);
+	gchar *title_esc = g_markup_escape_text(title, -1);
+	gchar *title_markup = g_strdup_printf(
+	    "<span weight=\"bold\" size=\"smaller\">%s</span>",
+	    title_esc ? title_esc : "");
+
+	gtk_label_set_markup(priv->title, title_markup);
+
+	g_free(title_esc);
+	g_free(title_markup);
+
+	g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_TITLE]);
 }
 
 static void
-pidgin_mini_dialog_get_property(GObject *object,
-                                guint property_id,
-                                GValue *value,
+mini_dialog_set_description(PidginMiniDialog *self, const gchar *description)
+{
+	PidginMiniDialogPrivate *priv =
+		pidgin_mini_dialog_get_instance_private(self);
+
+	if(description) {
+		gchar *desc_esc, *desc_markup;
+
+		desc_esc = priv->enable_description_markup
+		    ? g_strdup(description)
+		    : g_markup_escape_text(description, -1);
+		desc_markup = g_strdup_printf("<span size=\"smaller\">%s</span>",
+		                              desc_esc);
+
+		gtk_label_set_markup(priv->desc, desc_markup);
+
+		g_free(desc_esc);
+		g_free(desc_markup);
+
+		gtk_widget_show(GTK_WIDGET(priv->desc));
+		g_object_set(G_OBJECT(priv->desc), "no-show-all", FALSE, NULL);
+	} else {
+		gtk_label_set_text(priv->desc, NULL);
+		gtk_widget_hide(GTK_WIDGET(priv->desc));
+		/* make calling show_all() on the minidialog not affect desc
+		 * even though it's packed inside it.
+	 	 */
+		g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL);
+	}
+
+	g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_DESCRIPTION]);
+}
+
+/******************************************************************************
+ * GObject Implementation
+ *****************************************************************************/
+static void
+pidgin_mini_dialog_get_property(GObject *obj, guint param_id, GValue *value,
                                 GParamSpec *pspec)
 {
-	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
-	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(obj);
+	PidginMiniDialogPrivate *priv =
+		pidgin_mini_dialog_get_instance_private(self);
 
-	switch (property_id) {
+	switch (param_id) {
 		case PROP_TITLE:
 			g_value_set_string(value, gtk_label_get_text(priv->title));
 			break;
@@ -294,71 +211,21 @@ pidgin_mini_dialog_get_property(GObject 
 			g_value_set_boolean(value, priv->enable_description_markup);
 			break;
 		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+			break;
 	}
 }
 
 static void
-mini_dialog_set_title(PidginMiniDialog *self,
-                      const char *title)
-{
-	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
-
-	char *title_esc = g_markup_escape_text(title, -1);
-	char *title_markup = g_strdup_printf(
-		"<span weight=\"bold\" size=\"smaller\">%s</span>",
-		title_esc ? title_esc : "");
-
-	gtk_label_set_markup(priv->title, title_markup);
-
-	g_free(title_esc);
-	g_free(title_markup);
-
-	g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_TITLE]);
-}
-
-static void
-mini_dialog_set_description(PidginMiniDialog *self,
-                            const char *description)
-{
-	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
-	if(description)
-	{
-		char *desc_esc = priv->enable_description_markup ? g_strdup(description) : g_markup_escape_text(description, -1);
-		char *desc_markup = g_strdup_printf(
-			"<span size=\"smaller\">%s</span>", desc_esc);
-
-		gtk_label_set_markup(priv->desc, desc_markup);
-
-		g_free(desc_esc);
-		g_free(desc_markup);
-
-		gtk_widget_show(GTK_WIDGET(priv->desc));
-		g_object_set(G_OBJECT(priv->desc), "no-show-all", FALSE, NULL);
-	}
-	else
-	{
-		gtk_label_set_text(priv->desc, NULL);
-		gtk_widget_hide(GTK_WIDGET(priv->desc));
-		/* make calling show_all() on the minidialog not affect desc
-		 * even though it's packed inside it.
-	 	 */
-		g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL);
-	}
-
-	g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_DESCRIPTION]);
-}
-
-static void
-pidgin_mini_dialog_set_property(GObject *object,
-                                guint property_id,
+pidgin_mini_dialog_set_property(GObject *obj, guint param_id,
                                 const GValue *value,
                                 GParamSpec *pspec)
 {
-	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
-	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(obj);
+	PidginMiniDialogPrivate *priv =
+		pidgin_mini_dialog_get_instance_private(self);
 
-	switch (property_id) {
+	switch (param_id) {
 		case PROP_TITLE:
 			mini_dialog_set_title(self, g_value_get_string(value));
 			break;
@@ -377,74 +244,70 @@ pidgin_mini_dialog_set_property(GObject 
 			priv->enable_description_markup = g_value_get_boolean(value);
 			break;
 		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+			break;
 	}
 }
 
 static void
-pidgin_mini_dialog_finalize(GObject *object)
+pidgin_mini_dialog_finalize(GObject *obj)
 {
-	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
-	PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
+	PidginMiniDialog *self = PIDGIN_MINI_DIALOG(obj);
+	PidginMiniDialogPrivate *priv =
+		pidgin_mini_dialog_get_instance_private(self);
 
-	if (priv->idle_destroy_cb_id)
+	if (priv->idle_destroy_cb_id) {
 		g_source_remove(priv->idle_destroy_cb_id);
-
-	g_free(priv);
-	self->priv = NULL;
+	}
 
 	purple_prefs_disconnect_by_handle(self);
 
-	G_OBJECT_CLASS (pidgin_mini_dialog_parent_class)->finalize (object);
+	G_OBJECT_CLASS(pidgin_mini_dialog_parent_class)->finalize(obj);
 }
 
 static void
 pidgin_mini_dialog_class_init(PidginMiniDialogClass *klass)
 {
-	GObjectClass *object_class = G_OBJECT_CLASS(klass);
+	GObjectClass *obj_class = G_OBJECT_CLASS(klass);
 
-	object_class->get_property = pidgin_mini_dialog_get_property;
-	object_class->set_property = pidgin_mini_dialog_set_property;
-	object_class->finalize = pidgin_mini_dialog_finalize;
+	obj_class->get_property = pidgin_mini_dialog_get_property;
+	obj_class->set_property = pidgin_mini_dialog_set_property;
+	obj_class->finalize = pidgin_mini_dialog_finalize;
 
-	properties[PROP_TITLE] = g_param_spec_string("title",
-		"title",
+	properties[PROP_TITLE] = g_param_spec_string(
+		"title", "title",
 		"String specifying the mini-dialog's title", NULL,
 		G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
 
-	properties[PROP_DESCRIPTION] = g_param_spec_string("description",
-		"description",
+	properties[PROP_DESCRIPTION] = g_param_spec_string(
+		"description", "description",
 		"Description text for the mini-dialog, if desired", NULL,
 		G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
 
-	properties[PROP_ICON_NAME] = g_param_spec_string("icon-name",
-		"icon-name",
-		"String specifying the GtkIconTheme name of the dialog's icon",
-		NULL,
+	properties[PROP_ICON_NAME] = g_param_spec_string(
+		"icon-name", "icon-name",
+		"String specifying the GtkIconTheme name of the dialog's icon", NULL,
 		G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
 
-	properties[PROP_CUSTOM_ICON] = g_param_spec_object("custom-icon",
-		"custom-icon",
-		"Pixbuf to use as the dialog's icon",
-		GDK_TYPE_PIXBUF,
+	properties[PROP_CUSTOM_ICON] = g_param_spec_object(
+		"custom-icon", "custom-icon",
+		"Pixbuf to use as the dialog's icon", GDK_TYPE_PIXBUF,
 		G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
 
-	properties[PROP_ENABLE_DESCRIPTION_MARKUP] =
-		g_param_spec_boolean("enable-description-markup",
-		"enable-description-markup",
+	properties[PROP_ENABLE_DESCRIPTION_MARKUP] = g_param_spec_boolean(
+		"enable-description-markup", "enable-description-markup",
 		"Use GMarkup in the description text", FALSE,
 		G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE);
 
-	g_object_class_install_properties(object_class, LAST_PROPERTY, properties);
+	g_object_class_install_properties(obj_class, PROP_LAST, properties);
 }
 
 static void
 pidgin_mini_dialog_init(PidginMiniDialog *self)
 {
 	GtkBox *self_box = GTK_BOX(self);
-
-	PidginMiniDialogPrivate *priv = g_new0(PidginMiniDialogPrivate, 1);
-	self->priv = priv;
+	PidginMiniDialogPrivate *priv =
+		pidgin_mini_dialog_get_instance_private(self);
 
 	gtk_orientable_set_orientation(GTK_ORIENTABLE(self), GTK_ORIENTATION_VERTICAL);
 
@@ -486,3 +349,124 @@ pidgin_mini_dialog_init(PidginMiniDialog
 
 	gtk_widget_show_all(GTK_WIDGET(self));
 }
+
+/******************************************************************************
+ * Public API
+ *****************************************************************************/
+PidginMiniDialog *
+pidgin_mini_dialog_new(const gchar *title,
+                       const gchar *description,
+                       const gchar *icon_name)
+{
+	PidginMiniDialog *mini_dialog = g_object_new(PIDGIN_TYPE_MINI_DIALOG,
+		"title", title,
+		"description", description,
+		"icon-name", icon_name,
+		NULL);
+	return mini_dialog;
+}
+
+PidginMiniDialog *
+pidgin_mini_dialog_new_with_custom_icon(const gchar *title,
+                                        const gchar *description,
+                                        GdkPixbuf *custom_icon)
+{
+	PidginMiniDialog *mini_dialog = g_object_new(PIDGIN_TYPE_MINI_DIALOG,
+		"title", title,
+		"description", description,
+		"custom-icon", custom_icon,
+		NULL);
+	return mini_dialog;
+}
+
+void
+pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog, const gchar *title)
+{
+	g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog));
+
+	g_object_set(G_OBJECT(mini_dialog), "title", title, NULL);
+}
+
+void
+pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog,
+                                   const gchar *description)
+{
+	g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog));
+
+	g_object_set(G_OBJECT(mini_dialog), "description", description, NULL);
+}
+
+void
+pidgin_mini_dialog_enable_description_markup(PidginMiniDialog *mini_dialog)
+{
+	g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog));
+
+	g_object_set(G_OBJECT(mini_dialog), "enable-description-markup", TRUE, NULL);
+}
+
+void
+pidgin_mini_dialog_set_link_callback(PidginMiniDialog *mini_dialog,
+                                     GCallback cb, gpointer user_data)
+{
+	PidginMiniDialogPrivate *priv = NULL;
+
+	g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog));
+
+	priv = pidgin_mini_dialog_get_instance_private(mini_dialog);
+	g_signal_connect(priv->desc, "activate-link", cb, user_data);
+}
+
+void
+pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog,
+                                 const gchar *icon_name)
+{
+	g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog));
+
+	g_object_set(G_OBJECT(mini_dialog), "icon-name", icon_name, NULL);
+}
+
+void
+pidgin_mini_dialog_set_custom_icon(PidginMiniDialog *mini_dialog,
+                                   GdkPixbuf *custom_icon)
+{
+	g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog));
+
+	g_object_set(G_OBJECT(mini_dialog), "custom-icon", custom_icon, NULL);
+}
+
+guint
+pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog)
+{
+	GList *tmp;
+	guint len;
+
+	g_return_val_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog), 0);
+
+	tmp = gtk_container_get_children(GTK_CONTAINER(mini_dialog->contents));
+	len = g_list_length(tmp);
+	g_list_free(tmp);
+
+	return len;
+}
+
+void
+pidgin_mini_dialog_add_button(PidginMiniDialog *mini_dialog,
+                              const gchar *text,
+                              PidginMiniDialogCallback clicked_cb,
+                              gpointer user_data)
+{
+	g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog));
+
+	mini_dialog_add_button(mini_dialog, text, clicked_cb, user_data, TRUE);
+}
+
+void
+pidgin_mini_dialog_add_non_closing_button(PidginMiniDialog *mini_dialog,
+                                          const gchar *text,
+                                          PidginMiniDialogCallback clicked_cb,
+                                          gpointer user_data)
+{
+	g_return_if_fail(PIDGIN_IS_MINI_DIALOG(mini_dialog));
+
+	mini_dialog_add_button(mini_dialog, text, clicked_cb, user_data, FALSE);
+}
