diff --git a/ChangeLog.API b/ChangeLog.API
--- a/ChangeLog.API
+++ b/ChangeLog.API
@@ -670,6 +670,9 @@ version 3.0.0 (??/??/????):
 		* PALETTE_NUM_COLORS renamed to PIDGIN_PALETTE_NUM_COLORS
 		* pidgin_account_option_menu_* renamed to
 		  pidgin_account_chooser_*
+		* pidgin_make_mini_dialog renamed to
+		  pidgin_mini_dialog_new_with_buttons; note the argument order
+		  has changed to match pidgin_mini_dialog_new
 		* pidgin_new_item_from_stock renamed to pidgin_new_menu_item and
 		  removed the accel related parameters.
 		* pidgin_setup_screenname_autocomplete now takes a filter function and
@@ -750,6 +753,8 @@ version 3.0.0 (??/??/????):
 		* pidgin_create_window, use pidgin_window_new instead.
 		* PIDGIN_DIALOG
 		* pidgin_dialogs_alias_contact
+		* pidgin_make_mini_dialog_with_custom_icon; use
+		  pidgin_mini_dialog_new_with_custom_icon instead.
 		* pidgin_make_pretty_arrows
 		* pidgin_menu_position_func_helper
 		* pidgin_mini_dialog_links_supported
@@ -796,6 +801,8 @@ version 3.0.0 (??/??/????):
 		* pidgin_tooltip_setup_for_widget
 		* pidgin_tooltip_show
 		* PidginThemeFont
+		* PidginUtilMiniDialogCallback; use PidginMiniDialogCallback
+		  instead
 		* struct _GtkIMHtmlAnimation
 		* struct _GtkIMHtmlFontDetail
 		* struct _GtkIMHtmlHr
diff --git a/pidgin/gtkaccount.c b/pidgin/gtkaccount.c
--- a/pidgin/gtkaccount.c
+++ b/pidgin/gtkaccount.c
@@ -2422,16 +2422,21 @@ pidgin_accounts_window_hide(void)
 }
 
 static void
-free_add_user_data(PidginAccountAddUserData *data)
+free_add_user_data(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+                   G_GNUC_UNUSED GtkButton *button,
+                   gpointer user_data)
 {
+	PidginAccountAddUserData *data = user_data;
 	g_free(data->username);
 	g_free(data->alias);
 	g_free(data);
 }
 
 static void
-add_user_cb(PidginAccountAddUserData *data)
+add_user_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+            G_GNUC_UNUSED GtkButton *button, gpointer user_data)
 {
+	PidginAccountAddUserData *data = user_data;
 	PurpleConnection *gc = purple_account_get_connection(data->account);
 
 	if (g_list_find(purple_connections_get_all(), gc))
@@ -2440,7 +2445,7 @@ add_user_cb(PidginAccountAddUserData *da
 									 NULL, data->alias);
 	}
 
-	free_add_user_data(data);
+	free_add_user_data(NULL, NULL, user_data);
 }
 
 static char *
@@ -2476,8 +2481,9 @@ pidgin_accounts_notify_added(PurpleAccou
 	gc = purple_account_get_connection(account);
 
 	buffer = make_info(account, gc, remote_user, id, alias, msg);
-	alert = pidgin_make_mini_dialog(gc, "dialog-information", buffer,
-					  NULL, NULL, _("Close"), NULL, NULL);
+	alert = pidgin_mini_dialog_new_with_buttons(
+		buffer, NULL, "dialog-information", NULL,
+		_("Close"), NULL, NULL);
 	pidgin_blist_add_alert(alert);
 
 	g_free(buffer);
@@ -2501,10 +2507,9 @@ pidgin_accounts_request_add(PurpleAccoun
 	data->alias    = g_strdup(alias);
 
 	buffer = make_info(account, gc, remote_user, id, alias, msg);
-	alert = pidgin_make_mini_dialog(gc, "dialog-question",
-					  _("Add buddy to your list?"), buffer, data,
-					  _("Add"), G_CALLBACK(add_user_cb),
-					  _("Cancel"), G_CALLBACK(free_add_user_data), NULL);
+	alert = pidgin_mini_dialog_new_with_buttons(
+		_("Add buddy to your list?"), buffer, "dialog-question", data,
+		_("Add"), add_user_cb, _("Cancel"), free_add_user_data, NULL);
 	pidgin_blist_add_alert(alert);
 
 	g_free(buffer);
@@ -2545,8 +2550,10 @@ authorize_noreason_cb(struct auth_reques
 }
 
 static void
-authorize_reason_cb(struct auth_request *ar)
+authorize_reason_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+                    G_GNUC_UNUSED GtkButton *button, gpointer user_data)
 {
+	struct auth_request *ar = user_data;
 	PurpleProtocol *protocol = purple_account_get_protocol(ar->account);
 
 	if (protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_AUTHORIZATION_GRANTED_MESSAGE)) {
@@ -2584,8 +2591,10 @@ deny_noreason_cb(struct auth_request *ar
 }
 
 static void
-deny_reason_cb(struct auth_request *ar)
+deny_reason_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+               G_GNUC_UNUSED GtkButton *button, gpointer user_data)
 {
+	struct auth_request *ar = user_data;
 	PurpleProtocol *protocol = purple_account_get_protocol(ar->account);
 
 	if (protocol && (purple_protocol_get_options(protocol) & OPT_PROTO_AUTHORIZATION_DENIED_MESSAGE)) {
@@ -2621,8 +2630,8 @@ get_user_info_cb(GtkWidget   *label,
 }
 
 static void
-send_im_cb(PidginMiniDialog *mini_dialog,
-           GtkButton *button,
+send_im_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+           G_GNUC_UNUSED GtkButton *button,
            gpointer data)
 {
 	struct auth_request *ar = data;
@@ -2694,17 +2703,15 @@ pidgin_accounts_request_authorization(Pu
 	aa->account = account;
 	aa->add_buddy_after_auth = !on_list;
 
-	alert = pidgin_make_mini_dialog_with_custom_icon(
-		gc, protocol_icon,
-		_("Authorize buddy?"), NULL, aa,
-		_("Authorize"), authorize_reason_cb,
-		_("Deny"), deny_reason_cb,
-		NULL);
-
-	dialog = PIDGIN_MINI_DIALOG(alert);
+	dialog = pidgin_mini_dialog_new_with_custom_icon(
+		_("Authorize buddy?"), NULL, protocol_icon);
+	alert = GTK_WIDGET(dialog);
+
 	pidgin_mini_dialog_enable_description_markup(dialog);
 	pidgin_mini_dialog_set_link_callback(dialog, G_CALLBACK(get_user_info_cb), aa);
 	pidgin_mini_dialog_set_description(dialog, buffer);
+	pidgin_mini_dialog_add_button(dialog, _("Authorize"), authorize_reason_cb, aa);
+	pidgin_mini_dialog_add_button(dialog, _("Deny"), deny_reason_cb, aa);
 	pidgin_mini_dialog_add_non_closing_button(dialog, _("Send Instant Message"), send_im_cb, aa);
 
 	g_signal_connect_swapped(G_OBJECT(alert), "destroy", G_CALLBACK(free_auth_request), aa);
diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c
--- a/pidgin/gtkblist.c
+++ b/pidgin/gtkblist.c
@@ -4266,15 +4266,30 @@ remove_child_widget_by_account(GtkContai
 /* Generic error buttons */
 
 static void
-generic_error_modify_cb(PurpleAccount *account)
-{
+generic_account_connect_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+                           G_GNUC_UNUSED GtkButton *button,
+                           gpointer user_data)
+{
+	PurpleAccount *account = user_data;
+	purple_account_connect(account);
+}
+
+static void
+generic_error_modify_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+                        G_GNUC_UNUSED GtkButton *button,
+                        gpointer user_data)
+{
+	PurpleAccount *account = user_data;
 	purple_account_clear_current_error(account);
 	pidgin_account_dialog_show(PIDGIN_MODIFY_ACCOUNT_DIALOG, account);
 }
 
 static void
-generic_error_enable_cb(PurpleAccount *account)
-{
+generic_error_enable_cb(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+                        G_GNUC_UNUSED GtkButton *button,
+                        gpointer user_data)
+{
+	PurpleAccount *account = user_data;
 	purple_account_clear_current_error(account);
 	purple_account_set_enabled(account, purple_core_get_ui(), TRUE);
 }
@@ -4316,12 +4331,11 @@ add_generic_error_dialog(PurpleAccount *
 	else
 		primary = g_strdup_printf(_("%s disabled"), username);
 
-	mini_dialog = pidgin_make_mini_dialog(NULL, "dialog-error",
-		primary, err->description, account,
-		(enabled ? _("Reconnect") : _("Re-enable")),
-		(enabled ? PURPLE_CALLBACK(purple_account_connect)
-		         : PURPLE_CALLBACK(generic_error_enable_cb)),
-		_("Modify Account"), PURPLE_CALLBACK(generic_error_modify_cb),
+	mini_dialog = pidgin_mini_dialog_new_with_buttons(
+		primary, err->description, "dialog-error", account,
+		enabled ? _("Reconnect") : _("Re-enable"),
+		enabled ? generic_account_connect_cb : generic_error_enable_cb,
+		_("Modify Account"), generic_error_modify_cb,
 		NULL);
 
 	g_free(primary);
diff --git a/pidgin/gtkutils.h b/pidgin/gtkutils.h
--- a/pidgin/gtkutils.h
+++ b/pidgin/gtkutils.h
@@ -416,73 +416,6 @@ GtkFileChooserNative *pidgin_buddy_icon_
 gpointer pidgin_convert_buddy_icon(PurpleProtocol *protocol, const char *path, size_t *len);
 
 /**
- * PidginUtilMiniDialogCallback:
- *
- * The type of callbacks passed to pidgin_make_mini_dialog().
- */
-typedef void (*PidginUtilMiniDialogCallback)(gpointer user_data, GtkButton *button);
-
-/**
- * pidgin_make_mini_dialog:
- * @handle:         The #PurpleConnection to which this mini-dialog
- *                       refers, or %NULL if it does not refer to a
- *                       connection.  If @handle is supplied, the mini-dialog
- *                       will be automatically removed and destroyed when the
- *                       connection signs off.
- * @stock_id:       The ID of a stock image to use in the mini dialog.
- * @primary:        The primary text
- * @secondary:      The secondary text, or %NULL for no description.
- * @user_data:      Data to pass to the callbacks
- * @...:            a %NULL-terminated list of button labels
- *                       (<type>char *</type>) and callbacks
- *                       (#PidginUtilMiniDialogCallback).  @user_data will be
- *                       passed as the first argument.  (Callbacks may lack a
- *                       second argument, or be %NULL to take no action when
- *                       the corresponding button is pressed.) When a button is
- *                       pressed, the callback (if any) will be called; when
- *                       the callback returns the dialog will be destroyed.
- *
- * Creates a #PidginMiniDialog, tied to a #PurpleConnection, suitable for
- * embedding in the buddy list scrollbook with pidgin_blist_add_alert().
- *
- * See <link linkend="pidgin-pidginstock">Stock Resources</link>.
- *
- * Returns: (transfer full): A #PidginMiniDialog, suitable for passing to
- *                       pidgin_blist_add_alert().
- */
-GtkWidget *pidgin_make_mini_dialog(PurpleConnection *handle,
-	const char* stock_id, const char *primary, const char *secondary,
-	void *user_data, ...) G_GNUC_NULL_TERMINATED;
-
-/**
- * pidgin_make_mini_dialog_with_custom_icon:
- * @custom_icon: A custom GdkPixbuf to use.
- * @primary: The primary text
- * @secondary: The secondary text, or %NULL for no description.
- * @user_data: Data to pass to the callbacks
- * @...: a %NULL-terminated list of button labels
- *       (<type>char *</type>) and callbacks
- *       (#PidginUtilMiniDialogCallback).  @user_data will be
- *       passed as the first argument.  (Callbacks may lack a
- *       second argument, or be %NULL to take no action when
- *       the corresponding button is pressed.) When a button is
- *       pressed, the callback (if any) will be called; when
- *       the callback returns the dialog will be destroyed.
- *
- * Does exactly what pidgin_make_mini_dialog() does, except you can specify
- * a custom icon for the dialog.
- *
- * Returns: (transfer full): A #PidginMiniDialog, suitable for passing to
- *          pidgin_blist_add_alert().
- */
-GtkWidget *pidgin_make_mini_dialog_with_custom_icon(PurpleConnection *gc,
-	GdkPixbuf *custom_icon,
-	const char *primary,
-	const char *secondary,
-	void *user_data,
-	...) G_GNUC_NULL_TERMINATED;
-
-/**
  * pidgin_tree_view_search_equal_func:
  *
  * This is a callback function to be used for Ctrl+F searching in treeviews.
diff --git a/pidgin/gtkutils.c b/pidgin/gtkutils.c
--- a/pidgin/gtkutils.c
+++ b/pidgin/gtkutils.c
@@ -110,18 +110,11 @@ struct _icon_chooser {
 	gpointer data;
 };
 
-struct _old_button_clicked_cb_data
-{
-	PidginUtilMiniDialogCallback cb;
-	gpointer data;
-};
-
 /******************************************************************************
  * Globals
  *****************************************************************************/
 
 static guint accels_save_timer = 0;
-static GSList *minidialogs = NULL;
 
 /******************************************************************************
  * Code
@@ -1687,116 +1680,6 @@ pidgin_convert_buddy_icon(PurpleProtocol
 	return NULL;
 }
 
-static void *
-pidgin_utils_get_handle(void)
-{
-	static int handle;
-
-	return &handle;
-}
-
-static void connection_signed_off_cb(PurpleConnection *gc)
-{
-	GSList *list, *l_next;
-	for (list = minidialogs; list; list = l_next) {
-		l_next = list->next;
-		if (g_object_get_data(G_OBJECT(list->data), "gc") == gc) {
-				gtk_widget_destroy(GTK_WIDGET(list->data));
-		}
-	}
-}
-
-static void alert_killed_cb(GtkWidget *widget)
-{
-	minidialogs = g_slist_remove(minidialogs, widget);
-}
-
-static void
-old_mini_dialog_button_clicked_cb(PidginMiniDialog *mini_dialog,
-                                  GtkButton *button,
-                                  gpointer user_data)
-{
-	struct _old_button_clicked_cb_data *data = user_data;
-	data->cb(data->data, button);
-}
-
-static void
-old_mini_dialog_destroy_cb(GtkWidget *dialog,
-                           GList *cb_datas)
-{
-	g_list_free_full(cb_datas, g_free);
-}
-
-static void
-mini_dialog_init(PidginMiniDialog *mini_dialog, PurpleConnection *gc, void *user_data, va_list args)
-{
-	const char *button_text;
-	GList *cb_datas = NULL;
-	static gboolean first_call = TRUE;
-
-	if (first_call) {
-		first_call = FALSE;
-		purple_signal_connect(purple_connections_get_handle(), "signed-off",
-		                      pidgin_utils_get_handle(),
-		                      PURPLE_CALLBACK(connection_signed_off_cb), NULL);
-	}
-
-	g_object_set_data(G_OBJECT(mini_dialog), "gc" ,gc);
-	g_signal_connect(G_OBJECT(mini_dialog), "destroy",
-		G_CALLBACK(alert_killed_cb), NULL);
-
-	while ((button_text = va_arg(args, char*))) {
-		struct _old_button_clicked_cb_data *data = NULL;
-		PidginMiniDialogCallback wrapper_cb = NULL;
-		PidginUtilMiniDialogCallback callback =
-			va_arg(args, PidginUtilMiniDialogCallback);
-
-		if (callback != NULL) {
-			data = g_new0(struct _old_button_clicked_cb_data, 1);
-			data->cb = callback;
-			data->data = user_data;
-			wrapper_cb = old_mini_dialog_button_clicked_cb;
-		}
-		pidgin_mini_dialog_add_button(mini_dialog, button_text,
-			wrapper_cb, data);
-		cb_datas = g_list_append(cb_datas, data);
-	}
-
-	g_signal_connect(G_OBJECT(mini_dialog), "destroy",
-		G_CALLBACK(old_mini_dialog_destroy_cb), cb_datas);
-}
-
-#define INIT_AND_RETURN_MINI_DIALOG(mini_dialog) \
-	va_list args; \
-	va_start(args, user_data); \
-	mini_dialog_init(mini_dialog, gc, user_data, args); \
-	va_end(args); \
-	return GTK_WIDGET(mini_dialog);
-
-GtkWidget *
-pidgin_make_mini_dialog(PurpleConnection *gc,
-                        const char *icon_name,
-                        const char *primary,
-                        const char *secondary,
-                        void *user_data,
-                        ...)
-{
-	PidginMiniDialog *mini_dialog = pidgin_mini_dialog_new(primary, secondary, icon_name);
-	INIT_AND_RETURN_MINI_DIALOG(mini_dialog);
-}
-
-GtkWidget *
-pidgin_make_mini_dialog_with_custom_icon(PurpleConnection *gc,
-					GdkPixbuf *custom_icon,
-					const char *primary,
-					const char *secondary,
-					void *user_data,
-					...)
-{
-	PidginMiniDialog *mini_dialog = pidgin_mini_dialog_new_with_custom_icon(primary, secondary, custom_icon);
-	INIT_AND_RETURN_MINI_DIALOG(mini_dialog);
-}
-
 /*
  * "This is so dead sexy."
  * "Two thumbs up."
diff --git a/pidgin/minidialog.h b/pidgin/minidialog.h
--- a/pidgin/minidialog.h
+++ b/pidgin/minidialog.h
@@ -124,6 +124,32 @@ PidginMiniDialog *pidgin_mini_dialog_new
 	const gchar *description, GdkPixbuf *custom_icon);
 
 /**
+ * pidgin_mini_dialog_new_with_buttons:
+ * @title: The primary text.
+ * @description: The secondary text, or %NULL for no description.
+ * @icon_name: The name of an icon to use in the mini dialog.
+ * @user_data: Data to pass to the callbacks.
+ * @...: A %NULL-terminated list of button labels (<type>char *</type>) and
+ *       callbacks (#PidginMiniDialogCallback).  (Callbacks may be %NULL to
+ *       take no action when the corresponding button is pressed.) When a
+ *       button is pressed, the callback (if any) will be called; when the
+ *       callback returns the dialog will be destroyed.
+ *
+ * Creates a #PidginMiniDialog, suitable for embedding in the buddy list
+ * scrollbook with pidgin_blist_add_alert().
+ *
+ * Returns: (transfer full): A #PidginMiniDialog, suitable for passing to
+ *          pidgin_blist_add_alert().
+ *
+ * Since: 3.0.0
+ */
+GtkWidget *pidgin_mini_dialog_new_with_buttons(const gchar *title,
+                                               const gchar *description,
+                                               const gchar *icon_name,
+                                               gpointer user_data, ...)
+                                               G_GNUC_NULL_TERMINATED;
+
+/**
  * pidgin_mini_dialog_set_title:
  * @mini_dialog: a mini-dialog
  * @title:       the new title for @mini_dialog
diff --git a/pidgin/minidialog.c b/pidgin/minidialog.c
--- a/pidgin/minidialog.c
+++ b/pidgin/minidialog.c
@@ -379,6 +379,31 @@ pidgin_mini_dialog_new_with_custom_icon(
 	return mini_dialog;
 }
 
+GtkWidget *
+pidgin_mini_dialog_new_with_buttons(const gchar *title,
+                                    const gchar *description,
+                                    const gchar *icon_name, gpointer user_data,
+                                    ...)
+{
+	PidginMiniDialog *mini_dialog = NULL;
+	const char *button_text = NULL;
+	va_list args;
+
+	mini_dialog = pidgin_mini_dialog_new(title, description, icon_name);
+
+	va_start(args, user_data);
+	while ((button_text = va_arg(args, gchar *)) != NULL) {
+		PidginMiniDialogCallback callback =
+			va_arg(args, PidginMiniDialogCallback);
+
+		pidgin_mini_dialog_add_button(mini_dialog, button_text, callback,
+		                              user_data);
+	}
+	va_end(args);
+
+	return GTK_WIDGET(mini_dialog);
+}
+
 void
 pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog, const gchar *title)
 {
diff --git a/pidgin/plugins/relnot.c b/pidgin/plugins/relnot.c
--- a/pidgin/plugins/relnot.c
+++ b/pidgin/plugins/relnot.c
@@ -34,14 +34,18 @@ static SoupSession *session = NULL;
 #define MIN_CHECK_INTERVAL 60 * 60 * 24
 
 static void
-release_hide()
+release_hide(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+             G_GNUC_UNUSED GtkButton *button,
+             G_GNUC_UNUSED gpointer user_data)
 {
 	/* No-op.  We may use this method in the future to avoid showing
 	 * the popup twice */
 }
 
 static void
-release_show()
+release_show(G_GNUC_UNUSED PidginMiniDialog *mini_dialog,
+             G_GNUC_UNUSED GtkButton *button,
+             G_GNUC_UNUSED gpointer user_data)
 {
 	purple_notify_uri(NULL, PURPLE_WEBSITE);
 }
@@ -77,14 +81,9 @@ version_fetch_cb(G_GNUC_UNUSED SoupSessi
 	g_string_append_printf(message, _("You can upgrade to %s %s today."),
 			PIDGIN_NAME, cur_ver);
 
-	release_dialog = pidgin_make_mini_dialog(
-		NULL, "dialog-information",
-		_("New Version Available"),
-		message->str,
-		NULL,
-		_("Later"), PURPLE_CALLBACK(release_hide),
-		_("Download Now"), PURPLE_CALLBACK(release_show),
-		NULL);
+	release_dialog = pidgin_mini_dialog_new_with_buttons(
+		_("New Version Available"), message->str, "dialog-information", NULL,
+		_("Later"), release_hide, _("Download Now"), release_show, NULL);
 
 	pidgin_blist_add_alert(release_dialog);
 
