diff --git a/libpurple/protocols/gg/chat.h b/libpurple/protocols/gg/chat.h
--- a/libpurple/protocols/gg/chat.h
+++ b/libpurple/protocols/gg/chat.h
@@ -49,7 +49,7 @@
 void ggp_chat_leave(PurpleProtocolChat *protocol_chat, PurpleConnection *gc, int local_id);
 void ggp_chat_invite(PurpleProtocolChat *protocol_chat, PurpleConnection *gc, int local_id, const char *message,
 	const char *who);
-int ggp_chat_send(PurpleProtocolChat *protocol_chat, PurpleConnection *gc, int local_id, PurpleMessage *msg);
+int ggp_chat_send(PurpleProtocolChat *protocol_chat, PurpleConnection *gc, int local_id, PurpleConversation *conversation, PurpleMessage *msg);
 
 void ggp_chat_got_message(PurpleConnection *gc, uint64_t chat_id,
 	const char *message, time_t time, uin_t who);
# HG changeset patch
# Node ID 1f161cd8a8a0
# Parent  a3895b6d3621
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
@@ -496,8 +496,9 @@
 
 gint
 ggp_chat_send(G_GNUC_UNUSED PurpleProtocolChat *protocol_chat,
-              PurpleConnection *gc,
-              gint local_id, PurpleMessage *msg)
+              PurpleConnection *gc, gint local_id,
+              G_GNUC_UNUSED PurpleConversation *conversation,
+              PurpleMessage *msg)
 {
 	PurpleAccount *account = NULL;
 	PurpleContactInfo *contact_info = NULL;
diff --git a/libpurple/protocols/jabber/message.h b/libpurple/protocols/jabber/message.h
--- a/libpurple/protocols/jabber/message.h
+++ b/libpurple/protocols/jabber/message.h
@@ -72,7 +72,7 @@
 
 void jabber_message_parse(JabberStream *js, PurpleXmlNode *packet);
 int jabber_message_send_im(PurpleProtocolIM *pim, PurpleConnection *gc, PurpleConversation *conversation, PurpleMessage *msg);
-int jabber_message_send_chat(PurpleProtocolChat *protocol_chat, PurpleConnection *gc, int id, PurpleMessage *msg);
+int jabber_message_send_chat(PurpleProtocolChat *protocol_chat, PurpleConnection *gc, int id, PurpleConversation *conversation, PurpleMessage *msg);
 
 unsigned int jabber_send_typing(PurpleProtocolIM *pim, PurpleConnection *gc, const char *who, PurpleIMTypingState state);
 
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
@@ -907,7 +907,9 @@
 
 gint
 jabber_message_send_chat(G_GNUC_UNUSED PurpleProtocolChat *protocol_chat,
-                         PurpleConnection *gc, gint id, PurpleMessage *msg)
+                         PurpleConnection *gc, gint id,
+                         G_GNUC_UNUSED PurpleConversation *conversation,
+                         PurpleMessage *msg)
 {
 	JabberChat *chat;
 	JabberMessage *jm;
diff --git a/libpurple/purpleprotocolchat.h b/libpurple/purpleprotocolchat.h
--- a/libpurple/purpleprotocolchat.h
+++ b/libpurple/purpleprotocolchat.h
@@ -123,7 +123,7 @@
 
 	void (*leave)(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id);
 
-	gint (*send)(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, PurpleMessage *message);
+	gint (*send)(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, PurpleConversation *conversation, PurpleMessage *message);
 
 	gchar *(*get_user_real_name)(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, const gchar *who);
 
@@ -235,6 +235,7 @@
  * @protocol_chat: The #PurpleProtocolChat instance.
  * @connection: The #PurpleConnection instance.
  * @id: The id of the chat.
+ * @conversation: The [class@Conversation] of the chat.
  * @message: The message to send.
  *
  * Sends @message to the chat identified by @id.
@@ -243,7 +244,7 @@
  *
  * Since: 3.0.0
  */
-gint purple_protocol_chat_send(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, PurpleMessage *message);
+gint purple_protocol_chat_send(PurpleProtocolChat *protocol_chat, PurpleConnection *connection, gint id, PurpleConversation *conversation, PurpleMessage *message);
 
 /**
  * purple_protocol_chat_get_user_real_name:
diff --git a/libpurple/purpleprotocolchat.c b/libpurple/purpleprotocolchat.c
--- a/libpurple/purpleprotocolchat.c
+++ b/libpurple/purpleprotocolchat.c
@@ -157,6 +157,7 @@
 gint
 purple_protocol_chat_send(PurpleProtocolChat *protocol_chat,
                           PurpleConnection *connection, gint id,
+                          PurpleConversation *conversation,
                           PurpleMessage *message)
 {
 	PurpleProtocolChatInterface *iface = NULL;
@@ -167,7 +168,8 @@
 
 	iface = PURPLE_PROTOCOL_CHAT_GET_IFACE(protocol_chat);
 	if(iface != NULL && iface->send != NULL) {
-		return iface->send(protocol_chat, connection, id, message);
+		return iface->send(protocol_chat, connection, id, conversation,
+		                   message);
 	}
 
 	return -1;
diff --git a/libpurple/server.c b/libpurple/server.c
--- a/libpurple/server.c
+++ b/libpurple/server.c
@@ -289,16 +289,25 @@
 	purple_protocol_chat_leave(PURPLE_PROTOCOL_CHAT(protocol), gc, id);
 }
 
-int purple_serv_chat_send(PurpleConnection *gc, int id, PurpleMessage *msg)
-{
-	PurpleProtocol *protocol;
-	protocol = purple_connection_get_protocol(gc);
+int
+purple_serv_chat_send(PurpleConnection *gc, int id, PurpleMessage *msg) {
+	PurpleAccount *account = NULL;
+	PurpleProtocol *protocol = NULL;
+	PurpleConversation *conversation = NULL;
+	PurpleConversationManager *manager = NULL;
 
 	g_return_val_if_fail(msg != NULL, -EINVAL);
 
+	account = purple_connection_get_account(gc);
+	protocol = purple_connection_get_protocol(gc);
+
+	manager = purple_conversation_manager_get_default();
+	conversation = purple_conversation_manager_find_chat_by_id(manager,
+	                                                           account, id);
+
 	if (PURPLE_PROTOCOL_IMPLEMENTS(protocol, CHAT, send)) {
 		return purple_protocol_chat_send(PURPLE_PROTOCOL_CHAT(protocol), gc,
-		                                 id, msg);
+		                                 id, conversation, msg);
 	}
 
 	return -EINVAL;
