diff --git a/libpurple/account.c b/libpurple/account.c
--- a/libpurple/account.c
+++ b/libpurple/account.c
@@ -30,6 +30,7 @@
 #include "notify.h"
 #include "prefs.h"
 #include "purpleaccountpresence.h"
+#include "purpleconversationmanager.h"
 #include "purplecredentialmanager.h"
 #include "purpleprivate.h"
 #include "purpleprotocolclient.h"
@@ -1051,17 +1052,22 @@
 	GList *l;
 	PurpleAccount *account = PURPLE_ACCOUNT(object);
 	PurpleAccountPrivate *priv = purple_account_get_instance_private(account);
+	PurpleConversationManager *manager = NULL;
 
 	purple_debug_info("account", "Destroying account %p\n", account);
 	purple_signal_emit(purple_accounts_get_handle(), "account-destroying",
 						account);
 
-	for (l = purple_conversations_get_all(); l != NULL; l = l->next)
-	{
-		PurpleConversation *conv = (PurpleConversation *)l->data;
-
-		if (purple_conversation_get_account(conv) == account)
+	manager = purple_conversation_manager_get_default();
+	l = purple_conversation_manager_get_all(manager);
+	while(l != NULL) {
+		PurpleConversation *conv = PURPLE_CONVERSATION(l->data);
+
+		if (purple_conversation_get_account(conv) == account) {
 			purple_conversation_set_account(conv, NULL);
+		}
+
+		l = g_list_delete_link(l, l);
 	}
 
 	purple_account_set_status_types(account, NULL);
diff --git a/libpurple/accounts.c b/libpurple/accounts.c
--- a/libpurple/accounts.c
+++ b/libpurple/accounts.c
@@ -27,6 +27,7 @@
 #include "debug.h"
 #include "enums.h"
 #include "network.h"
+#include "purpleconversationmanager.h"
 #include "purplecredentialmanager.h"
 #include "purpleprivate.h"
 
@@ -584,7 +585,8 @@
 purple_accounts_delete(PurpleAccount *account)
 {
 	PurpleBlistNode *gnode, *cnode, *bnode;
-	PurpleCredentialManager *manager = NULL;
+	PurpleConversationManager *conv_manager = NULL;
+	PurpleCredentialManager *cred_manager = NULL;
 	GList *iter;
 
 	g_return_if_fail(account != NULL);
@@ -636,11 +638,16 @@
 	}
 
 	/* Remove any open conversation for this account */
-	for (iter = purple_conversations_get_all(); iter; ) {
+	conv_manager = purple_conversation_manager_get_default();
+	iter = purple_conversation_manager_get_all(conv_manager);
+	while(iter != NULL) {
 		PurpleConversation *conv = iter->data;
-		iter = iter->next;
-		if (purple_conversation_get_account(conv) == account)
+
+		if(purple_conversation_get_account(conv) == account) {
 			g_object_unref(conv);
+		}
+
+		iter = g_list_delete_link(iter, iter);
 	}
 
 	/* This will cause the deletion of an old buddy icon. */
@@ -649,8 +656,8 @@
 	/* This is async because we do not want the
 	 * account being overwritten before we are done.
 	 */
-	manager = purple_credential_manager_get_default();
-	purple_credential_manager_clear_password_async(manager, account, NULL,
+	cred_manager = purple_credential_manager_get_default();
+	purple_credential_manager_clear_password_async(cred_manager, account, NULL,
 	                                               purple_accounts_delete_set,
 	                                               NULL);
 }
diff --git a/libpurple/buddy.c b/libpurple/buddy.c
--- a/libpurple/buddy.c
+++ b/libpurple/buddy.c
@@ -25,6 +25,7 @@
 #include "debug.h"
 #include "internal.h"
 #include "purplebuddypresence.h"
+#include "purpleconversationmanager.h"
 #include "purpleprotocolclient.h"
 #include "util.h"
 
@@ -437,6 +438,7 @@
 	PurpleBuddyList *blist = NULL;
 	PurpleBuddyPrivate *priv = NULL;
 	PurpleConversation *im = NULL;
+	PurpleConversationManager *manager = NULL;
 	gchar *old_alias = NULL, *new_alias = NULL;
 
 	g_return_if_fail(PURPLE_IS_BUDDY(buddy));
@@ -467,7 +469,9 @@
 	purple_blist_save_node(blist, PURPLE_BLIST_NODE(buddy));
 	purple_blist_update_node(blist, PURPLE_BLIST_NODE(buddy));
 
-	im = purple_conversations_find_im_with_account(priv->name, priv->account);
+	manager = purple_conversation_manager_get_default();
+	im = purple_conversation_manager_find_im(manager, priv->account,
+	                                         priv->name);
 	if(PURPLE_IS_IM_CONVERSATION(im)) {
 		purple_conversation_autoset_title(im);
 	}
@@ -493,6 +497,7 @@
 	PurpleBuddyList *blist = NULL;
 	PurpleBuddyPrivate *priv = NULL;
 	PurpleConversation *im = NULL;
+	PurpleConversationManager *manager = NULL;
 	gchar *old_alias = NULL, *new_alias = NULL;
 
 	g_return_if_fail(PURPLE_IS_BUDDY(buddy));
@@ -525,7 +530,9 @@
 	purple_blist_save_node(blist, PURPLE_BLIST_NODE(buddy));
 	purple_blist_update_node(blist, PURPLE_BLIST_NODE(buddy));
 
-	im = purple_conversations_find_im_with_account(priv->name, priv->account);
+	manager = purple_conversation_manager_get_default();
+	im = purple_conversation_manager_find_im(manager, priv->account,
+	                                         priv->name);
 	if(PURPLE_IS_IM_CONVERSATION(im)) {
 		purple_conversation_autoset_title(im);
 	}
diff --git a/libpurple/buddyicon.c b/libpurple/buddyicon.c
--- a/libpurple/buddyicon.c
+++ b/libpurple/buddyicon.c
@@ -24,6 +24,7 @@
 #include "debug.h"
 #include "image.h"
 #include "purpleconversation.h"
+#include "purpleconversationmanager.h"
 #include "purpleprivate.h"
 #include "purpleprotocolserver.h"
 #include "util.h"
@@ -379,6 +380,7 @@
 purple_buddy_icon_update(PurpleBuddyIcon *icon)
 {
 	PurpleConversation *im;
+	PurpleConversationManager *manager;
 	PurpleAccount *account;
 	const char *username;
 	PurpleBuddyIcon *icon_to_set;
@@ -440,7 +442,8 @@
 		buddies = g_slist_delete_link(buddies, buddies);
 	}
 
-	im = purple_conversations_find_im_with_account(username, account);
+	manager = purple_conversation_manager_get_default();
+	im = purple_conversation_manager_find_im(manager, account, username);
 	if(PURPLE_IS_IM_CONVERSATION(im)) {
 		purple_im_conversation_set_icon(PURPLE_IM_CONVERSATION(im),
 		                                icon_to_set);
@@ -873,6 +876,7 @@
                                         guchar *icon_data, size_t icon_len)
 {
 	char *old_icon;
+	PurpleConversationManager *manager;
 	PurpleImage *old_img;
 	PurpleImage *img = NULL;
 
@@ -908,6 +912,8 @@
 	else
 		g_hash_table_remove(pointer_icon_cache, node);
 
+	manager = purple_conversation_manager_get_default();
+
 	if (PURPLE_IS_CONTACT(node)) {
 		PurpleBlistNode *child;
 		for (child = purple_blist_node_get_first_child(node);
@@ -917,26 +923,32 @@
 			PurpleBuddy *buddy;
 			PurpleConversation *im;
 
-			if (!PURPLE_IS_BUDDY(child))
+			if(!PURPLE_IS_BUDDY(child)) {
 				continue;
+			}
+
+			buddy = PURPLE_BUDDY(child);
 
-			buddy = (PurpleBuddy *)child;
-
-			im = purple_conversations_find_im_with_account(purple_buddy_get_name(buddy), purple_buddy_get_account(buddy));
-			if (im)
+			im = purple_conversation_manager_find_im(manager,
+			                                         purple_buddy_get_account(buddy),
+			                                         purple_buddy_get_name(buddy));
+			if(PURPLE_IS_IM_CONVERSATION(im)) {
 				purple_conversation_update(im, PURPLE_CONVERSATION_UPDATE_ICON);
+			}
 
 			/* Is this call necessary anymore? Can the buddies
 			 * themselves need updating when the custom buddy
 			 * icon changes? */
-			purple_blist_update_node(purple_blist_get_default(),
-			                         PURPLE_BLIST_NODE(buddy));
+			purple_blist_update_node(purple_blist_get_default(), child);
 		}
 	} else if (PURPLE_IS_CHAT(node)) {
+		PurpleAccount *account = purple_chat_get_account(PURPLE_CHAT(node));
 		PurpleConversation *chat = NULL;
+		PurpleConversationManager *manager = NULL;
+		const gchar *name = purple_chat_get_name(PURPLE_CHAT(node));
 
-		chat = purple_conversations_find_chat_with_account(purple_chat_get_name((PurpleChat*)node), purple_chat_get_account((PurpleChat*)node));
-		if (chat) {
+		chat = purple_conversation_manager_find_chat(manager, account, name);
+		if(PURPLE_IS_CHAT_CONVERSATION(chat)) {
 			purple_conversation_update(chat, PURPLE_CONVERSATION_UPDATE_ICON);
 		}
 	}
diff --git a/libpurple/contact.c b/libpurple/contact.c
--- a/libpurple/contact.c
+++ b/libpurple/contact.c
@@ -24,6 +24,7 @@
 #include "contact.h"
 #include "internal.h" /* TODO: this needs to die */
 #include "purplebuddypresence.h"
+#include "purpleconversationmanager.h"
 #include "purpleprivate.h"
 #include "util.h"
 
@@ -113,7 +114,7 @@
 purple_contact_set_alias(PurpleContact *contact, const char *alias)
 {
 	PurpleContactPrivate *priv = NULL;
-	PurpleConversation *im;
+	PurpleConversationManager *manager = NULL;
 	PurpleBlistNode *bnode;
 	char *old_alias;
 	char *new_alias = NULL;
@@ -131,33 +132,37 @@
 
 	old_alias = priv->alias;
 
-	if ((new_alias != NULL) && (*new_alias != '\0'))
+	if ((new_alias != NULL) && (*new_alias != '\0')) {
 		priv->alias = new_alias;
-	else {
+	} else {
 		priv->alias = NULL;
 		g_free(new_alias); /* could be "\0" */
 	}
 
-	g_object_notify_by_pspec(G_OBJECT(contact),
-			properties[PROP_ALIAS]);
+	g_object_notify_by_pspec(G_OBJECT(contact), properties[PROP_ALIAS]);
 
 	purple_blist_save_node(purple_blist_get_default(),
 	                       PURPLE_BLIST_NODE(contact));
 	purple_blist_update_node(purple_blist_get_default(),
 	                         PURPLE_BLIST_NODE(contact));
 
+	manager = purple_conversation_manager_get_default();
+
 	for(bnode = PURPLE_BLIST_NODE(contact)->child; bnode != NULL; bnode = bnode->next)
 	{
 		PurpleBuddy *buddy = PURPLE_BUDDY(bnode);
+		PurpleConversation *im;
 
-		im = purple_conversations_find_im_with_account(purple_buddy_get_name(buddy),
-				purple_buddy_get_account(buddy));
-		if (im)
+		im = purple_conversation_manager_find_im(manager,
+		                                         purple_buddy_get_account(buddy),
+		                                         purple_buddy_get_name(buddy));
+		if(PURPLE_IS_IM_CONVERSATION(im)) {
 			purple_conversation_autoset_title(im);
+		}
 	}
 
 	purple_signal_emit(purple_blist_get_handle(), "blist-node-aliased",
-					 contact, old_alias);
+	                   contact, old_alias);
 	g_free(old_alias);
 }
 
diff --git a/libpurple/protocols.c b/libpurple/protocols.c
--- a/libpurple/protocols.c
+++ b/libpurple/protocols.c
@@ -30,6 +30,7 @@
 #include "protocol.h"
 #include "purpleaccountoption.h"
 #include "purpleconversation.h"
+#include "purpleconversationmanager.h"
 #include "purplecredentialmanager.h"
 #include "purpleprotocolattention.h"
 #include "purpleprotocolmanager.h"
@@ -452,14 +453,17 @@
 purple_protocol_got_attention(PurpleConnection *gc, const char *who, guint type_code)
 {
 	PurpleConversation *conv = NULL;
+	PurpleConversationManager *manager = NULL;
 	PurpleAccount *account = purple_connection_get_account(gc);
 
 	got_attention(gc, -1, who, type_code);
-	conv =
-		purple_conversations_find_with_account(who, account);
-	if (conv)
+
+	manager = purple_conversation_manager_get_default();
+	conv = purple_conversation_manager_find(manager, account, who);
+	if(PURPLE_IS_CONVERSATION(conv)) {
 		purple_protocol_attention(conv, who, type_code, PURPLE_MESSAGE_RECV,
-			time(NULL));
+		                          time(NULL));
+	}
 }
 
 void
diff --git a/libpurple/purplechatconversation.c b/libpurple/purplechatconversation.c
--- a/libpurple/purplechatconversation.c
+++ b/libpurple/purplechatconversation.c
@@ -25,6 +25,7 @@
 #include "internal.h"
 #include "debug.h"
 #include "enums.h"
+#include "purpleconversationmanager.h"
 #include "purplechatconversation.h"
 #include "purpleprivate.h"
 
@@ -341,13 +342,15 @@
 PurpleConversation *
 purple_chat_conversation_new(PurpleAccount *account, const gchar *name) {
 	PurpleConversation *chat = NULL;
+	PurpleConversationManager *manager = NULL;
 	PurpleConnection *connection = NULL;
 
 	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
 	g_return_val_if_fail(name != NULL, NULL);
 
 	/* Check if this conversation already exists. */
-	chat = purple_conversations_find_chat_with_account(name, account);
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat(manager, account, name);
 	if(PURPLE_IS_CHAT_CONVERSATION(chat)) {
 		if(!purple_chat_conversation_has_left(PURPLE_CHAT_CONVERSATION(chat))) {
 			purple_debug_warning("chat-conversation", "A chat named %s "
diff --git a/libpurple/purpleconversation.c b/libpurple/purpleconversation.c
--- a/libpurple/purpleconversation.c
+++ b/libpurple/purpleconversation.c
@@ -32,6 +32,7 @@
 #include "prefs.h"
 #include "protocol.h"
 #include "purpleconversation.h"
+#include "purpleconversationmanager.h"
 #include "purplemarkup.h"
 #include "purpleprivate.h"
 #include "purpleprotocolclient.h"
@@ -288,6 +289,7 @@
 	PurpleConversation *conv = PURPLE_CONVERSATION(object);
 	PurpleAccount *account;
 	PurpleConnection *gc;
+	PurpleConversationManager *manager;
 	PurpleConversationUiOps *ops;
 
 	G_OBJECT_CLASS(purple_conversation_parent_class)->constructed(object);
@@ -299,7 +301,8 @@
 	purple_conversation_set_features(conv, purple_connection_get_flags(gc));
 
 	/* add the conversation to the appropriate lists */
-	purple_conversations_add(conv);
+	manager = purple_conversation_manager_get_default();
+	purple_conversation_manager_register(manager, conv);
 
 	/* Auto-set the title. */
 	purple_conversation_autoset_title(conv);
@@ -328,6 +331,7 @@
 static void
 purple_conversation_finalize(GObject *object) {
 	PurpleConversation *conv = PURPLE_CONVERSATION(object);
+	PurpleConversationManager *manager;
 	PurpleConversationPrivate *priv =
 			purple_conversation_get_instance_private(conv);
 	PurpleConversationUiOps *ops  = purple_conversation_get_ui_ops(conv);
@@ -335,7 +339,8 @@
 	purple_request_close_with_handle(conv);
 
 	/* remove from conversations and im/chats lists prior to emit */
-	purple_conversations_remove(conv);
+	manager = purple_conversation_manager_get_default();
+	purple_conversation_manager_unregister(manager, conv);
 
 	purple_signal_emit(purple_conversations_get_handle(),
 	                   "deleting-conversation", conv);
@@ -682,7 +687,10 @@
 			return;
 		}
 	} else if(PURPLE_IS_IM_CONVERSATION(conv)) {
-		if(!g_list_find(purple_conversations_get_all(), conv)) {
+		PurpleConversationManager *manager = NULL;
+
+		manager = purple_conversation_manager_get_default();
+		if(!purple_conversation_manager_is_registered(manager, conv)) {
 			return;
 		}
 	}
@@ -852,14 +860,17 @@
                                   const gchar *what)
 {
 	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 
 	g_return_val_if_fail(who != NULL, FALSE);
 	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), FALSE);
 	g_return_val_if_fail(what != NULL, FALSE);
 
-	conv = purple_conversations_find_with_account(who, account);
-	if(conv != NULL) {
-		purple_conversation_write_system_message(conv, what, PURPLE_MESSAGE_ERROR);
+	manager = purple_conversation_manager_get_default();
+	conv = purple_conversation_manager_find(manager, account, who);
+	if(PURPLE_IS_CONVERSATION(conv)) {
+		purple_conversation_write_system_message(conv, what,
+		                                         PURPLE_MESSAGE_ERROR);
 		return TRUE;
 	}
 
diff --git a/libpurple/purpleimconversation.c b/libpurple/purpleimconversation.c
--- a/libpurple/purpleimconversation.c
+++ b/libpurple/purpleimconversation.c
@@ -23,6 +23,7 @@
 
 #include <libpurple/debug.h>
 #include <libpurple/enums.h>
+#include <libpurple/purpleconversationmanager.h>
 #include <libpurple/purpleprivate.h>
 #include <libpurple/purpleprotocolclient.h>
 
@@ -252,12 +253,15 @@
 purple_im_conversation_new(PurpleAccount *account, const char *name)
 {
 	PurpleConversation *im = NULL;
+	PurpleConversationManager *manager = NULL;
 
 	g_return_val_if_fail(PURPLE_IS_ACCOUNT(account), NULL);
 	g_return_val_if_fail(name != NULL, NULL);
 
 	/* Check if this conversation already exists. */
-	if((im = purple_conversations_find_im_with_account(name, account)) != NULL) {
+	manager = purple_conversation_manager_get_default();
+	im = purple_conversation_manager_find_im(manager, account, name);
+	if(PURPLE_IS_IM_CONVERSATION(im)) {
 		return g_object_ref(im);
 	}
 
diff --git a/libpurple/server.c b/libpurple/server.c
--- a/libpurple/server.c
+++ b/libpurple/server.c
@@ -33,6 +33,7 @@
 #include "prefs.h"
 #include "protocol.h"
 #include "purpleconversation.h"
+#include "purpleconversationmanager.h"
 #include "purpleprivate.h"
 #include "purpleprotocolattention.h"
 #include "purpleprotocolchat.h"
@@ -123,8 +124,9 @@
 
 int purple_serv_send_im(PurpleConnection *gc, PurpleMessage *msg)
 {
+	PurpleAccount *account = NULL;
 	PurpleConversation *im = NULL;
-	PurpleAccount *account = NULL;
+	PurpleConversationManager *manager = NULL;
 	PurplePresence *presence = NULL;
 	PurpleProtocol *protocol = NULL;
 	int val = -EINVAL;
@@ -143,7 +145,8 @@
 	presence = purple_account_get_presence(account);
 	recipient = purple_message_get_recipient(msg);
 
-	im = purple_conversations_find_im_with_account(recipient, account);
+	manager = purple_conversation_manager_get_default();
+	im = purple_conversation_manager_find_im(manager, account, recipient);
 
 	/* we probably shouldn't be here if the protocol doesn't know how to send
 	 * im's... but there was a similar check here before so I just reproduced
@@ -239,13 +242,16 @@
 purple_serv_got_alias(PurpleConnection *gc, const char *who, const char *alias)
 {
 	PurpleAccount *account;
-	GSList *buddies;
 	PurpleBuddy *b;
 	PurpleConversation *im;
+	PurpleConversationManager *manager;
+	GSList *buddies;
 
 	account = purple_connection_get_account(gc);
 	buddies = purple_blist_find_buddies(account, who);
 
+	manager = purple_conversation_manager_get_default();
+
 	while (buddies != NULL)
 	{
 		const char *server_alias;
@@ -260,7 +266,8 @@
 
 		purple_buddy_set_server_alias(b, alias);
 
-		im = purple_conversations_find_im_with_account(purple_buddy_get_name(b), account);
+		im = purple_conversation_manager_find_im(manager, account,
+		                                         purple_buddy_get_name(b));
 		if (im != NULL && alias != NULL && !purple_strequal(alias, who))
 		{
 			char *escaped = g_markup_escape_text(who, -1);
@@ -439,11 +446,15 @@
 
 void purple_serv_chat_invite(PurpleConnection *gc, int id, const char *message, const char *name)
 {
+	PurpleAccount *account;
+	PurpleConversation *chat;
+	PurpleConversationManager *manager;
 	PurpleProtocol *protocol = NULL;
-	PurpleConversation *chat;
 	char *buffy;
 
-	chat = purple_conversations_find_chat(gc, id);
+	account = purple_connection_get_account(gc);
+	manager = purple_conversation_manager_get_default();
+	chat = purple_conversation_manager_find_chat_by_id(manager, account, id);
 
 	if(chat == NULL)
 		return;
@@ -503,6 +514,7 @@
 {
 	PurpleAccount *account;
 	PurpleConversation *im;
+	PurpleConversationManager *manager;
 	char *message, *name;
 	char *angel, *buffy;
 	int plugin_return;
@@ -510,7 +522,7 @@
 
 	g_return_if_fail(msg != NULL);
 
-	account  = purple_connection_get_account(gc);
+	account = purple_connection_get_account(gc);
 
 	if (mtime < 0) {
 		purple_debug_error("server",
@@ -531,11 +543,13 @@
 		return;
 	}
 
+	manager = purple_conversation_manager_get_default();
+
 	/*
 	 * We should update the conversation window buttons and menu,
 	 * if it exists.
 	 */
-	im = purple_conversations_find_im_with_account(who, purple_connection_get_account(gc));
+	im = purple_conversation_manager_find_im(manager, account, who);
 
 	/*
 	 * Make copies of the message and the sender in case plugins want
@@ -546,7 +560,7 @@
 
 	plugin_return = GPOINTER_TO_INT(
 		purple_signal_emit_return_1(purple_conversations_get_handle(),
-								  "receiving-im-msg", purple_connection_get_account(gc),
+								  "receiving-im-msg", account,
 								  &angel, &buffy, im, &flags));
 
 	if (!buffy || !angel || plugin_return) {
@@ -558,15 +572,17 @@
 	name = angel;
 	message = buffy;
 
-	purple_signal_emit(purple_conversations_get_handle(), "received-im-msg", purple_connection_get_account(gc),
-					 name, message, im, flags);
+	purple_signal_emit(purple_conversations_get_handle(), "received-im-msg",
+	                   account, name, message, im, flags);
 
 	/* search for conversation again in case it was created by received-im-msg handler */
-	if (im == NULL)
-		im = purple_conversations_find_im_with_account(name, purple_connection_get_account(gc));
+	if(im == NULL) {
+		im = purple_conversation_manager_find_im(manager, account, name);
+	}
 
-	if (im == NULL)
+	if(im == NULL) {
 		im = purple_im_conversation_new(account, name);
+	}
 
 	pmsg = purple_message_new_incoming(name, message, flags, mtime);
 	purple_conversation_write_message(im, pmsg);
@@ -655,11 +671,18 @@
 	g_free(name);
 }
 
-void purple_serv_got_typing(PurpleConnection *gc, const char *name, int timeout,
-					 PurpleIMTypingState state) {
+void
+purple_serv_got_typing(PurpleConnection *gc, const char *name, int timeout,
+                       PurpleIMTypingState state)
+{
+	PurpleAccount *account;
 	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 
-	conv = purple_conversations_find_im_with_account(name, purple_connection_get_account(gc));
+	account = purple_connection_get_account(gc);
+
+	manager = purple_conversation_manager_get_default();
+	conv = purple_conversation_manager_find_im(manager, account, name);
 	if(PURPLE_IS_IM_CONVERSATION(conv)) {
 		PurpleIMConversation *im = PURPLE_IM_CONVERSATION(conv);
 
@@ -673,30 +696,35 @@
 		{
 			case PURPLE_IM_TYPING:
 				purple_signal_emit(purple_conversations_get_handle(),
-								   "buddy-typing", purple_connection_get_account(gc), name);
+								   "buddy-typing", account, name);
 				break;
 			case PURPLE_IM_TYPED:
 				purple_signal_emit(purple_conversations_get_handle(),
-								   "buddy-typed", purple_connection_get_account(gc), name);
+								   "buddy-typed", account, name);
 				break;
 			case PURPLE_IM_NOT_TYPING:
 				purple_signal_emit(purple_conversations_get_handle(),
-								   "buddy-typing-stopped", purple_connection_get_account(gc), name);
+								   "buddy-typing-stopped", account, name);
 				break;
 		}
 	}
 }
 
-void purple_serv_got_typing_stopped(PurpleConnection *gc, const char *name) {
+void
+purple_serv_got_typing_stopped(PurpleConnection *gc, const char *name) {
+	PurpleAccount *account;
+	PurpleConversation *conv;
+	PurpleConversationManager *manager;
 
-	PurpleConversation *conv;
+	account = purple_connection_get_account(gc);
 
-	conv = purple_conversations_find_im_with_account(name, purple_connection_get_account(gc));
-	if (conv != NULL)
-	{
+	manager = purple_conversation_manager_get_default();
+	conv = purple_conversation_manager_find_im(manager, account, name);
+	if(conv != NULL) {
 		PurpleIMConversation *im = PURPLE_IM_CONVERSATION(conv);
-		if (purple_im_conversation_get_typing_state(im) == PURPLE_IM_NOT_TYPING)
+		if(purple_im_conversation_get_typing_state(im) == PURPLE_IM_NOT_TYPING) {
 			return;
+		}
 
 		purple_im_conversation_stop_typing_timeout(im);
 		purple_im_conversation_set_typing_state(im, PURPLE_IM_NOT_TYPING);
@@ -704,7 +732,7 @@
 	else
 	{
 		purple_signal_emit(purple_conversations_get_handle(),
-						 "buddy-typing-stopped", purple_connection_get_account(gc), name);
+		                   "buddy-typing-stopped", account, name);
 	}
 }
 
diff --git a/libpurple/xfer.c b/libpurple/xfer.c
--- a/libpurple/xfer.c
+++ b/libpurple/xfer.c
@@ -36,6 +36,7 @@
 #include "prefs.h"
 #include "proxy.h"
 #include "purple-gio.h"
+#include "purpleconversationmanager.h"
 #include "request.h"
 #include "util.h"
 #include "xfer.h"
@@ -212,6 +213,7 @@
 	const char *message, gboolean is_error, gboolean print_thumbnail)
 {
 	PurpleConversation *im = NULL;
+	PurpleConversationManager *manager = NULL;
 	PurpleMessageFlags flags = PURPLE_MESSAGE_SYSTEM;
 	char *escaped;
 	gconstpointer thumbnail_data;
@@ -220,11 +222,13 @@
 
 	thumbnail_data = purple_xfer_get_thumbnail(xfer, &size);
 
-	im = purple_conversations_find_im_with_account(priv->who,
-											   purple_xfer_get_account(xfer));
-
-	if (im == NULL)
+	manager = purple_conversation_manager_get_default();
+	im = purple_conversation_manager_find_im(manager,
+	                                         purple_xfer_get_account(xfer),
+	                                         priv->who);
+	if(PURPLE_IS_IM_CONVERSATION(im)) {
 		return;
+	}
 
 	escaped = g_markup_escape_text(message, -1);
 
@@ -956,11 +960,11 @@
 	if (completed == TRUE) {
 		char *msg = NULL;
 		PurpleConversation *im;
+		PurpleConversationManager *manager;
 
 		purple_xfer_set_status(xfer, PURPLE_XFER_STATUS_DONE);
 
-		if (purple_xfer_get_filename(xfer) != NULL)
-		{
+		if(purple_xfer_get_filename(xfer) != NULL) {
 			char *filename = g_markup_escape_text(purple_xfer_get_filename(xfer), -1);
 			if (purple_xfer_get_local_filename(xfer)
 			 && purple_xfer_get_xfer_type(xfer) == PURPLE_XFER_TYPE_RECEIVE)
@@ -974,16 +978,15 @@
 				msg = g_strdup_printf(_("Transfer of file %s complete"),
 				                      filename);
 			g_free(filename);
-		}
-		else
+		} else {
 			msg = g_strdup(_("File transfer complete"));
-
-		im = purple_conversations_find_im_with_account(priv->who,
-		                                             purple_xfer_get_account(xfer));
-
-		if (im != NULL) {
-			purple_conversation_write_system_message(
-				im, msg, 0);
+		}
+
+		manager = purple_conversation_manager_get_default();
+		im = purple_conversation_manager_find_im(manager, priv->account,
+		                                         priv->who);
+		if(PURPLE_IS_IM_CONVERSATION(im)) {
+			purple_conversation_write_system_message(im, msg, 0);
 		}
 		g_free(msg);
 	}
