diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 00bc8ebe871b961e35458f2ce01abe32c81176b9..a6e745448a98c921cd4a1aa46238d01b18251426 100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -475,6 +475,57 @@ void LLAvatarActions::kick(const LLUUID& id)
 	LLNotifications::instance().add("KickUser", LLSD(), payload, handleKick);
 }
 
+// static
+void LLAvatarActions::freezeAvatar(const LLUUID& id)
+{
+	std::string fullname;
+	gCacheName->getFullName(id, fullname);
+	LLSD payload;
+	payload["avatar_id"] = id;
+
+	if (!fullname.empty())
+	{
+		LLSD args;
+		args["AVATAR_NAME"] = fullname;
+		LLNotificationsUtil::add("FreezeAvatarFullname", args, payload, handleFreezeAvatar);
+	}
+	else
+	{
+		LLNotificationsUtil::add("FreezeAvatar", LLSD(), payload, handleFreezeAvatar);
+	}
+}
+
+// static
+void LLAvatarActions::ejectAvatar(const LLUUID& id, bool ban_enabled)
+{
+	std::string fullname;
+	gCacheName->getFullName(id, fullname);
+	LLSD payload;
+	payload["avatar_id"] = id;
+	payload["ban_enabled"] = ban_enabled;
+	LLSD args;
+	if (!fullname.empty())
+	{
+		args["AVATAR_NAME"] = fullname;
+	}
+
+	if (ban_enabled)
+	{
+			LLNotificationsUtil::add("EjectAvatarFullname", args, payload, handleEjectAvatar);
+	}
+	else
+	{
+		if (!fullname.empty())
+		{
+			LLNotificationsUtil::add("EjectAvatarFullnameNoBan", args, payload, handleEjectAvatar);
+		}
+		else
+		{
+			LLNotificationsUtil::add("EjectAvatarNoBan", LLSD(), payload, handleEjectAvatar);
+		}
+	}
+}
+
 // static
 void LLAvatarActions::freeze(const LLUUID& id)
 {
@@ -482,7 +533,6 @@ void LLAvatarActions::freeze(const LLUUID& id)
 	payload["avatar_id"] = id;
 	LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze);
 }
-
 // static
 void LLAvatarActions::unfreeze(const LLUUID& id)
 {
@@ -1133,10 +1183,77 @@ bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response)
 	}
 	return false;
 }
-bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
+
+bool LLAvatarActions::handleFreezeAvatar(const LLSD& notification, const LLSD& response)
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
 
+	if (0 == option || 1 == option)
+	{
+	    U32 flags = 0x0;
+	    if (1 == option)
+	    {
+	        // unfreeze
+	        flags |= 0x1;
+	    }
+	    LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+		LLMessageSystem* msg = gMessageSystem;
+
+		msg->newMessage("FreezeUser");
+		msg->nextBlock("AgentData");
+		msg->addUUID("AgentID", gAgent.getID());
+		msg->addUUID("SessionID", gAgent.getSessionID());
+		msg->nextBlock("Data");
+		msg->addUUID("TargetID", avatar_id );
+		msg->addU32("Flags", flags );
+		gAgent.sendReliableMessage();
+	}
+	return false;
+}
+
+bool LLAvatarActions::handleEjectAvatar(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (2 == option)
+	{
+		return false;
+	}
+	LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+	bool ban_enabled = notification["payload"]["ban_enabled"].asBoolean();
+
+	if (0 == option)
+	{
+		LLMessageSystem* msg = gMessageSystem;
+		U32 flags = 0x0;
+		msg->newMessage("EjectUser");
+		msg->nextBlock("AgentData");
+		msg->addUUID("AgentID", gAgent.getID() );
+		msg->addUUID("SessionID", gAgent.getSessionID() );
+		msg->nextBlock("Data");
+		msg->addUUID("TargetID", avatar_id );
+		msg->addU32("Flags", flags );
+		gAgent.sendReliableMessage();
+	}
+	else if (ban_enabled)
+	{
+		LLMessageSystem* msg = gMessageSystem;
+
+		U32 flags = 0x1;
+		msg->newMessage("EjectUser");
+		msg->nextBlock("AgentData");
+		msg->addUUID("AgentID", gAgent.getID() );
+		msg->addUUID("SessionID", gAgent.getSessionID() );
+		msg->nextBlock("Data");
+		msg->addUUID("TargetID", avatar_id );
+		msg->addU32("Flags", flags );
+		gAgent.sendReliableMessage();
+	}
+	return false;
+}
+
+bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
@@ -1153,6 +1270,7 @@ bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& respons
 	}
 	return false;
 }
+
 bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response)
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index bd0ac24e932c836fc6872bd7875c5d2d57e078e4..256d44d820ae643a0449f6bb37d50c759b6637fd 100755
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -173,6 +173,9 @@ class LLAvatarActions
 	 */	
 	static void inviteToGroup(const LLUUID& id);
 	
+	static void freezeAvatar(const LLUUID& id);
+
+	static void ejectAvatar(const LLUUID& id, bool ban_enabled = false);
 	/**
 	 * Kick avatar off grid
 	 */	
@@ -242,6 +245,8 @@ class LLAvatarActions
 	static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
 	static bool handleRemove(const LLSD& notification, const LLSD& response);
 	static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id);
+	static bool handleFreezeAvatar(const LLSD& notification, const LLSD& response);
+	static bool handleEjectAvatar(const LLSD& notification, const LLSD& response);
 	static bool handleKick(const LLSD& notification, const LLSD& response);
 	static bool handleFreeze(const LLSD& notification, const LLSD& response);
 	static bool handleUnfreeze(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index a5f59dbf4a84de1faae87489116593454c442cea..65769ff526490982f8e6b07eb6d22f49ba67ae59 100755
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -38,9 +38,14 @@
 #include "llavataractions.h"
 #include "llcallingcard.h"			// for LLAvatarTracker
 #include "lllogchat.h"
+#include "llparcel.h"
 #include "llviewermenu.h"			// for gMenuHolder
 #include "llconversationmodel.h"
 #include "llviewerobjectlist.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llvoavatarself.h"
+#include "roles_constants.h"
 
 namespace LLPanelPeopleMenus
 {
@@ -77,9 +82,13 @@ LLContextMenu* PeopleContextMenu::createMenu()
 		registrar.add("Avatar.InviteToGroup",	boost::bind(&LLAvatarActions::inviteToGroup,			id));
 		registrar.add("Avatar.TeleportRequest",	boost::bind(&PeopleContextMenu::requestTeleport,		this));
 		registrar.add("Avatar.Calllog",			boost::bind(&LLAvatarActions::viewChatHistory,			id));
+		registrar.add("Avatar.Freeze",			boost::bind(&LLAvatarActions::freezeAvatar,					id));
+		registrar.add("Avatar.Eject",			boost::bind(&PeopleContextMenu::eject,					this));
+
 
 		enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));
 		enable_registrar.add("Avatar.CheckItem",  boost::bind(&PeopleContextMenu::checkContextMenuItem,	this, _2));
+		enable_registrar.add("Avatar.EnableFreezeEject", boost::bind(&PeopleContextMenu::enableFreezeEject, this, _2));
 
 		// create the context menu from the XUI
 		menu = createFromFile("menu_people_nearby.xml");
@@ -258,6 +267,50 @@ bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata)
 	return false;
 }
 
+bool PeopleContextMenu::enableFreezeEject(const LLSD& userdata)
+{
+    if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1))
+    {
+        return false;
+    }
+
+    const LLUUID& id = mUUIDs.front();
+
+    // Use avatar_id if available, otherwise default to right-click avatar
+    LLVOAvatar* avatar = NULL;
+    if (id.notNull())
+    {
+        LLViewerObject* object = gObjectList.findObject(id);
+        if (object)
+        {
+            if( !object->isAvatar() )
+            {
+                object = NULL;
+            }
+            avatar = (LLVOAvatar*) object;
+        }
+    }
+    if (!avatar) return false;
+
+    // Gods can always freeze
+    if (gAgent.isGodlike()) return true;
+
+    // Estate owners / managers can freeze
+    // Parcel owners can also freeze
+    const LLVector3& pos = avatar->getPositionRegion();
+    const LLVector3d& pos_global = avatar->getPositionGlobal();
+    LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
+    LLViewerRegion* region = avatar->getRegion();
+    if (!region) return false;
+
+    bool new_value = region->isOwnedSelf(pos);
+    if (!new_value || region->isOwnedGroup(pos))
+    {
+        new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
+    }
+    return new_value;
+}
+
 void PeopleContextMenu::requestTeleport()
 {
 	// boost::bind cannot recognize overloaded method LLAvatarActions::teleportRequest(),
@@ -272,6 +325,39 @@ void PeopleContextMenu::offerTeleport()
 	LLAvatarActions::offerTeleport(mUUIDs);
 }
 
+void PeopleContextMenu::eject()
+{
+	if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1))
+	{
+		return;
+	}
+
+	const LLUUID& id = mUUIDs.front();
+
+	// Use avatar_id if available, otherwise default to right-click avatar
+	LLVOAvatar* avatar = NULL;
+	if (id.notNull())
+	{
+		LLViewerObject* object = gObjectList.findObject(id);
+		if (object)
+		{
+			if( !object->isAvatar() )
+			{
+				object = NULL;
+			}
+			avatar = (LLVOAvatar*) object;
+		}
+	}
+	if (!avatar) return;
+	LLSD payload;
+	payload["avatar_id"] = avatar->getID();
+	std::string fullname = avatar->getFullname();
+
+	const LLVector3d& pos = avatar->getPositionGlobal();
+	LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel();
+	LLAvatarActions::ejectAvatar(id ,LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_MANAGE_BANNED));
+}
+
 void PeopleContextMenu::startConference()
 {
 	uuid_vec_t uuids;
@@ -320,6 +406,8 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)
 		items.push_back(std::string("share"));
 		items.push_back(std::string("pay"));
 		items.push_back(std::string("block_unblock"));
+		items.push_back(std::string("freeze"));
+		items.push_back(std::string("eject"));
 	}
 
     hide_context_entries(menu, items, disabled_items);
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index 9767bab89f88647c53b08e34386471ad9c7081d5..5ed20e00640c0d0ecac0ce68dae818e6f161f066 100755
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -46,7 +46,9 @@ class PeopleContextMenu : public LLListContextMenu
 private:
 	bool enableContextMenuItem(const LLSD& userdata);
 	bool checkContextMenuItem(const LLSD& userdata);
+	bool enableFreezeEject(const LLSD& userdata);
 	void offerTeleport();
+	void eject();
 	void startConference();
 	void requestTeleport();
 };
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index f12226ebeb48964ce71848a398bcecbd2e42394a..c1500d4e7c8920fcf1fa8824fc4d85571c47ae50 100755
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -143,4 +143,20 @@
          function="Avatar.EnableItem"
          parameter="can_block" />
     </menu_item_check>
+    <menu_item_call
+         label="Freeze"
+         name="freeze">
+        <menu_item_call.on_click
+         function="Avatar.Freeze" />
+        <menu_item_call.on_visible
+         function="Avatar.EnableFreezeEject"/>
+    </menu_item_call>
+    <menu_item_call
+         label="Eject"
+         name="eject">
+        <menu_item_call.on_click
+         function="Avatar.Eject" />
+        <menu_item_call.on_visible
+         function="Avatar.EnableFreezeEject"/>
+    </menu_item_call>
 </context_menu>