diff --git a/libpurple/protocols/bonjour/xmpp.c b/libpurple/protocols/bonjour/xmpp.c
--- a/libpurple/protocols/bonjour/xmpp.c
+++ b/libpurple/protocols/bonjour/xmpp.c
@@ -268,8 +268,11 @@
 		g_clear_error(&error);
 		return;
 	} else if (ret <= 0) {
+		PurpleAccount *account = NULL;
 		PurpleConversation *conv = NULL;
-		PurpleAccount *account = NULL;
+		PurpleConversationManager *manager = NULL;
+
+		manager = purple_conversation_manager_get_default();
 
 		purple_debug_error(
 		        "bonjour",
@@ -279,11 +282,12 @@
 
 		account = purple_buddy_get_account(pb);
 
-		conv = PURPLE_CONVERSATION(purple_conversations_find_im_with_account(bb->name, account));
-		if (conv != NULL)
+		conv = purple_conversation_manager_find_im(manager, account, bb->name);
+		if (conv != NULL) {
 			purple_conversation_write_system_message(conv,
 				_("Unable to send message."),
 				PURPLE_MESSAGE_ERROR);
+		}
 
 		bonjour_xmpp_close_conversation(bb->conversation);
 		bb->conversation = NULL;
@@ -321,8 +325,11 @@
 		ret = 0;
 		g_clear_error(&error);
 	} else if (ret <= 0) {
+		PurpleAccount *account;
 		PurpleConversation *conv;
-		PurpleAccount *account;
+		PurpleConversationManager *manager;
+
+		manager = purple_conversation_manager_get_default();
 
 		purple_debug_error(
 		        "bonjour",
@@ -332,11 +339,12 @@
 
 		account = purple_buddy_get_account(pb);
 
-		conv = PURPLE_CONVERSATION(purple_conversations_find_im_with_account(bb->name, account));
-		if (conv != NULL)
+		conv = purple_conversation_manager_find_im(manager, account, bb->name);
+		if (conv != NULL) {
 			purple_conversation_write_system_message(conv,
 				_("Unable to send message."),
 				PURPLE_MESSAGE_ERROR);
+		}
 
 		bonjour_xmpp_close_conversation(bb->conversation);
 		bb->conversation = NULL;
@@ -470,8 +478,11 @@
 		return;
 	} else if (ret <= 0) {
 		PurpleConversation *conv;
+		PurpleConversationManager *manager;
+		BonjourBuddy *bb = NULL;
 		const char *bname = bconv->buddy_name;
-		BonjourBuddy *bb = NULL;
+
+		manager = purple_conversation_manager_get_default();
 
 		if(bconv->pb) {
 			bb = purple_buddy_get_protocol_data(bconv->pb);
@@ -484,15 +495,18 @@
 		        bname ? bname : "(unknown)", bconv->ip,
 		        error ? error->message : "(null)");
 
-		conv = PURPLE_CONVERSATION(purple_conversations_find_im_with_account(bname, bconv->account));
-		if (conv != NULL)
+		conv = purple_conversation_manager_find_im(manager, bconv->account,
+		                                           bname);
+		if (conv != NULL) {
 			purple_conversation_write_system_message(conv,
 				_("Unable to send the message, the conversation couldn't be started."),
 				PURPLE_MESSAGE_ERROR);
+		}
 
 		bonjour_xmpp_close_conversation(bconv);
-		if(bb != NULL)
+		if(bb != NULL) {
 			bb->conversation = NULL;
+		}
 
 		g_clear_error(&error);
 		return;
@@ -558,11 +572,17 @@
 
 		if (bconv->pb) {
 			PurpleConversation *conv;
-			conv = PURPLE_CONVERSATION(purple_conversations_find_im_with_account(bname, bconv->account));
-			if (conv != NULL)
+			PurpleConversationManager *manager;
+
+			manager = purple_conversation_manager_get_default();
+
+			conv = purple_conversation_manager_find_im(manager, bconv->account,
+			                                           bname);
+			if (conv != NULL) {
 				purple_conversation_write_system_message(conv,
 					_("Unable to send the message, the conversation couldn't be started."),
 					PURPLE_MESSAGE_ERROR);
+			}
 		}
 
 		purple_gio_graceful_close(G_IO_STREAM(bconv->socket),
@@ -621,11 +641,17 @@
 
 		if (bconv->pb) {
 			PurpleConversation *conv;
-			conv = PURPLE_CONVERSATION(purple_conversations_find_im_with_account(bname, bconv->account));
-			if (conv != NULL)
+			PurpleConversationManager *manager;
+
+			manager = purple_conversation_manager_get_default();
+
+			conv = purple_conversation_manager_find_im(manager, bconv->account,
+			                                           bname);
+			if (conv != NULL) {
 				purple_conversation_write_system_message(conv,
 					_("Unable to send the message, the conversation couldn't be started."),
 					PURPLE_MESSAGE_ERROR);
+			}
 		}
 
 		/* We don't want to recieve anything else */
@@ -780,8 +806,9 @@
 	                                              res, &error);
 
 	if (conn == NULL) {
+		PurpleAccount *account = NULL;
 		PurpleConversation *conv = NULL;
-		PurpleAccount *account = NULL;
+		PurpleConversationManager *manager = NULL;
 		GSList *tmp;
 
 		if (error && error->code == G_IO_ERROR_CANCELLED) {
@@ -833,11 +860,14 @@
 
 		purple_debug_error("bonjour", "No more addresses for buddy %s. Aborting", purple_buddy_get_name(pb));
 
-		conv = PURPLE_CONVERSATION(purple_conversations_find_im_with_account(bb->name, account));
-		if (conv != NULL)
+		manager = purple_conversation_manager_get_default();
+
+		conv = purple_conversation_manager_find_im(manager, account, bb->name);
+		if (conv != NULL) {
 			purple_conversation_write_system_message(conv,
 				_("Unable to send the message, the conversation couldn't be started."),
 				PURPLE_MESSAGE_ERROR);
+		}
 
 		bonjour_xmpp_close_conversation(bb->conversation);
 		bb->conversation = NULL;
@@ -851,8 +881,9 @@
 	        g_object_ref(g_io_stream_get_output_stream(G_IO_STREAM(conn)));
 
 	if (!bonjour_xmpp_send_stream_init(bb->conversation, &error)) {
+		PurpleAccount *account = NULL;
 		PurpleConversation *conv = NULL;
-		PurpleAccount *account = NULL;
+		PurpleConversationManager *manager = NULL;
 
 		purple_debug_error("bonjour",
 		                   "Error starting stream with buddy %s at "
@@ -863,11 +894,14 @@
 
 		account = purple_buddy_get_account(pb);
 
-		conv = PURPLE_CONVERSATION(purple_conversations_find_im_with_account(bb->name, account));
-		if (conv != NULL)
+		manager = purple_conversation_manager_get_default();
+
+		conv = purple_conversation_manager_find_im(manager, account, bb->name);
+		if (conv != NULL) {
 			purple_conversation_write_system_message(conv,
 				_("Unable to send the message, the conversation couldn't be started."),
 				PURPLE_MESSAGE_ERROR);
+		}
 
 		bonjour_xmpp_close_conversation(bb->conversation);
 		bb->conversation = NULL;
diff --git a/libpurple/protocols/facebook/facebook.c b/libpurple/protocols/facebook/facebook.c
--- a/libpurple/protocols/facebook/facebook.c
+++ b/libpurple/protocols/facebook/facebook.c
@@ -395,17 +395,20 @@
 	GSList *l;
 	PurpleAccount *acct;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	PurpleConnection *gc;
 
 	gc = fb_data_get_connection(fata);
 	acct = purple_connection_get_account(gc);
 	fetch = g_hash_table_new(fb_id_hash, fb_id_equal);
 
+	manager = purple_conversation_manager_get_default();
+
 	for (l = events; l != NULL; l = l->next) {
 		event = l->data;
 
 		FB_ID_TO_STR(event->tid, tid);
-		chat = purple_conversations_find_chat_with_account(tid, acct);
+		chat = purple_conversation_manager_find_chat(manager, acct, tid);
 
 		if (chat == NULL) {
 			continue;
@@ -511,6 +514,7 @@
 	GSList *l;
 	PurpleAccount *acct;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	PurpleConnection *gc;
 	PurpleMessageFlags flags;
 
@@ -520,6 +524,8 @@
 	open = purple_account_get_bool(acct, "group-chat-open", TRUE);
 	self = purple_account_get_bool(acct, "show-self", TRUE);
 
+	manager = purple_conversation_manager_get_default();
+
 	for (l = msgs; l != NULL; l = l->next) {
 		msg = l->data;
 		FB_ID_TO_STR(msg->uid, uid);
@@ -569,7 +575,7 @@
 		}
 
 		FB_ID_TO_STR(msg->tid, tid);
-		chat = purple_conversations_find_chat_with_account(tid, acct);
+		chat = purple_conversation_manager_find_chat(manager, acct, tid);
 
 		if (chat == NULL) {
 			if (!open) {
@@ -636,6 +642,7 @@
 	GSList *l;
 	PurpleAccount *acct;
 	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 	PurpleChatConversation *chat;
 	PurpleConnection *gc;
 
@@ -644,7 +651,8 @@
 	id = fb_id_hash(&thrd->tid);
 	FB_ID_TO_STR(thrd->tid, tid);
 
-	conv = purple_conversations_find_chat_with_account(tid, acct);
+	manager = purple_conversation_manager_get_default();
+	conv = purple_conversation_manager_find_chat(manager, acct, tid);
 	if((conv == NULL) || purple_chat_conversation_has_left(PURPLE_CHAT_CONVERSATION(conv))) {
 		conv = purple_serv_got_joined_chat(gc, id, tid);
 		chat = PURPLE_CHAT_CONVERSATION(conv);
@@ -707,12 +715,15 @@
 	PurpleAccount *acct;
 	PurpleConnection *gc;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 
 	FB_ID_TO_STR(thrd->tid, tid);
 
 	gc = fb_data_get_connection(fata);
 	acct = purple_connection_get_account(gc);
-	chat = purple_conversations_find_chat_with_account(tid, acct);
+
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, acct, tid);
 
 	if (chat == NULL) {
 		PurpleRequestCommonParameters *cpar;
@@ -1312,6 +1323,7 @@
 	FbId tid;
 	gint id;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	PurpleRequestCommonParameters *cpar;
 
 	name = g_hash_table_lookup(data, "name");
@@ -1329,7 +1341,11 @@
 
 	tid = FB_ID_FROM_STR(name);
 	id = fb_id_hash(&tid);
-	chat = purple_conversations_find_chat(gc, id);
+
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat_by_id(manager,
+	                                                   purple_connection_get_account(gc),
+	                                                   id);
 
 	if ((chat != NULL) && !purple_chat_conversation_has_left(PURPLE_CHAT_CONVERSATION(chat))) {
 		purple_conversation_present(chat);
@@ -1362,6 +1378,7 @@
 	FbId tid;
 	FbId uid;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	PurpleRequestCommonParameters *cpar;
 
 	if (!FB_ID_IS_STR(who)) {
@@ -1376,7 +1393,11 @@
 
 	fata = purple_connection_get_protocol_data(gc);
 	api = fb_data_get_api(fata);
-	chat = purple_conversations_find_chat(gc, id);
+
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat_by_id(manager,
+	                                                   purple_connection_get_account(gc),
+	                                                   id);
 
 	name = purple_conversation_get_name(chat);
 	tid = FB_ID_FROM_STR(name);
@@ -1397,11 +1418,14 @@
 	gchar *sext;
 	PurpleAccount *acct;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 
 	acct = purple_connection_get_account(gc);
 	fata = purple_connection_get_protocol_data(gc);
 	api = fb_data_get_api(fata);
-	chat = purple_conversations_find_chat(gc, id);
+
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat_by_id(manager, acct, id);
 
 	name = purple_conversation_get_name(chat);
 	tid = FB_ID_FROM_STR(name);
@@ -1428,10 +1452,15 @@
 	FbData *fata;
 	FbId tid;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 
 	fata = purple_connection_get_protocol_data(gc);
 	api = fb_data_get_api(fata);
-	chat = purple_conversations_find_chat(gc, id);
+
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat_by_id(manager,
+	                                                   purple_connection_get_account(gc),
+	                                                   id);
 
 	name = purple_conversation_get_name(chat);
 	tid = FB_ID_FROM_STR(name);
diff --git a/libpurple/protocols/facebook/util.c b/libpurple/protocols/facebook/util.c
--- a/libpurple/protocols/facebook/util.c
+++ b/libpurple/protocols/facebook/util.c
@@ -437,6 +437,7 @@
 	const gchar *name, *me;
 	PurpleAccount *acct;
 	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 	PurpleMessage *msg;
 
 	if (!(flags & PURPLE_MESSAGE_SEND)) {
@@ -445,7 +446,9 @@
 	}
 
 	acct = purple_connection_get_account(gc);
-	conv = purple_conversations_find_im_with_account(who, acct);
+	manager = purple_conversation_manager_get_default();
+
+	conv = purple_conversation_manager_find_im(manager, acct, who);
 
 	if (conv == NULL) {
 		conv = purple_im_conversation_new(acct, who);
@@ -473,6 +476,7 @@
 	const gchar *name;
 	PurpleAccount *acct;
 	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 	PurpleMessage *msg;
 	const gchar *me;
 
@@ -482,7 +486,9 @@
 	}
 
 	acct = purple_connection_get_account(gc);
-	conv = purple_conversations_find_chat(gc, id);
+	manager = purple_conversation_manager_get_default();
+
+	conv = purple_conversation_manager_find_chat_by_id(manager, acct, id);
 
 	me = purple_account_get_name_for_display(acct);
 	name = purple_account_get_username(acct);
diff --git a/libpurple/protocols/gg/chat.c b/libpurple/protocols/gg/chat.c
--- a/libpurple/protocols/gg/chat.c
+++ b/libpurple/protocols/gg/chat.c
@@ -489,6 +489,7 @@
 	GGPInfo *info = purple_connection_get_protocol_data(gc);
 	GDateTime *dt = NULL;
 	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 	ggp_chat_local_info *chat;
 	gboolean succ = TRUE;
 	const gchar *me;
@@ -501,9 +502,10 @@
 		return -1;
 	}
 
-	conv = purple_conversations_find_chat_with_account(
-		ggp_chat_get_name_from_id(chat->id),
-		purple_connection_get_account(gc));
+	manager = purple_conversation_manager_get_default();
+	conv = purple_conversation_manager_find_chat(manager,
+	                                             purple_connection_get_account(gc),
+	                                             ggp_chat_get_name_from_id(chat->id));
 
 	gg_msg = ggp_message_format_to_gg(conv,
 		purple_message_get_contents(msg));
diff --git a/libpurple/protocols/gg/image-prpl.c b/libpurple/protocols/gg/image-prpl.c
--- a/libpurple/protocols/gg/image-prpl.c
+++ b/libpurple/protocols/gg/image-prpl.c
@@ -168,6 +168,7 @@
 	ggp_image_session_data *sdata = ggp_image_get_sdata(gc);
 	ggp_image_sent *sent_image;
 	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 	uint64_t id;
 	gchar *gg_filename;
 
@@ -208,9 +209,10 @@
 		purple_image_get_data_size(sent_image->image));
 	g_free(gg_filename);
 
-	conv = purple_conversations_find_with_account(
-		sent_image->conv_name,
-		purple_connection_get_account(gc));
+	manager = purple_conversation_manager_get_default();
+	conv = purple_conversation_manager_find(manager,
+	                                        purple_connection_get_account(gc),
+	                                        sent_image->conv_name);
 	if (conv != NULL) {
 		gchar *msg = g_strdup_printf(_("Image delivered to %u."),
 			image_request->sender);
diff --git a/libpurple/protocols/gg/message-prpl.c b/libpurple/protocols/gg/message-prpl.c
--- a/libpurple/protocols/gg/message-prpl.c
+++ b/libpurple/protocols/gg/message-prpl.c
@@ -167,11 +167,14 @@
 {
 	PurpleAccount *account = purple_connection_get_account(gc);
 	PurpleConversation *im;
+	PurpleConversationManager *manager;
 	const gchar *who = ggp_uin_to_str(uin);
 
-	im = purple_conversations_find_im_with_account(who, account);
-	if (im)
+	manager = purple_conversation_manager_get_default();
+	im = purple_conversation_manager_find_im(manager, account, who);
+	if (im) {
 		return im;
+	}
 	im = purple_im_conversation_new(account, who);
 	return im;
 }
@@ -647,6 +650,7 @@
 {
 	GGPInfo *info = purple_connection_get_protocol_data(gc);
 	PurpleConversation *im;
+	PurpleConversationManager *manager;
 	ggp_buddy_data *buddy_data;
 	gchar *gg_msg;
 	gboolean succ;
@@ -663,8 +667,10 @@
 	if (buddy_data->blocked)
 		return -1;
 
-	im = purple_conversations_find_im_with_account(
-		rcpt, purple_connection_get_account(gc));
+	manager = purple_conversation_manager_get_default();
+	im = purple_conversation_manager_find_im(manager,
+	                                         purple_connection_get_account(gc),
+	                                         rcpt);
 
 	gg_msg = ggp_message_format_to_gg(im,
 		purple_message_get_contents(msg));
diff --git a/libpurple/protocols/irc/cmds.c b/libpurple/protocols/irc/cmds.c
--- a/libpurple/protocols/irc/cmds.c
+++ b/libpurple/protocols/irc/cmds.c
@@ -29,11 +29,16 @@
 
 int irc_cmd_default(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
 {
-	PurpleConversation *convo = purple_conversations_find_with_account(target, irc->account);
+	PurpleConversation *convo;
+	PurpleConversationManager *manager;
 	char *buf;
 
-	if (!convo)
+	manager = purple_conversation_manager_get_default();
+	convo = purple_conversation_manager_find(manager, irc->account, target);
+
+	if (!convo) {
 		return 1;
+	}
 
 	buf = g_strdup_printf(_("Unknown command: %s"), cmd);
 	purple_conversation_write_system_message(convo, buf, PURPLE_MESSAGE_NO_LOG);
@@ -92,12 +97,15 @@
 	const gchar *src, *me;
 	gchar *msg;
 	PurpleConversation *convo;
+	PurpleConversationManager *manager;
 	PurpleMessage *pmsg;
 
-	if (!args || !args[0] || !gc)
+	if (!args || !args[0] || !gc) {
 		return 0;
+	}
 
-	convo = purple_conversations_find_with_account(target, irc->account);
+	manager = purple_conversation_manager_get_default();
+	convo = purple_conversation_manager_find(manager, irc->account, target);
 	me = purple_account_get_name_for_display(irc->account);
 
 	msg = g_strdup_printf("/me %s", args[0]);
@@ -257,18 +265,23 @@
 
 int irc_cmd_kick(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
 {
+	PurpleConversationManager *manager;
 	char *buf;
 
-	if (!args || !args[0])
+	if(!args || !args[0]) {
 		return 0;
+	}
 
-	if (!purple_conversations_find_chat_with_account(target, irc->account))
+	manager = purple_conversation_manager_get_default();
+	if(!purple_conversation_manager_find_chat(manager, irc->account, target)) {
 		return 0;
+	}
 
-	if (args[1])
+	if(args[1]) {
 		buf = irc_format(irc, "vcn:", "KICK", target, args[0], args[1]);
-	else
+	} else {
 		buf = irc_format(irc, "vcn", "KICK", target, args[0]);
+	}
 	irc_send(irc, buf);
 	g_free(buf);
 
@@ -599,16 +612,20 @@
 
 int irc_cmd_topic(struct irc_conn *irc, const char *cmd, const char *target, const char **args)
 {
+	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	char *buf;
 	const char *topic;
-	PurpleConversation *chat;
 
-	if (!args)
+	if (!args) {
 		return 0;
+	}
 
-	chat = purple_conversations_find_chat_with_account(target, irc->account);
-	if (!chat)
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account, target);
+	if (!chat) {
 		return 0;
+	}
 
 	if (!args[0]) {
 		topic = purple_chat_conversation_get_topic (PURPLE_CHAT_CONVERSATION(chat));
diff --git a/libpurple/protocols/irc/irc.c b/libpurple/protocols/irc/irc.c
--- a/libpurple/protocols/irc/irc.c
+++ b/libpurple/protocols/irc/irc.c
@@ -858,9 +858,14 @@
                 gint id, const gchar *message, const gchar *name)
 {
 	struct irc_conn *irc = purple_connection_get_protocol_data(gc);
-	PurpleConversation *convo = PURPLE_CONVERSATION(purple_conversations_find_chat(gc, id));
+	PurpleConversation *convo;
+	PurpleConversationManager *manager;
 	const char *args[2];
 
+	manager = purple_conversation_manager_get_default();
+	convo = purple_conversation_manager_find_chat_by_id(manager,
+	                                                    purple_connection_get_account(gc),
+	                                                    id);
 	if (!convo) {
 		purple_debug_error("irc", "Got chat invite request for bogus chat");
 		return;
@@ -876,11 +881,17 @@
                gint id)
 {
 	struct irc_conn *irc = purple_connection_get_protocol_data(gc);
-	PurpleConversation *convo = PURPLE_CONVERSATION(purple_conversations_find_chat(gc, id));
+	PurpleConversation *convo;
+	PurpleConversationManager *manager;
 	const char *args[2];
 
-	if (!convo)
+	manager = purple_conversation_manager_get_default();
+	convo = purple_conversation_manager_find_chat_by_id(manager,
+	                                                    purple_connection_get_account(gc),
+	                                                    id);
+	if (!convo) {
 		return;
+	}
 
 	args[0] = purple_conversation_get_name(convo);
 	args[1] = NULL;
@@ -893,10 +904,16 @@
               PurpleMessage *msg)
 {
 	struct irc_conn *irc = purple_connection_get_protocol_data(gc);
-	PurpleConversation *convo = PURPLE_CONVERSATION(purple_conversations_find_chat(gc, id));
+	PurpleConversation *convo;
+	PurpleConversationManager *manager;
 	const char *args[2];
 	char *tmp;
 
+	manager = purple_conversation_manager_get_default();
+	convo = purple_conversation_manager_find_chat_by_id(manager,
+	                                                    purple_connection_get_account(gc),
+	                                                    id);
+
 	if (!convo) {
 		purple_debug_error("irc", "chat send on nonexistent chat");
 		return -EINVAL;
@@ -942,16 +959,23 @@
 irc_chat_set_topic(PurpleProtocolChat *protocol_chat, PurpleConnection *gc,
                    gint id, const gchar *topic)
 {
+	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 	char *buf;
 	const char *name = NULL;
 	struct irc_conn *irc;
 
+	manager = purple_conversation_manager_get_default();
+	conv = purple_conversation_manager_find_chat_by_id(manager,
+	                                                   purple_connection_get_account(gc),
+	                                                   id);
+
 	irc = purple_connection_get_protocol_data(gc);
-	name = purple_conversation_get_name(PURPLE_CONVERSATION(
-			purple_conversations_find_chat(gc, id)));
+	name = purple_conversation_get_name(conv);
 
-	if (name == NULL)
+	if (name == NULL) {
 		return;
+	}
 
 	buf = irc_format(irc, "vt:", "TOPIC", name, topic);
 	irc_send(irc, buf);
diff --git a/libpurple/protocols/irc/msgs.c b/libpurple/protocols/irc/msgs.c
--- a/libpurple/protocols/irc/msgs.c
+++ b/libpurple/protocols/irc/msgs.c
@@ -130,6 +130,7 @@
 	const char *end, *cur, *numeric = NULL;
 	char *clean, *tmp, *convname;
 	PurpleConversation *convo;
+	PurpleConversationManager *manager;
 
 	for (cur = args[0], i = 0; i < 4; i++) {
 		end = strchr(cur, ' ');
@@ -164,7 +165,8 @@
 	g_free(tmp);
 
 	/* Check for an existing conversation */
-	convo = purple_conversations_find_with_account(convname, irc->account);
+	manager = purple_conversation_manager_get_default();
+	convo = purple_conversation_manager_find(manager, irc->account, convname);
 	g_free(convname);
 
 	if (convo == NULL) {
@@ -259,8 +261,11 @@
 void irc_msg_ban(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 
-	chat = purple_conversations_find_chat_with_account(args[1], irc->account);
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             args[1]);
 
 	if (purple_strequal(name, "367")) {
 		char *msg = NULL;
@@ -308,28 +313,35 @@
 void irc_msg_banfull(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	char *buf, *nick;
 
-	chat = purple_conversations_find_chat_with_account(args[1], irc->account);
-	if (!chat)
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             args[1]);
+	if (!chat) {
 		return;
+	}
 
 	nick = g_markup_escape_text(args[2], -1);
 	buf = g_strdup_printf(_("Cannot ban %s: banlist is full"), nick);
 	g_free(nick);
-	purple_conversation_write_system_message(chat,
-		buf, PURPLE_MESSAGE_NO_LOG);
+	purple_conversation_write_system_message(chat, buf, PURPLE_MESSAGE_NO_LOG);
 	g_free(buf);
 }
 
 void irc_msg_chanmode(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	char *buf, *escaped;
 
-	chat = purple_conversations_find_chat_with_account(args[1], irc->account);
-	if (!chat)	/* XXX punt on channels we are not in for now */
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             args[1]);
+	if (!chat) { /* XXX punt on channels we are not in for now */
 		return;
+	}
 
 	escaped = (args[3] != NULL) ? g_markup_escape_text(args[3], -1) : NULL;
 	buf = g_strdup_printf("mode for %s: %s %s", args[1], args[2], escaped ? escaped : "");
@@ -466,13 +478,16 @@
 {
 	if (purple_strequal(name, "352")) {
 		PurpleConversation *chat;
+		PurpleConversationManager *manager;
 		PurpleChatUser *cb;
 
 		char *cur, *userhost, *realname;
 
 		PurpleChatUserFlags flags;
 
-		chat = purple_conversations_find_chat_with_account(args[1], irc->account);
+		manager = purple_conversation_manager_get_default();
+		chat = purple_conversation_manager_find_chat(manager, irc->account,
+		                                             args[1]);
 		if (!chat) {
 			purple_debug_error("irc", "Got a WHO response for %s, which doesn't exist", args[1]);
 			return;
@@ -483,7 +498,7 @@
 			purple_debug_error("irc", "Got a WHO response for %s who isn't a buddy.", args[5]);
 			return;
 		}
-		
+
 		userhost = g_strdup_printf("%s@%s", args[2], args[3]);
 
 		/* The final argument is a :-argument, but annoyingly
@@ -553,6 +568,7 @@
 {
 	char *chan, *topic, *msg, *nick, *tmp, *tmp2;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 
 	if (purple_strequal(name, "topic")) {
 		chan = args[0];
@@ -562,7 +578,8 @@
 		topic = irc_mirc2txt (args[2]);
 	}
 
-	chat = purple_conversations_find_chat_with_account(chan, irc->account);
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account, chan);
 	if (!chat) {
 		purple_debug_error("irc", "Got a topic for %s, which doesn't exist", chan);
 		g_free(topic);
@@ -606,11 +623,14 @@
 void irc_msg_topicinfo(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	GDateTime *dt, *local;
 	gint64 mtime;
 	char *msg, *timestamp, *datestamp;
 
-	chat = purple_conversations_find_chat_with_account(args[1], irc->account);
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             args[1]);
 	if (!chat) {
 		purple_debug_error("irc", "Got topic info for %s, which doesn't exist", args[1]);
 		return;
@@ -662,7 +682,11 @@
 	PurpleConversation *convo;
 
 	if (purple_strequal(name, "366")) {
-		convo = purple_conversations_find_with_account(args[1], irc->account);
+		PurpleConversationManager *manager;
+
+		manager = purple_conversation_manager_get_default();
+		convo = purple_conversation_manager_find(manager, irc->account,
+		                                         args[1]);
 		if (!convo) {
 			purple_debug_error("irc", "Got a NAMES list for %s, which doesn't exist", args[1]);
 			g_string_free(irc->names, TRUE);
@@ -798,8 +822,10 @@
 {
 	PurpleConnection *gc;
 	PurpleConversation *convo;
+	PurpleConversationManager *manager;
 
-	convo = purple_conversations_find_with_account(args[1], irc->account);
+	manager = purple_conversation_manager_get_default();
+	convo = purple_conversation_manager_find(manager, irc->account, args[1]);
 	if (convo) {
 		purple_conversation_write_system_message(convo,
 			PURPLE_IS_IM_CONVERSATION(convo) ? _("User is not logged in") : _("no such channel"),
@@ -822,8 +848,11 @@
 {
 	PurpleConnection *gc;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 
-	chat = purple_conversations_find_chat_with_account(args[1], irc->account);
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             args[1]);
 	if (chat) {
 		purple_conversation_write_system_message(chat, args[2],
 			PURPLE_MESSAGE_NO_LOG);
@@ -837,7 +866,12 @@
 
 void irc_msg_notinchan(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
-	PurpleConversation *chat = purple_conversations_find_chat_with_account(args[1], irc->account);
+	PurpleConversation *chat;
+	PurpleConversationManager *manager;
+
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             args[1]);
 
 	purple_debug_info("irc", "We're apparently not in %s, but tried to use it", args[1]);
 	if (chat) {
@@ -851,10 +885,14 @@
 void irc_msg_notop(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 
-	chat = purple_conversations_find_chat_with_account(args[1], irc->account);
-	if (!chat)
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             args[1]);
+	if (!chat) {
 		return;
+	}
 
 	purple_conversation_write_system_message(chat, args[2], 0);
 }
@@ -932,6 +970,7 @@
 {
 	PurpleConnection *gc = purple_account_get_connection(irc->account);
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	PurpleChatUser *cb;
 
 	char *nick, *userhost, *buf;
@@ -942,11 +981,14 @@
 
 	nick = irc_mask_nick(from);
 
+	manager = purple_conversation_manager_get_default();
+
 	if (!purple_utf8_strcasecmp(nick, purple_connection_get_display_name(gc))) {
 		/* We are joining a channel for the first time */
 		purple_serv_got_joined_chat(gc, id++, args[0]);
 		g_free(nick);
-		chat = purple_conversations_find_chat_with_account(args[0], irc->account);
+		chat = purple_conversation_manager_find_chat(manager, irc->account,
+		                                             args[0]);
 
 		if (chat == NULL) {
 			purple_debug_error("irc", "tried to join %s but couldn't\n", args[0]);
@@ -967,7 +1009,8 @@
 		return;
 	}
 
-	chat = purple_conversations_find_chat_with_account(args[0], irc->account);
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             args[0]);
 	if (chat == NULL) {
 		purple_debug_error("irc", "JOIN for %s failed", args[0]);
 		g_free(nick);
@@ -995,11 +1038,16 @@
 void irc_msg_kick(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
 	PurpleConnection *gc = purple_account_get_connection(irc->account);
-	PurpleConversation *chat = purple_conversations_find_chat_with_account(args[0], irc->account);
+	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	char *nick, *buf;
 
 	g_return_if_fail(gc);
 
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             args[0]);
+
 	nick = irc_mask_nick(from);
 
 	if (!chat) {
@@ -1028,8 +1076,12 @@
 	char *nick = irc_mask_nick(from), *buf;
 
 	if (*args[0] == '#' || *args[0] == '&') {	/* Channel	*/
+		PurpleConversationManager *manager;
 		char *escaped;
-		chat = purple_conversations_find_chat_with_account(args[0], irc->account);
+
+		manager = purple_conversation_manager_get_default();
+		chat = purple_conversation_manager_find_chat(manager, irc->account,
+		                                             args[0]);
 		if (!chat) {
 			purple_debug_error("irc", "MODE received for %s, which we are not in", args[0]);
 			g_free(nick);
@@ -1093,6 +1145,7 @@
 {
 	PurpleConnection *gc = purple_account_get_connection(irc->account);
 	PurpleConversation *im;
+	PurpleConversationManager *manager;
 	GSList *chats;
 	char *nick = irc_mask_nick(from);
 
@@ -1116,10 +1169,11 @@
 		chats = chats->next;
 	}
 
-	im = purple_conversations_find_im_with_account(nick,
-						   irc->account);
-	if (im != NULL)
+	manager = purple_conversation_manager_get_default();
+	im = purple_conversation_manager_find_im(manager, irc->account, nick);
+	if (im != NULL) {
 		purple_conversation_set_name(im, args[0]);
+	}
 
 	g_free(nick);
 }
@@ -1202,6 +1256,7 @@
 {
 	PurpleConnection *gc = purple_account_get_connection(irc->account);
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	char *nick, *msg, *channel;
 
 	g_return_if_fail(gc);
@@ -1210,7 +1265,9 @@
 	 * that I can see.  This catches that. */
 	channel = (args[0][0] == ':') ? &args[0][1] : args[0];
 
-	chat = purple_conversations_find_chat_with_account(channel, irc->account);
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, irc->account,
+	                                             channel);
 	if (!chat) {
 		purple_debug_info("irc", "Got a PART on %s, which doesn't exist -- probably closed", channel);
 		return;
@@ -1246,6 +1303,7 @@
 void irc_msg_pong(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
 	PurpleConversation *convo;
+	PurpleConversationManager *manager;
 	PurpleConnection *gc;
 	char **parts, *msg;
 	gint64 oldstamp;
@@ -1265,7 +1323,8 @@
 		                              (gdouble)G_USEC_PER_SEC);
 	}
 
-	convo = purple_conversations_find_with_account(parts[0], irc->account);
+	manager = purple_conversation_manager_get_default();
+	convo = purple_conversation_manager_find(manager, irc->account, parts[0]);
 	g_strfreev(parts);
 	if (convo) {
 		purple_conversation_write_system_message(convo, msg, PURPLE_MESSAGE_NO_LOG);
@@ -1319,7 +1378,11 @@
 	if (!purple_utf8_strcasecmp(to, purple_connection_get_display_name(gc))) {
 		purple_serv_got_im(gc, nick, msg, 0, time(NULL));
 	} else {
-		chat = purple_conversations_find_chat_with_account(irc_nick_skip_mode(irc, to), irc->account);
+		PurpleConversationManager *manager;
+
+		manager = purple_conversation_manager_get_default();
+		chat = purple_conversation_manager_find_chat(manager, irc->account,
+		                                             irc_nick_skip_mode(irc, to));
 		if (chat) {
 			purple_serv_got_chat_in(gc, purple_chat_conversation_get_id(PURPLE_CHAT_CONVERSATION(chat)),
 				nick, PURPLE_MESSAGE_RECV, msg, time(NULL));
@@ -1334,11 +1397,14 @@
 void irc_msg_regonly(struct irc_conn *irc, const char *name, const char *from, char **args)
 {
 	PurpleConnection *gc = purple_account_get_connection(irc->account);
+	PurpleConversationManager *manager;
 	char *msg;
 
 	g_return_if_fail(gc);
 
-	if (purple_conversations_find_chat_with_account(args[1], irc->account)) {
+	manager = purple_conversation_manager_get_default();
+
+	if(purple_conversation_manager_find_chat(manager, irc->account, args[1])) {
 		/* This is a channel we're already in; for some reason,
 		 * freenode feels the need to notify us that in some
 		 * hypothetical other situation this might not have
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -3229,8 +3229,12 @@
 
 	if (!_jabber_send_buzz(js, username, &error)) {
 		PurpleAccount *account = purple_connection_get_account(gc);
-		PurpleConversation *conv =
-			purple_conversations_find_with_account(username, account);
+		PurpleConversation *conv;
+		PurpleConversationManager *manager;
+
+		manager = purple_conversation_manager_get_default();
+		conv = purple_conversation_manager_find(manager, account, username);
+
 		purple_debug_error("jabber", "jabber_send_attention: jabber_cmd_buzz failed with error: %s\n", error ? error : "(NULL)");
 
 		if (conv) {
diff --git a/libpurple/protocols/jabber/message.c b/libpurple/protocols/jabber/message.c
--- a/libpurple/protocols/jabber/message.c
+++ b/libpurple/protocols/jabber/message.c
@@ -104,6 +104,7 @@
 	JabberID *jid = jabber_id_new(contact);
 
 	PurpleConnection *gc;
+	PurpleConversationManager *manager;
 	PurpleAccount *account;
 	PurpleMessageFlags flags = 0;
 	JabberBuddy *jb;
@@ -113,6 +114,8 @@
 	if(!jid)
 		return;
 
+	manager = purple_conversation_manager_get_default();
+
 	gc = jm->js->gc;
 	account = purple_connection_get_account(gc);
 
@@ -130,8 +133,10 @@
 			purple_serv_got_typing(gc, contact, 0, PURPLE_IM_TYPED);
 			break;
 		case JM_STATE_GONE: {
-			PurpleConversation *im = purple_conversations_find_im_with_account(
-					contact, account);
+			PurpleConversation *im = NULL;
+
+			im = purple_conversation_manager_find_im(manager, account, contact);
+
 			if (im && jid->node && jid->domain) {
 				char buf[256];
 				PurpleBuddy *buddy;
@@ -177,7 +182,7 @@
 			 */
 			PurpleConversation *im;
 
-			im = purple_conversations_find_im_with_account(contact, account);
+			im = purple_conversation_manager_find_im(manager, account, contact);
 			if (im && !purple_strequal(contact,
 					purple_conversation_get_name(im))) {
 				purple_debug_info("jabber", "Binding conversation to %s\n",
@@ -752,9 +757,14 @@
 								jabber_id_free(jid);
 							}
 						} else if (jm->type == JABBER_MESSAGE_NORMAL ||
-						           jm->type == JABBER_MESSAGE_CHAT) {
-							conv =
-								purple_conversations_find_with_account(from, account);
+						           jm->type == JABBER_MESSAGE_CHAT)
+						{
+							PurpleConversationManager *manager;
+
+							manager = purple_conversation_manager_get_default();
+							conv = purple_conversation_manager_find(manager,
+							                                        account,
+							                                        from);
 							if (!conv) {
 								/* we need to create the conversation here */
 								conv = PURPLE_CONVERSATION(
@@ -975,10 +985,12 @@
 	PurpleAccount *account = purple_connection_get_account(jm->js->gc);
 	GList *found_smileys, *it, *it_next;
 	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 	gboolean has_too_large_smiley = FALSE;
 	gchar *smileyfied_xhtml = NULL;
 
-	conv = purple_conversations_find_with_account(jm->to, account);
+	manager = purple_conversation_manager_get_default();
+	conv = purple_conversation_manager_find(manager, account, jm->to);
 
 	if (!jabber_conv_support_custom_smileys(jm->js, conv, jm->to))
 		return NULL;
diff --git a/libpurple/protocols/jabber/presence.c b/libpurple/protocols/jabber/presence.c
--- a/libpurple/protocols/jabber/presence.c
+++ b/libpurple/protocols/jabber/presence.c
@@ -765,18 +765,20 @@
 	PurpleBuddy *b;
 	char *buddy_name;
 	PurpleConversation *im;
+	PurpleConversationManager *manager;
 
 	buddy_name = jabber_id_get_bare_jid(presence->jid_from);
 
 	account = purple_connection_get_account(js->gc);
 	b = purple_blist_find_buddy(account, buddy_name);
 
+	manager = purple_conversation_manager_get_default();
 	/*
 	 * Unbind/unlock from sending messages to a specific resource on
 	 * presence changes.  This is locked to a specific resource when
 	 * receiving a message (in message.c).
 	 */
-	im = purple_conversations_find_im_with_account(buddy_name, account);
+	im = purple_conversation_manager_find_im(manager, account, buddy_name);
 	if (im) {
 		purple_debug_info("jabber", "Changed conversation binding from %s to %s\n",
 				purple_conversation_get_name(im), buddy_name);
diff --git a/libpurple/protocols/novell/novell.c b/libpurple/protocols/novell/novell.c
--- a/libpurple/protocols/novell/novell.c
+++ b/libpurple/protocols/novell/novell.c
@@ -224,11 +224,15 @@
 	if (ret_code == NM_OK) {
 		user_record = (NMUserRecord *) resp_data;
 		if (user_record) {
+			PurpleConversationManager *manager = NULL;
+
+			manager = purple_conversation_manager_get_default();
 
 			/* Set the title for the conversation */
 			/* XXX - Should this be find_im_with_account? */
-			gconv =	purple_conversations_find_with_account(nm_user_record_get_display_id(user_record),
-														(PurpleAccount *) user->client_data);
+			gconv = purple_conversation_manager_find(manager,
+			                                         (PurpleAccount *)user->client_data,
+			                                         nm_user_record_get_display_id(user_record));
 			if (gconv) {
 
 				dn = nm_user_record_get_dn(user_record);
@@ -1791,19 +1795,22 @@
 
 			user_record = nm_find_user_record(user, nm_event_get_source(event));
 			if (user_record) {
+				PurpleConversationManager *manager = NULL;
 
 				flags = 0;
-				if (nm_event_get_type(event) == NMEVT_RECEIVE_AUTOREPLY)
+				if(nm_event_get_type(event) == NMEVT_RECEIVE_AUTOREPLY) {
 					flags |= PURPLE_MESSAGE_AUTO_RESP;
+				}
 
 				purple_serv_got_im(purple_account_get_connection(user->client_data),
 							nm_user_record_get_display_id(user_record),
 							text, flags,
 							nm_event_get_gmt(event));
 
-				im = purple_conversations_find_im_with_account(
-					nm_user_record_get_display_id(user_record),
-					(PurpleAccount *) user->client_data);
+				manager = purple_conversation_manager_get_default();
+				im = purple_conversation_manager_find_im(manager,
+				                                         (PurpleAccount *)user->client_data,
+				                                         nm_user_record_get_display_id(user_record));
 				if (im) {
 
 					contact = nm_find_contact(user, nm_event_get_source(event));
@@ -2091,10 +2098,14 @@
 
 	ur = nm_find_user_record(user, nm_event_get_source(event));
 	if (ur) {
+		PurpleConversationManager *manager = NULL;
+
+		manager = purple_conversation_manager_get_default();
+
 		/* XXX - Should this be PURPLE_CONV_TYPE_IM? */
-		gconv =
-			purple_conversations_find_with_account(nm_user_record_get_display_id(ur),
-												user->client_data);
+		gconv = purple_conversation_manager_find(manager,
+		                                         PURPLE_ACCOUNT(user->client_data),
+		                                         nm_user_record_get_display_id(ur));
 		if (gconv) {
 			const char *name = nm_user_record_get_full_name(ur);
 
@@ -2474,6 +2485,7 @@
 {
 	NMConference *conference;
 	PurpleConversation *chat;
+	PurpleConversationManager *manager = NULL;
 	GSList *cnode;
 	NMMessage *message;
 	NMUser *user;
@@ -2535,9 +2547,12 @@
 		}
 	}
 
+	manager = purple_conversation_manager_get_default();
 
 	/* The conference was not found, must be closed */
-	chat = purple_conversations_find_chat(gc, id);
+	chat = purple_conversation_manager_find_chat_by_id(manager,
+	                                                   purple_connection_get_account(gc),
+	                                                   id);
 	if (chat) {
 		str = g_strdup(_("This conference has been closed."
 						 " No more messages can be sent."));
diff --git a/libpurple/protocols/null/nullprpl.c b/libpurple/protocols/null/nullprpl.c
--- a/libpurple/protocols/null/nullprpl.c
+++ b/libpurple/protocols/null/nullprpl.c
@@ -130,24 +130,38 @@
 
 static void call_chat_func(gpointer data, gpointer userdata) {
   PurpleConnection *to = (PurpleConnection *)data;
+  PurpleConversation *chat;
+  PurpleConversationManager *manager;
   ChatFuncData *cfdata = (ChatFuncData *)userdata;
-
   int id = purple_chat_conversation_get_id(PURPLE_CHAT_CONVERSATION(cfdata->from_chat));
-  PurpleConversation *chat = purple_conversations_find_chat(to, id);
-  if (chat)
+
+  manager = purple_conversation_manager_get_default();
+  chat = purple_conversation_manager_find_chat_by_id(manager,
+                                                     purple_connection_get_account(to),
+                                                     id);
+  if (chat) {
     cfdata->fn(cfdata->from_chat, chat, id,
                purple_conversation_get_name(chat), cfdata->userdata);
+  }
 }
 
 static void foreach_gc_in_chat(ChatFunc fn, PurpleConnection *from,
                                int id, gpointer userdata) {
-  PurpleConversation *chat = purple_conversations_find_chat(from, id);
-  ChatFuncData cfdata = { fn,
-                          chat,
-                          userdata };
+  PurpleConversation *chat;
+  PurpleConversationManager *manager;
+  ChatFuncData cfdata = {
+    .fn = fn,
+    .userdata = userdata
+  };
 
-  g_list_foreach(purple_connections_get_all(), call_chat_func,
-                 &cfdata);
+  manager = purple_conversation_manager_get_default();
+  chat = purple_conversation_manager_find_chat_by_id(manager,
+                                                     purple_connection_get_account(from),
+                                                     id);
+
+  cfdata.from_chat = chat;
+
+  g_list_foreach(purple_connections_get_all(), call_chat_func, &cfdata);
 }
 
 
@@ -748,12 +762,17 @@
 null_join_chat(PurpleProtocolChat *protocol_chat, PurpleConnection *gc,
                GHashTable *components)
 {
-  const char *username = purple_account_get_username(purple_connection_get_account(gc));
+  PurpleAccount *account = purple_connection_get_account(gc);
+  PurpleConversationManager *manager;
+  const char *username = purple_account_get_username(account);
   const char *room = g_hash_table_lookup(components, "room");
   int chat_id = g_str_hash(room);
+
   purple_debug_info("nullprpl", "%s is joining chat room %s\n", username, room);
 
-  if (!purple_conversations_find_chat(gc, chat_id)) {
+  manager = purple_conversation_manager_get_default();
+
+  if(!purple_conversation_manager_find_chat_by_id(manager, account, chat_id)) {
     purple_serv_got_joined_chat(gc, chat_id, room);
 
     /* tell everyone that we joined, and add them if they're already there */
@@ -807,16 +826,24 @@
 null_chat_invite(PurpleProtocolChat *protocol_chat, PurpleConnection *gc,
                  gint id, const gchar *message, const gchar *who)
 {
-  const char *username = purple_account_get_username(purple_connection_get_account(gc));
-  PurpleConversation *chat = purple_conversations_find_chat(gc, id);
-  const char *room = purple_conversation_get_name(chat);
+  PurpleAccount *account = purple_connection_get_account(gc);
   PurpleAccount *to_acct = purple_accounts_find(who, "null");
+  PurpleConversation *chat;
+  PurpleConversationManager *manager;
+  const char *username = purple_account_get_username(account);
+  const char *room = NULL;
+
+  manager = purple_conversation_manager_get_default();
+  chat = purple_conversation_manager_find_chat_by_id(manager, account, id);
+  room = purple_conversation_get_name(chat);
 
   purple_debug_info("nullprpl", "%s is inviting %s to join chat room %s\n",
                     username, who, room);
 
   if (to_acct) {
-    PurpleConversation *to_conv = purple_conversations_find_chat(purple_account_get_connection(to_acct), id);
+    PurpleConversation *to_conv;
+
+    to_conv = purple_conversation_manager_find_chat_by_id(manager, to_acct, id);
     if (to_conv) {
       char *tmp = g_strdup_printf("%s is already in chat room %s.", who, room);
       purple_debug_info("nullprpl",
@@ -852,7 +879,13 @@
 null_chat_leave(PurpleProtocolChat *protocol_chat, PurpleConnection *gc,
                 gint id)
 {
-  PurpleConversation *chat = purple_conversations_find_chat(gc, id);
+  PurpleConversationManager *manager;
+  PurpleConversation *chat;
+
+  manager = purple_conversation_manager_get_default();
+  chat = purple_conversation_manager_find_chat_by_id(manager,
+                                                     purple_connection_get_account(gc),
+                                                     id);
   purple_debug_info("nullprpl", "%s is leaving chat room %s\n",
                     purple_account_get_username(purple_connection_get_account(gc)),
                     purple_conversation_get_name(chat));
@@ -877,10 +910,14 @@
 null_chat_send(PurpleProtocolChat *protocol_chat, PurpleConnection *gc,
                gint id, PurpleMessage *msg)
 {
-  const char *username = purple_account_get_username(purple_connection_get_account(gc));
-  PurpleConversation *chat = purple_conversations_find_chat(gc, id);
+  PurpleAccount *account = purple_connection_get_account(gc);
+  PurpleConversation *chat;
+  PurpleConversationManager *manager;
   const gchar *message = purple_message_get_contents(msg);
+  const gchar *username = purple_account_get_username(account);
 
+  manager = purple_conversation_manager_get_default();
+  chat = purple_conversation_manager_find_chat_by_id(manager, account, id);
   if (chat) {
     purple_debug_info("nullprpl",
                       "%s is sending message to chat room %s: %s\n", username,
@@ -990,11 +1027,17 @@
 null_set_chat_topic(PurpleProtocolChat *protocol_chat, PurpleConnection *gc,
                     gint id, const gchar *topic)
 {
-  PurpleConversation *chat = purple_conversations_find_chat(gc, id);
+  PurpleConversation *chat = NULL;
+  PurpleConversationManager *manager = NULL;
   const char *last_topic;
 
-  if (!chat)
+  manager = purple_conversation_manager_get_default();
+  chat = purple_conversation_manager_find_chat_by_id(manager,
+                                                     purple_connection_get_account(gc),
+                                                     id);
+  if (!chat) {
     return;
+  }
 
   purple_debug_info("nullprpl", "%s sets topic of chat room '%s' to '%s'\n",
                     purple_account_get_username(purple_connection_get_account(gc)),
@@ -1016,6 +1059,7 @@
 
 static PurpleRoomlist *null_roomlist_get_list(PurpleConnection *gc) {
   const char *username = purple_account_get_username(purple_connection_get_account(gc));
+  PurpleConversationManager *manager;
   PurpleRoomlist *roomlist = purple_roomlist_new(purple_connection_get_account(gc));
   GList *fields = NULL;
   PurpleRoomlistField *field;
@@ -1034,9 +1078,11 @@
 
   purple_roomlist_set_fields(roomlist, fields);
 
+  manager = purple_conversation_manager_get_default();
+
   /* add each chat room. the chat ids are cached in seen_ids so that each room
    * is only returned once, even if multiple users are in it. */
-  for (chats  = purple_conversations_get_all(); chats; chats = g_list_next(chats)) {
+  for (chats = purple_conversation_manager_get_all(manager); chats; chats = g_list_next(chats)) {
     PurpleChatConversation *chat = NULL;
     PurpleRoomlistRoom *room = NULL;
     const gchar *name = NULL;
diff --git a/libpurple/protocols/sametime/sametime.c b/libpurple/protocols/sametime/sametime.c
--- a/libpurple/protocols/sametime/sametime.c
+++ b/libpurple/protocols/sametime/sametime.c
@@ -1776,14 +1776,19 @@
   struct mwPurpleProtocolData *pd;
   PurpleAccount *acct;
   PurpleConversation *im;
+  PurpleConversationManager *manager;
   PurpleBuddy *buddy;
   char *who = from->user_id;
   char *msg, *msg2;
 
   pd = mwSession_getClientData(s);
   acct = purple_connection_get_account(pd->gc);
-  im = purple_conversations_find_im_with_account(who, acct);
-  if(! im) im = purple_im_conversation_new(acct, who);
+
+  manager = purple_conversation_manager_get_default();
+  im = purple_conversation_manager_find_im(manager, acct, who);
+  if(!PURPLE_IS_IM_CONVERSATION(im)) {
+    im = purple_im_conversation_new(acct, who);
+  }
 
   buddy = purple_blist_find_buddy(acct, who);
   if(buddy) who = (char *) purple_buddy_get_contact_alias(buddy);
@@ -1888,13 +1893,9 @@
 #define CONF_TO_ID(conf)   (GPOINTER_TO_INT(conf))
 #define ID_TO_CONF(pd, id) (conf_find_by_id((pd), (id)))
 
-#define CHAT_TO_ID(chat)   (purple_chat_conversation_get_id(chat))
-#define ID_TO_CHAT(id)     (purple_conversations_find_chat(id))
-
 #define CHAT_TO_CONF(pd, chat)  (ID_TO_CONF((pd), CHAT_TO_ID(chat)))
 #define CONF_TO_CHAT(conf)      (ID_TO_CHAT(CONF_TO_ID(conf)))
 
-
 static struct mwConference *
 conf_find_by_id(struct mwPurpleProtocolData *pd, int id) {
 
@@ -1907,7 +1908,7 @@
     struct mwConference *c = l->data;
     PurpleChatConversation *h = mwConference_getClientData(c);
 
-    if(CHAT_TO_ID(h) == id) {
+    if(purple_chat_conversation_get_id(h) == id) {
       conf = c;
       break;
     }
@@ -2461,6 +2462,7 @@
   struct mwSession *session;
   struct mwPurpleProtocolData *pd;
   PurpleConnection *gc;
+  PurpleConversationManager *manager;
   PurpleAccount *acct;
 
   struct mwIdBlock *idb;
@@ -2473,7 +2475,9 @@
 
   idb = mwConversation_getTarget(conv);
 
-  return purple_conversations_find_im_with_account(idb->user, acct);
+  manager = purple_conversation_manager_get_default();
+
+  return purple_conversation_manager_find_im(manager, acct, idb->user);
 }
 
 
@@ -2859,7 +2863,7 @@
     struct mwPlace *p = l->data;
     PurpleChatConversation *h = mwPlace_getClientData(p);
 
-    if(CHAT_TO_ID(h) == id) {
+    if(purple_chat_conversation_get_id(h) == id) {
       place = p;
       break;
     }
@@ -4042,12 +4046,17 @@
 static void notify_im(PurpleConnection *gc, GList *row, void *user_data) {
   PurpleAccount *acct;
   PurpleConversation *im;
+  PurpleConversationManager *manager;
   char *id;
 
   acct = purple_connection_get_account(gc);
   id = g_list_nth_data(row, 1);
-  im = purple_conversations_find_im_with_account(id, acct);
-  if(! im) im = purple_im_conversation_new(acct, id);
+
+  manager = purple_conversation_manager_get_default();
+  im = purple_conversation_manager_find_im(manager, acct, id);
+  if(!PURPLE_IS_IM_CONVERSATION(im)) {
+    im = purple_im_conversation_new(acct, id);
+  }
   purple_conversation_present(im);
 }
 
diff --git a/libpurple/protocols/silc/buddy.c b/libpurple/protocols/silc/buddy.c
--- a/libpurple/protocols/silc/buddy.c
+++ b/libpurple/protocols/silc/buddy.c
@@ -77,6 +77,7 @@
 	case SILC_KEY_AGREEMENT_OK:
 		{
 			PurpleConversation *im;
+			PurpleConversationManager *manager;
 			char tmp[128];
 
 			/* Set the private key for this client */
@@ -85,10 +86,11 @@
 								NULL, NULL, key);
 			silc_ske_free_key_material(key);
 
+			manager = purple_conversation_manager_get_default();
 
 			/* Open IM window */
-			im = purple_conversations_find_im_with_account(
-								      client_entry->nickname, sg->account);
+			im = purple_conversation_manager_find_im(manager, sg->account,
+			                                         client_entry->nickname);
 			if (im) {
 				/* we don't have windows in the core anymore...but we may want to
 				 * provide some method for asking the UI to show the window
diff --git a/libpurple/protocols/silc/ops.c b/libpurple/protocols/silc/ops.c
--- a/libpurple/protocols/silc/ops.c
+++ b/libpurple/protocols/silc/ops.c
@@ -95,6 +95,7 @@
 	SilcUInt32 data_len;
 	PurpleMessageFlags cflags = 0;
 	PurpleConversation *chat = NULL;
+	PurpleConversationManager *manager = NULL;
 	SilcBool ret = FALSE;
 
 	if (!mime)
@@ -180,6 +181,8 @@
 		goto out;
 	}
 
+	manager = purple_conversation_manager_get_default();
+
 	/* Image */
 	if (g_str_has_prefix(type, "image/")) {
 		char tmp[32];
@@ -194,16 +197,20 @@
 			for (l = sg->grps; l; l = l->next)
 				if (((SilcPurplePrvgrp)l->data)->key == key) {
 					prv = l->data;
-					chat = purple_conversations_find_chat_with_account(
-							prv->channel, sg->account);
+					chat = purple_conversation_manager_find_chat(manager,
+					                                             sg->account,
+					                                             prv->channel);
 					break;
 				}
 		}
-		if (channel && !chat)
-			chat = purple_conversations_find_chat_with_account(
-								      channel->channel_name, sg->account);
-		if (channel && !chat)
+		if (channel && !chat) {
+			chat = purple_conversation_manager_find_chat(manager, sg->account,
+			                                             channel->channel_name);
+		}
+
+		if (channel && !chat) {
 			goto out;
+		}
 
 		img = purple_image_new_from_data(data, data_len);
 		if (!img)
@@ -268,11 +275,14 @@
 	PurpleConnection *gc = client->application;
 	SilcPurple sg = purple_connection_get_protocol_data(gc);
 	PurpleConversation *chat = NULL;
+	PurpleConversationManager *manager = NULL;
 	char *msg, *tmp;
 
 	if (!message)
 		return;
 
+	manager = purple_conversation_manager_get_default();
+
 	if (key) {
 		GList *l;
 		SilcPurplePrvgrp prv;
@@ -280,16 +290,19 @@
 		for (l = sg->grps; l; l = l->next)
 			if (((SilcPurplePrvgrp)l->data)->key == key) {
 				prv = l->data;
-				chat = purple_conversations_find_chat_with_account(
-										prv->channel, sg->account);
+				chat = purple_conversation_manager_find_chat(manager, sg->account,
+				                                             prv->channel);
 				break;
 			}
 	}
-	if (!chat)
-		chat = purple_conversations_find_chat_with_account(
-							      channel->channel_name, sg->account);
-	if (!chat)
+	if (!chat) {
+		chat = purple_conversation_manager_find_chat(manager, sg->account,
+		                                             channel->channel_name);
+	}
+
+	if (!chat) {
 		return;
+	}
 
 	if (flags & SILC_MESSAGE_FLAG_SIGNED &&
 	    purple_account_get_bool(sg->account, "sign-verify", FALSE)) {
@@ -365,14 +378,17 @@
 	PurpleConnection *gc = client->application;
 	SilcPurple sg = purple_connection_get_protocol_data(gc);
 	PurpleConversation *convo;
+	PurpleConversationManager *manager = NULL;
 	char *msg, *tmp;
 
-	if (!message)
+	if (!message) {
 		return;
+	}
 
+	manager = purple_conversation_manager_get_default();
 	/* XXX - Should this be PURPLE_CONV_TYPE_IM? */
-	convo = purple_conversations_find_with_account(
-							      sender->nickname, sg->account);
+	convo = purple_conversation_manager_find(manager, sg->account,
+	                                         sender->nickname);
 
 	if (flags & SILC_MESSAGE_FLAG_SIGNED &&
 	    purple_account_get_bool(sg->account, "sign-verify", FALSE)) {
@@ -445,6 +461,7 @@
 {
 	va_list va;
 	PurpleConnection *gc = client->application;
+	PurpleConversationManager *manager;
 	SilcPurple sg = purple_connection_get_protocol_data(gc);
 	PurpleAccount *account = purple_connection_get_account(gc);
 	PurpleConversation *chat;
@@ -464,6 +481,8 @@
 	va_start(va, type);
 	memset(buf, 0, sizeof(buf));
 
+	manager = purple_conversation_manager_get_default();
+
 	switch (type) {
 
 	case SILC_NOTIFY_TYPE_NONE:
@@ -490,10 +509,11 @@
 		if (client_entry == conn->local_entry)
 			break;
 
-		chat = purple_conversations_find_chat_with_account(
-							      channel->channel_name, sg->account);
-		if (!chat)
+		chat = purple_conversation_manager_find_chat(manager, sg->account,
+		                                             channel->channel_name);
+		if (!chat) {
 			break;
+		}
 
 		/* Join user to channel */
 		g_snprintf(buf, sizeof(buf), "%s@%s",
@@ -507,10 +527,11 @@
 		client_entry = va_arg(va, SilcClientEntry);
 		channel = va_arg(va, SilcChannelEntry);
 
-		chat = purple_conversations_find_chat_with_account(
-							      channel->channel_name, sg->account);
-		if (!chat)
+		chat = purple_conversation_manager_find_chat(manager, sg->account,
+		                                             channel->channel_name);
+		if (!chat) {
 			break;
+		}
 
 		/* Remove user from channel */
 		purple_chat_conversation_remove_user(PURPLE_CHAT_CONVERSATION(chat),
@@ -525,10 +546,11 @@
 		/* Remove from all channels */
 		silc_hash_table_list(client_entry->channels, &htl);
 		while (silc_hash_table_get(&htl, NULL, (void *)&chu)) {
-			chat = purple_conversations_find_chat_with_account(
-								      chu->channel->channel_name, sg->account);
-			if (!chat)
+			chat = purple_conversation_manager_find_chat(manager, sg->account,
+			                                             chu->channel->channel_name);
+			if (!chat) {
 				continue;
+			}
 			purple_chat_conversation_remove_user(PURPLE_CHAT_CONVERSATION(chat),
 						     client_entry->nickname,
 						     tmp);
@@ -545,13 +567,15 @@
 			tmp = va_arg(va, char *);
 			channel = va_arg(va, SilcChannelEntry);
 
-			chat = purple_conversations_find_chat_with_account(
-								      channel->channel_name, sg->account);
-			if (!chat)
+			chat = purple_conversation_manager_find_chat(manager, sg->account,
+			                                             channel->channel_name);
+			if (!chat) {
 				break;
+			}
 
-			if (!tmp)
+			if (!tmp) {
 				break;
+			}
 
 			esc = g_markup_escape_text(tmp, -1);
 			tmp2 = purple_markup_linkify(esc);
@@ -604,13 +628,15 @@
 		/* Change nick on all channels */
 		silc_hash_table_list(client_entry->channels, &htl);
 		while (silc_hash_table_get(&htl, NULL, (void *)&chu)) {
-			chat = purple_conversations_find_chat_with_account(
-								      chu->channel->channel_name, sg->account);
-			if (!chat)
+			chat = purple_conversation_manager_find_chat(manager, sg->account,
+			                                             chu->channel->channel_name);
+			if (!chat) {
 				continue;
-			if (purple_chat_conversation_has_user(PURPLE_CHAT_CONVERSATION(chat), client_entry->nickname))
+			}
+			if (purple_chat_conversation_has_user(PURPLE_CHAT_CONVERSATION(chat), client_entry->nickname)) {
 				purple_chat_conversation_rename_user(PURPLE_CHAT_CONVERSATION(chat),
 							     tmp, name);
+			}
 		}
 		silc_hash_table_list_reset(&htl);
 
@@ -627,19 +653,23 @@
 		(void)va_arg(va, SilcDList);
 		channel = va_arg(va, SilcChannelEntry);
 
-		chat = purple_conversations_find_chat_with_account(
-							      channel->channel_name, sg->account);
-		if (!chat)
+		chat = purple_conversation_manager_find_chat(manager, sg->account,
+		                                             channel->channel_name);
+		if (!chat) {
 			break;
+		}
 
-		if (idtype == SILC_ID_CLIENT)
+		if (idtype == SILC_ID_CLIENT) {
 			name = ((SilcClientEntry)entry)->nickname;
-		else if (idtype == SILC_ID_SERVER)
+		} else if (idtype == SILC_ID_SERVER) {
 			name = ((SilcServerEntry)entry)->server_name;
-		else
+		} else {
 			name = ((SilcChannelEntry)entry)->channel_name;
-		if (!name)
+		}
+
+		if (!name) {
 			break;
+		}
 
 		if (mode) {
 			silcpurple_get_chmode_string(mode, buf2, sizeof(buf2));
@@ -663,19 +693,23 @@
 			client_entry2 = va_arg(va, SilcClientEntry);
 			channel = va_arg(va, SilcChannelEntry);
 
-			chat = purple_conversations_find_chat_with_account(
-								      channel->channel_name, sg->account);
-			if (!chat)
+			chat = purple_conversation_manager_find_chat(manager, sg->account,
+			                                             channel->channel_name);
+			if (!chat) {
 				break;
+			}
 
-			if (idtype == SILC_ID_CLIENT)
+			if (idtype == SILC_ID_CLIENT) {
 				name = ((SilcClientEntry)entry)->nickname;
-			else if (idtype == SILC_ID_SERVER)
+			} else if (idtype == SILC_ID_SERVER) {
 				name = ((SilcServerEntry)entry)->server_name;
-			else
+			} else {
 				name = ((SilcChannelEntry)entry)->channel_name;
-			if (!name)
+			}
+
+			if (!name) {
 				break;
+			}
 
 			if (mode) {
 				silcpurple_get_chumode_string(mode, buf2, sizeof(buf2));
@@ -709,10 +743,11 @@
 		client_entry2 = va_arg(va, SilcClientEntry);
 		channel = va_arg(va, SilcChannelEntry);
 
-		chat = purple_conversations_find_chat_with_account(
-							      channel->channel_name, sg->account);
-		if (!chat)
+		chat = purple_conversation_manager_find_chat(manager, sg->account,
+		                                             channel->channel_name);
+		if (!chat) {
 			break;
+		}
 
 		if (client_entry == conn->local_entry) {
 			/* Remove us from channel */
@@ -760,10 +795,11 @@
 			/* Remove us from all channels */
 			silc_hash_table_list(client_entry->channels, &htl);
 			while (silc_hash_table_get(&htl, NULL, (void *)&chu)) {
-				chat = purple_conversations_find_chat_with_account(
-										chu->channel->channel_name, sg->account);
-				if (!chat)
+				chat = purple_conversation_manager_find_chat(manager, sg->account,
+				                                             chu->channel->channel_name);
+				if (!chat) {
 					continue;
+				}
 				purple_conversation_write_system_message(chat, buf, 0);
 				purple_serv_got_chat_left(gc, purple_chat_conversation_get_id(PURPLE_CHAT_CONVERSATION(chat)));
 			}
@@ -790,10 +826,11 @@
 			/* Remove user from all channels */
 			silc_hash_table_list(client_entry->channels, &htl);
 			while (silc_hash_table_get(&htl, NULL, (void *)&chu)) {
-				chat = purple_conversations_find_chat_with_account(
-										chu->channel->channel_name, sg->account);
-				if (!chat)
+				chat = purple_conversation_manager_find_chat(manager, sg->account,
+				                                             chu->channel->channel_name);
+				if (!chat) {
 					continue;
+				}
 				purple_chat_conversation_remove_user(PURPLE_CHAT_CONVERSATION(chat),
 							     client_entry->nickname, tmp);
 			}
@@ -814,10 +851,11 @@
 			/* Remove from all channels */
 			silc_hash_table_list(client_entry->channels, &htl);
 			while (silc_hash_table_get(&htl, NULL, (void *)&chu)) {
-				chat = purple_conversations_find_chat_with_account(
-									      chu->channel->channel_name, sg->account);
-				if (!chat)
+				chat = purple_conversation_manager_find_chat(manager, sg->account,
+				                                             chu->channel->channel_name);
+				if (!chat) {
 					continue;
+				}
 				purple_chat_conversation_remove_user(PURPLE_CHAT_CONVERSATION(chat),
 							     client_entry->nickname,
 							     _("Server signoff"));
@@ -990,6 +1028,9 @@
 	PurpleConnection *gc = client->application;
 	SilcPurple sg = purple_connection_get_protocol_data(gc);
 	PurpleConversation *chat;
+	PurpleConversationManager *manager;
+
+	manager = purple_conversation_manager_get_default();
 
 	switch (command) {
 	case SILC_COMMAND_JOIN:
@@ -1016,10 +1057,11 @@
 			/* Add channel to Purple */
 			channel->context = SILC_32_TO_PTR(++sg->channel_ids);
 			purple_serv_got_joined_chat(gc, sg->channel_ids, channel->channel_name);
-			chat = purple_conversations_find_chat_with_account(
-								      channel->channel_name, sg->account);
-			if (!chat)
+			chat = purple_conversation_manager_find_chat(manager, sg->account,
+			                                             channel->channel_name);
+			if (!chat) {
 			  return;
+			}
 
 			/* Add all users to channel */
 			while (silc_hash_table_get(user_list, NULL, (void *)&chu)) {
@@ -1310,8 +1352,8 @@
 
 			channel = va_arg(ap, SilcChannelEntry);
 
-			chat = purple_conversations_find_chat_with_account(
-								      channel->channel_name, sg->account);
+			chat = purple_conversation_manager_find_chat(manager, sg->account,
+			                                             channel->channel_name);
 			if (!chat) {
 				purple_debug_error("silc", "Got a topic for %s, which doesn't exist\n",
 						   channel->channel_name);
@@ -1346,14 +1388,16 @@
 			/* Change nick on all channels */
 			silc_hash_table_list(local_entry->channels, &htl);
 			while (silc_hash_table_get(&htl, NULL, (void *)&chu)) {
-				chat = purple_conversations_find_chat_with_account(
-									      chu->channel->channel_name, sg->account);
-				if (!chat)
+				chat = purple_conversation_manager_find_chat(manager, sg->account,
+				                                             chu->channel->channel_name);
+				if (!chat) {
 					continue;
+				}
 				oldnick = purple_chat_conversation_get_nick(PURPLE_CHAT_CONVERSATION(chat));
 				if (!purple_strequal(oldnick,
 						purple_normalize(purple_conversation_get_account(chat),
-						newnick))) {
+						newnick)))
+				{
 
 					purple_chat_conversation_rename_user(PURPLE_CHAT_CONVERSATION(chat),
 								     oldnick, newnick);
diff --git a/libpurple/protocols/silc/silc.c b/libpurple/protocols/silc/silc.c
--- a/libpurple/protocols/silc/silc.c
+++ b/libpurple/protocols/silc/silc.c
@@ -1401,6 +1401,7 @@
 	SilcPurple sg = purple_connection_get_protocol_data(gc);
 	SilcPurpleIM im = context;
 	PurpleConversation *convo;
+	PurpleConversationManager *manager;
 	char tmp[256];
 	SilcClientEntry client_entry;
 	SilcDList list;
@@ -1408,13 +1409,15 @@
 	const gchar *me;
 	PurpleMessage *msg;
 
-	convo = purple_conversations_find_im_with_account(im->nick,
-						      sg->account);
-	if (!convo)
+	manager = purple_conversation_manager_get_default();
+	convo = purple_conversation_manager_find_im(manager, sg->account, im->nick);
+	if (!convo) {
 		return;
+	}
 
-	if (!clients)
+	if (!clients) {
 		goto err;
+	}
 
 	if (silc_dlist_count(clients) > 1) {
 		/* Find the correct one. The im->nick might be a formatted nick
@@ -1604,9 +1607,15 @@
 	if (gc == NULL)
 		return PURPLE_CMD_RET_FAILED;
 
-	if(args && args[0])
-		chat = purple_conversations_find_chat_with_account(args[0],
-									purple_connection_get_account(gc));
+	if(args && args[0]) {
+		PurpleConversationManager *manager;
+
+		manager = purple_conversation_manager_get_default();
+
+		chat = purple_conversation_manager_find_chat(manager,
+		                                             purple_connection_get_account(gc),
+		                                             args[0]);
+	}
 
 	if (chat != NULL)
 		id = purple_chat_conversation_get_id(PURPLE_CHAT_CONVERSATION(chat));
diff --git a/libpurple/protocols/zephyr/zephyr.c b/libpurple/protocols/zephyr/zephyr.c
--- a/libpurple/protocols/zephyr/zephyr.c
+++ b/libpurple/protocols/zephyr/zephyr.c
@@ -315,6 +315,7 @@
 			gchar *send_inst_utf8;
 			GSList *l = g_slist_find_custom(zephyr->subscrips, &sub, (GCompareFunc)zephyr_triple_subset);
 			PurpleConversation *gcc;
+			PurpleConversationManager *manager;
 
 			if (!l) {
 				/* This is a server supplied subscription */
@@ -340,7 +341,10 @@
 				}
 			}
 
-			gcc = purple_conversations_find_chat_with_account(zt->name, purple_connection_get_account(gc));
+			manager = purple_conversation_manager_get_default();
+			gcc = purple_conversation_manager_find_chat(manager,
+			                                            purple_connection_get_account(gc),
+			                                            zt->name);
 			if (!purple_chat_conversation_has_user(PURPLE_CHAT_CONVERSATION(gcc), stripped_sender)) {
 				GInetAddress *inet_addr = NULL;
 				gchar *ipaddr = NULL;
@@ -924,6 +928,7 @@
 	zephyr_triple *zt;
 	const char *sig;
 	PurpleConversation *gcc;
+	PurpleConversationManager *manager;
 	char *inst;
 	char *recipient;
 	zephyr_account *zephyr = purple_connection_get_protocol_data(gc);
@@ -937,7 +942,10 @@
 	zt = l->data;
 	sig = zephyr_get_signature();
 
-	gcc = purple_conversations_find_chat_with_account(zt->name, purple_connection_get_account(gc));
+	manager = purple_conversation_manager_get_default();
+	gcc = purple_conversation_manager_find_chat(manager,
+	                                            purple_connection_get_account(gc),
+	                                            zt->name);
 
 	if (!(inst = (char *)purple_chat_conversation_get_topic(PURPLE_CHAT_CONVERSATION(gcc))))
 		inst = g_strdup("PERSONAL");
@@ -1354,6 +1362,7 @@
 {
 	zephyr_triple *zt;
 	PurpleConversation *gcc;
+	PurpleConversationManager *manager;
 	gchar *topic_utf8;
 	zephyr_account *zephyr = purple_connection_get_protocol_data(gc);
 	GSList *l;
@@ -1364,7 +1373,10 @@
 	}
 	zt = l->data;
 
-	gcc = purple_conversations_find_chat_with_account(zt->name, purple_connection_get_account(gc));
+	manager = purple_conversation_manager_get_default();
+	gcc = purple_conversation_manager_find_chat(manager,
+	                                            purple_connection_get_account(gc),
+	                                            zt->name);
 
 	topic_utf8 = convert_to_utf8(topic, zephyr->encoding);
 	purple_chat_conversation_set_topic(PURPLE_CHAT_CONVERSATION(gcc), zephyr->username, topic_utf8);
