diff --git a/indra/newview/alchatcommand.cpp b/indra/newview/alchatcommand.cpp
index 14bd8f41777d2eea299626735c4ae7fd5632f93b..e26f839035b8d1102265bc2d0588cbb63ba8303a 100644
--- a/indra/newview/alchatcommand.cpp
+++ b/indra/newview/alchatcommand.cpp
@@ -34,14 +34,18 @@
 // viewer includes
 #include "llagent.h"
 #include "llagentcamera.h"
+#include "llagentui.h"
 #include "llcommandhandler.h"
-#include "llfloaterreg.h"
 #include "llfloaterimnearbychat.h"
+#include "llfloaterreg.h"
+#include "llfloaterregioninfo.h"
 #include "llnotificationsutil.h"
+#include "llregioninfomodel.h"
 #include "llstartup.h"
 #include "lltrans.h"
 #include "llviewercontrol.h"
 #include "llviewermessage.h"
+#include "llviewerobjectlist.h"
 #include "llviewerregion.h"
 #include "llvoavatarself.h"
 #include "llvolume.h"
@@ -68,6 +72,8 @@ bool ALChatCommand::parseCommand(std::string data)
 		static LLCachedControl<std::string> sCalcCommand(gSavedSettings, "AlchemyChatCommandCalc", "/calc");
 		static LLCachedControl<std::string> sMaptoCommand(gSavedSettings, "AlchemyChatCommandMapto", "/mapto");
 		static LLCachedControl<std::string> sClearCommand(gSavedSettings, "AlchemyChatCommandClearNearby", "/clr");
+		static LLCachedControl<std::string> sRegionMsgCommand(gSavedSettings, "AlchemyChatCommandRegionMessage", "/regionmsg");
+		static LLCachedControl<std::string> sResyncAnimCommand(gSavedSettings, "AlchemyChatCommandResyncAnim", "/resync");
 
 		if (cmd == utf8str_tolower(sDrawDistanceCommand)) // dd
 		{
@@ -216,6 +222,44 @@ bool ALChatCommand::parseCommand(std::string data)
 			LLNotificationsUtil::add("ChatCommandDiceRoll", args);
 			return true;
 		}
+		else if (cmd == utf8str_tolower(sRegionMsgCommand)) // Region Message / Dialog
+		{
+			if (data.length() > cmd.length() + 1)
+			{
+				std::string notification_message = data.substr(cmd.length() + 1);
+				std::vector<std::string> strings(5, "-1");
+				// [0] grid_x, unused here
+				// [1] grid_y, unused here
+				strings[2] = gAgentID.asString(); // [2] agent_id of sender
+				// [3] senter name
+				std::string name;
+				LLAgentUI::buildFullname(name);
+				strings[3] = name;
+				strings[4] = notification_message; // [4] message
+				LLRegionInfoModel::sendEstateOwnerMessage(gMessageSystem, "simulatormessage", LLFloaterRegionInfo::getLastInvoice(), strings);
+				return true;
+			}
+		}
+		else if (cmd == utf8str_tolower(sResyncAnimCommand)) // Resync Animations
+		{
+			for (S32 i = 0; i < gObjectList.getNumObjects(); i++)
+			{
+				LLViewerObject* object = gObjectList.getObject(i);
+				if (object && object->isAvatar())
+				{
+					LLVOAvatar* avatarp = (LLVOAvatar*)object;
+					if (avatarp)
+					{
+						for (const auto& keyvalue : avatarp->mPlayingAnimations)
+						{
+							avatarp->stopMotion(keyvalue.first, TRUE);
+							avatarp->startMotion(keyvalue.first);
+						}
+					}
+				}
+			}
+			return true;
+		}
 	}
 	return false;
 }
diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index 0ca164016626737fd975989265bb2fdead57b041..551e21d7711c21871d0b3e25fd2add17aac8f757 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -134,6 +134,28 @@
       <key>Value</key>
       <string>/pos</string>
     </map>
+    <key>AlchemyChatCommandRegionMessage</key>
+    <map>
+      <key>Comment</key>
+      <string>Command to send a region message</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>/regionmsg</string>
+    </map>
+    <key>AlchemyChatCommandResyncAnim</key>
+    <map>
+      <key>Comment</key>
+      <string>Command to stop/start in order to resync animations</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>/resync</string>
+    </map>
     <key>AlchemyChatCommandRezPlat</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 5b8c6687b5bb9c9fa29ec066c0db4981cea9b7d5..c0fbf99360c571772cdb0cadc053da2d01fceef5 100755
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -640,6 +640,24 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
 						LLNotifications::instance().add("RevokedModifyRights",args, payload);
 					}
 				}
+				// <Alchemy>
+				if ((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MAP_LOCATION)
+				{
+					LLSD args;
+					args["NAME"] = LLSLURL("agent", agent_id, "displayname").getSLURLString();
+					
+					LLSD payload;
+					payload["from_id"] = agent_id;
+					if (LLRelationship::GRANT_MAP_LOCATION & new_rights)
+					{
+						LLNotifications::instance().add("GrantedMapRights", args, payload);
+					}
+					else
+					{
+						LLNotifications::instance().add("RevokedMapRights", args, payload);
+					}
+				}
+				// </Alchemy>
 				(mBuddyInfo[agent_id])->setRightsFrom(new_rights);
 			}
 		}
diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h
index d22a0de4635bfd14abd5e7f862aeb86073fd26aa..b12e5ba6861f56b118fad5788f550b6077365a4c 100755
--- a/indra/newview/llregioninfomodel.h
+++ b/indra/newview/llregioninfomodel.h
@@ -86,6 +86,7 @@ protected:
 private:
 	void reset();
 
+public: // <Alchemy />
 	// *FIXME: Duplicated code from LLPanelRegionInfo
 	static void sendEstateOwnerMessage(
 		LLMessageSystem* msg,
@@ -93,6 +94,7 @@ private:
 		const LLUUID& invoice,
 		const std::vector<std::string>& strings);
 
+private: // <Alchemy />
 	update_signal_t mUpdateSignal;
 };
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index caf0a5feb4669234a3494e07cdfdf9fc390e3179..88a05ba472e9168faeae9c659044199a4637c9cb 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3157,15 +3157,16 @@ class LLSyncAnimations : public view_listener_t
 		for (S32 i = 0; i < gObjectList.getNumObjects(); ++i)
 		{
 			LLViewerObject* object = gObjectList.getObject(i);
-			if (object && object->isAvatar())
+			if (object &&
+				object->isAvatar())
 			{
 				LLVOAvatar* avatarp = static_cast<LLVOAvatar*>(object);
 				if (avatarp)
 				{
-					for (const auto& anim_it : avatarp->mPlayingAnimations)
+					for (const auto& keyvalue : avatarp->mPlayingAnimations)
 					{
-						avatarp->stopMotion(anim_it.first, TRUE);
-						avatarp->startMotion(anim_it.first);
+						avatarp->stopMotion(keyvalue.first, TRUE);
+						avatarp->startMotion(keyvalue.first);
 					}
 				}
 			}
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index a5b2f9ecc5cbe7f2b2c2c571e8d004c29f47facd..ab8022132f3530824f94ce6323e263a82b976ccb 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -10375,4 +10375,20 @@ the region &quot;[REGION]&quot;?
        text="Cancel"/>
     </form>
   </notification>
+  <notification
+    icon="alertmodal.tga"
+    name="RevokedMapRights"
+    persist="true"
+    log_to_im="true"
+    type="notify">
+    Your privilege to find [NAME]&apos;s map location has been revoked.
+  </notification>
+  <notification
+    icon="alertmodal.tga"
+    name="GrantedMapRights"
+    persist="true"
+    log_to_im="true"
+    type="notify">
+    [NAME] has given you permission to find their location on the map.
+  </notification>
 </notifications>