diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp
index 9b463c9a3f4c1eca0bd0e737346363a83743bf00..d9c705adf02ba22e7c245858c31afebb9ca4d0bc 100644
--- a/indra/newview/groupchatlistener.cpp
+++ b/indra/newview/groupchatlistener.cpp
@@ -18,6 +18,22 @@
 // external library headers
 // other Linden headers
 #include "llgroupactions.h"
+#include "llimview.h"
+
+
+namespace {
+	void startIm_wrapper(LLSD const & event)
+	{
+		LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID());
+		sendReply(LLSDMap("session_id", LLSD(session_id)), event);
+	}
+
+	void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id)
+	{
+		LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START);
+	}
+}
+
 
 GroupChatListener::GroupChatListener():
     LLEventAPI("GroupChat",
@@ -26,11 +42,18 @@ GroupChatListener::GroupChatListener():
     add("startIM",
         "Enter a group chat in group with UUID [\"id\"]\n"
         "Assumes the logged-in agent is already a member of this group.",
-        &LLGroupActions::startIM,
-        LLSDArray("id"));
+        &startIm_wrapper);
     add("endIM",
         "Leave a group chat in group with UUID [\"id\"]\n"
         "Assumes a prior successful startIM request.",
         &LLGroupActions::endIM,
         LLSDArray("id"));
+	add("sendIM",
+		"send a groupchat IM",
+		&send_message_wrapper,
+        LLSDArray("text")("session_id")("group_id"));
 }
+/*
+	static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id,
+								const LLUUID& other_participant_id, EInstantMessage dialog);
+*/
\ No newline at end of file
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 92fd84ff5b30f60e9d4bc54a64831f362d21363f..97fa5514417c91f9f63974f33e3a942c58bcf777 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -322,10 +322,9 @@ void LLGroupActions::closeGroup(const LLUUID& group_id)
 
 
 // static
-void LLGroupActions::startIM(const LLUUID& group_id)
+LLUUID LLGroupActions::startIM(const LLUUID& group_id)
 {
-	if (group_id.isNull())
-		return;
+	if (group_id.isNull()) return LLUUID::null;
 
 	LLGroupData group_data;
 	if (gAgent.getGroupData(group_id, group_data))
@@ -339,12 +338,14 @@ void LLGroupActions::startIM(const LLUUID& group_id)
 			LLIMFloater::show(session_id);
 		}
 		make_ui_sound("UISndStartIM");
+		return session_id;
 	}
 	else
 	{
 		// this should never happen, as starting a group IM session
 		// relies on you belonging to the group and hence having the group data
 		make_ui_sound("UISndInvalidOp");
+		return LLUUID::null;
 	}
 }
 
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index c52a25818b76bfc7c2e8a717f23d2c5a43ee6c13..3f9852f194550d302aa2db12c2002c431c50412f 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -87,7 +87,7 @@ class LLGroupActions
 	/**
 	 * Start group instant messaging session.
 	 */
-	static void startIM(const LLUUID& group_id);
+	static LLUUID startIM(const LLUUID& group_id);
 
 	/**
 	 * End group instant messaging session.