diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 21a3ddfd78118b08b35c088e6fcc3acf41203cb6..be719c0a7839f85a9f149e3ad914da515780a053 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -451,17 +451,24 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
 	return true;
 }
 
-bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
+bool LLIMModel::logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
 {
 	if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
 	{
-		std::string name = LLIMModel::getInstance()->getName(session_id);
-		if (name == LLStringUtil::null)
-		{
-			name = from;
-		}
+		LLLogChat::saveHistory(session_name, from, from_id, utf8_text);
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
 
-		LLLogChat::saveHistory(name, from, from_id, utf8_text);
+bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
+{
+	if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
+	{
+		LLLogChat::saveHistory(LLIMModel::getInstance()->getName(session_id), from, from_id, utf8_text);
 		return true;
 	}
 	else
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 5cc0b033a2f0ea3af5d2fe79ff6fb4c3f1d7df94..40e3a8fb692ce6d8aaa870d91a97f395bfe623b6 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -201,9 +201,9 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	void testMessages();
 
 	/**
-	 * Save an IM message into a file
+	 * Saves an IM message into a file
 	 */
-	bool logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
+	bool logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
 
 private:
 	
@@ -211,6 +211,11 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	 * Add message to a list of message associated with session specified by session_id
 	 */
 	bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text); 
+
+	/**
+	 * Save an IM message into a file
+	 */
+	bool logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
 };
 
 class LLIMSessionObserver
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index 2e7f95660a48e966c3fcb8929607635d79abb825..68899319563eac76edc3a7a47e5868ecb3f675c4 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -88,6 +88,8 @@ bool LLGroupHandler::processNotification(const LLSD& notify)
 	
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
+		LLHandlerUtil::logGroupNoticeToIMGroup(notification);
+
 		LLPanel* notify_box = new LLToastGroupNotifyPanel(notification);
 		LLToast::Params p;
 		p.notif_id = notification->getID();
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index b561f795f5d929d90fb8ca48c6da240e8c1777bf..da8928321aba50b3daa5cc9e06040f6372a48496 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -268,7 +268,20 @@ class LLHandlerUtil
 	/**
 	 * Writes notification message to IM session.
 	 */
+	static void logToIM(const EInstantMessage& session_type,
+			const std::string& session_name, const std::string& from_name,
+			const std::string& message, const LLUUID& session_owner_id,
+			const LLUUID& from_id);
+
+	/**
+	 * Writes notification message to IM  p2p session.
+	 */
 	static void logToIMP2P(const LLNotificationPtr& notification);
+
+	/**
+	 * Writes group notice notification message to IM  group session.
+	 */
+	static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification);
 };
 
 }
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index a30f896fa26f9a205c6ce07a0baf047e89cd5acf..05da33851382f9bfa3d8556faa9d96facb5f65ad 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -36,6 +36,7 @@
 #include "llnotificationhandler.h"
 #include "llnotifications.h"
 #include "llimview.h"
+#include "llagent.h"
 
 using namespace LLNotificationsUI;
 
@@ -51,43 +52,78 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
 			|| REVOKED_MODIFY_RIGHTS == notification->getName();
 }
 
+// static
+void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
+		const std::string& session_name, const std::string& from_name,
+		const std::string& message, const LLUUID& session_owner_id,
+		const LLUUID& from_id)
+{
+	LLUUID session_id = LLIMMgr::computeSessionID(session_type,
+			session_owner_id);
+	LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
+			session_id);
+	if (session == NULL)
+	{
+		LLIMModel::instance().logToFile(session_name, from_name, from_id, message);
+	}
+	else
+	{
+		// store active session id
+		const LLUUID & active_session_id =
+				LLIMModel::instance().getActiveSessionID();
+
+		// set searched session as active to avoid IM toast popup
+		LLIMModel::instance().setActiveSessionID(session_id);
+
+		LLIMModel::instance().addMessage(session_id, from_name, from_id,
+				message);
+
+		// restore active session id
+		LLIMModel::instance().setActiveSessionID(active_session_id);
+	}
+}
+
 // static
 void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification)
 {
-	// add message to IM
 	const std::string
 			name =
 					notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
 							: notification->getSubstitutions()["[NAME]"];
 
-	// don't create IM session with objects, it's necessary condition to log
+	// don't create IM p2p session with objects, it's necessary condition to log
 	if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName()
 			!= OBJECT_GIVE_ITEM_UNKNOWN_USER)
 	{
 		LLUUID from_id = notification->getPayload()["from_id"];
-		LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
-				from_id);
-
-		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
-		if (session == NULL)
-		{
-			LLIMModel::instance().logToFile(session_id, name, from_id,
-					notification->getMessage());
-		}
-		else
-		{
-			// store active session id
-			const LLUUID & active_session_id =
-					LLIMModel::instance().getActiveSessionID();
-
-			// set searched session as active to avoid IM toast popup
-			LLIMModel::instance().setActiveSessionID(session->mSessionID);
-
-			LLIMModel::instance().addMessage(session->mSessionID, name, from_id,
-					notification->getMessage());
-
-			// restore active session id
-			LLIMModel::instance().setActiveSessionID(active_session_id);
-		}
+
+		logToIM(IM_NOTHING_SPECIAL, name, name, notification->getMessage(),
+				from_id, from_id);
 	}
 }
+
+// static
+void LLHandlerUtil::logGroupNoticeToIMGroup(
+		const LLNotificationPtr& notification)
+{
+
+	const LLSD& payload = notification->getPayload();
+	LLGroupData groupData;
+	if (!gAgent.getGroupData(payload["group_id"].asUUID(), groupData))
+	{
+		llwarns
+						<< "Group notice for unkown group: "
+								<< payload["group_id"].asUUID() << llendl;
+	}
+
+	const std::string group_name = groupData.mName;
+	const std::string sender_name = payload["sender_name"].asString();
+
+	// we can't retrieve sender id from group notice system message, so try to lookup it from cache
+	LLUUID sender_id;
+	gCacheName->getUUID(sender_name, sender_id);
+
+	logToIM(IM_SESSION_GROUP_START, group_name, sender_name, payload["message"],
+			payload["group_id"], sender_id);
+}
+