diff --git a/ChangeLog.API b/ChangeLog.API
--- a/ChangeLog.API
+++ b/ChangeLog.API
@@ -57,11 +57,9 @@
 		* purple_request_fields_set_ui_data
 		* purple_roomlist_get_account
 		* purple_roomlist_get_proto_data
-		* purple_roomlist_get_ui_data
 		* purple_roomlist_room_get_expanded_once
 		* purple_roomlist_room_set_expanded_once
 		* purple_roomlist_set_proto_data
-		* purple_roomlist_set_ui_data
 		* purple_time_parse_month
 		* purple_whiteboard_get_account
 		* purple_whiteboard_get_draw_list
diff --git a/finch/gntroomlist.c b/finch/gntroomlist.c
--- a/finch/gntroomlist.c
+++ b/finch/gntroomlist.c
@@ -335,7 +335,7 @@
 static void
 fl_create(PurpleRoomlist *list)
 {
-	purple_roomlist_set_ui_data(list, &froomlist);
+	g_object_set_data(G_OBJECT(list), "finch-ui", &froomlist);
 	setup_roomlist(NULL);
 	update_roomlist(list);
 }
diff --git a/libpurple/roomlist.h b/libpurple/roomlist.h
--- a/libpurple/roomlist.h
+++ b/libpurple/roomlist.h
@@ -138,16 +138,11 @@
 
 /**
  * PurpleRoomlist:
- * @ui_data: The UI data associated with this room list. This is a convenience
- *           field provided to the UIs -- it is not used by the libpurple core.
  *
  * Represents a list of rooms for a given connection on a given protocol.
  */
 struct _PurpleRoomlist {
 	GObject gparent;
-
-	/*< public >*/
-	gpointer ui_data;
 };
 
 G_BEGIN_DECLS
@@ -313,27 +308,6 @@
  */
 void purple_roomlist_set_protocol_data(PurpleRoomlist *list, gpointer proto_data);
 
-/**
- * purple_roomlist_get_ui_data:
- * @list: The roomlist, which must not be %NULL.
- *
- * Get the UI data associated with this room list.
- *
- * Returns: The UI data associated with this room list.  This is a
- *         convenience field provided to the UIs--it is not
- *         used by the libpurple core.
- */
-gpointer purple_roomlist_get_ui_data(PurpleRoomlist *list);
-
-/**
- * purple_roomlist_set_ui_data:
- * @list: The roomlist, which must not be %NULL.
- * @ui_data: A pointer to associate with this room list.
- *
- * Set the UI data associated with this room list.
- */
-void purple_roomlist_set_ui_data(PurpleRoomlist *list, gpointer ui_data);
-
 /**************************************************************************/
 /* Protocol Roomlist Interface API                                        */
 /**************************************************************************/
diff --git a/libpurple/roomlist.c b/libpurple/roomlist.c
--- a/libpurple/roomlist.c
+++ b/libpurple/roomlist.c
@@ -244,20 +244,6 @@
 	priv->proto_data = proto_data;
 }
 
-gpointer purple_roomlist_get_ui_data(PurpleRoomlist *list)
-{
-	g_return_val_if_fail(PURPLE_IS_ROOMLIST(list), NULL);
-
-	return list->ui_data;
-}
-
-void purple_roomlist_set_ui_data(PurpleRoomlist *list, gpointer ui_data)
-{
-	g_return_if_fail(PURPLE_IS_ROOMLIST(list));
-
-	list->ui_data = ui_data;
-}
-
 /**************************************************************************/
 /* Room List GObject code                                                 */
 /**************************************************************************/
diff --git a/pidgin/gtkroomlist.c b/pidgin/gtkroomlist.c
--- a/pidgin/gtkroomlist.c
+++ b/pidgin/gtkroomlist.c
@@ -36,6 +36,8 @@
 G_DECLARE_FINAL_TYPE(PidginRoomlistDialog, pidgin_roomlist_dialog, PIDGIN,
                      ROOMLIST_DIALOG, GtkDialog)
 
+#define PIDGIN_ROOMLIST_UI_DATA "pidgin-ui"
+
 struct _PidginRoomlistDialog {
 	GtkDialog parent;
 
@@ -93,7 +95,10 @@
 		g_source_remove(dialog->pg_update_to);
 
 	if (dialog->roomlist) {
-		PidginRoomlist *rl = purple_roomlist_get_ui_data(dialog->roomlist);
+		PidginRoomlist *rl = NULL;
+
+		rl = g_object_get_data(G_OBJECT(dialog->roomlist),
+		                       PIDGIN_ROOMLIST_UI_DATA);
 
 		if (dialog->pg_update_to > 0)
 			/* yes, that's right, unref it twice. */
@@ -117,7 +122,10 @@
 	dialog->account = account;
 
 	if (change && dialog->roomlist) {
-		PidginRoomlist *rl = purple_roomlist_get_ui_data(dialog->roomlist);
+		PidginRoomlist *rl = NULL;
+
+		rl = g_object_get_data(G_OBJECT(dialog->roomlist),
+		                       PIDGIN_ROOMLIST_UI_DATA);
 		if (rl->tree) {
 			gtk_widget_destroy(rl->tree);
 			rl->tree = NULL;
@@ -137,7 +145,9 @@
 		return;
 
 	if (dialog->roomlist != NULL) {
-		rl = purple_roomlist_get_ui_data(dialog->roomlist);
+		rl = g_object_get_data(G_OBJECT(dialog->roomlist),
+		                       PIDGIN_ROOMLIST_UI_DATA);
+
 		gtk_widget_destroy(rl->tree);
 		g_object_unref(dialog->roomlist);
 	}
@@ -146,7 +156,9 @@
 	if (!dialog->roomlist)
 		return;
 	g_object_ref(dialog->roomlist);
-	rl = purple_roomlist_get_ui_data(dialog->roomlist);
+
+	rl = g_object_get_data(G_OBJECT(dialog->roomlist),
+	                       PIDGIN_ROOMLIST_UI_DATA);
 	rl->dialog = dialog;
 
 	gtk_widget_set_sensitive(dialog->account_widget, FALSE);
@@ -240,9 +252,11 @@
 static void add_room_to_blist_cb(GtkButton *button, PidginRoomlistDialog *dialog)
 {
 	PurpleRoomlist *rl = dialog->roomlist;
-	PidginRoomlist *grl = purple_roomlist_get_ui_data(rl);
+	PidginRoomlist *grl = NULL;
 	struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "room-info");
 
+	grl = g_object_get_data(G_OBJECT(rl), PIDGIN_ROOMLIST_UI_DATA);
+
 	if(info != NULL)
 		do_add_room_cb(grl->tree, info);
 }
@@ -255,9 +269,11 @@
 static void join_button_cb(GtkButton *button, PidginRoomlistDialog *dialog)
 {
 	PurpleRoomlist *rl = dialog->roomlist;
-	PidginRoomlist *grl = purple_roomlist_get_ui_data(rl);
+	PidginRoomlist *grl = NULL;
 	struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "room-info");
 
+	grl = g_object_get_data(G_OBJECT(rl), PIDGIN_ROOMLIST_UI_DATA);
+
 	if(info != NULL)
 		do_join_cb(grl->tree, info);
 }
@@ -265,12 +281,14 @@
 static void row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *arg2,
                       PurpleRoomlist *list)
 {
-	PidginRoomlist *grl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *grl = NULL;
 	GtkTreeIter iter;
 	PurpleRoomlistRoom *room;
 	GValue val;
 	struct _menu_cb_info info;
 
+	grl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
+
 	gtk_tree_model_get_iter(GTK_TREE_MODEL(grl->model), &iter, path);
 	val.g_type = 0;
 	gtk_tree_model_get_value(GTK_TREE_MODEL(grl->model), &iter, ROOM_COLUMN, &val);
@@ -287,7 +305,7 @@
 static gboolean room_click_cb(GtkWidget *tv, GdkEventButton *event, PurpleRoomlist *list)
 {
 	GtkTreePath *path;
-	PidginRoomlist *grl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *grl = NULL;
 	GValue val;
 	PurpleRoomlistRoom *room;
 	GtkTreeIter iter;
@@ -297,6 +315,8 @@
 	if (!gdk_event_triggers_context_menu((GdkEvent *)event))
 		return FALSE;
 
+	grl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
+
 	/* Here we figure out which room was clicked */
 	if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL))
 		return FALSE;
@@ -347,12 +367,15 @@
 pidgin_roomlist_paint_tooltip(GtkWidget *widget, cairo_t *cr, gpointer user_data)
 {
 	PurpleRoomlist *list = user_data;
-	PidginRoomlist *grl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *grl = NULL;
 	int current_height, max_width;
 	int max_text_width;
-	GtkTextDirection dir = gtk_widget_get_direction(GTK_WIDGET(grl->tree));
+	GtkTextDirection dir;
 	GtkStyleContext *context;
 
+	grl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
+	dir = gtk_widget_get_direction(GTK_WIDGET(grl->tree));
+
 	context = gtk_widget_get_style_context(grl->tipwindow);
 	gtk_style_context_add_class(context, GTK_STYLE_CLASS_TOOLTIP);
 
@@ -389,7 +412,7 @@
 
 static gboolean pidgin_roomlist_create_tip(PurpleRoomlist *list, GtkTreePath *path)
 {
-	PidginRoomlist *grl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *grl = NULL;
 	PurpleRoomlistRoom *room;
 	GtkTreeIter iter;
 	GValue val;
@@ -399,6 +422,8 @@
 	gint j;
 	gboolean first = TRUE;
 
+	grl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
+
 #if 0
 	if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), grl->tip_rect.x, grl->tip_rect.y + (grl->tip_rect.height/2),
 		&path, NULL, NULL, NULL))
@@ -478,7 +503,9 @@
 		gpointer data, int *w, int *h)
 {
 	PurpleRoomlist *list = data;
-	PidginRoomlist *grl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *grl = NULL;
+
+	grl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
 	grl->tipwindow = widget;
 	if (!pidgin_roomlist_create_tip(data, path))
 		return FALSE;
@@ -607,7 +634,7 @@
 {
 	PidginRoomlist *rl = g_new0(PidginRoomlist, 1);
 
-	purple_roomlist_set_ui_data(list, rl);
+	g_object_set_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA, rl);
 
 	rl->cats = g_hash_table_new_full(NULL, NULL, NULL, (GDestroyNotify)gtk_tree_row_reference_free);
 
@@ -670,7 +697,7 @@
 
 static void pidgin_roomlist_set_fields(PurpleRoomlist *list, GList *fields)
 {
-	PidginRoomlist *grl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *grl = NULL;
 	gint columns = NUM_OF_COLUMNS;
 	int j;
 	GtkTreeStore *model;
@@ -681,6 +708,7 @@
 	GList *l;
 	GType *types;
 
+	grl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
 	g_return_if_fail(grl != NULL);
 
 	columns += g_list_length(fields);
@@ -774,8 +802,9 @@
 static gboolean pidgin_progress_bar_pulse(gpointer data)
 {
 	PurpleRoomlist *list = data;
-	PidginRoomlist *rl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *rl = NULL;
 
+	rl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
 	if (!rl || !rl->dialog || !rl->dialog->pg_needs_pulse) {
 		if (rl && rl->dialog)
 			rl->dialog->pg_update_to = 0;
@@ -790,7 +819,7 @@
 
 static void pidgin_roomlist_add_room(PurpleRoomlist *list, PurpleRoomlistRoom *room)
 {
-	PidginRoomlist *rl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *rl = NULL;
 	GtkTreeRowReference *rr, *parentrr = NULL;
 	GtkTreePath *path;
 	GtkTreeIter iter, parent, child;
@@ -798,6 +827,8 @@
 	int j;
 	gboolean append = TRUE;
 
+	rl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
+
 	rl->total_rooms++;
 	if (purple_roomlist_room_get_room_type(room) == PURPLE_ROOMLIST_ROOMTYPE_ROOM)
 		rl->num_rooms++;
@@ -862,8 +893,9 @@
 
 static void pidgin_roomlist_in_progress(PurpleRoomlist *list, gboolean in_progress)
 {
-	PidginRoomlist *rl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *rl = NULL;
 
+	rl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
 	if (!rl || !rl->dialog)
 		return;
 
@@ -884,7 +916,9 @@
 
 static void pidgin_roomlist_destroy(PurpleRoomlist *list)
 {
-	PidginRoomlist *rl = purple_roomlist_get_ui_data(list);
+	PidginRoomlist *rl = NULL;
+
+	rl = g_object_get_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA);
 
 	roomlists = g_list_remove(roomlists, list);
 
@@ -892,7 +926,7 @@
 
 	g_hash_table_destroy(rl->cats);
 	g_free(rl);
-	purple_roomlist_set_ui_data(list, NULL);
+	g_object_set_data(G_OBJECT(list), PIDGIN_ROOMLIST_UI_DATA, NULL);
 }
 
 static PurpleRoomlistUiOps ops = {
