diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b1cb10665ba348166f4287b9558339a3f43c17f7..b2053d68a31d067325eb87d9d508d5a890b0c7c6 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -70,6 +70,7 @@ include_directories(
     )
 
 set(viewer_SOURCE_FILES
+    groupchatlistener.cpp
     llagent.cpp
     llagentaccess.cpp
     llagentcamera.cpp
@@ -612,6 +613,7 @@ endif (LINUX)
 set(viewer_HEADER_FILES
     CMakeLists.txt
     ViewerInstall.cmake
+    groupchatlistener.h
     llagent.h
     llagentaccess.h
     llagentcamera.h
diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9b463c9a3f4c1eca0bd0e737346363a83743bf00
--- /dev/null
+++ b/indra/newview/groupchatlistener.cpp
@@ -0,0 +1,36 @@
+/**
+ * @file   groupchatlistener.cpp
+ * @author Nat Goodspeed
+ * @date   2011-04-11
+ * @brief  Implementation for groupchatlistener.
+ * 
+ * $LicenseInfo:firstyear=2011&license=internal$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "groupchatlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llgroupactions.h"
+
+GroupChatListener::GroupChatListener():
+    LLEventAPI("GroupChat",
+               "API to enter, leave, send and intercept group chat messages")
+{
+    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"));
+    add("endIM",
+        "Leave a group chat in group with UUID [\"id\"]\n"
+        "Assumes a prior successful startIM request.",
+        &LLGroupActions::endIM,
+        LLSDArray("id"));
+}
diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h
new file mode 100644
index 0000000000000000000000000000000000000000..719e3e877f51df5233bb49ad1428f0bc5fe6c0e0
--- /dev/null
+++ b/indra/newview/groupchatlistener.h
@@ -0,0 +1,23 @@
+/**
+ * @file   groupchatlistener.h
+ * @author Nat Goodspeed
+ * @date   2011-04-11
+ * @brief  
+ * 
+ * $LicenseInfo:firstyear=2011&license=internal$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_GROUPCHATLISTENER_H)
+#define LL_GROUPCHATLISTENER_H
+
+#include "lleventapi.h"
+
+class GroupChatListener: public LLEventAPI
+{
+public:
+    GroupChatListener();
+};
+
+#endif /* ! defined(LL_GROUPCHATLISTENER_H) */
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 7c56e610ce5906a61c708431fdd5cab9d6250034..92fd84ff5b30f60e9d4bc54a64831f362d21363f 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -40,10 +40,12 @@
 #include "llsidetray.h"
 #include "llstatusbar.h"	// can_afford_transaction()
 #include "llimfloater.h"
+#include "groupchatlistener.h"
 
 //
 // Globals
 //
+static GroupChatListener sGroupChatListener;
 
 class LLGroupHandler : public LLCommandHandler
 {