diff --git a/pidgin/pidgininfopane.h b/pidgin/pidgininfopane.h
--- a/pidgin/pidgininfopane.h
+++ b/pidgin/pidgininfopane.h
@@ -69,6 +69,19 @@
  */
 PurpleConversation *pidgin_info_pane_get_conversation(PidginInfoPane *pane);
 
+/**
+ * pidgin_info_pane_set_conversation:
+ * @pane: The instance.
+ * @conversation: (nullable): The [class@Purple.Conversation] to use.
+ *
+ * Sets the conversation that @pane uses to get its values.
+ *
+ * Typically this is only necessary for the conversation instance itself.
+ *
+ * Since: 3.0.0
+ */
+void pidgin_info_pane_set_conversation(PidginInfoPane *pane, PurpleConversation *conversation);
+
 G_END_DECLS
 
 #endif /* PIDGIN_INFO_PANE_H */
# HG changeset patch
# Node ID 88f3ad078cda
# Parent  5ac321d71801
diff --git a/pidgin/pidgininfopane.c b/pidgin/pidgininfopane.c
--- a/pidgin/pidgininfopane.c
+++ b/pidgin/pidgininfopane.c
@@ -35,8 +35,13 @@
 
 	GtkWidget *hbox;
 	GtkWidget *presence_icon;
+
 	GtkWidget *name;
+	GBinding *name_binding;
+
 	GtkWidget *topic;
+	GBinding *topic_binding;
+
 	GtkWidget *avatar;
 };
 
@@ -50,60 +55,6 @@
 G_DEFINE_TYPE(PidginInfoPane, pidgin_info_pane, GTK_TYPE_BOX)
 
 /******************************************************************************
- * Helpers
- *****************************************************************************/
-static void
-pidgin_info_pane_set_conversation(PidginInfoPane *pane,
-                                  PurpleConversation *conversation)
-{
-	if(!g_set_object(&pane->conversation, conversation)) {
-		return;
-	}
-
-	/* Tell the avatar about the new conversation. */
-	pidgin_avatar_set_conversation(PIDGIN_AVATAR(pane->avatar),
-	                               pane->conversation);
-
-	if(PURPLE_IS_CONVERSATION(conversation)) {
-		PidginPresenceIcon *presence_icon = NULL;
-		PurplePresence *presence = NULL;
-		const gchar *fallback = "person";
-
-		g_object_bind_property(G_OBJECT(conversation), "name",
-		                       G_OBJECT(pane->name), "label",
-		                       G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
-
-		if(PURPLE_IS_CHAT_CONVERSATION(conversation)) {
-			g_object_bind_property(G_OBJECT(conversation), "topic",
-			                       G_OBJECT(pane->topic), "label",
-			                       G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
-			fallback = "chat";
-		} else if(PURPLE_IS_IM_CONVERSATION(conversation)){
-			PurpleAccount *account = NULL;
-			PurpleBuddy *buddy = NULL;
-			const gchar *name = NULL;
-
-			account = purple_conversation_get_account(conversation);
-			name = purple_conversation_get_name(conversation);
-			buddy = purple_blist_find_buddy(account, name);
-
-			if(PURPLE_IS_BUDDY(buddy)) {
-				presence = purple_buddy_get_presence(buddy);
-			}
-
-			fallback = "person";
-		}
-
-		presence_icon = PIDGIN_PRESENCE_ICON(pane->presence_icon);
-		pidgin_presence_icon_set_fallback(presence_icon, fallback);
-		pidgin_presence_icon_set_presence(presence_icon, presence);
-	}
-
-	/* Notify that we changed. */
-	g_object_notify_by_pspec(G_OBJECT(pane), properties[PROP_CONVERSATION]);
-}
-
-/******************************************************************************
  * GObject Implementation
  *****************************************************************************/
 static void
@@ -170,7 +121,7 @@
 		"conversation", "conversation",
 		"The PurpleConversation instance",
 		PURPLE_TYPE_CONVERSATION,
-		G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+		G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
 	g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
 
@@ -203,3 +154,63 @@
 
 	return pane->conversation;
 }
+
+void
+pidgin_info_pane_set_conversation(PidginInfoPane *pane,
+                                  PurpleConversation *conversation)
+{
+	g_return_if_fail(PIDGIN_IS_INFO_PANE(pane));
+
+	if(!g_set_object(&pane->conversation, conversation)) {
+		return;
+	}
+
+	/* Remove the old bindings. */
+	g_clear_pointer(&pane->name_binding, g_binding_unbind);
+	g_clear_pointer(&pane->topic_binding, g_binding_unbind);
+
+	/* Tell the avatar about the new conversation. */
+	pidgin_avatar_set_conversation(PIDGIN_AVATAR(pane->avatar),
+	                               pane->conversation);
+
+	if(PURPLE_IS_CONVERSATION(conversation)) {
+		PidginPresenceIcon *presence_icon = NULL;
+		PurplePresence *presence = NULL;
+		const gchar *fallback = "person";
+
+		pane->name_binding =
+			g_object_bind_property(G_OBJECT(conversation), "name",
+			                       G_OBJECT(pane->name), "label",
+			                       G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+
+		pane->topic_binding =
+			g_object_bind_property(G_OBJECT(conversation), "topic",
+			                       G_OBJECT(pane->topic), "label",
+			                       G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
+
+		if(PURPLE_IS_CHAT_CONVERSATION(conversation)) {
+			fallback = "chat";
+		} else if(PURPLE_IS_IM_CONVERSATION(conversation)) {
+			PurpleAccount *account = NULL;
+			PurpleBuddy *buddy = NULL;
+			const gchar *name = NULL;
+
+			account = purple_conversation_get_account(conversation);
+			name = purple_conversation_get_name(conversation);
+			buddy = purple_blist_find_buddy(account, name);
+
+			if(PURPLE_IS_BUDDY(buddy)) {
+				presence = purple_buddy_get_presence(buddy);
+			}
+
+			fallback = "person";
+		}
+
+		presence_icon = PIDGIN_PRESENCE_ICON(pane->presence_icon);
+		pidgin_presence_icon_set_fallback(presence_icon, fallback);
+		pidgin_presence_icon_set_presence(presence_icon, presence);
+	}
+
+	/* Notify that we changed. */
+	g_object_notify_by_pspec(G_OBJECT(pane), properties[PROP_CONVERSATION]);
+}
