diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index b301565b6ebae9f502b985926e4acde6406f1c34..8098191bf774c5a178ffe1bf160445f00ca4dbdb 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -200,17 +200,6 @@
       <key>Value</key>
       <boolean>1</boolean>
     </map>
-    <key>RLVaShowNameTags</key>
-    <map>
-      <key>Comment</key>
-      <string>Display of names above avatars is subject to the general "Show Names" setting when @shownames=n restricted</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <boolean>0</boolean>
-    </map>
     <key>RLVaTopLevelMenu</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 26683ae70087e9304c3d39689c554864f20104ab..bf8607d43e258e35f1e5cc1a82f07b726ef5b5fc 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -1928,7 +1928,10 @@ std::ostream& operator<<(std::ostream &s, const LLAgent &agent)
 //-----------------------------------------------------------------------------
 BOOL LLAgent::needsRenderAvatar()
 {
-	if (gAgentCamera.cameraMouselook() && !LLVOAvatar::sVisibleInFirstPerson)
+//	if (gAgentCamera.cameraMouselook() && !LLVOAvatar::sVisibleInFirstPerson)
+// [RLVa:KB] - Checked: RLVa-2.0.2
+	if ( (gAgentCamera.cameraMouselook() && !LLVOAvatar::sVisibleInFirstPerson) || (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWSELF)) )
+// [/RLVa:KB]
 	{
 		return FALSE;
 	}
@@ -1939,7 +1942,10 @@ BOOL LLAgent::needsRenderAvatar()
 // TRUE if we need to render your own avatar's head.
 BOOL LLAgent::needsRenderHead()
 {
-	return (LLVOAvatar::sVisibleInFirstPerson && LLPipeline::sReflectionRender) || (mShowAvatar && !gAgentCamera.cameraMouselook());
+// [RLVa:KB] - Checked: RLVa-2.0.2
+	return ((LLVOAvatar::sVisibleInFirstPerson && LLPipeline::sReflectionRender) || (mShowAvatar && !gAgentCamera.cameraMouselook())) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWSELFHEAD));
+// [/RLVa:KB]
+//	return (LLVOAvatar::sVisibleInFirstPerson && LLPipeline::sReflectionRender) || (mShowAvatar && !gAgentCamera.cameraMouselook());
 }
 
 //-----------------------------------------------------------------------------
@@ -4158,7 +4164,7 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
 // [RLVa:KB] - Checked: RLVa-2.0.0
 	if ( (RlvActions::isRlvEnabled()) && (!RlvUtil::isForceTp()) )
 	{
-		if ( (RlvActions::isLocalTp(pos_global)) ? !RlvActions::canTeleportToLocal() : !RlvActions::canTeleportToLocation() )
+		if ( (RlvActions::isLocalTp(pos_global)) ? !RlvActions::canTeleportToLocal(pos_global) : !RlvActions::canTeleportToLocation() )
 		{
 			RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT);
 			return;
@@ -4228,7 +4234,7 @@ void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global, const LLVe
 {
 	if ( (RlvActions::isRlvEnabled()) && (!RlvUtil::isForceTp()) )
 	{
-		if ( (RlvActions::isLocalTp(pos_global)) ? !RlvActions::canTeleportToLocal() : !RlvActions::canTeleportToLocation() )
+		if ( (RlvActions::isLocalTp(pos_global)) ? !RlvActions::canTeleportToLocal(pos_global) : !RlvActions::canTeleportToLocation() )
 		{
 			RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT);
 			return;
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index ff3d4e6ce2ff9049bf04e75d0b30c36251c08be3..85bae5cd7592f6ecf22b81b039f588250fb28687 100755
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -186,7 +186,7 @@ void LLAgentListener::requestSit(LLSD const & event_data) const
 
 // [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c) | Modified: RLVa-1.1.0j
 	// TODO-RLVa: [RLVa-1.2.1] Figure out how to call this?
-	if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canSit(object)) )
+	if ( (rlv_handler_t::isEnabled()) && (!RlvActions::canSit(object)) )
 	{
 		return;
 	}
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 9b6aa0e1bb5023e2f412c6a0d87e38afa52a818e..fc5809827f8a79c8d4778d33dc1cd1623cb5d9b2 100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -510,8 +510,8 @@ void LLAvatarActions::teleportRequest(const LLUUID& id)
 {
 	LLSD notification;
 	notification["uuid"] = id;
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-	notification["NAME"] = LLSLURL("agent", id, (RlvActions::canShowName(RlvActions::SNC_TELEPORTREQUEST)) ? "completename" : "rlvanonym").getSLURLString();
+// [RLVa:KB] - Checked: RLVa-1.5.0
+	notification["NAME"] = LLSLURL("agent", id, (RlvActions::canShowName(RlvActions::SNC_TELEPORTREQUEST, id)) ? "completename" : "rlvanonym").getSLURLString();
 // [/RLVa:KB]
 //	LLAvatarName av_name;
 //	if (!LLAvatarNameCache::get(id, &av_name))
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 3769db837e3dabd4b8cdbcaf5a5200933c62c6ca..c039e6bd80658101bb9941781f7e7481f13d03eb 100755
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -47,9 +47,6 @@
 #include "llvoiceclient.h"
 #include "llviewercontrol.h"	// for gSavedSettings
 #include "lltooldraganddrop.h"
-// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.2a)
-#include "rlvhandler.h"
-// [/RLVa:KB]
 
 static LLDefaultChildRegistry::Register<LLAvatarList> r("avatar_list");
 
@@ -143,7 +140,7 @@ LLAvatarList::LLAvatarList(const Params& p)
 , mShowProfileBtn(p.show_profile_btn)
 , mShowSpeakingIndicator(p.show_speaking_indicator)
 , mShowPermissions(p.show_permissions_granted)
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
+// [RLVa:KB] - Checked: RLVa-1.2.0
 , mRlvCheckShowNames(false)
 // [/RLVa:KB]
 {
@@ -440,7 +437,7 @@ S32 LLAvatarList::notifyParent(const LLSD& info)
 void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
 {
 	LLAvatarListItem* item = new LLAvatarListItem();
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
+// [RLVa:KB] - Checked: RLVa-1.2.0
 	item->setRlvCheckShowNames(mRlvCheckShowNames);
 // [/RLVa:KB]
 	// This sets the name as a side effect
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index a1479895a35d339c1b51f9a233df0f7b1562e3b3..3a7f9d3887f2776b8f0e87b6020251fc91b7b933 100755
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -91,7 +91,7 @@ public:
 	// Return true if filter has at least one match.
 	bool filterHasMatches();
 
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
+// [RLVa:KB] - Checked: RLVa-1.2.0
 	void setRlvCheckShowNames(bool fRlvCheckShowNames) { mRlvCheckShowNames = fRlvCheckShowNames; }
 	// We need this to be public since we call it from RlvUIEnabler::onToggleShowNames()
 	void updateAvatarNames();
@@ -132,7 +132,7 @@ private:
 	bool mShowProfileBtn;
 	bool mShowSpeakingIndicator;
 	bool mShowPermissions;
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
+// [RLVa:KB] - RLVa-1.2.0
 	bool mRlvCheckShowNames;
 // [/RLVa:KB]
 
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 5c0700fccdddd5fe8fab1d72766d7cce1ad229d9..cc4364a774067eec4a696e78b12c12f7b69c01a4 100755
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -41,8 +41,9 @@
 #include "llavatariconctrl.h"
 #include "lloutputmonitorctrl.h"
 #include "lltooldraganddrop.h"
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a)
-#include "rlvhandler.h"
+// [RLVa:KB] - Checked: RLVa-2.0.1
+#include "rlvactions.h"
+#include "rlvcommon.h"
 // [/RLVa:KB]
 
 bool LLAvatarListItem::sStaticInitialized = false;
@@ -79,7 +80,7 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
 	mOnlineStatus(E_UNKNOWN),
 	mShowInfoBtn(true),
 	mShowProfileBtn(true),
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
+// [RLVa:KB] - Checked: RLVa-1.2.0
 	mRlvCheckShowNames(false),
 // [/RLVa:KB]
 	mShowPermissions(false),
@@ -185,9 +186,10 @@ void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
 	getChildView("hovered_icon")->setVisible( true);
 //	mInfoBtn->setVisible(mShowInfoBtn);
 //	mProfileBtn->setVisible(mShowProfileBtn);
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
-	mInfoBtn->setVisible( (mShowInfoBtn) && ((!mRlvCheckShowNames) || (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))) );
-	mProfileBtn->setVisible( (mShowProfileBtn) && ((!mRlvCheckShowNames) || (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))) );
+// [RLVa:KB] - Checked: RLVa-1.2.0
+	bool fRlvCanShowName = (!mRlvCheckShowNames) || (RlvActions::canShowName(RlvActions::SNC_DEFAULT, mAvatarId));
+	mInfoBtn->setVisible( (mShowInfoBtn) && (fRlvCanShowName) );
+	mProfileBtn->setVisible( (mShowProfileBtn) && (fRlvCanShowName) );
 // [/RLVa:KB]
 
 	mHovered = true;
@@ -366,7 +368,7 @@ void LLAvatarListItem::onProfileBtnClick()
 BOOL LLAvatarListItem::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
 //	if(mInfoBtn->getRect().pointInRect(x, y))
-// [SL:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
+// [RVLa:KB] - Checked: RLVa-1.2.2
 	if ( (mInfoBtn->getVisible()) && (mInfoBtn->getEnabled()) && (mInfoBtn->getRect().pointInRect(x, y)) )
 // [/SL:KB]
 	{
@@ -374,7 +376,7 @@ BOOL LLAvatarListItem::handleDoubleClick(S32 x, S32 y, MASK mask)
 		return TRUE;
 	}
 //	if(mProfileBtn->getRect().pointInRect(x, y))
-// [SL:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
+// [RLVa:KB] - Checked: RLVa-1.2.2
 	if ( (mProfileBtn->getVisible()) && (mProfileBtn->getEnabled()) && (mProfileBtn->getRect().pointInRect(x, y)) )
 // [/SL:KB]
 	{
@@ -424,12 +426,13 @@ void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name)
 
 //	setAvatarName(av_name.getDisplayName());
 //	setAvatarToolTip(av_name.getUserName());
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-	bool fRlvFilter = (mRlvCheckShowNames) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
-	setAvatarName( (!fRlvFilter) ? av_name.getDisplayName() : RlvStrings::getAnonym(av_name) );
-	setAvatarToolTip( (!fRlvFilter) ? av_name.getUserName() : RlvStrings::getAnonym(av_name) );
+// [RLVa:KB] - Checked: RLVa-1.2.2
+	bool fRlvCanShowName = (!mRlvCheckShowNames) || (RlvActions::canShowName(RlvActions::SNC_DEFAULT, mAvatarId));
+
+	setAvatarName( (fRlvCanShowName) ? av_name.getDisplayName() : RlvStrings::getAnonym(av_name) );
+	setAvatarToolTip( (fRlvCanShowName) ? av_name.getUserName() : RlvStrings::getAnonym(av_name) );
 	// TODO-RLVa: bit of a hack putting this here. Maybe find a better way?
-	mAvatarIcon->setDrawTooltip(!fRlvFilter);
+	mAvatarIcon->setDrawTooltip(fRlvCanShowName);
 // [/RLVa:KB]
 
 	//requesting the list to resort
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index e1533d38d07e07b7255be44496fa412c53089c16..7f44740dc1516d2ca71e6ec8693e75f1f43a9e80 100755
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -106,7 +106,7 @@ public:
 	void setShowPermissions(bool show) { mShowPermissions = show; };
 	void showLastInteractionTime(bool show);
 	void setAvatarIconVisible(bool visible);
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
+// [RLVa:KB] - Checked: RLVa-1.2.0
 	void setRlvCheckShowNames(bool fRlvCheckShowNames) { mRlvCheckShowNames = fRlvCheckShowNames; }
 // [/RLVa:KB]
 	
@@ -214,7 +214,7 @@ private:
 	//Speaker indicator and avatar name coords are translated accordingly
 	bool mShowInfoBtn;
 	bool mShowProfileBtn;
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
+// [RLVa:KB] - Checked: RLVa-1.2.0
 	bool mRlvCheckShowNames;
 // [/RLVa:KB]
 
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index 014b7f554f518d1cd1128cb72ffc97f84e5c3c91..d8c062507ae77511e6e3bf7bb3a19d327b840584 100755
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -292,6 +292,7 @@ void LLFloaterAvatarPicker::onList()
 		RLV_ASSERT( (pTabs) && (pNearMePanel) );
 		if ( (pTabs) && (pNearMePanel) )
 		{
+			// TODO-RLVa: check this for RlvActions::canShowName()
 			bool fRlvEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES);
 			pTabs->enableTabButton(pTabs->getIndexForPanel(pNearMePanel), fRlvEnable);
 			if ( (!fRlvEnable) && (pTabs->getCurrentPanel() == pNearMePanel) )
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index 5a9cdbba44d6bfe3aee80e43f079528bf4e32147..fa1667de73d376c28ab9f968f674f232718f6660 100755
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -104,7 +104,10 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)
 	// Clean up the lists...
 	floater->reset();
 	floater->mSaleInfo = sale_info;
-	floater->mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
+// [RLVa:KB] - Checked: RLVa-2.0.0
+	floater->mObjectSelection = LLSelectMgr::getInstance()->getSelection();
+// [/RLVa:KB]
+//	floater->mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
 	
 	LLSelectNode* node = selection->getFirstRootNode();
 	if (!node)
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index b32ac860aaa57299fec019a6e4fde0061e77026c..9d0682d251f6db2f443de00c2cd00bd78f7bb375 100755
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -104,7 +104,10 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info)
 	if (list)
 		list->deleteAllItems();
 
-	floater->mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
+// [RLVa:KB] - Checked: RLVa-2.0.0
+	floater->mObjectSelection = LLSelectMgr::getInstance()->getSelection();
+// [/RLVa:KB]
+//	floater->mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
 
 	LLUUID owner_id;
 	std::string owner_name;
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index f1b07abbc54502ea71d6ed11652bea7f29f37998..5f9ecbd30c156927d6b43fa0e5101b71b42698bf 100755
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -69,6 +69,7 @@
 #include "llautoreplace.h"
 // [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0b)
 #include "rlvhandler.h"
+#include "rlvactions.h"
 // [/RLVa:KB]
 
 S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0;
@@ -874,7 +875,7 @@ void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channe
 		else
 		{
 			// Don't allow chat on a non-public channel if sendchannel restricted (unless the channel is an exception)
-			if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHANNEL)) && (!gRlvHandler.isException(RLV_BHVR_SENDCHANNEL, channel)) )
+			if (!RlvActions::canSendChannel(channel))
 				return;
 
 			// Don't allow chat on debug channel if @sendchat, @redirchat or @rediremote restricted (shows as public chat on viewers)
diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp
index 76a91e35a4c49d06e12f0b567096521e970f86ed..6f3d2e1e0afabd8ddabe35be4215b1f7123a2139 100755
--- a/indra/newview/llfloaterimnearbychathandler.cpp
+++ b/indra/newview/llfloaterimnearbychathandler.cpp
@@ -45,8 +45,9 @@
 #include "llrootview.h"
 #include "lllayoutstack.h"
 
-// [RLVa:KB] - Checked: 2010-04-21 (RLVa-1.2.0f)
-#include "rlvhandler.h"
+// [RLVa:KB] - Checked: RLVa-2.0.0
+#include "rlvactions.h"
+#include "rlvcommon.h"
 // [/RLVa:KB]
 
 //add LLFloaterIMNearbyChatHandler to LLNotificationsUI namespace
@@ -491,16 +492,16 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
 		return;//don't process empty messages
 
 // [RLVa:KB] - Checked: 2010-04-20 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f
-	if (rlv_handler_t::isEnabled())
+	if (RlvActions::isRlvEnabled())
 	{
 		// NOTE-RLVa: we can only filter the *message* here since most everything else will already be part of "args" as well
 		LLChat& tmp_chat = const_cast<LLChat&>(chat_msg);
-		if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) && (!tmp_chat.mRlvLocFiltered) && (CHAT_SOURCE_AGENT != tmp_chat.mSourceType) )
+		if ( (!RlvActions::canShowLocation()) && (!tmp_chat.mRlvLocFiltered) && (CHAT_SOURCE_AGENT != tmp_chat.mSourceType) )
 		{
 			RlvUtil::filterLocation(tmp_chat.mText);
 			tmp_chat.mRlvLocFiltered = TRUE;
 		}
-		if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!tmp_chat.mRlvNamesFiltered) && (CHAT_SOURCE_AGENT != tmp_chat.mSourceType) )
+		if ( (!RlvActions::canShowName(RlvActions::SNC_DEFAULT)) && (!tmp_chat.mRlvNamesFiltered) && (CHAT_SOURCE_AGENT != tmp_chat.mSourceType) )
 		{
 			RlvUtil::filterNames(tmp_chat.mText);
 			tmp_chat.mRlvNamesFiltered = TRUE;
@@ -574,8 +575,8 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
  		LLFirstUse::otherAvatarChatFirst();
 
  		// Add sender to the recent people list.
-// [RLVa:KB] - Checked: 2012-03-15 (RLVa-1.4.6) | Added: RLVa-1.4.6
-		if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+// [RLVa:KB] - Checked: RLVa-2.0.0
+		if ( (!RlvActions::isRlvEnabled()) || (RlvActions::canShowName(RlvActions::SNC_DEFAULT, chat_msg.mFromID)) )
 	 		LLRecentPeople::instance().add(chat_msg.mFromID);
 // [/RLVa:KB]
 // 		LLRecentPeople::instance().add(chat_msg.mFromID);
@@ -651,8 +652,8 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
             LLUUID id;
             id.generate();
             chat["id"] = id;
-// [RLVa:KB] - Checked: 2010-04-20 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
-			if (rlv_handler_t::isEnabled())
+// [RLVa:KB] - Checked: RLVa-1.2.0
+			if (RlvActions::isRlvEnabled())
 				chat["show_icon_tooltip"] = !chat_msg.mRlvNamesFiltered;
 // [/RLVa:KB]
             std::string r_color_name = "White";
diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp
index c2e70e5cec6a7223d3c192e05baca563e4197d42..57a05b42fcfaada163a224376627b2c7d65393d2 100755
--- a/indra/newview/llfloaterinspect.cpp
+++ b/indra/newview/llfloaterinspect.cpp
@@ -42,9 +42,10 @@
 #include "llviewercontrol.h"
 #include "llviewerobject.h"
 #include "lluictrlfactory.h"
-// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
-#include "rlvhandler.h"
-#include "llagent.h"
+// [RLVa:KB] - Checked: RLVa-2.0.1
+#include "rlvactions.h"
+#include "rlvcommon.h"
+#include "rlvui.h"
 // [/RLVa:KB]
 
 //LLFloaterInspect* LLFloaterInspect::sInstance = NULL;
@@ -105,11 +106,13 @@ void LLFloaterInspect::onOpen(const LLSD& key)
 	mObjectSelection = LLSelectMgr::getInstance()->getSelection();
 	refresh();
 }
-void LLFloaterInspect::onClickCreatorProfile()
+
+// [RLVa:KB] - Checked: RLVa-2.0.1
+const LLSelectNode* LLFloaterInspect::getSelectedNode() /*const*/
 {
 	if(mObjectList->getAllSelected().size() == 0)
 	{
-		return;
+		return NULL;
 	}
 	LLScrollListItem* first_selected =mObjectList->getFirstSelected();
 
@@ -124,41 +127,29 @@ void LLFloaterInspect::onClickCreatorProfile()
 				return (obj_id == node->getObject()->getID());
 			}
 		} func(first_selected->getUUID());
-		LLSelectNode* node = mObjectSelection->getFirstNode(&func);
+		return mObjectSelection->getFirstNode(&func);
+	}
+	return NULL;
+}
+
+void LLFloaterInspect::onClickCreatorProfile()
+{
+		const LLSelectNode* node = getSelectedNode();
 		if(node)
 		{
-//			LLAvatarActions::showProfile(node->mPermissions->getCreator());
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a) | Modified: RLVa-1.0.0e
+			// Only anonymize the creator if they're also the owner or if they're a nearby avie
 			const LLUUID& idCreator = node->mPermissions->getCreator();
-			if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && 
-				 ((node->mPermissions->getOwner() == idCreator) || (RlvUtil::isNearbyAgent(idCreator))) )
+			if ( (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, idCreator)) && ((node->mPermissions->getOwner() == idCreator) || (RlvUtil::isNearbyAgent(idCreator))) )
 			{
 				return;
 			}
 			LLAvatarActions::showProfile(idCreator);
-// [/RLVa:KB]
 		}
-	}
 }
 
 void LLFloaterInspect::onClickOwnerProfile()
 {
-	if(mObjectList->getAllSelected().size() == 0) return;
-	LLScrollListItem* first_selected =mObjectList->getFirstSelected();
-
-	if (first_selected)
-	{
-		LLUUID selected_id = first_selected->getUUID();
-		struct f : public LLSelectedNodeFunctor
-		{
-			LLUUID obj_id;
-			f(const LLUUID& id) : obj_id(id) {}
-			virtual bool apply(LLSelectNode* node)
-			{
-				return (obj_id == node->getObject()->getID());
-			}
-		} func(selected_id);
-		LLSelectNode* node = mObjectSelection->getFirstNode(&func);
+		const LLSelectNode* node = getSelectedNode();
 		if(node)
 		{
 			if(node->mPermissions->isGroupOwned())
@@ -169,30 +160,108 @@ void LLFloaterInspect::onClickOwnerProfile()
 			else
 			{
 				const LLUUID& owner_id = node->mPermissions->getOwner();
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a) | Modified: RLVa-1.0.0e
-			if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
-				return;
-// [/RLVa:KB]
+				if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, owner_id))
+					return;
 				LLAvatarActions::showProfile(owner_id);
 			}
 
 		}
-	}
 }
 
 void LLFloaterInspect::onSelectObject()
 {
 	if(LLFloaterInspect::getSelectedUUID() != LLUUID::null)
 	{
-//		getChildView("button owner")->setEnabled(true);
-//		getChildView("button creator")->setEnabled(true);
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a) | Modified: RLVa-1.0.0e
-		getChildView("button owner")->setEnabled(!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
-		// TODO-RLVa: [RLVa-1.2.2] Is it worth checking the selected node just to selectively disable this button?
-		getChildView("button creator")->setEnabled(true);
-// [/RLVa:KB]
+		if (!RlvActions::isRlvEnabled())
+		{
+			getChildView("button owner")->setEnabled(true);
+			getChildView("button creator")->setEnabled(true);
+		}
+		else
+		{
+			const LLSelectNode* node = getSelectedNode();
+			const LLUUID& idOwner = (node) ? node->mPermissions->getOwner() : LLUUID::null;
+			const LLUUID& idCreator = (node) ? node->mPermissions->getCreator() : LLUUID::null;
+
+			// See LLFloaterInspect::onClickCreatorProfile()
+			getChildView("button owner")->setEnabled( (RlvActions::canShowName(RlvActions::SNC_DEFAULT, idOwner)) || ((node) && (node->mPermissions->isGroupOwned())) );
+			// See LLFloaterInspect::onClickOwnerProfile()
+			getChildView("button creator")->setEnabled( ((idOwner != idCreator) && (!RlvUtil::isNearbyAgent(idCreator))) || (RlvActions::canShowName(RlvActions::SNC_DEFAULT, idCreator)) );
+		}
 	}
 }
+// [/RLVa:KB]
+
+//void LLFloaterInspect::onClickCreatorProfile()
+//{
+//	if(mObjectList->getAllSelected().size() == 0)
+//	{
+//		return;
+//	}
+//	LLScrollListItem* first_selected =mObjectList->getFirstSelected();
+//
+//	if (first_selected)
+//	{
+//		struct f : public LLSelectedNodeFunctor
+//		{
+//			LLUUID obj_id;
+//			f(const LLUUID& id) : obj_id(id) {}
+//			virtual bool apply(LLSelectNode* node)
+//			{
+//				return (obj_id == node->getObject()->getID());
+//			}
+//		} func(first_selected->getUUID());
+//		LLSelectNode* node = mObjectSelection->getFirstNode(&func);
+//		if(node)
+//		{
+//			LLAvatarActions::showProfile(node->mPermissions->getCreator());
+//		}
+//	}
+//}
+
+//void LLFloaterInspect::onClickOwnerProfile()
+//{
+//	if(mObjectList->getAllSelected().size() == 0) return;
+//	LLScrollListItem* first_selected =mObjectList->getFirstSelected();
+//
+//	if (first_selected)
+//	{
+//		LLUUID selected_id = first_selected->getUUID();
+//		struct f : public LLSelectedNodeFunctor
+//		{
+//			LLUUID obj_id;
+//			f(const LLUUID& id) : obj_id(id) {}
+//			virtual bool apply(LLSelectNode* node)
+//			{
+//				return (obj_id == node->getObject()->getID());
+//			}
+//		} func(selected_id);
+//		LLSelectNode* node = mObjectSelection->getFirstNode(&func);
+//		if(node)
+//		{
+//			if(node->mPermissions->isGroupOwned())
+//			{
+//				const LLUUID& idGroup = node->mPermissions->getGroup();
+//				LLGroupActions::show(idGroup);
+//			}
+//			else
+//			{
+//				const LLUUID& owner_id = node->mPermissions->getOwner();
+//				LLAvatarActions::showProfile(owner_id);
+//			}
+//
+//		}
+//	}
+//}
+
+//void LLFloaterInspect::onSelectObject()
+//{
+//	if(LLFloaterInspect::getSelectedUUID() != LLUUID::null)
+//	{
+//		getChildView("button owner")->setEnabled(true);
+//		getChildView("button creator")->setEnabled(true);
+//	}
+//}
 
 LLUUID LLFloaterInspect::getSelectedUUID()
 {
@@ -276,12 +345,11 @@ void LLFloaterInspect::refresh()
 			// actual name and set a placeholder.
 			if (LLAvatarNameCache::get(idOwner, &av_name))
 			{
-//				owner_name = av_name.getCompleteName();
-// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-				bool fRlvFilterOwner = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (idOwner != gAgent.getID()) && 
-					(!obj->mPermissions->isGroupOwned());
-				owner_name = (!fRlvFilterOwner) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name);
+// [RLVa:KB] - Checked: RLVa-2.0.1
+				bool fRlvCanShowName = (RlvActions::canShowName(RlvActions::SNC_DEFAULT, idOwner)) || (obj->mPermissions->isGroupOwned());
+				owner_name = (fRlvCanShowName) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name);
 // [/RLVa:KB]
+//				owner_name = av_name.getCompleteName();
 			}
 			else
 			{
@@ -296,14 +364,12 @@ void LLFloaterInspect::refresh()
 
 		if (LLAvatarNameCache::get(idCreator, &av_name))
 		{
-//			creator_name = av_name.getCompleteName();
-// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
+// [RLVa:KB] - Checked: RLVa-2.0.1
 			const LLUUID& idCreator = obj->mPermissions->getCreator();
-			LLAvatarNameCache::get(idCreator, &av_name);
-			bool fRlvFilterCreator = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (idCreator != gAgent.getID()) && 
-				( (obj->mPermissions->getOwner() == idCreator) || (RlvUtil::isNearbyAgent(idCreator)) );
-			creator_name = (!fRlvFilterCreator) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name);
+			bool fRlvCanShowName = (RlvActions::canShowName(RlvActions::SNC_DEFAULT, idCreator)) || ( (obj->mPermissions->getOwner() != idCreator) && (!RlvUtil::isNearbyAgent(idCreator)) );
+			creator_name = (fRlvCanShowName) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name);
 // [/RLVa:KB]
+//			creator_name = av_name.getCompleteName();
 		}
 		else
 		{
@@ -314,7 +380,7 @@ void LLFloaterInspect::refresh()
 			}
 			mCreatorNameCacheConnection = LLAvatarNameCache::get(idCreator, boost::bind(&LLFloaterInspect::onGetCreatorNameCallback, this));
 		}
-
+		
 		row["id"] = obj->getObject()->getID();
 		row["columns"][0]["column"] = "object_name";
 		row["columns"][0]["type"] = "text";
diff --git a/indra/newview/llfloaterinspect.h b/indra/newview/llfloaterinspect.h
index 44381eac96f27cf64919fcae7469ba5e9ebb2dd8..7f7f7377f05d02aa8b33429fae4e0f24e7674df8 100755
--- a/indra/newview/llfloaterinspect.h
+++ b/indra/newview/llfloaterinspect.h
@@ -36,6 +36,9 @@
 class LLObjectSelection;
 class LLScrollListCtrl;
 class LLUICtrl;
+// [RLVa:KB] - Checked: RLVa-2.0.1
+class LLSelectNode;
+// [/RLVa:KB]
 
 class LLFloaterInspect : public LLFloater
 {
@@ -61,6 +64,10 @@ protected:
 	void setDirty() { mDirty = TRUE; }
 	bool mDirty;
 
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	const LLSelectNode* getSelectedNode() /*const*/;
+// [/RLVa:KB]
+
 private:
 	void onGetOwnerNameCallback();
 	void onGetCreatorNameCallback();
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index f9b3adcbc26ac3621829e542831bdfe167779bbf..6a6f14acde80cb60226dbe3f5eb402eb5892fd07 100755
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -59,8 +59,9 @@
 
 #include "lluictrlfactory.h"
 
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b)
-#include "rlvhandler.h"
+// [RLVa:KB] - Checked: RLVa-2.0.1
+#include "rlvactions.h"
+#include "rlvcommon.h"
 // [/RLVa:KB]
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -282,11 +283,10 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 		getChildView("BtnCreator")->setEnabled(TRUE);
 		getChildView("LabelCreatorTitle")->setEnabled(TRUE);
 		getChildView("LabelCreatorName")->setEnabled(TRUE);
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Modified: RLVa-1.0.0e
+// [RLVa:KB] - Checked: RLVa-2.0.1
 		// If the object creator matches the object owner we need to anonymize the creator field as well
-		if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && 
-			( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == item->getCreatorUUID()) ) ||
-			  (RlvUtil::isNearbyAgent(item->getCreatorUUID())) ) )
+		if ( (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, item->getCreatorUUID())) &&
+		     ( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == item->getCreatorUUID()) ) || (RlvUtil::isNearbyAgent(item->getCreatorUUID())) ) )
 		{
 			childSetEnabled("BtnCreator", FALSE);
 			name = RlvStrings::getAnonym(name);
@@ -307,6 +307,9 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 	////////////////
 	if(perm.isOwned())
 	{
+// [RLVa:KB] - Checked: RVLa-2.0.1
+		bool fRlvCanShowOwner = true;
+// [/RLVa:KB]
 		std::string name;
 		if (perm.isGroupOwned())
 		{
@@ -315,14 +318,18 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 		else
 		{
 			gCacheName->getFullName(perm.getOwner(), name);
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Modified: RLVa-1.0.0e
-			if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
-				name = RlvStrings::getAnonym(name);
+// [RLVa:KB] - Checked: RLVa-2.0.1
+			if (RlvActions::isRlvEnabled())
+			{
+				fRlvCanShowOwner = RlvActions::canShowName(RlvActions::SNC_DEFAULT, perm.getOwner());
+				if (!fRlvCanShowOwner)
+					name = RlvStrings::getAnonym(name);
+			}
 // [/RLVa:KB]
 		}
 //		getChildView("BtnOwner")->setEnabled(TRUE);
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Added: RLVa-1.0.0e
-		getChildView("BtnOwner")->setEnabled(!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
+// [RLVa:KB] - Checked: RLVa-2.0.1
+		getChildView("BtnOwner")->setEnabled(fRlvCanShowOwner);
 // [/RLVa:KB]
 		getChildView("LabelOwnerTitle")->setEnabled(TRUE);
 		getChildView("LabelOwnerName")->setEnabled(TRUE);
@@ -560,12 +567,12 @@ void LLFloaterProperties::onClickCreator()
 	if(!item) return;
 	if(!item->getCreatorUUID().isNull())
 	{
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Added: RLVa-1.2.1b
-		if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+// [RLVa:KB] - Checked: RLVa-1.2.1
+		const LLUUID& idCreator = item->getCreatorUUID();
+		if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, idCreator)) )
 		{
 			const LLPermissions& perm = item->getPermissions();
-			if ( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == item->getCreatorUUID()) ) ||
-			     (RlvUtil::isNearbyAgent(item->getCreatorUUID())) )
+			if ( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == idCreator) ) || (RlvUtil::isNearbyAgent(idCreator)) )
 			{
 				return;
 			}
@@ -586,8 +593,8 @@ void LLFloaterProperties::onClickOwner()
 	}
 	else
 	{
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Modified: RLVa-1.0.0e
-		if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+// [RLVa:KB] - Checked: RLVa-1.0.0
+		if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, item->getPermissions().getOwner())) )
 			return;
 // [/RLVa:KB]
 		LLAvatarActions::showProfile(item->getPermissions().getOwner());
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 950a6cfaef5b053b630bd70f9126baf8cfdcde4f..d22c40922add3d0e3c8d3a46a1fe0868e29485c3 100755
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -56,6 +56,10 @@
 #include "llappearancemgr.h"
 #include "llgesturelistener.h"
 
+// [RLVa:KB] - Checked: RLVa-2.0.0
+#include "rlvactions.h"
+// [/RLVa:KB]
+
 // Longest time, in seconds, to wait for all animations to stop playing
 const F32 MAX_WAIT_ANIM_SECS = 30.f;
 
@@ -527,6 +531,11 @@ void LLGestureMgr::playGesture(LLMultiGesture* gesture)
 {
 	if (!gesture) return;
 
+// [RLVa:KB] - Checked: RLVa-2.0.0 | Handles: @sendgesture
+	if (!RlvActions::canPlayGestures())
+		return;
+// [/RLVa:KB]
+
 	// Reset gesture to first step
 	gesture->mCurrentStep = 0;
 
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index 9101b3bcc9eb449a4fcbe810998ebf708d4eb5d7..eb6df9723d6b0765b513f4cb770ce0711e2669b8 100755
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -46,9 +46,10 @@
 #include "llrecentpeople.h"
 #include "llviewerobjectlist.h"
 #include "llvoavatarself.h"
-// [RLVa:KB] - Checked: 2010-03-04 (RLVa-1.2.2a)
+// [RLVa:KB] - Checked: RLVa-1.2.2
 #include "llavatarnamecache.h"
-#include "rlvhandler.h"
+#include "rlvactions.h"
+#include "rlvcommon.h"
 #include "rlvui.h"
 // [/RLVa:KB]
 
@@ -322,9 +323,8 @@ void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im
 	{
 		gIMMgr->addSystemMessage(im_session_id, "inventory_item_offered", args);
 	}
-// [RLVa:KB] - Checked: 2010-05-26 (RLVa-1.2.2a) | Modified: RLVa-1.2.0h
-	else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (RlvUtil::isNearbyAgent(to_agent)) &&
-		      (!RlvUIEnabler::hasOpenProfile(to_agent)) )
+// [RLVa:KB] - Checked: RLVa-1.2.0
+	else if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, to_agent)) && (RlvUtil::isNearbyAgent(to_agent)) && (!RlvUIEnabler::hasOpenProfile(to_agent)) )
 	{
 		// Log to chat history if the user didn't drop on an IM session or a profile to avoid revealing the name of the recipient
 		std::string strMsgName = "inventory_item_offered-im"; LLSD args; LLAvatarName avName;
@@ -444,10 +444,10 @@ void LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent,
 
 	// add buddy to recent people list
 //	LLRecentPeople::instance().add(to_agent);
-// [RLVa:KB] - Checked: 2010-04-21 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
+// [RLVa:KB] - Checked: RLVa-2.0.0
 	// Block the recent activity update if this was an in-world drop on an avatar (as opposed to a drop on an IM session or on a profile)
-	if ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) || (im_session_id.notNull()) || (!RlvUtil::isNearbyAgent(to_agent)) ||
-		 (RlvUIEnabler::hasOpenProfile(to_agent)) )
+	if ( (!RlvActions::isRlvEnabled()) ||
+	     (RlvActions::canShowName(RlvActions::SNC_DEFAULT, to_agent)) || (im_session_id.notNull()) || (!RlvUtil::isNearbyAgent(to_agent)) || (RlvUIEnabler::hasOpenProfile(to_agent)) )
 	{
 		LLRecentPeople::instance().add(to_agent);
 	}
@@ -518,10 +518,10 @@ bool LLGiveInventory::commitGiveInventoryCategory(const LLUUID& to_agent,
 
 	// add buddy to recent people list
 //	LLRecentPeople::instance().add(to_agent);
-// [RLVa:KB] - Checked: 2010-04-20 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
+// [RLVa:KB] - Checked: RLVa-2.0.0
 	// Block the recent activity update if this was an in-world drop on an avatar (as opposed to a drop on an IM session or on a profile)
-	if ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) || (im_session_id.notNull()) || (!RlvUtil::isNearbyAgent(to_agent)) ||
-		 (RlvUIEnabler::hasOpenProfile(to_agent)) )
+	if ( (!RlvActions::isRlvEnabled()) ||
+	     (RlvActions::canShowName(RlvActions::SNC_DEFAULT, to_agent)) || (im_session_id.notNull()) || (!RlvUtil::isNearbyAgent(to_agent)) || (RlvUIEnabler::hasOpenProfile(to_agent)) )
 	{
 		LLRecentPeople::instance().add(to_agent);
 	}
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 33736185c1abde13e49b618c507b4f467f1dc421..841edc94488361808247c1904f72db8883cdf114 100755
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -64,7 +64,9 @@
 #include "llspatialpartition.h"
 #include "llviewershadermgr.h"
 // [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e)
+#include "rlvactions.h"
 #include "rlvhandler.h"
+#include "rlvhelper.h"
 // [/RLVa:KB]
 
 // Height of the yellow selection highlight posts for land
@@ -152,13 +154,15 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
 // [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Modified: RLVa-1.0.0g
 	if (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH))
 	{
+		static RlvCachedBehaviourModifier<float> s_nFartouchDist(RLV_MODIFIER_FARTOUCHDIST);
+
 		// We'll allow drag selection under fartouch, but only within the fartouch range
 		// (just copy/paste the code above us to make that work, thank you Lindens!)
 		LLVector3 relative_av_pos = av_pos;
 		relative_av_pos -= LLViewerCamera::getInstance()->getOrigin();
 
-		F32 new_far = relative_av_pos * LLViewerCamera::getInstance()->getAtAxis() + 1.5f;
-		F32 new_near = relative_av_pos * LLViewerCamera::getInstance()->getAtAxis() - 1.5f;
+		F32 new_far = relative_av_pos * LLViewerCamera::getInstance()->getAtAxis() + s_nFartouchDist;
+		F32 new_near = relative_av_pos * LLViewerCamera::getInstance()->getAtAxis() - s_nFartouchDist;
 
 		new_near = llmax(new_near, 0.1f);
 
@@ -167,7 +171,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
 
 		// Usurp these two
 		limit_select_distance = TRUE;
-		select_dist_squared = 1.5f * 1.5f;
+		select_dist_squared = s_nFartouchDist * s_nFartouchDist;
 	}
 // [/RLVa:KB]
 	LLViewerCamera::getInstance()->setPerspective(FOR_SELECTION, 
@@ -245,7 +249,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
 			}
 
 // [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Added: RLVa-1.3.0c
-			if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canEdit(vobjp)) )
+			if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canEdit(vobjp)) )
 			{
 				continue;
 			}
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index b1ddee47e6c0033afe54864ab1023e8fccfd97b6..350ba753d419cdc71f5fafa89073e2429e5cf418 100755
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -46,7 +46,8 @@
 #include "llstatusbar.h"
 #include "llmenugl.h"
 #include "pipeline.h"
-// [RLVa:KB] - Checked: 2010-03-27 (RLVa-1.4.0a)
+// [RLVa:KB] - Checked: RLVa-1.4.0
+#include "rlvactions.h"
 #include "rlvhandler.h"
 // [/RLVa:KB]
 #include <boost/tokenizer.hpp>
@@ -247,14 +248,14 @@ void LLHUDText::setString(const std::string &text_utf8)
 //	addLine(text_utf8, mColor);
 // [RLVa:KB] - Checked: 2010-03-02 (RLVa-1.4.0a) | Modified: RLVa-1.0.0f
 	// NOTE: setString() is called for debug and map beacons as well
-	if (rlv_handler_t::isEnabled())
+	if (RlvActions::isRlvEnabled())
 	{
 		std::string text(text_utf8);
 		if (gRlvHandler.canShowHoverText(mSourceObject))
 		{
-			if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
+			if (!RlvActions::canShowLocation())
 				RlvUtil::filterLocation(text);
-			if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+			if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT))
 				RlvUtil::filterNames(text);
 		}
 		else
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index a2d3a15b5bb7faf30b57763c5807381058547270..30275d44a4f60f819665a2dce1a8db56a3dbacf4 100755
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -39,6 +39,7 @@
 #include "llviewermediafocus.h"
 #include "llviewerobjectlist.h"	// to select the requested object
 // [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0c)
+#include "rlvactions.h"
 #include "rlvhandler.h"
 #include "lltoolpie.h"
 // [/RLVa:KB]
@@ -401,7 +402,7 @@ void LLInspectObject::updateSitLabel(LLSelectNode* nodep)
 	if (rlv_handler_t::isEnabled())
 	{
 		const LLPickInfo& pick = LLToolPie::getInstance()->getPick();
-		sit_btn->setEnabled( (pick.mObjectID.notNull()) && (gRlvHandler.canSit(pick.getObject(), pick.mObjectOffset)) );
+		sit_btn->setEnabled( (pick.mObjectID.notNull()) && (RlvActions::canSit(pick.getObject(), pick.mObjectOffset)) );
 	}
 // [/RLVa:KB]
 }
@@ -501,12 +502,10 @@ void LLInspectObject::updateCreator(LLSelectNode* nodep)
 		LLUUID creator_id = nodep->mPermissions->getCreator();
 //		std::string creator_url = 
 //			LLSLURL("agent", creator_id, "about").getSLURLString();
-// [RLVa:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
+// [RLVa:KB] - Checked: RLVa-1.2.2
 		// Only anonymize the creator if they're also the owner or if they're a nearby avie
-		bool fRlvHideCreator = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) &&
-			 ((nodep->mPermissions->getOwner() == creator_id) || (RlvUtil::isNearbyAgent(creator_id)));
-		std::string creator_url = 
-			LLSLURL("agent", creator_id, (!fRlvHideCreator) ? "about" : "rlvanonym").getSLURLString();
+		bool fRlvHideCreator = (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, creator_id)) && ((nodep->mPermissions->getOwner() == creator_id) || (RlvUtil::isNearbyAgent(creator_id)));
+		const std::string creator_url = LLSLURL("agent", creator_id, (!fRlvHideCreator) ? "about" : "rlvanonym").getSLURLString();
 // [/RLVa:KB]
 		args["[CREATOR]"] = creator_url;
 
@@ -523,8 +522,8 @@ void LLInspectObject::updateCreator(LLSelectNode* nodep)
 		{
 			owner_id = nodep->mPermissions->getOwner();
 //			owner_url = LLSLURL("agent", owner_id, "about").getSLURLString();
-// [RLVa:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-			bool fRlvHideOwner = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
+// [RLVa:KB] - Checked: RLVa-1.2.2
+			bool fRlvHideOwner = (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, owner_id));
 			owner_url = LLSLURL("agent", owner_id, (!fRlvHideOwner) ? "about" : "rlvanonym").getSLURLString();
 // [/RLVa:KB]
 		}
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 1a939a63b781fdd41c5ee1af1c277f3487d57b22..0f5fec964afe8273c44d84c0c1f8657090142aeb 100755
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -60,8 +60,9 @@
 #include "llviewerwindow.h"
 #include "llworld.h"
 #include "llworldmapview.h"		// shared draw code
-// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.0f)
-#include "rlvhandler.h"
+// [RLVa:KB] - Checked: RLVa-2.0.1
+#include "rlvactions.h"
+#include "rlvcommon.h"
 // [/RLVa:KB]
 
 static LLDefaultChildRegistry::Register<LLNetMap> r1("net_map");
@@ -351,9 +352,8 @@ void LLNetMap::draw()
 
 			pos_map = globalPosToView(positions[i]);
 
-// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f
-			bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL) &&
-				(!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
+// [RLVa:KB] - Checked: RLVa-1.2.0
+			bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, uuid));
 // [/RLVa:KB]
 //			bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL);
 
@@ -608,26 +608,17 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask )
 	// If the cursor is near an avatar on the minimap, a mini-inspector will be
 	// shown for the avatar, instead of the normal map tooltip.
 //	if (handleToolTipAgent(mClosestAgentToCursor))
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-	if ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (handleToolTipAgent(mClosestAgentToCursor)) )
+// [RLVa:KB] - Checked: RLVa-1.2.2
+	bool fRlvCanShowName = (mClosestAgentToCursor.notNull()) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, mClosestAgentToCursor));
+	if ( (fRlvCanShowName) && (handleToolTipAgent(mClosestAgentToCursor)) )
 // [/RLVa:KB]
 	{
 		return TRUE;
 	}
 
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-	LLStringUtil::format_map_t args;
-
-	LLAvatarName avName;
-	if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && 
-		 (mClosestAgentToCursor.notNull()) && (LLAvatarNameCache::get(mClosestAgentToCursor, &avName)) )
-	{
-		args["[AGENT]"] = RlvStrings::getAnonym(avName) + "\n";
-	}
-	else
-	{
-		args["[AGENT]"] = "";
-	}
+// [RLVa:KB] - Checked: RLVa-1.2.2
+	LLStringUtil::format_map_t args; LLAvatarName avName;
+	args["[AGENT]"] = ( (!fRlvCanShowName) && (mClosestAgentToCursor.notNull()) && (LLAvatarNameCache::get(mClosestAgentToCursor, &avName)) ) ? RlvStrings::getAnonym(avName) + "\n" : "";
 // [/RLVa:KB]
 
 	LLRect sticky_rect;
@@ -642,8 +633,8 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask )
 		sticky_rect.mTop = sticky_rect.mBottom + 2 * SLOP;
 
 //		region_name = region->getName();
-// [RLVa:KB] - Checked: 2010-10-19 (RLVa-1.2.2b) | Modified: RLVa-1.2.2b
-		region_name = ((!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? region->getName() : RlvStrings::getString(RLV_STRING_HIDDEN_REGION));
+// [RLVa:KB] - Checked: RLVa-1.2.2
+		region_name = (RlvActions::canShowLocation()) ? region->getName() : RlvStrings::getString(RLV_STRING_HIDDEN_REGION);
 // [/RLVa:KB]
 		if (!region_name.empty())
 		{
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 5b2c5b1f6321038b846c128273a40749c56728ca..05ceaffd82933ec39f0cb3206286173452e58359 100755
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -74,8 +74,8 @@
 
 #include "llagentui.h"
 #include "llslurl.h"
-// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.2a)
-#include "rlvhandler.h"
+// [RLVa:KB] - Checked: RLVa-1.2.2
+#include "rlvactions.h"
 // [/RLVa:KB]
 
 
@@ -626,7 +626,7 @@ BOOL LLPanelPeople::postBuild()
 	mNearbyList->setNoItemsMsg(getString("no_one_near"));
 	mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near"));
 	mNearbyList->setShowIcons("NearbyListShowIcons");
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
+// [RLVa:KB] - Checked: RLVa-1.2.0
 	mNearbyList->setRlvCheckShowNames(true);
 // [/RLVa:KB]
 	mMiniMap = (LLNetMap*)getChildView("Net Map",true);
@@ -898,7 +898,7 @@ void LLPanelPeople::updateFacebookList(bool visible)
 void LLPanelPeople::updateButtons()
 {
 	std::string cur_tab		= getActiveTabName();
-// [RLVa:KB] - Checked: 2013-05-06 (RLVa-1.4.9)
+// [RLVa:KB] - Checked: RLVa-1.4.9
 	bool nearby_tab_active = (cur_tab == NEARBY_TAB_NAME);
 // [/RLVa:KB]
 	bool friends_tab_active = (cur_tab == FRIENDS_TAB_NAME);
@@ -941,9 +941,9 @@ void LLPanelPeople::updateButtons()
 		LLPanel* cur_panel = mTabContainer->getCurrentPanel();
 		if (cur_panel)
 		{
-// [RLVa:KB] - Checked: 2010-07-20 (RLVa-1.2.2a) | Added: RLVa-1.2.0h
+// [RLVa:KB] - Checked: RLVa-1.2.0
 			if (cur_panel->hasChild("add_friend_btn", TRUE))
-				cur_panel->getChildView("add_friend_btn")->setEnabled(item_selected && !is_friend && !is_self && ((!nearby_tab_active) || (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))));
+				cur_panel->getChildView("add_friend_btn")->setEnabled(item_selected && !is_friend && !is_self && ((!nearby_tab_active) || (RlvActions::canShowName(RlvActions::SNC_DEFAULT, selected_id))));
 // [/RLBa:KB]
 //			if (cur_panel->hasChild("add_friend_btn", TRUE))
 //				cur_panel->getChildView("add_friend_btn")->setEnabled(item_selected && !is_friend && !is_self);
@@ -960,10 +960,13 @@ void LLPanelPeople::updateButtons()
 		}
 	}
 
-// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.2a) | Modified: RLVa-1.2.0d
-	if ( (nearby_tab_active) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
+// [RLVa:KB] - Checked: RLVa-1.2.0
+	if ( (nearby_tab_active) && (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT)) )
 	{
-		item_selected = multiple_selected = false;
+		bool fCanShowNames = true;
+		std::for_each(selected_uuids.begin(), selected_uuids.end(), [&fCanShowNames](const LLUUID& idAgent) { fCanShowNames &= RlvActions::canShowName(RlvActions::SNC_DEFAULT, idAgent); });
+		if (!fCanShowNames)
+			item_selected = multiple_selected = false;
 	}
 // [/RLBa:KB]
 }
@@ -1164,13 +1167,6 @@ void LLPanelPeople::onTabSelected(const LLSD& param)
 
 void LLPanelPeople::onAvatarListDoubleClicked(LLUICtrl* ctrl)
 {
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-	if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (NEARBY_TAB_NAME == getActiveTabName()) )
-	{
-		return;
-	}
-// [/RLVa:KB]
-
 	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(ctrl);
 	if(!item)
 	{
@@ -1183,6 +1179,13 @@ void LLPanelPeople::onAvatarListDoubleClicked(LLUICtrl* ctrl)
 		return;
 	}
 	
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	if ( (RlvActions::isRlvEnabled()) && (NEARBY_TAB_NAME == getActiveTabName()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, clicked_id)) )
+	{
+		return;
+	}
+// [/RLVa:KB]
+
 #if 0 // SJB: Useful for testing, but not currently functional or to spec
 	LLAvatarActions::showProfile(clicked_id);
 #else // spec says open IM window
@@ -1296,15 +1299,17 @@ void LLPanelPeople::onGearButtonClicked(LLUICtrl* btn)
 
 void LLPanelPeople::onImButtonClicked()
 {
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-	if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (NEARBY_TAB_NAME == getActiveTabName()) )
+	uuid_vec_t selected_uuids;
+	getCurrentItemIDs(selected_uuids);
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	if ( (RlvActions::isRlvEnabled()) && (NEARBY_TAB_NAME == getActiveTabName()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT)) )
 	{
-		return;
+		bool fCanShowNames = true;
+		std::for_each(selected_uuids.begin(), selected_uuids.end(), [&fCanShowNames](const LLUUID& idAgent) { fCanShowNames &= RlvActions::canShowName(RlvActions::SNC_DEFAULT, idAgent); });
+		if (!fCanShowNames)
+			return;
 	}
 // [/RLVa:KB]
-
-	uuid_vec_t selected_uuids;
-	getCurrentItemIDs(selected_uuids);
 	if ( selected_uuids.size() == 1 )
 	{
 		// if selected only one person then start up IM
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 482a871773311006cc8a66e0acd796580c2c149c..b746ee3e770b4c4d13c8d2d736ac16531969faeb 100755
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -59,7 +59,7 @@ public:
 
     bool mTryToConnectToFacebook;
 
-// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
+// [RLVa:KB] - Checked: RLVa-1.2.0
 	LLAvatarList* getNearbyList() { return mNearbyList; }
 // [/RLVa:KB]
 
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 7ed0e8ceb0e75fb5d1ad578251a3aef2e8aa4941..00dcf0833c7d7fa7858d3789aec3d01a103c5849 100755
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -41,9 +41,8 @@
 #include "llviewermenu.h"			// for gMenuHolder
 #include "llconversationmodel.h"
 #include "llviewerobjectlist.h"
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
+// [RLVa:KB] - Checked: RLVa-2.0.1
 #include "rlvactions.h"
-#include "rlvhandler.h"
 // [/RLVa:KB]
 
 namespace LLPanelPeopleMenus
@@ -184,17 +183,17 @@ bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata)
 
 		for (;id != uuids_end; ++id)
 		{
-			if ( LLAvatarActions::isFriend(*id) )
+//			if ( LLAvatarActions::isFriend(*id) )
+// [RLVa:KB] - Checked: 2014-03-31 (RLVa-2.0.1)
+			if ( (LLAvatarActions::isFriend(*id)) || (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, *id)) )
+// [/RLVa:KB]
 			{
 				result = false;
 				break;
 			}
 		}
 
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-		return result && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
-// [/RLVa:KB]
-//		return result;
+		return result;
 	}
 	else if (item == std::string("can_delete"))
 	{
@@ -210,17 +209,17 @@ bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata)
 
 		for (;id != uuids_end; ++id)
 		{
-			if ( !LLAvatarActions::isFriend(*id) )
+//			if ( !LLAvatarActions::isFriend(*id) )
+// [RLVa:KB] - Checked: 2014-03-31 (RLVa-2.0.1)
+			if ( (!LLAvatarActions::isFriend(*id)) || (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, *id)) )
+// [/RLVa:KB]
 			{
 				result = false;
 				break;
 			}
 		}
 
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-		return result && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
-// [/RLVa:KB]
-//		return result;
+		return result;
 	}
 	else if (item == std::string("can_call"))
 	{
@@ -272,8 +271,8 @@ void PeopleContextMenu::requestTeleport()
 {
 	// boost::bind cannot recognize overloaded method LLAvatarActions::teleportRequest(),
 	// so we have to use a wrapper.
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-	bool fRlvCanShowName = (!m_fRlvCheck) || (!RlvActions::isRlvEnabled()) || (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	bool fRlvCanShowName = (!m_fRlvCheck) || (RlvActions::canShowName(RlvActions::SNC_DEFAULT, mUUIDs.front()));
 	RlvActions::setShowName(RlvActions::SNC_TELEPORTREQUEST, fRlvCanShowName);
 	LLAvatarActions::teleportRequest(mUUIDs.front());
 	RlvActions::setShowName(RlvActions::SNC_TELEPORTREQUEST, true);
@@ -285,8 +284,11 @@ void PeopleContextMenu::offerTeleport()
 {
 	// boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),
 	// so we have to use a wrapper.
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-	bool fRlvCanShowName = (!m_fRlvCheck) || (!RlvActions::isRlvEnabled()) || (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	bool fRlvCanShowName = true;
+	if ( (m_fRlvCheck) && (RlvActions::isRlvEnabled()) )
+		std::for_each(mUUIDs.begin(), mUUIDs.end(), [&fRlvCanShowName](const LLUUID& idAgent) { fRlvCanShowName &= RlvActions::canShowName(RlvActions::SNC_DEFAULT, idAgent); });
+
 	RlvActions::setShowName(RlvActions::SNC_TELEPORTOFFER, fRlvCanShowName);
 	LLAvatarActions::offerTeleport(mUUIDs);
 	RlvActions::setShowName(RlvActions::SNC_TELEPORTOFFER, true);
@@ -314,14 +316,18 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)
     menuentry_vec_t items;
     menuentry_vec_t disabled_items;
 	
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-	if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+// [RLVa:KB] - Checked: RLVa-1.5.0
+	bool fRlvCanShowName = true;
+	if ( (m_fRlvCheck) && (RlvActions::isRlvEnabled()) )
+		std::for_each(mUUIDs.begin(), mUUIDs.end(), [&fRlvCanShowName](const LLUUID& idAgent) { fRlvCanShowName &= RlvActions::canShowName(RlvActions::SNC_DEFAULT, idAgent); });
+
+	if (!fRlvCanShowName)
 	{
 		if (flags & ITEM_IN_MULTI_SELECTION)
 		{
 			items.push_back(std::string("offer_teleport"));
 		}
-		else 
+		else
 		{
 			items.push_back(std::string("offer_teleport"));
 			items.push_back(std::string("request_teleport"));
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index 65f47cd05d9b3e20d70ba24aa8dc8d7f746ccdd2..51414708632c77bc8eefd94323b078bf9d0cc8e1 100755
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -38,7 +38,7 @@ namespace LLPanelPeopleMenus
 class PeopleContextMenu : public LLListContextMenu
 {
 public:
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
+// [RLVa:KB] - Checked: RLVa-1.5.0
 	PeopleContextMenu() : m_fRlvCheck(false) {}
 // [/RLVa:KB]
 	/*virtual*/ LLContextMenu* createMenu();
@@ -53,7 +53,7 @@ private:
 	void startConference();
 	void requestTeleport();
 
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
+// [RLVa:KB] - Checked: RLVa-1.5.0
 protected:
 	bool m_fRlvCheck;
 // [/RLVa:KB]
@@ -64,7 +64,7 @@ protected:
  */
 class NearbyPeopleContextMenu : public PeopleContextMenu
 {
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
+// [RLVa:KB] - Checked: RLVa-1.5.0
 public:
 	NearbyPeopleContextMenu() : PeopleContextMenu() { m_fRlvCheck = true; }
 // [/RLVa:KB]
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 999b942554cb990c676128769630fb90fa6c9344..4c2f77d7844e9e9f61d0166e7b715d968501bc13 100755
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -65,7 +65,8 @@
 #include "lltrans.h"
 // [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a)
 #include "llslurl.h"
-#include "rlvhandler.h"
+#include "rlvactions.h"
+#include "rlvcommon.h"
 // [/RLVa:KB]
 
 U8 string_value_to_click_action(std::string p_value);
@@ -411,15 +412,15 @@ void LLPanelPermissions::refresh()
 //	getChildView("Owner Name")->setEnabled(TRUE);
 // [RLVa:KB] - Moved further down to avoid an annoying flicker when the text is set twice in a row
 
-// [RLVa:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-	if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT)) )
 	{
 		// Only anonymize the creator if all of the selection was created by the same avie who's also the owner or they're a nearby avie
-		if ( (creators_identical) && (mCreatorID != gAgent.getID()) && ((mCreatorID == mOwnerID) || (RlvUtil::isNearbyAgent(mCreatorID))) )
+		if ( (creators_identical) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, mCreatorID)) && ((mCreatorID == mOwnerID) || (RlvUtil::isNearbyAgent(mCreatorID))) )
 			creator_name = LLSLURL("agent", mCreatorID, "rlvanonym").getSLURLString();
 
 		// Only anonymize the owner name if all of the selection is owned by the same avie and isn't group owned
-		if ( (owners_identical) && (!LLSelectMgr::getInstance()->selectIsGroupOwned()) && (mOwnerID != gAgent.getID()) )
+		if ( (owners_identical) && (!LLSelectMgr::getInstance()->selectIsGroupOwned()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, mOwnerID)) )
 			owner_name = LLSLURL("agent", mOwnerID, "rlvanonym").getSLURLString();
 	}
 
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 193f28b9d726b486d7eaab19b478aa5edf04a5a2..00ddbc9c43115c523efd3c4623e0cb6944e07e19 100755
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -96,6 +96,7 @@
 // [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
 #include "rlvactions.h"
 #include "rlvhandler.h"
+#include "rlvhelper.h"
 // [/RLVa:KB]
 #include "llglheaders.h"
 
@@ -4313,7 +4314,7 @@ void LLSelectMgr::deselectAllIfTooFar()
 			bool apply(LLSelectNode* pNode)
 			{
 				const LLViewerObject* pObj = pNode->getObject();
-				return (!pNode->isTransient()) && (pObj) && (!gRlvHandler.canEdit(pObj)) && (pObj->getID() != LLViewerMediaFocus::getInstance()->getFocusedObjectID());
+				return (!pNode->isTransient()) && (pObj) && (!RlvActions::canEdit(pObj)) && (pObj->getID() != LLViewerMediaFocus::getInstance()->getFocusedObjectID());
 			}
 		} f;
 		if (mSelectedObjects->getFirstRootNode(&f, TRUE))
@@ -4345,6 +4346,8 @@ void LLSelectMgr::deselectAllIfTooFar()
 	LLVector3d selectionCenter = getSelectionCenterGlobal();
 //	if (gSavedSettings.getBOOL("LimitSelectDistance")
 // [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Modified: RLVa-0.2.0f
+	static RlvCachedBehaviourModifier<float> s_nFartouchDist(RLV_MODIFIER_FARTOUCHDIST);
+
 	BOOL fRlvFartouch = gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH) && gFloaterTools->getVisible();
 	if ( (gSavedSettings.getBOOL("LimitSelectDistance") || (fRlvFartouch) )
 // [/RLVa:KB]
@@ -4355,7 +4358,7 @@ void LLSelectMgr::deselectAllIfTooFar()
 	{
 //		F32 deselect_dist = gSavedSettings.getF32("MaxSelectDistance");
 // [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Modified: RLVa-0.2.0f
-		F32 deselect_dist = (!fRlvFartouch) ? gSavedSettings.getF32("MaxSelectDistance") : 1.5f;
+		F32 deselect_dist = (!fRlvFartouch) ? gSavedSettings.getF32("MaxSelectDistance") : s_nFartouchDist;
 // [/RLVa:KB]
 		F32 deselect_dist_sq = deselect_dist * deselect_dist;
 
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 0fbefebd1835a5989861e67c4ed2babeb3e8f7c8..5c46beee23de83e1d1b7267f86d6c81637301488 100755
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -47,8 +47,9 @@
 #include "llexperienceassociationresponder.h"
 #include "llexperiencecache.h"
 #include "lltrans.h"
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a)
-#include "rlvhandler.h"
+// [RLVa:KB] - Checked: RLVa-2.0.1
+#include "rlvactions.h"
+#include "rlvcommon.h"
 // [/RLVa:KB]
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -360,13 +361,16 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
 //		std::string name =
 //			LLSLURL("agent", creator_id, "completename").getSLURLString();
 //		getChildView("BtnCreator")->setEnabled(TRUE);
-// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
+// [RLVa:KB] - Checked: RLVa-2.0.1
 		// If the object creator matches the object owner we need to anonymize the creator field as well
-		bool fRlvFilterCreator = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && 
-			( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == creator_id) && (perm.getOwner() != gAgent.getID())) ||
-			  (RlvUtil::isNearbyAgent(item->getCreatorUUID())) );
-		std::string name = LLSLURL("agent", creator_id, (!fRlvFilterCreator) ? "completename" : "rlvanonym").getSLURLString();
-		getChildView("BtnCreator")->setEnabled(!fRlvFilterCreator);
+		bool fRlvCanShowCreator = true;
+		if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, creator_id)) &&
+		     ( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == creator_id) ) || (RlvUtil::isNearbyAgent(item->getCreatorUUID())) ) )
+		{
+			fRlvCanShowCreator = false;
+		}
+		std::string name = LLSLURL("agent", creator_id, (fRlvCanShowCreator) ? "completename" : "rlvanonym").getSLURLString();
+		getChildView("BtnCreator")->setEnabled(fRlvCanShowCreator);
 // [/RLVa:KB]
 		getChildView("LabelCreatorTitle")->setEnabled(TRUE);
 		getChildView("LabelCreatorName")->setEnabled(FALSE);
@@ -385,6 +389,9 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
 	////////////////
 	if(perm.isOwned())
 	{
+// [RLVa:KB] - Checked: RVLa-2.0.1
+		bool fRlvCanShowOwner = true;
+// [/RLVa:KB]
 		std::string name;
 		if (perm.isGroupOwned())
 		{
@@ -394,14 +401,14 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
 		{
 			LLUUID owner_id = perm.getOwner();
 //			name = LLSLURL("agent", owner_id, "completename").getSLURLString();
-// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-			bool fRlvFilterOwner = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (owner_id != gAgent.getID());
-			name = LLSLURL("agent", owner_id, (!fRlvFilterOwner) ? "completename" : "rlvanonym").getSLURLString();
+// [RLVa:KB] - Checked: RLVa-2.0.1
+			fRlvCanShowOwner = RlvActions::canShowName(RlvActions::SNC_DEFAULT, owner_id);
+			name = LLSLURL("agent", owner_id, (fRlvCanShowOwner) ? "completename" : "rlvanonym").getSLURLString();
 // [/RLVa:KB]
 		}
 //		getChildView("BtnOwner")->setEnabled(TRUE);
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a) | Added: RLVa-1.0.0e
-		getChildView("BtnOwner")->setEnabled(!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
+// [RLVa:KB] - Checked: RLVa-2.0.1
+		getChildView("BtnOwner")->setEnabled(fRlvCanShowOwner);
 // [/RLVa:KB]
 		getChildView("LabelOwnerTitle")->setEnabled(TRUE);
 		getChildView("LabelOwnerName")->setEnabled(FALSE);
@@ -759,12 +766,12 @@ void LLSidepanelItemInfo::onClickCreator()
 	if(!item) return;
 	if(!item->getCreatorUUID().isNull())
 	{
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a) | Added: RLVa-1.2.1b
-		if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+// [RLVa:KB] - Checked: RLVa-1.2.1
+		const LLUUID& idCreator = item->getCreatorUUID();
+		if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, idCreator)) )
 		{
 			const LLPermissions& perm = item->getPermissions();
-			if ( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == item->getCreatorUUID()) && (perm.getOwner() != gAgent.getID())) || 
-			     (RlvUtil::isNearbyAgent(item->getCreatorUUID())) )
+			if ( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == idCreator) ) || (RlvUtil::isNearbyAgent(idCreator)) )
 			{
 				return;
 			}
@@ -785,8 +792,8 @@ void LLSidepanelItemInfo::onClickOwner()
 	}
 	else
 	{
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a) | Modified: RLVa-1.0.0e
-		if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (item->getPermissions().getOwner() != gAgent.getID()) )
+// [RLVa:KB] - Checked: RLVa-1.0.0
+		if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, item->getPermissions().getOwner())) )
 			return;
 // [/RLVa:KB]
 		LLAvatarActions::showProfile(item->getPermissions().getOwner());
diff --git a/indra/newview/lltoolface.cpp b/indra/newview/lltoolface.cpp
index 4b02174009d2017d29b4580f6c6a0083eba8c8a4..c1707bba30d75a90eb4e157b12b7ef41038e0ed1 100755
--- a/indra/newview/lltoolface.cpp
+++ b/indra/newview/lltoolface.cpp
@@ -40,6 +40,7 @@
 #include "llviewerwindow.h"
 #include "llfloatertools.h"
 // [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e)
+#include "rlvactions.h"
 #include "rlvhandler.h"
 // [/RLVa:KB]
 
@@ -95,7 +96,7 @@ void LLToolFace::pickCallback(const LLPickInfo& pick_info)
 
 // [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Modified: RLVa-1.3.0c
 		if ( (rlv_handler_t::isEnabled()) &&
-			 ( (!gRlvHandler.canEdit(hit_obj)) || 
+			 ( (!RlvActions::canEdit(hit_obj)) || 
 			   ((gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && (!gRlvHandler.canTouch(hit_obj, pick_info.mObjectOffset))) ) )
 		{
 			return;
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 532d902e5c39e8a22b622f777312a40846718863..9f941c1aac350f1bfb9c4d61ebec88f4fe2671e6 100755
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -71,6 +71,7 @@
 #include "llweb.h"
 #include "pipeline.h"	// setHighlightObject
 // [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c)
+#include "rlvactions.h"
 #include "rlvhandler.h"
 // [/RLVa:KB]
 
@@ -461,7 +462,7 @@ ECursorType LLToolPie::cursorFromObject(LLViewerObject* object)
 //			if (isAgentAvatarValid() && !gAgentAvatarp->isSitting()) // not already sitting?
 // [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c) | Modified: RLVa-1.2.0g
 			if ( (isAgentAvatarValid() && !gAgentAvatarp->isSitting()) && 
-				 ((!rlv_handler_t::isEnabled()) || (gRlvHandler.canSit(object, LLToolPie::getInstance()->getHoverPick().mObjectOffset))) )
+				 ((!rlv_handler_t::isEnabled()) || (RlvActions::canSit(object, LLToolPie::getInstance()->getHoverPick().mObjectOffset))) )
 // [/RLVa:KB]
 			{
 				cursor = UI_CURSOR_TOOLSIT;
@@ -729,10 +730,24 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
                                              FALSE /* ignore transparent */,
                                              FALSE /* ignore particles */);
 
-        if (!mPick.mPosGlobal.isExactlyZero()			// valid coordinates for pick
-            && (mPick.mPickType == LLPickInfo::PICK_LAND	// we clicked on land
-                || mPick.mObjectID.notNull()))				// or on an object
+//        if (!mPick.mPosGlobal.isExactlyZero()			// valid coordinates for pick
+//            && (mPick.mPickType == LLPickInfo::PICK_LAND	// we clicked on land
+//                || mPick.mObjectID.notNull()))				// or on an object
+// [RLVa:KB] - Checked: RLVa-2.0.0
+		bool fValidPick = (!mPick.mPosGlobal.isExactlyZero()			// valid coordinates for pick
+			&& (mPick.mPickType == LLPickInfo::PICK_LAND	// we clicked on land
+				|| mPick.mObjectID.notNull()));				// or on an object
+
+		if ( (fValidPick) && (RlvActions::isRlvEnabled()) && (!RlvActions::canTeleportToLocal(mPick.mPosGlobal)) )
+		{
+			RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_AUTOPILOT);
+			fValidPick = false;
+		}
+
+		if (fValidPick)
+// [/RLVa:KB]
         {
+
             // handle special cases of steering picks
             LLViewerObject* avatar_object = mPick.getObject();
 
@@ -827,8 +842,20 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
             }
         }
 
-		if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
-			(mPick.mObjectID.notNull()  && !mPick.mPosGlobal.isExactlyZero()))
+//		if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
+//			(mPick.mObjectID.notNull()  && !mPick.mPosGlobal.isExactlyZero()))
+// [RLVa:KB] - Checked: RLVa-2.0.0
+		bool fValidPick = ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
+			(mPick.mObjectID.notNull()  && !mPick.mPosGlobal.isExactlyZero()));
+
+		if ( (fValidPick) && (RlvActions::isRlvEnabled()) && (!RlvActions::canTeleportToLocal(mPick.mPosGlobal)) )
+		{
+			RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_AUTOPILOT);
+			fValidPick = false;
+		}
+
+		if (fValidPick)
+// [/RLVa:KB]
 		{
 			walkToClickedLocation();
 			return TRUE;
@@ -1096,8 +1123,8 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
 			if (LLAvatarNameCache::get(hover_object->getID(), &av_name))
 			{
 //				final_name = av_name.getCompleteName();
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-				final_name = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name);
+// [RLVa:KB] - Checked: RLVa-1.2.2
+				final_name = (RlvActions::canShowName(RlvActions::SNC_DEFAULT, hover_object->getID())) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name);
 // [/RLVa:KB]
 			}
 			else
@@ -1107,9 +1134,9 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
 
 			// *HACK: We may select this object, so pretend it was clicked
 			mPick = mHoverPick;
-// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.2a) | Added: RLVa-1.2.0e
+// [RLVa:KB] - Checked: RLVa-1.2.0
 			if ( (!rlv_handler_t::isEnabled()) || 
-				 ( (gRlvHandler.canTouch(hover_object, mHoverPick.mObjectOffset)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ) )
+			     ( (gRlvHandler.canTouch(hover_object, mHoverPick.mObjectOffset)) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, hover_object->getID())) ) )
 			{
 // [/RLVa:KB]
 				LLInspector::Params p;
diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp
index 9bc4b2e9448582ad2c2810f53b835dcf63ecfb93..ea819811ef2d339dd78cf5a33dd209e9f344d3a8 100755
--- a/indra/newview/lltoolplacer.cpp
+++ b/indra/newview/lltoolplacer.cpp
@@ -45,6 +45,7 @@
 #include "llui.h"
 // [RLVa:KB] - Checked: 2010-03-23 (RLVa-1.2.0a)
 #include "rlvhandler.h"
+#include "rlvhelper.h"
 // [/RLVa:KB]
 
 //Headers added for functions moved from viewer.cpp
@@ -128,9 +129,11 @@ BOOL LLToolPlacer::raycastForNewObjPos( S32 x, S32 y, LLViewerObject** hit_obj,
 
 // [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Modified: RLVa-0.2.0f
 	// NOTE: don't use surface_pos_global since for prims it will be the center of the prim while we need center + offset
-	if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && (dist_vec_squared(gAgent.getPositionGlobal(), pick.mPosGlobal) > 1.5f * 1.5f) )
+	if (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH))
 	{
-		return FALSE;
+		static RlvCachedBehaviourModifier<float> s_nFartouchDist(RLV_MODIFIER_FARTOUCHDIST);
+		if (dist_vec_squared(gAgent.getPositionGlobal(), pick.mPosGlobal) > s_nFartouchDist * s_nFartouchDist)
+			return FALSE;
 	}
 // [/RLVa:KB]
 
diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp
index e9d2d9a7b33f08315e2ff29d2f9ea823c42b1d04..2cd221c351b9340098ff23cfec9e6d8cd823647d 100755
--- a/indra/newview/lltoolselect.cpp
+++ b/indra/newview/lltoolselect.cpp
@@ -47,8 +47,9 @@
 #include "llviewerwindow.h"
 #include "llvoavatarself.h"
 #include "llworld.h"
-// [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c)
-#include "rlvhandler.h"
+// [RLVa:KB] - Checked: RLVa-2.0.0
+#include "rlvactions.h"
+#include "rlvhelper.h"
 #include "llfloaterreg.h"
 // [/RLVa:KB]
 
@@ -86,22 +87,23 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi
 	}
 
 // [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Modified: RLVa-1.3.0c
-	if ( (object) && (rlv_handler_t::isEnabled()) )
+	if ( (object) && (RlvActions::isRlvEnabled()) )
 	{
-		if (!gRlvHandler.canEdit(object))
+		if (!RlvActions::canEdit(object))
 		{
 			if (!temp_select)
 				return LLSelectMgr::getInstance()->getSelection();
 			else if (LLToolMgr::instance().inBuildMode())
 				LLToolMgr::instance().toggleBuildMode();
 		}
-		
-		if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && ((!object->isAttachment()) || (!object->permYouOwner())) &&
-			 (dist_vec_squared(gAgent.getPositionAgent(), object->getPositionRegion()) > 1.5f * 1.5f) )
+
+		if ( (RlvActions::hasBehaviour(RLV_BHVR_FARTOUCH)) && ((!object->isAttachment()) || (!object->permYouOwner())) )
 		{
-			// NOTE: see behaviour notes for a rather lengthy explanation of why we're doing things this way
-			//if (dist_vec_squared(gAgent.getPositionAgent(), object->getPositionRegion() + pick.mObjectOffset) > 1.5f * 1.5f)
-			if (dist_vec_squared(gAgent.getPositionAgent(), pick.mIntersection) > 1.5f * 1.5f)
+			static RlvCachedBehaviourModifier<float> s_nFartouchDist(RLV_MODIFIER_FARTOUCHDIST);
+			float nFartouchDistSq = s_nFartouchDist * s_nFartouchDist;
+			// NOTE: recheck why we did it this way, might be able to simplify
+			if ( (dist_vec_squared(gAgent.getPositionAgent(), object->getPositionRegion()) > nFartouchDistSq) &&
+			     (dist_vec_squared(gAgent.getPositionAgent(), pick.mIntersection) > nFartouchDistSq) )
 			{
 				if ( (LLFloaterReg::instanceVisible("build")) && (pick.mKeyMask != MASK_SHIFT) && (pick.mKeyMask != MASK_CONTROL) )
 					LLSelectMgr::getInstance()->deselectAll();
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 314f6417deb53141bffa530753a5c03bc23de695..4b0a36ddcd788dfffd63cd90ff2af304e808ecb8 100755
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -41,7 +41,7 @@
 #include "llworld.h"
 #include "lltoolmgr.h"
 #include "llviewerjoystick.h"
-// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e)
+// [RLVa:KB] - RLVa-2.0.0
 #include "rlvactions.h"
 #include "rlvhandler.h"
 // [/RLVa:KB]
@@ -357,15 +357,17 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
 		if (limit_select_distance)
 		{
 			// ...select distance from control
-//			z_far = gSavedSettings.getF32("MaxSelectDistance");
-// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Added: RLVa-1.2.0e
-			z_far = (!gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) ? gSavedSettings.getF32("MaxSelectDistance") : 1.5;
-// [/RLVa:KB]
+			z_far = gSavedSettings.getF32("MaxSelectDistance");
 		}
 		else
 		{
 			z_far = gAgentCamera.mDrawDistance;
 		}
+
+// [RLVa:KB] - Checked: RLVa-2.0.0
+		if (RlvActions::hasBehaviour(RLV_BHVR_FARTOUCH))
+			z_far = RlvActions::getModifierValue<float>(RLV_MODIFIER_FARTOUCHDIST);
+// [/RLVa:KB]
 	}
 	else
 	{
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 505c01076e9e2300c40f8f94b88c2190ac119e0c..73131c3bf46dfb19da3be3f12221f3803130bdba 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -1249,13 +1249,22 @@ class LLAdvancedToggleWireframe : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-// [RLVa:KB] - Checked: 2013-05-11 (RLVa-1.4.9)
+// [RLVa:KB] - Checked: RLVa-2.0.0
 		bool fRlvBlockWireframe = gRlvAttachmentLocks.hasLockedHUD();
 		if ( (!gUseWireframe) && (fRlvBlockWireframe) )
-		{
 			RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_WIREFRAME);
-		}
-		gUseWireframe = (!gUseWireframe) && (!fRlvBlockWireframe);
+		set_use_wireframe( (!gUseWireframe) && (!fRlvBlockWireframe) );
+		return true;
+	}
+};
+
+// Called from rlvhandler.cpp
+void set_use_wireframe(BOOL useWireframe)
+	{
+		if (gUseWireframe == useWireframe)
+			return;
+
+		gUseWireframe = useWireframe;
 // [/RLVa:KB]
 //		gUseWireframe = !(gUseWireframe);
 
@@ -1276,9 +1285,9 @@ class LLAdvancedToggleWireframe : public view_listener_t
 			LLViewerShaderMgr::instance()->setShaders();
 		}
 
-		return true;
+//		return true;
 	}
-};
+//};
 
 class LLAdvancedCheckWireframe : public view_listener_t
 {
@@ -3088,8 +3097,8 @@ bool enable_object_mute()
 			lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden");
 		bool is_self = avatar->isSelf();
 //		return !is_linden && !is_self;
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Added: RLVa-1.2.1b
-		return !is_linden && !is_self && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES);
+// [RLVa:KB] - Checked: RLVa-1.2.1
+		return !is_linden && !is_self && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID()));
 // [/RLVa:KB]
 	}
 	else
@@ -3197,11 +3206,11 @@ class LLObjectMute : public view_listener_t
 		LLVOAvatar* avatar = find_avatar_from_object(object); 
 		if (avatar)
 		{
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Added: RLVa-1.0.0e
-			if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+			id = avatar->getID();
+// [RLVa:KB] - Checked: RLVa-1.0.0
+			if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, id))
 				return true;
 // [/RLVa:KB]
-			id = avatar->getID();
 
 			LLNameValue *firstname = avatar->getNVPair("FirstName");
 			LLNameValue *lastname = avatar->getNVPair("LastName");
@@ -3355,8 +3364,8 @@ void handle_avatar_freeze(const LLSD& avatar_id)
 			{
 				LLSD args;
 //				args["AVATAR_NAME"] = fullname;
-// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.0e
-				args["AVATAR_NAME"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : RlvStrings::getAnonym(fullname);
+// [RLVa:KB] - Checked: RLVa-1.0.0
+				args["AVATAR_NAME"] = (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())) ? fullname : RlvStrings::getAnonym(fullname);
 // [/RLVa:KB]
 				LLNotificationsUtil::add("FreezeAvatarFullname",
 							args,
@@ -3487,8 +3496,8 @@ void handle_avatar_eject(const LLSD& avatar_id)
 				{
     				LLSD args;
 //					args["AVATAR_NAME"] = fullname;
-// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.0e
-					args["AVATAR_NAME"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : RlvStrings::getAnonym(fullname);
+// [RLVa:KB] - Checked: RLVa-1.0.0
+					args["AVATAR_NAME"] = (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())) ? fullname : RlvStrings::getAnonym(fullname);
 // [/RLVa:KB]
     				LLNotificationsUtil::add("EjectAvatarFullname",
     							args,
@@ -3510,8 +3519,8 @@ void handle_avatar_eject(const LLSD& avatar_id)
 				{
     				LLSD args;
 //					args["AVATAR_NAME"] = fullname;
-// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.0e
-					args["AVATAR_NAME"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : RlvStrings::getAnonym(fullname);
+// [RLVa:KB] - Checked: RLVa-1.0.0
+					args["AVATAR_NAME"] = (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())) ? fullname : RlvStrings::getAnonym(fullname);
 // [/RLVa:KB]
     				LLNotificationsUtil::add("EjectAvatarFullnameNoBan",
     							args,
@@ -4008,8 +4017,8 @@ class LLAvatarEnableAddFriend : public view_listener_t
 	{
 		LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
 //		bool new_value = avatar && !LLAvatarActions::isFriend(avatar->getID());
-// [RLVa:KB] - Checked: 2010-04-20 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f
-		bool new_value = avatar && !LLAvatarActions::isFriend(avatar->getID()) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
+// [RLVa:KB] - Checked: RLVa-1.2.0
+		bool new_value = avatar && !LLAvatarActions::isFriend(avatar->getID()) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID()));
 // [/RLVa:KB]
 		return new_value;
 	}
@@ -4084,7 +4093,7 @@ bool is_object_sittable()
 	if (rlv_handler_t::isEnabled())
 	{
 		const LLPickInfo& pick = LLToolPie::getInstance()->getPick();
-		if ( (pick.mObjectID.notNull()) && (!gRlvHandler.canSit(pick.getObject(), pick.mObjectOffset)) )
+		if ( (pick.mObjectID.notNull()) && (!RlvActions::canSit(pick.getObject(), pick.mObjectOffset)) )
 			return false;
 	}
 // [/RLVa:KB]
@@ -4123,7 +4132,7 @@ void handle_object_sit_or_stand()
 //	if (object && object->getPCode() == LL_PCODE_VOLUME)
 // [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c) | Modified: RLVa-1.2.0c
 	if ( (object && object->getPCode() == LL_PCODE_VOLUME) && 
-		 ((!rlv_handler_t::isEnabled()) || (gRlvHandler.canSit(object, pick.mObjectOffset))) )
+		 ((!rlv_handler_t::isEnabled()) || (RlvActions::canSit(object, pick.mObjectOffset))) )
 // [/RLVa:KB]
 	{
 // [RLVa:KB] - Checked: 2010-08-29 (RLVa-1.2.1c) | Added: RLVa-1.2.1c
@@ -6145,8 +6154,8 @@ class LLAvatarInviteToGroup : public view_listener_t
 	{
 		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
 //		if(avatar)
-// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
-		if ( (avatar) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
+// [RLVa:KB] - Checked: RLVa-1.2.0
+		if ( (avatar) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())) )
 // [/RLVa:KB]
 		{
 			LLAvatarActions::inviteToGroup(avatar->getID());
@@ -6161,8 +6170,8 @@ class LLAvatarAddFriend : public view_listener_t
 	{
 		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
 //		if(avatar && !LLAvatarActions::isFriend(avatar->getID()))
-// [RLVa:KB] - Checked: 2010-04-20 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f
-		if ( (avatar && !LLAvatarActions::isFriend(avatar->getID())) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
+// [RLVa:KB] - Checked: RLVa-1.2.0
+		if ( (avatar && !LLAvatarActions::isFriend(avatar->getID())) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())) )
 // [/RLVa:KB]
 		{
 			request_friendship(avatar->getID());
@@ -6205,8 +6214,8 @@ class LLAvatarAddContact : public view_listener_t
 	{
 		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
 //		if(avatar)
-// [RLVa:KB] - Checked: 2010-04-20 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f
-		if ( (avatar) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
+// [RLVa:KB] - Checked: RLVa-1.2.0
+		if ( (avatar) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())) )
 // [/RLVa:KB]
 		{
 			create_inventory_callingcard(avatar->getID());
@@ -6272,8 +6281,8 @@ bool enable_pay_avatar()
 	LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
 	LLVOAvatar* avatar = find_avatar_from_object(obj);
 //	return (avatar != NULL);
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Added: RLVa-1.2.1b
-	return (avatar != NULL) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
+// [RLVa:KB] - Checked: RLVa-1.2.1
+	return (avatar != NULL) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID()));
 // [/RLVa:KB]
 }
 
@@ -6329,7 +6338,7 @@ bool enable_object_sit(LLUICtrl* ctrl)
 		{
 			const LLPickInfo& pick = LLToolPie::getInstance()->getPick();
 			if (pick.mObjectID.notNull())
-				sitting_on_sel = !gRlvHandler.canSit(pick.getObject(), pick.mObjectOffset);
+				sitting_on_sel = !RlvActions::canSit(pick.getObject(), pick.mObjectOffset);
 		}
 // [/RLVa:KB]
 
@@ -6588,8 +6597,8 @@ class LLShowAgentProfile : public view_listener_t
 
 		LLVOAvatar* avatar = find_avatar_from_object(agent_id);
 //		if (avatar)
-// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.0d) | Modified: RLVa-1.2.0d
-		if ( (avatar) && ((!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) || (gAgent.getID() == agent_id)) )
+// [RLVa:KB] - Checked: RLVa-1.2.0
+		if ( (avatar) && ((RlvActions::canShowName(RlvActions::SNC_DEFAULT, agent_id)) || (gAgent.getID() == agent_id)) )
 // [/RLVa:KB]
 		{
 			LLAvatarActions::showProfile(avatar->getID());
@@ -7300,8 +7309,8 @@ class LLAvatarSendIM : public view_listener_t
 	{
 		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
 //		if(avatar)
-// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
-		if ( (avatar) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
+// [RLVa:KB] - Checked: RLVa-1.2.0
+		if ( (avatar) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())) )
 // [/RLVa:KB]
 		{
 			LLAvatarActions::startIM(avatar->getID());
@@ -7316,8 +7325,8 @@ class LLAvatarCall : public view_listener_t
 	{
 		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
 //		if(avatar)
-// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
-		if ( (avatar) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
+// [RLVa:KB] - Checked: RLVa-1.2.0
+		if ( (avatar) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, avatar->getID())) )
 // [/RLVa:KB]
 		{
 			LLAvatarActions::startCall(avatar->getID());
@@ -7326,10 +7335,16 @@ class LLAvatarCall : public view_listener_t
 	}
 };
 
-// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Added: RLVa-1.2.1b
+// [RLVa:KB] - Checked: RLVa-1.2.1
 bool enable_avatar_call()
 {
-	return (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (LLAvatarActions::canCall());
+	if (RlvActions::isRlvEnabled())
+	{
+		const LLVOAvatar* pAvatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
+		if ((!pAvatar) || (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, pAvatar->getID())))
+			return false;
+	}
+	return LLAvatarActions::canCall();
 }
 // [/RLVa:KB]
 
@@ -9541,10 +9556,11 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono");
 	view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints");
 
-// [RLVa:KB] - Checked: 2010-04-23 (RLVa-1.2.0g) | Added: RLVa-1.2.0
+// [RLVa:KB] - Checked: RLVa-2.0.0
 	enable.add("RLV.MainToggleVisible", boost::bind(&rlvMenuMainToggleVisible, _1));
-	if (rlv_handler_t::isEnabled())
+	if (RlvActions::isRlvEnabled())
 	{
+		enable.add("RLV.CanShowName", boost::bind(&rlvMenuCanShowName));
 		enable.add("RLV.EnableIfNot", boost::bind(&rlvMenuEnableIfNot, _2));
 	}
 // [/RLVa:KB]
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index b7bdf0015775bb61bfd4814f0019267c462ef3f1..36bf472cad58c5d37d0a9837e28d6b5f8e80fb15 100755
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -38,6 +38,10 @@ class LLParcelSelection;
 class LLObjectSelection;
 class LLSelectNode;
 
+// [RLVa:KB] - Checked: RLVa-2.0.0
+void set_use_wireframe(BOOL useWireframe);
+// [/RLVa:KB]
+
 void initialize_edit_menu();
 void initialize_spellcheck_menu();
 void init_menus();
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index d83b2e800f6228f098c697fdd6f15c8736131efc..0db5187d5d27803f0ec6ed6efede4af214f00fe8 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1549,13 +1549,12 @@ void LLOfferInfo::send_auto_receive_response(void)
 	{
 		// add buddy to recent people list
 //		LLRecentPeople::instance().add(mFromID);
-// [RLVa:KB] - Checked: 2010-04-20 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
-		// RELEASE-RLVa: [RLVa-1.2.2] Make sure this stays in sync with the condition in inventory_offer_handler()
-		if ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) || (!RlvUtil::isNearbyAgent(mFromID)) || 
-			 (RlvUIEnabler::hasOpenIM(mFromID)) || ((RlvUIEnabler::hasOpenProfile(mFromID))) )
-		{
+// [RLVa:KB] - Checked: RLVa-2.0.1
+		// RELEASE-RLVa: [RLVa-2.0.1] Make sure this stays in sync with the condition in inventory_offer_handler()
+		bool fRlvCanShowName = (!RlvActions::isRlvEnabled()) ||
+			(RlvActions::canShowName(RlvActions::SNC_DEFAULT, mFromID)) || (!RlvUtil::isNearbyAgent(mFromID)) || (RlvUIEnabler::hasOpenIM(mFromID)) || (RlvUIEnabler::hasOpenProfile(mFromID));
+		if (fRlvCanShowName)
 			LLRecentPeople::instance().add(mFromID);
-		}
 // [/RLVa:KB]
 	}
 }
@@ -1837,9 +1836,11 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
 // [SL:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
 			std::string name_slurl = LLSLURL("agent", mFromID, "about").getSLURLString();
 
-// [RLVa:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-			// RELEASE-RLVa: [RLVa-1.2.2] Make sure this stays in sync with the condition in inventory_offer_handler()
-			if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (RlvUtil::isNearbyAgent(mFromID)) )
+// [RLVa:KB] - Checked: RLVa-2.0.1
+			// RELEASE-RLVa: [RLVa-2.0.1] Make sure this stays in sync with the condition in inventory_offer_handler()
+			bool fRlvCanShowName = (!RlvActions::isRlvEnabled()) ||
+				(RlvActions::canShowName(RlvActions::SNC_DEFAULT, mFromID)) || (!RlvUtil::isNearbyAgent(mFromID)) || (RlvUIEnabler::hasOpenIM(mFromID)) || (RlvUIEnabler::hasOpenProfile(mFromID));
+			if (!fRlvCanShowName)
 				name_slurl = LLSLURL("agent", mFromID, "rlvanonym").getSLURLString();
 // [/RLVa:KB]
 
@@ -2108,9 +2109,9 @@ void inventory_offer_handler(LLOfferInfo* info)
 	// Object -> Agent Inventory Offer
 	if (info->mFromObject && !bAutoAccept)
 	{
-// [RLVa:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
+// [RLVa:KB] - Checked: RLVa-1.2.2
 		// Only filter if the object owner is a nearby agent
-		if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (RlvUtil::isNearbyAgent(info->mFromID)) )
+		if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, info->mFromID)) && (RlvUtil::isNearbyAgent(info->mFromID)) )
 		{
 			payload["rlv_shownames"] = TRUE;
 			args["NAME_SLURL"] = LLSLURL("agent", info->mFromID, "rlvanonym").getSLURLString();
@@ -2131,10 +2132,11 @@ void inventory_offer_handler(LLOfferInfo* info)
 	}
 	else // Agent -> Agent Inventory Offer
 	{
-// [RLVa:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
+// [RLVa:KB] - Checked: RLVa-2.0.1
 		// Only filter if the offer is from a nearby agent and if there's no open IM session (doesn't necessarily have to be focused)
-		if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (RlvUtil::isNearbyAgent(info->mFromID)) &&
-			 (!RlvUIEnabler::hasOpenIM(info->mFromID)) )
+		bool fRlvCanShowName = (!RlvActions::isRlvEnabled()) ||
+			(RlvActions::canShowName(RlvActions::SNC_DEFAULT, info->mFromID)) || (!RlvUtil::isNearbyAgent(info->mFromID)) || (RlvUIEnabler::hasOpenIM(info->mFromID)) || (RlvUIEnabler::hasOpenProfile(info->mFromID));
+		if (!fRlvCanShowName)
 		{
 			payload["rlv_shownames"] = TRUE;
 			args["NAME"] = RlvStrings::getAnonym(info->mFromName);
@@ -2989,11 +2991,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	case IM_INVENTORY_ACCEPTED:
 	{
 //		args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();;
-// [RLVa:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
+// [RLVa:KB] - Checked: RLVa-1.2.2
 		// Only anonymize the name if the agent is nearby, there isn't an open IM session to them and their profile isn't open
-		bool fRlvFilterName = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (RlvUtil::isNearbyAgent(from_id)) && 
-			(!RlvUIEnabler::hasOpenProfile(from_id)) && (!RlvUIEnabler::hasOpenIM(from_id));
-		args["NAME"] = LLSLURL("agent", from_id, (!fRlvFilterName) ? "completename" : "rlvanonym").getSLURLString();;
+		bool fRlvCanShowName = (!RlvActions::isRlvEnabled()) ||
+			(RlvActions::canShowName(RlvActions::SNC_DEFAULT, from_id)) || (!RlvUtil::isNearbyAgent(from_id)) || (RlvUIEnabler::hasOpenProfile(from_id)) || (RlvUIEnabler::hasOpenIM(from_id));
+		args["NAME"] = LLSLURL("agent", from_id, (fRlvCanShowName) ? "completename" : "rlvanonym").getSLURLString();;
 // [/RLVa:KB]
 		LLSD payload;
 		payload["from_id"] = from_id;
@@ -3006,11 +3008,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	case IM_INVENTORY_DECLINED:
 	{
 //		args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();;
-// [RLVa:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
+// [RLVa:KB] - Checked: RLVa-1.2.2
 		// Only anonymize the name if the agent is nearby, there isn't an open IM session to them and their profile isn't open
-		bool fRlvFilterName = (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (RlvUtil::isNearbyAgent(from_id)) && 
-			(!RlvUIEnabler::hasOpenProfile(from_id)) && (!RlvUIEnabler::hasOpenIM(from_id));
-		args["NAME"] = LLSLURL("agent", from_id, (!fRlvFilterName) ? "completename" : "rlvanonym").getSLURLString();;
+		bool fRlvCanShowName = (!RlvActions::isRlvEnabled()) ||
+			(RlvActions::canShowName(RlvActions::SNC_DEFAULT, from_id)) || (!RlvUtil::isNearbyAgent(from_id)) || (RlvUIEnabler::hasOpenProfile(from_id)) || (RlvUIEnabler::hasOpenIM(from_id));
+		args["NAME"] = LLSLURL("agent", from_id, (fRlvCanShowName) ? "completename" : "rlvanonym").getSLURLString();;
 // [/RLVa:KB]
 		LLSD payload;
 		payload["from_id"] = from_id;
@@ -3073,18 +3075,18 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 
 			LLSD query_string;
 			query_string["owner"] = from_id;
-// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
-			if (rlv_handler_t::isEnabled())
+// [RLVa:KB] - Checked: RLVa-1.2.0
+			if (RlvActions::isRlvEnabled())
 			{
 				// NOTE: the chat message itself will be filtered in LLNearbyChatHandler::processChat()
-				if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!from_group) && (RlvUtil::isNearbyAgent(from_id)) )
+				if ( (!RlvActions::canShowName(RlvActions::SNC_DEFAULT)) && (!from_group) && (RlvUtil::isNearbyAgent(from_id)) )
 				{
 					query_string["rlv_shownames"] = TRUE;
 
 					RlvUtil::filterNames(name);
 					chat.mFromName = name;
 				}
-				if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
+				if (!RlvActions::canShowLocation())
 				{
 					std::string::size_type idxPos = location.find('/');
 					if ( (std::string::npos != idxPos) && (RlvUtil::isNearbyRegion(location.substr(0, idxPos))) )
@@ -3939,7 +3941,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 			// Filtering "rules":
 			//   avatar => filter only their name (unless it's this avie)
 			//   other  => filter everything
-			if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+			if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT))
 			{
 				if (CHAT_SOURCE_AGENT != chat.mSourceType)
 				{
@@ -3949,19 +3951,19 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 				{
 					chat.mFromName = RlvStrings::getAnonym(chat.mFromName);
 					chat.mRlvNamesFiltered = TRUE;
-				} 
+				}
 			}
 
 			// Create an "objectim" URL for objects if we're either @shownames or @showloc restricted
 			// (we need to do this now because we won't be have enough information to do it later on)
-			if ( (CHAT_SOURCE_OBJECT == chat.mSourceType) && 
-				 ((gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))) )
+			if ( (CHAT_SOURCE_OBJECT == chat.mSourceType) &&
+			     ( (!RlvActions::canShowName(RlvActions::SNC_DEFAULT)) || (!RlvActions::canShowLocation()) ) )
 			{
 				LLSD sdQuery;
 				sdQuery["name"] = chat.mFromName;
 				sdQuery["owner"] = owner_id;
 
-				if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) && (!is_owned_by_me) )
+				if ( (!RlvActions::canShowName(RlvActions::SNC_COUNT, owner_id)) && (!is_owned_by_me) )
 					sdQuery["rlv_shownames"] = true;
 
 				const LLViewerRegion* pRegion = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
@@ -6585,12 +6587,12 @@ void process_alert_core(const std::string& message, BOOL modal)
 		}
 
 			std::string new_msg =LLNotifications::instance().getGlobalString(text);
-// [RLVa:KB] - Checked: 2012-02-07 (RLVa-1.4.5) | Added: RLVa-1.4.5
-			if ( (new_msg == text) && (rlv_handler_t::isEnabled()) )
+// [RLVa:KB] - Checked: RLVa-1.4.5
+			if ( (new_msg == text) && (RlvActions::isRlvEnabled()) )
 			{
-				if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
+				if (!RlvActions::canShowLocation())
 					RlvUtil::filterLocation(new_msg);
-				if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+				if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT))
 					RlvUtil::filterNames(new_msg);
 			}
 // [/RLVa:KB]
@@ -6601,12 +6603,12 @@ void process_alert_core(const std::string& message, BOOL modal)
 	{
 		LLSD args;
 		std::string new_msg =LLNotifications::instance().getGlobalString(message);
-// [RLVa:KB] - Checked: 2012-02-07 (RLVa-1.4.5) | Added: RLVa-1.4.5
-		if ( (new_msg == message) && (rlv_handler_t::isEnabled()) )
+// [RLVa:KB] - Checked: RLVa-1.4.5
+		if ( (new_msg == message) && (RlvActions::isRlvEnabled()) )
 		{
-			if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
+			if (!RlvActions::canShowLocation())
 				RlvUtil::filterLocation(new_msg);
-			if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+			if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT))
 				RlvUtil::filterNames(new_msg);
 		}
 // [/RLVa:KB]
@@ -6625,12 +6627,12 @@ void process_alert_core(const std::string& message, BOOL modal)
 			std::string localized_msg;
 			bool is_message_localized = LLTrans::findString(localized_msg, new_msg);
 
-// [RLVa:KB] - Checked: 2012-02-07 (RLVa-1.4.5) | Added: RLVa-1.4.5
-			if ( (new_msg == message) && (rlv_handler_t::isEnabled()) )
+// [RLVa:KB] - Checked: RLVa-1.4.5
+			if ( (new_msg == message) && (RlvActions::isRlvEnabled()) )
 			{
-				if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
+				if (!RlvActions::canShowLocation())
 					RlvUtil::filterLocation(new_msg);
-				if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+				if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT))
 					RlvUtil::filterNames(new_msg);
 			}
 // [/RLVa:KB]
@@ -7569,14 +7571,14 @@ void send_lures(const LLSD& notification, const LLSD& response)
 
 		// Record the offer.
 		{
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-			bool fRlvHideName = notification["payload"]["rlv_shownames"].asBoolean();
+// [RLVa:KB] - Checked: RLVa-2.0.1
+			bool fRlvCanShowName = (!notification["payload"].has("rlv_shownames")) ? true : !notification["payload"]["rlv_shownames"].asBoolean();
 // [/RLVa:KB]
 			std::string target_name;
 			gCacheName->getFullName(target_id, target_name);  // for im log filenames
 			LLSD args;
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-			args["TO_NAME"] = LLSLURL("agent", target_id, (!fRlvHideName) ? "displayname" : "rlvanonym").getSLURLString();;
+// [RLVa:KB] - Checked: RLVa-2.0.1
+			args["TO_NAME"] = LLSLURL("agent", target_id, (fRlvCanShowName) ? "displayname" : "rlvanonym").getSLURLString();;
 // [/RLVa:KB]
 //			args["TO_NAME"] = LLSLURL("agent", target_id, "displayname").getSLURLString();;
 	
@@ -7588,8 +7590,8 @@ void send_lures(const LLSD& notification, const LLSD& response)
 			LLNotificationsUtil::add("TeleportOfferSent", args, payload);
 
 			// Add the recepient to the recent people list.
-// [RLVa:KB] - Checked: 2014-03-31 (Catznip-3.6)
-			if (!fRlvHideName)
+// [RLVa:KB] - Checked: RLVa-2.0.1
+			if (fRlvCanShowName)
 				LLRecentPeople::instance().add(target_id);
 // [/RLVa:KB]
 //			LLRecentPeople::instance().add(target_id);
@@ -7643,25 +7645,32 @@ void handle_lure(const uuid_vec_t& ids)
 //	edit_args["REGION"] = gAgent.getRegion()->getName();
 
 	LLSD payload;
-	for (std::vector<LLUUID>::const_iterator it = ids.begin();
-		it != ids.end();
-		++it)
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	bool fRlvShouldHideNames = false;
+	for (const LLUUID& idAgent : ids)
 	{
-// [RLVa:KB] - Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.0.0a
 		// Only allow offering teleports if everyone is a @tplure exception or able to map this avie under @showloc=n
 		if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
 		{
-			const LLRelationship* pBuddyInfo = LLAvatarTracker::instance().getBuddyInfo(*it);
-			if ( (!gRlvHandler.isException(RLV_BHVR_TPLURE, *it, RLV_CHECK_PERMISSIVE)) &&
+			const LLRelationship* pBuddyInfo = LLAvatarTracker::instance().getBuddyInfo(idAgent);
+			if ( (!gRlvHandler.isException(RLV_BHVR_TPLURE, idAgent, RLV_CHECK_PERMISSIVE)) &&
 				 ((!pBuddyInfo) || (!pBuddyInfo->isOnline()) || (!pBuddyInfo->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION))) )
 			{
+				RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_TELEPORT_OFFER);
 				return;
 			}
 		}
-		payload["rlv_shownames"] = !RlvActions::canShowName(RlvActions::SNC_TELEPORTOFFER);
-// [/RLVa:KB]
-		payload["ids"].append(*it);
+		fRlvShouldHideNames |= !RlvActions::canShowName(RlvActions::SNC_TELEPORTOFFER, idAgent);
+		payload["ids"].append(idAgent);
 	}
+	payload["rlv_shownames"] = fRlvShouldHideNames;
+// [/RLVa:KB]
+// 	for (std::vector<LLUUID>::const_iterator it = ids.begin();
+// 		it != ids.end();
+// 		++it)
+// 	{
+// 		payload["ids"].append(*it);
+// 	}
 	if (gAgent.isGodlike())
 	{
 		LLNotificationsUtil::add("OfferTeleportFromGod", edit_args, payload, handle_lure_callback);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 0afc7273d41bf1b8774ef78703baf404607d7818..638a0720f500da52310b83eef423c948bd762c97 100755
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -103,6 +103,7 @@
 #include "llfloaterperms.h"
 #include "llvocache.h"
 // [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
+#include "rlvactions.h"
 #include "rlvhandler.h"
 #include "rlvlocks.h"
 // [/RLVa:KB]
@@ -5831,7 +5832,7 @@ BOOL LLViewerObject::permTransfer() const
 BOOL LLViewerObject::allowOpen() const
 {
 // [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Modified: RLVa-1.3.0c
-	return !flagInventoryEmpty() && (permYouOwner() || permModify()) && ((!rlv_handler_t::isEnabled()) || (gRlvHandler.canEdit(this)));
+	return !flagInventoryEmpty() && (permYouOwner() || permModify()) && ((!RlvActions::isRlvEnabled()) || (RlvActions::canEdit(this)));
 // [/RLVa:KB]
 //	return !flagInventoryEmpty() && (permYouOwner() || permModify());
 }
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 733bfe926b21f2149b881aebb39b6b27983f2198..79c125818870f465af888cc3acdc5a47e558d201 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -96,7 +96,8 @@
 #include "llanimstatelabels.h"
 #include "lltrans.h"
 #include "llappearancemgr.h"
-// [RLVa:KB] - Checked: 2010-04-01 (RLVa-1.2.0c)
+// [RLVa:KB] - Checked: RLVa-2.0.1
+#include "rlvactions.h"
 #include "rlvhandler.h"
 // [/RLVa:KB]
 
@@ -2624,15 +2625,20 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
 	const F32 time_visible = mTimeVisible.getElapsedTimeF32();
 	const F32 NAME_SHOW_TIME = gSavedSettings.getF32("RenderNameShowTime");	// seconds
 	const F32 FADE_DURATION = gSavedSettings.getF32("RenderNameFadeDuration"); // seconds
-// [RLVa:KB] - Checked: 2010-04-04 (RLVa-1.2.2a) | Added: RLVa-0.2.0b
-	bool fRlvShowNames = gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES);
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	bool fRlvShowAvTag = true, fRlvShowAvName = true;
+	if (RlvActions::isRlvEnabled())
+	{
+		fRlvShowAvTag = RlvActions::canShowName(RlvActions::SNC_NAMETAG, getID());
+		fRlvShowAvName = (fRlvShowAvTag) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, getID()));
+	}
 // [/RLVa:KB]
 	BOOL visible_avatar = isVisible() || mNeedsAnimUpdate;
 	BOOL visible_chat = gSavedSettings.getBOOL("UseChatBubbles") && (mChats.size() || mTyping);
 	BOOL render_name =	visible_chat ||
 		                (visible_avatar &&
-// [RLVa:KB] - Checked: 2010-04-04 (RLVa-1.2.2a) | Added: RLVa-1.0.0h
-						( (!fRlvShowNames) || (RlvSettings::getShowNameTags()) ) &&
+// [RLVa:KB] - Checked: RLVa-2.0.1
+						(fRlvShowAvTag) &&
 // [/RLVa:KB]
 		                ((sRenderName == RENDER_NAME_ALWAYS) ||
 		                 (sRenderName == RENDER_NAME_FADE && time_visible < NAME_SHOW_TIME)));
@@ -2665,8 +2671,8 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
 		new_name = TRUE;
 	}
 
-// [RLVa:KB] - Checked: 2010-04-04 (RLVa-1.2.2a) | Added: RLVa-0.2.0b
-	if (fRlvShowNames)
+// [RLVa:KB] - Checked: RLVa-0.2.0
+	if (!fRlvShowAvName)
 	{
 		if (mRenderGroupTitles)
 		{
@@ -2743,8 +2749,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 	// Avatars must have a first and last name
 	if (!firstname || !lastname) return;
 
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
-	bool fRlvShowNames = gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES);
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	bool fRlvShowAvName = RlvActions::canShowName(RlvActions::SNC_DEFAULT, getID());
 // [/RLVa:KB]
 	bool is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY)  != mSignaledAnimations.end();
 	bool is_do_not_disturb = mSignaledAnimations.find(ANIM_AGENT_DO_NOT_DISTURB) != mSignaledAnimations.end();
@@ -2759,8 +2765,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 		is_muted = LLMuteList::getInstance()->isMuted(getID());
 	}
 //	bool is_friend = LLAvatarTracker::instance().isBuddy(getID());
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
-	bool is_friend = (!fRlvShowNames) && (LLAvatarTracker::instance().isBuddy(getID()));
+// [RLVa:KB] - Checked: RLVa-1.2.2
+	bool is_friend = (fRlvShowAvName) && (LLAvatarTracker::instance().isBuddy(getID()));
 // [/RLVa:KB]
 	bool is_cloud = getIsCloud();
 
@@ -2827,8 +2833,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 		}
 
 //		if (sRenderGroupTitles
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-		if (sRenderGroupTitles && !fRlvShowNames
+// [RLVa:KB] - Checked: RLVa-1.2.2
+		if (sRenderGroupTitles && fRlvShowAvName
 // [/RLVa:KB]
 			&& title && title->getString() && title->getString()[0] != '\0')
 		{
@@ -2851,8 +2857,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 				clearNameTag();
 			}
 
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-			if ( (!fRlvShowNames) || (isSelf()) )
+// [RLVa:KB] - Checked: RLVa-1.2.2
+			if ( (fRlvShowAvName) || (isSelf()) )
 			{
 // [/RLVa:KB]
 				// Might be blank if name not available yet, that's OK
@@ -2869,7 +2875,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 					addNameTagLine(av_name.getUserName(), username_color, LLFontGL::NORMAL,
 					LLFontGL::getFontSansSerifSmall());
 				}
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
+// [RLVa:KB] - Checked: RLVa-1.2.2
 			}
 			else
 			{
@@ -2881,8 +2887,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 		{
 			const LLFontGL* font = LLFontGL::getFontSansSerif();
 			std::string full_name = LLCacheName::buildFullName( firstname->getString(), lastname->getString() );
-// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
-			if ( (fRlvShowNames) && (!isSelf()) )
+// [RLVa:KB] - Checked: RLVa-1.2.2
+			if ( (!fRlvShowAvName) && (!isSelf()) )
 			{
 				full_name = RlvStrings::getAnonym(full_name);
 			}
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 9cef4eda9defd9d0a07690545381493f9fd43eaf..e6685c92a8d19b946fe40fcf575b8059a3ee5307 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -65,8 +65,9 @@
 #include "llsdutil.h"
 #include "llstartup.h"
 #include "llsdserialize.h"
-// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
+// [RLVa:KB] - Checked: RLVa-2.0.2
 #include "rlvhandler.h"
+#include "rlvhelper.h"
 #include "rlvlocks.h"
 // [/RLVa:KB]
 
@@ -1062,12 +1063,25 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)
 		}
 		else
 		{
+// [RLVa:KB] - Checked: RLVa-2.0.2
+			bool fRlvCanShowAttachment = true;
+			if (rlv_handler_t::isEnabled())
+			{
+				fRlvCanShowAttachment =
+					(!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWSELF)) &&
+					( (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWSELFHEAD)) || (RLV_ATTACHGROUP_HEAD != rlvAttachGroupFromIndex(attachment->getGroup())) );
+			}
+// [/RLVa:KB]
+
 			switch (camera_mode)
 			{
 				case CAMERA_MODE_MOUSELOOK:
 					if (LLVOAvatar::sVisibleInFirstPerson && attachment->getVisibleInFirstPerson())
 					{
-						attachment->setAttachmentVisibility(TRUE);
+// [RLVa:KB] - Checked: RLVa-2.0.2
+						attachment->setAttachmentVisibility(fRlvCanShowAttachment);
+// [/RLVa:KB]
+//						attachment->setAttachmentVisibility(TRUE);
 					}
 					else
 					{
@@ -1075,7 +1089,10 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)
 					}
 					break;
 				default:
-					attachment->setAttachmentVisibility(TRUE);
+// [RLVa:KB] - Checked: RLVa-2.0.2
+					attachment->setAttachmentVisibility(fRlvCanShowAttachment);
+// [/RLVa:KB]
+//					attachment->setAttachmentVisibility(TRUE);
 					break;
 			}
 		}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 01f2b0f2d726fa70fd90ee2285486d7b20eb965d..da74fad7d75601dd65a819a5cc49f28677cc39fa 100755
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -77,8 +77,8 @@
 #include "llvoavatar.h"
 #include "llvocache.h"
 #include "llmaterialmgr.h"
-// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
-#include "rlvhandler.h"
+// [RLVa:KB] - Checked: RLVa-2.0.0
+#include "rlvactions.h"
 #include "rlvlocks.h"
 // [/RLVa:KB]
 
@@ -4434,10 +4434,10 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 //	if (facep->getViewerObject()->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects)
 // [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Modified: RLVa-1.3.0c
 	const LLViewerObject* pObj = facep->getViewerObject();
-	if ( (pObj->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects) && 
-		 ( (!rlv_handler_t::isEnabled()) || 
-		   ( ((!pObj->isHUDAttachment()) || (!gRlvAttachmentLocks.isLockedAttachment(pObj->getRootEdit()))) && 
-		     (gRlvHandler.canEdit(pObj)) ) ) )
+	if ( (pObj->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects) &&
+		 ( (!RlvActions::isRlvEnabled()) ||
+		   ( ((!pObj->isHUDAttachment()) || (!gRlvAttachmentLocks.isLockedAttachment(pObj->getRootEdit()))) &&
+		     (RlvActions::canEdit(pObj)) ) ) )
 // [/RVLa:KB]
 	{
 		return;
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 11d3706821fa5cf20411502ce71ddd05f57c526a..a98c4145099b7062cdcbb1a070575ed78dbd7616 100755
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -1327,6 +1327,35 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
 	}
 }
 
+// [RLVa:KB] - Checked: RLVa-2.0.1
+bool LLWorld::getAvatar(const LLUUID& idAvatar, LLVector3d& posAvatar) const
+{
+	for (const LLCharacter* pCharacter : LLCharacter::sInstances)
+	{
+		const LLVOAvatar* pAvatar = static_cast<const LLVOAvatar*>(pCharacter);
+		if ( (!pAvatar->isDead()) && (!pAvatar->mIsDummy) && (!pAvatar->isOrphaned()) && (idAvatar == pAvatar->getID()) )
+		{
+			posAvatar = pAvatar->getPositionGlobal();
+			return true;
+		}
+	}
+
+	for (const LLViewerRegion* pRegion : LLWorld::getInstance()->getRegionList())
+	{
+		for (S32 idxAgent = 0, cntAgent = pRegion->mMapAvatarIDs.size(); idxAgent < cntAgent; ++idxAgent)
+		{
+			if (idAvatar == pRegion->mMapAvatarIDs[idxAgent])
+			{
+				posAvatar = unpackLocalToGlobalPosition(pRegion->mMapAvatars[idxAgent], pRegion->getOriginGlobal());
+				return true;
+			}
+		}
+	}
+
+	return false;
+}
+// [/RLVa:KB]
+
 bool LLWorld::isRegionListed(const LLViewerRegion* region) const
 {
 	region_list_t::const_iterator it = find(mRegionList.begin(), mRegionList.end(), region);
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index b2d84180648ddfadc41c3ce0185f9354153451d8..325a120f55b6e921c29144fc0bda040ff3a12f33 100755
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -162,6 +162,9 @@ public:
 		uuid_vec_t* avatar_ids = NULL,
 		std::vector<LLVector3d>* positions = NULL, 
 		const LLVector3d& relative_to = LLVector3d(), F32 radius = FLT_MAX) const;
+// [RLVa:KB] - Checked: RLVa-2.0.1
+	bool getAvatar(const LLUUID& idAvatar, LLVector3d& posAvatar) const;
+// [/RLVa:KB]
 
 	// Returns 'true' if the region is in mRegionList,
 	// 'false' if the region has been removed due to region change
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 72b75318ddd651b1746e917b4e18244d74f849ea..3a811699c0c4da1762c0e6d22cd923b5f8e36307 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -115,8 +115,8 @@
 #include "llpathfindingpathtool.h"
 #include "llscenemonitor.h"
 #include "llprogressview.h"
-// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
-#include "rlvhandler.h"
+// [RLVa:KB] - Checked: RLVa-2.0.0
+#include "rlvactions.h"
 #include "rlvlocks.h"
 // [/RLVa:KB]
 
@@ -3548,9 +3548,9 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
 // [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.2.1f
 		const LLViewerObject* pObj = drawablep->getVObj();
 		if ( (pObj) && (pObj->isSelected()) && 
-			 ( (!rlv_handler_t::isEnabled()) || 
+			 ( (!RlvActions::isRlvEnabled()) || 
 			   ( ((!pObj->isHUDAttachment()) || (!gRlvAttachmentLocks.isLockedAttachment(pObj->getRootEdit()))) && 
-			     (gRlvHandler.canEdit(pObj)) ) ) )
+			     (RlvActions::canEdit(pObj)) ) ) )
 // [/RVLa:KB]
 		{
 			return;
diff --git a/indra/newview/rlvactions.cpp b/indra/newview/rlvactions.cpp
index 528694617f488859405ab4d2fb49c04e69bda674..8ecb3113fe88b60ecddcc1036b3c575798f2394b 100644
--- a/indra/newview/rlvactions.cpp
+++ b/indra/newview/rlvactions.cpp
@@ -19,6 +19,7 @@
 #include "llimview.h"
 #include "llviewercamera.h"
 #include "llvoavatarself.h"
+#include "llworld.h"
 #include "rlvactions.h"
 #include "rlvhelper.h"
 #include "rlvhandler.h"
@@ -116,47 +117,93 @@ bool RlvActions::getCameraFOVLimits(F32& nFOVMin, F32& nFOVMax)
 
 // ============================================================================
 // Communication/Avatar interaction
-// 
+//
 
 bool RlvActions::s_BlockNamesContexts[SNC_COUNT] = { 0 };
 
-// Checked: 2010-11-30 (RLVa-1.3.0)
+// Little helper function to check the IM exclusion range for @recvim, @sendim and @startim (returns: min_dist <= (pos user - pos target) <= max_dist)
+static bool rlvCheckAvatarIMDistance(const LLUUID& idAvatar, ERlvBehaviourModifier eModDistMin, ERlvBehaviourModifier eModDistMax)
+{
+	LLVector3d posAgent;
+	const RlvBehaviourModifier *pBhvrModDistMin = RlvBehaviourDictionary::instance().getModifier(eModDistMin), *pBhvrModDistMax = RlvBehaviourDictionary::instance().getModifier(eModDistMax);
+	if ( ((pBhvrModDistMin->hasValue()) || (pBhvrModDistMax->hasValue())) && (LLWorld::getInstance()->getAvatar(idAvatar, posAgent)) )
+	{
+		float nDist = llabs(dist_vec_squared(gAgent.getPositionGlobal(), posAgent));
+		return (nDist >= pBhvrModDistMin->getValue<float>()) && (nDist <= pBhvrModDistMax->getValue<float>());
+	}
+	return false;
+}
+
 bool RlvActions::canReceiveIM(const LLUUID& idSender)
 {
 	// User can receive an IM from "sender" (could be an agent or a group) if:
-	//   - not generally restricted from receiving IMs (or the sender is an exception)
+	//   - not generally restricted from receiving IMs (or the sender is an exception or inside the exclusion range)
 	//   - not specifically restricted from receiving an IM from the sender
-	return 
-		(!rlv_handler_t::isEnabled()) ||
-		( ( (!gRlvHandler.hasBehaviour(RLV_BHVR_RECVIM)) || (gRlvHandler.isException(RLV_BHVR_RECVIM, idSender)) ) &&
+	return
+		(!isRlvEnabled()) ||
+		( ( (!gRlvHandler.hasBehaviour(RLV_BHVR_RECVIM)) || (gRlvHandler.isException(RLV_BHVR_RECVIM, idSender)) || (rlvCheckAvatarIMDistance(idSender, RLV_MODIFIER_RECVIMDISTMIN, RLV_MODIFIER_RECVIMDISTMAX)) ) &&
 		  ( (!gRlvHandler.hasBehaviour(RLV_BHVR_RECVIMFROM)) || (!gRlvHandler.isException(RLV_BHVR_RECVIMFROM, idSender)) ) );
 }
 
-// Checked: 2010-11-30 (RLVa-1.3.0)
+bool RlvActions::canPlayGestures()
+{
+	return (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDGESTURE));
+}
+
+bool RlvActions::canSendChannel(int nChannel)
+{
+	return
+		( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHANNEL)) || (gRlvHandler.isException(RLV_BHVR_SENDCHANNEL, nChannel)) ) &&
+		( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHANNELEXCEPT)) || (!gRlvHandler.isException(RLV_BHVR_SENDCHANNELEXCEPT, nChannel)) );
+}
+
 bool RlvActions::canSendIM(const LLUUID& idRecipient)
 {
 	// User can send an IM to "recipient" (could be an agent or a group) if:
-	//   - not generally restricted from sending IMs (or the recipient is an exception)
+	//   - not generally restricted from sending IMs (or the recipient is an exception or inside the exclusion range)
 	//   - not specifically restricted from sending an IM to the recipient
-	return 
-		(!rlv_handler_t::isEnabled()) ||
-		( ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDIM)) || (gRlvHandler.isException(RLV_BHVR_SENDIM, idRecipient)) ) &&
+	return
+		(!isRlvEnabled()) ||
+		( ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDIM)) || (gRlvHandler.isException(RLV_BHVR_SENDIM, idRecipient)) || (rlvCheckAvatarIMDistance(idRecipient, RLV_MODIFIER_SENDIMDISTMIN, RLV_MODIFIER_SENDIMDISTMAX)) ) &&
 		  ( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDIMTO)) || (!gRlvHandler.isException(RLV_BHVR_SENDIMTO, idRecipient)) ) );
 }
 
 bool RlvActions::canStartIM(const LLUUID& idRecipient)
 {
 	// User can start an IM session with "recipient" (could be an agent or a group) if:
-	//   - not generally restricted from starting IM sessions (or the recipient is an exception)
+	//   - not generally restricted from starting IM sessions (or the recipient is an exception or inside the exclusion range)
 	//   - not specifically restricted from starting an IM session with the recipient
 	//   - the session already exists
-	return 
-		(!rlv_handler_t::isEnabled()) ||
-		( ( (!gRlvHandler.hasBehaviour(RLV_BHVR_STARTIM)) || (gRlvHandler.isException(RLV_BHVR_STARTIM, idRecipient)) ) &&
+	return
+		(!isRlvEnabled()) ||
+		( ( (!gRlvHandler.hasBehaviour(RLV_BHVR_STARTIM)) || (gRlvHandler.isException(RLV_BHVR_STARTIM, idRecipient)) || (rlvCheckAvatarIMDistance(idRecipient, RLV_MODIFIER_STARTIMDISTMIN, RLV_MODIFIER_STARTIMDISTMAX)) ) &&
 		  ( (!gRlvHandler.hasBehaviour(RLV_BHVR_STARTIMTO)) || (!gRlvHandler.isException(RLV_BHVR_STARTIMTO, idRecipient)) ) ) ||
 		( (hasOpenP2PSession(idRecipient)) || (hasOpenGroupSession(idRecipient)) );
 }
 
+bool RlvActions::canShowName(EShowNamesContext eContext, const LLUUID& idAgent)
+{
+	// Handle most common case upfront
+	if (!s_BlockNamesContexts[eContext])
+		return true;
+
+	if (idAgent.notNull())
+	{
+		switch (eContext)
+		{
+			// Show/hide avatar nametag
+			case SNC_NAMETAG:
+				return (gRlvHandler.isException(RLV_BHVR_SHOWNAMETAGS, idAgent)) || (gAgentID == idAgent);
+			// Show/hide avatar name
+			case SNC_DEFAULT:
+			case SNC_TELEPORTOFFER:
+			case SNC_TELEPORTREQUEST:
+				return gRlvHandler.isException(RLV_BHVR_SHOWNAMES, idAgent);
+		}
+	}
+	return false;
+}
+
 // ============================================================================
 // Movement
 // 
@@ -185,28 +232,76 @@ bool RlvActions::autoAcceptTeleportRequest(const LLUUID& idRequester)
 // Teleporting
 //
 
-bool RlvActions::canTeleportToLocal()
+bool RlvActions::canTeleportToLocal(const LLVector3d& posGlobal)
 {
-	return (!gRlvHandler.hasBehaviour(RLV_BHVR_SITTP)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_TPLOCAL)) && (RlvActions::canStand());
+	// User can initiate a local teleport if:
+	//   - not restricted from "sit teleporting" (or the destination is within the allowed xy-radius)
+	//   - not restricted from teleporting locally (or the destination is within the allowed xy-radius)
+	//   - can stand up (or isn't sitting)
+	// NOTE: if we're teleporting due to an active command we should disregard any restrictions from the same object
+	const LLUUID& idRlvObjExcept = gRlvHandler.getCurrentObject();
+	bool fCanStand = RlvActions::canStand(idRlvObjExcept);
+	if ( (fCanStand) && ((gRlvHandler.hasBehaviourExcept(RLV_BHVR_SITTP, gRlvHandler.getCurrentObject())) || (gRlvHandler.hasBehaviourExcept(RLV_BHVR_TPLOCAL, gRlvHandler.getCurrentObject()))) )
+	{
+		// User can stand up but is either @sittp or @tplocal restricted so we need to distance check
+		const F32 nDistSq = (LLVector2(posGlobal.mdV[0], posGlobal.mdV[1]) - LLVector2(gAgent.getPositionGlobal().mdV[0], gAgent.getPositionGlobal().mdV[1])).lengthSquared();
+		F32 nMaxDist = llmin(RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_TPLOCALDIST)->getValue<float>(), RLV_MODIFIER_TPLOCAL_DEFAULT);
+		if (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP))
+			nMaxDist = llmin(nMaxDist, RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SITTPDIST)->getValue<F32>());
+		return (nDistSq < nMaxDist * nMaxDist);
+	}
+	return fCanStand;
 }
 
 bool RlvActions::canTeleportToLocation()
 {
 	// NOTE: if we're teleporting due to an active command we should disregard any restrictions from the same object
 	const LLUUID& idRlvObjExcept = gRlvHandler.getCurrentObject();
-	return (!gRlvHandler.hasBehaviourExcept(RLV_BHVR_TPLOC, idRlvObjExcept)) && (!gRlvHandler.hasBehaviourExcept(RLV_BHVR_TPLOCAL, idRlvObjExcept)) && (RlvActions::canStand(idRlvObjExcept));
+	return (!gRlvHandler.hasBehaviourExcept(RLV_BHVR_TPLOC, idRlvObjExcept)) && (RlvActions::canStand(idRlvObjExcept));
 }
 
 bool RlvActions::isLocalTp(const LLVector3d& posGlobal)
 {
-	F32 nDistSq = (LLVector2(posGlobal.mdV[0], posGlobal.mdV[1]) - LLVector2(gAgent.getPositionGlobal().mdV[0], gAgent.getPositionGlobal().mdV[1])).lengthSquared();
-	return nDistSq < RLV_TELEPORT_LOCAL_RADIUS * RLV_TELEPORT_LOCAL_RADIUS;
+	const F32 nDistSq = (LLVector2(posGlobal.mdV[0], posGlobal.mdV[1]) - LLVector2(gAgent.getPositionGlobal().mdV[0], gAgent.getPositionGlobal().mdV[1])).lengthSquared();
+	return nDistSq < RLV_MODIFIER_TPLOCAL_DEFAULT * RLV_MODIFIER_TPLOCAL_DEFAULT;
 }
 
 // ============================================================================
 // World interaction
 //
 
+bool RlvActions::canEdit(const LLViewerObject* pObj)
+{
+	// User can edit the specified object if:
+	//   - not generally restricted from editing (or the object's root is an exception)
+	//   - not specifically restricted from editing this object's root
+	return
+		(pObj) &&
+		((!hasBehaviour(RLV_BHVR_EDIT)) || (gRlvHandler.isException(RLV_BHVR_EDIT, pObj->getRootEdit()->getID()))) &&
+		((!hasBehaviour(RLV_BHVR_EDITOBJ)) || (!gRlvHandler.isException(RLV_BHVR_EDITOBJ, pObj->getRootEdit()->getID())));
+}
+
+
+bool RlvActions::canSit(const LLViewerObject* pObj, const LLVector3& posOffset /*= LLVector3::zero*/)
+{
+	// User can sit on the specified object if:
+	//   - not prevented from sitting
+	//   - not prevented from standing up or not currently sitting
+	//   - not standtp restricted or not currently sitting (if the user is sitting and tried to sit elsewhere the tp would just kick in)
+	//   - not a regular sit (i.e. due to @sit:<uuid>=force)
+	//   - not @sittp=n or @fartouch=n restricted or if they clicked on a point within the allowed radius
+	static RlvCachedBehaviourModifier<float> s_nFarTouchDist(RLV_MODIFIER_FARTOUCHDIST);
+	static RlvCachedBehaviourModifier<float> s_nSitTpDist(RLV_MODIFIER_SITTPDIST);
+	return
+		( (pObj) && (LL_PCODE_VOLUME == pObj->getPCode()) ) &&
+		(!hasBehaviour(RLV_BHVR_SIT)) &&
+		( ((!hasBehaviour(RLV_BHVR_UNSIT)) && (!hasBehaviour(RLV_BHVR_STANDTP))) ||
+		  ((isAgentAvatarValid()) && (!gAgentAvatarp->isSitting())) ) &&
+		( ( (NULL != gRlvHandler.getCurrentCommand()) && (RLV_BHVR_SIT == gRlvHandler.getCurrentCommand()->getBehaviourType()) ) ||
+		  ( ((!hasBehaviour(RLV_BHVR_SITTP)) || (dist_vec_squared(gAgent.getPositionGlobal(), pObj->getPositionGlobal() + LLVector3d(posOffset)) < s_nSitTpDist * s_nSitTpDist)) &&
+		    ((!hasBehaviour(RLV_BHVR_FARTOUCH)) || (dist_vec_squared(gAgent.getPositionGlobal(), pObj->getPositionGlobal() + LLVector3d(posOffset)) < s_nFarTouchDist * s_nFarTouchDist)) ) );
+}
+
 bool RlvActions::canStand()
 {
 	// NOTE: return FALSE only if we're @unsit=n restricted and the avie is currently sitting on something and TRUE for everything else
@@ -227,7 +322,13 @@ bool RlvActions::canShowLocation()
 
 // ============================================================================
 // Helper functions
-// 
+//
+
+template<>
+const float& RlvActions::getModifierValue<float>(ERlvBehaviourModifier eBhvrMod)
+{
+	return RlvBehaviourDictionary::instance().getModifier(eBhvrMod)->getValue<float>();
+}
 
 // Checked: 2013-05-10 (RLVa-1.4.9)
 bool RlvActions::hasBehaviour(ERlvBehaviour eBhvr)
diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h
index fab61644123c50d0e622ec04b588d008682273c5..9eb6825089ffb8e78cd4e68c69cac86f35d8e2df 100644
--- a/indra/newview/rlvactions.h
+++ b/indra/newview/rlvactions.h
@@ -1,6 +1,6 @@
 /** 
  *
- * Copyright (c) 2009-2013, Kitty Barnett
+ * Copyright (c) 2009-2016, Kitty Barnett
  * 
  * The source code in this file is provided to you under the terms of the 
  * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
@@ -79,6 +79,16 @@ public:
 	 */
 	static bool canReceiveIM(const LLUUID& idSender);
 
+	/*
+	 * Returns true if the user is allowed to send/play gestures (whether active ones from the chat bar or using the gesture preview floater)
+	 */
+	static bool canPlayGestures();
+
+	/*
+	 * Returns true if the user is allowed to chat on the specified channel
+	 */
+	static bool canSendChannel(int nChannel);
+
 	/*
 	 * Returns true if the user is allowed to send IMs to the specified recipient (can be an avatar or a group)
 	 */
@@ -94,9 +104,9 @@ public:
 	 * (This is used to hide an avatar name in one case but not a near-identical case - such as teleporting a friend vs a nearby agent -
 	 *  in a way that limits the amount of code that needs to be changed to carry context from one function to another)
 	 */
-	enum EShowNamesContext { SNC_TELEPORTOFFER = 0, SNC_TELEPORTREQUEST, SNC_COUNT };
-	static bool canShowName(EShowNamesContext eContext) { return (eContext < SNC_COUNT) ? !s_BlockNamesContexts[eContext] : false; }
-	static void setShowName(EShowNamesContext eContext, bool fShowName) { if ( (eContext < SNC_COUNT) && (isRlvEnabled()) ) { s_BlockNamesContexts[eContext] = !fShowName; } }
+	enum EShowNamesContext { SNC_DEFAULT = 0, SNC_NAMETAG, SNC_TELEPORTOFFER, SNC_TELEPORTREQUEST, SNC_COUNT };
+	static bool canShowName(EShowNamesContext eContext, const LLUUID& idAgent = LLUUID::null);
+	static void setShowName(EShowNamesContext eContext, bool fCanShowName) { if ( (eContext < SNC_COUNT) && (isRlvEnabled()) ) { s_BlockNamesContexts[eContext] = !fCanShowName; } }
 
 protected:
 	// Backwards logic so that we can initialize to 0 and it won't block when we forget to/don't check if RLVa is disabled
@@ -135,7 +145,7 @@ public:
 	/*
 	 * Returns true if the user can teleport locally (short distances)
 	 */
-	static bool canTeleportToLocal();
+	static bool canTeleportToLocal(const LLVector3d& posGlobal);
 
 	/*
 	 * Returns true if the user can teleport to a (remote) location
@@ -151,6 +161,16 @@ public:
 	// World interaction
 	// =================
 public:
+	/*
+	 * Returns true if the user can edit the specified object
+	 */
+	static bool canEdit(const LLViewerObject* pObj);
+
+	/*
+	 * Returns true if the user can sit up on the specified object
+	 */
+	static bool canSit(const LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero);
+
 	/*
 	 * Returns true if the user can stand up (returns true if the user isn't currently sitting)
 	 */
@@ -167,7 +187,12 @@ public:
 	// ================
 public:
 	/*
-	 * Convenience function to check for a behaviour without having to include rlvhandler.h
+	 * Convenience function to get the current/active value of a behaviour modifier
+	 */
+	template<typename T> static const T& getModifierValue(ERlvBehaviourModifier eBhvrMod);
+
+	/*
+	 * Convenience function to check for a behaviour without having to include rlvhandler.h.
 	 * Do NOT call this function if speed is important (i.e. per-frame)
 	 */
 	static bool hasBehaviour(ERlvBehaviour eBhvr);
diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp
index f6e07b41c5b0fccf971e19f2ae8b26eb8651bedc..8db5b32841f330ee8aa38f575cd84d3e7de7c0bf 100644
--- a/indra/newview/rlvcommon.cpp
+++ b/indra/newview/rlvcommon.cpp
@@ -20,6 +20,7 @@
 #include "llavatarnamecache.h"
 #include "llinstantmessage.h"
 #include "llnotificationsutil.h"
+#include "llregionhandle.h"
 #include "llsdserialize.h"
 #include "lltrans.h"
 #include "llviewerparcelmgr.h"
@@ -36,6 +37,13 @@
 #include "lscript_byteformat.h"
 #include <boost/algorithm/string.hpp>
 
+// ============================================================================
+// Forward declarations
+//
+
+// llviewermenu.cpp
+LLVOAvatar* find_avatar_from_object(LLViewerObject* object);
+
 // ============================================================================
 // RlvNotifications
 //
@@ -71,7 +79,6 @@ bool RlvSettings::fCompositeFolders = false;
 bool RlvSettings::fCanOOC = true;
 bool RlvSettings::fLegacyNaming = true;
 bool RlvSettings::fNoSetEnv = false;
-bool RlvSettings::fShowNameTags = false;
 
 // Checked: 2010-02-27 (RLVa-1.2.0a) | Modified: RLVa-1.1.0i
 void RlvSettings::initClass()
@@ -92,10 +99,6 @@ void RlvSettings::initClass()
 		fCanOOC = rlvGetSetting<bool>(RLV_SETTING_CANOOC, true);
 		fNoSetEnv = rlvGetSetting<bool>(RLV_SETTING_NOSETENV, false);
 
-		fShowNameTags = rlvGetSetting<bool>(RLV_SETTING_SHOWNAMETAGS, false);
-		if (gSavedSettings.controlExists(RLV_SETTING_SHOWNAMETAGS))
-			gSavedSettings.getControl(RLV_SETTING_SHOWNAMETAGS)->getSignal()->connect(boost::bind(&onChangedSettingBOOL, _2, &fShowNameTags));
-
 		// Don't allow toggling RLVaLoginLastLocation from the debug settings floater
 		if (gSavedPerAccountSettings.controlExists(RLV_SETTING_LOGINLASTLOCATION))
 			gSavedPerAccountSettings.getControl(RLV_SETTING_LOGINLASTLOCATION)->setHiddenFromSettingsEditor(true);
@@ -381,7 +384,7 @@ void RlvUtil::filterNames(std::string& strUTF8Text, bool fFilterLegacy)
 	for (int idxAgent = 0, cntAgent = idAgents.size(); idxAgent < cntAgent; idxAgent++)
 	{
 		LLAvatarName avName;
-		if (LLAvatarNameCache::get(idAgents[idxAgent], &avName))
+		if ( (LLAvatarNameCache::get(idAgents[idxAgent], &avName)) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, idAgents[idxAgent])) )
 		{
 			const std::string& strDisplayName = avName.getDisplayName();
 			bool fFilterDisplay = (strDisplayName.length() > 2);
@@ -529,6 +532,18 @@ bool RlvUtil::sendChatReply(S32 nChannel, const std::string& strUTF8Text)
 	return true;
 }
 
+void RlvUtil::teleportCallback(U64 hRegion, const LLVector3& posRegion, const LLVector3& vecLookAt)
+{
+	if (hRegion)
+	{
+		const LLVector3d posGlobal = from_region_handle(hRegion) + (LLVector3d)posRegion;
+		if (vecLookAt.isExactlyZero())
+			gAgent.teleportViaLocation(posGlobal);
+		else
+			gAgent.teleportViaLocationLookAt(posGlobal, vecLookAt);
+	}
+}
+
 // ============================================================================
 // Generic menu enablers
 //
@@ -575,6 +590,12 @@ void rlvMenuToggleVisible()
 	}
 }
 
+bool rlvMenuCanShowName()
+{
+  const LLVOAvatar* pAvatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
+  return (pAvatar) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, pAvatar->getID()));
+}
+
 // Checked: 2010-04-23 (RLVa-1.2.0g) | Modified: RLVa-1.2.0g
 bool rlvMenuEnableIfNot(const LLSD& sdParam)
 {
@@ -625,7 +646,7 @@ bool RlvSelectHasLockedAttach::apply(LLSelectNode* pNode)
 bool RlvSelectIsEditable::apply(LLSelectNode* pNode)
 {
 	const LLViewerObject* pObj = pNode->getObject();
-	return (pObj) && (!gRlvHandler.canEdit(pObj));
+	return (pObj) && (!RlvActions::canEdit(pObj));
 }
 
 // Checked: 2011-05-28 (RLVa-1.4.0a) | Modified: RLVa-1.4.0a
diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h
index 56aed0d64a66b86176df58cb2c51c95adc71f7fd..9d586e1724c9429d7e5bf8622e4e21ac4519f177 100644
--- a/indra/newview/rlvcommon.h
+++ b/indra/newview/rlvcommon.h
@@ -97,7 +97,6 @@ public:
 	static bool getHideLockedAttach()			{ return rlvGetSetting<bool>(RLV_SETTING_HIDELOCKEDATTACH, false); }
 	static bool getHideLockedInventory()		{ return rlvGetSetting<bool>(RLV_SETTING_HIDELOCKEDINVENTORY, false); }
 	static bool getSharedInvAutoRename()		{ return rlvGetSetting<bool>(RLV_SETTING_SHAREDINVAUTORENAME, true); }
-	static bool getShowNameTags()				{ return fShowNameTags; }
 
 	static bool getLoginLastLocation()			{ return rlvGetPerUserSetting<bool>(RLV_SETTING_LOGINLASTLOCATION, true); }
 	static void updateLoginLastLocation();
@@ -114,7 +113,6 @@ protected:
 	static bool fCanOOC;
 	static bool fLegacyNaming;
 	static bool fNoSetEnv;
-	static bool fShowNameTags;
 };
 
 // ============================================================================
@@ -174,6 +172,7 @@ public:
 	static bool sendChatReply(S32 nChannel, const std::string& strUTF8Text);
 	static bool sendChatReply(const std::string& strChannel, const std::string& strUTF8Text);
 
+	static void teleportCallback(U64 hRegion, const LLVector3& posRegion, const LLVector3& vecLookAt);
 protected:
 	static bool m_fForceTp;															// @standtp
 };
@@ -199,6 +198,7 @@ typedef bool (RlvExtCommandHandler::*rlvExtCommandHandler)(const RlvCommand& rlv
 
 bool rlvMenuMainToggleVisible(LLUICtrl* pMenuItem);
 void rlvMenuToggleVisible();
+bool rlvMenuCanShowName();
 bool rlvMenuEnableIfNot(const LLSD& sdParam);
 
 // ============================================================================
diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h
index 086b54e8bf3ddc236af0d07834bbd22200e9c308..ab68d13f87812ea79ff0981641d77115bda86230 100644
--- a/indra/newview/rlvdefines.h
+++ b/indra/newview/rlvdefines.h
@@ -66,13 +66,15 @@ const S32 RLVa_VERSION_BUILD = 0;
 
 #define RLV_ROOT_FOLDER					"#RLV"
 #define RLV_CMD_PREFIX					'@'
+#define RLV_MODIFIER_TPLOCAL_DEFAULT    256.f			// Any teleport that's more than a region away is non-local
+#define RLV_MODIFIER_FARTOUCH_DEFAULT   1.5f			// Specifies the default @fartouch distance
+#define RLV_MODIFIER_SITTP_DEFAULT      1.5f			// Specifies the default @sittp distance
 #define RLV_OPTION_SEPARATOR			";"				// Default separator used in command options
 #define RLV_PUTINV_PREFIX				"#RLV/~"
 #define RLV_PUTINV_SEPARATOR			"/"
 #define RLV_PUTINV_MAXDEPTH				4
 #define RLV_SETROT_OFFSET				F_PI_BY_TWO		// @setrot is off by 90° with the rest of SL
 #define RLV_STRINGS_FILE				"rlva_strings.xml"
-#define RLV_TELEPORT_LOCAL_RADIUS		256				// Any teleport that's more than a region away is non-local
 
 #define RLV_FOLDER_FLAG_NOSTRIP			"nostrip"
 #define RLV_FOLDER_PREFIX_HIDDEN		'.'
@@ -104,13 +106,15 @@ enum ERlvBehaviour {
 	RLV_BHVR_CHATWHISPER,			// "chatwhisper"
 	RLV_BHVR_CHATNORMAL,			// "chatnormal"
 	RLV_BHVR_CHATSHOUT,				// "chatshout"
-	RLV_BHVR_SENDCHANNEL,			// "sendchannel"
+	RLV_BHVR_SENDCHANNEL,
+	RLV_BHVR_SENDCHANNELEXCEPT,
 	RLV_BHVR_SENDIM,				// "sendim"
 	RLV_BHVR_SENDIMTO,				// "sendimto"
 	RLV_BHVR_RECVIM,				// "recvim"
 	RLV_BHVR_RECVIMFROM,			// "recvimfrom"
 	RLV_BHVR_STARTIM,				// "startim"
 	RLV_BHVR_STARTIMTO,				// "startimto"
+	RLV_BHVR_SENDGESTURE,
 	RLV_BHVR_PERMISSIVE,			// "permissive"
 	RLV_BHVR_NOTIFY,				// "notify"
 	RLV_BHVR_SHOWINV,				// "showinv"
@@ -118,10 +122,13 @@ enum ERlvBehaviour {
 	RLV_BHVR_SHOWWORLDMAP,			// "showworldmap"
 	RLV_BHVR_SHOWLOC,				// "showloc"
 	RLV_BHVR_SHOWNAMES,				// "shownames"
+	RLV_BHVR_SHOWNAMETAGS,			// "shownametags"
 	RLV_BHVR_SHOWHOVERTEXT,			// "showhovertext"
 	RLV_BHVR_SHOWHOVERTEXTHUD,		// "showhovertexthud"
 	RLV_BHVR_SHOWHOVERTEXTWORLD,	// "showhovertextworld"
 	RLV_BHVR_SHOWHOVERTEXTALL,		// "showhovertextall"
+	RLV_BHVR_SHOWSELF,
+	RLV_BHVR_SHOWSELFHEAD,
 	RLV_BHVR_TPLM,					// "tplm"
 	RLV_BHVR_TPLOC,					// "tploc"
 	RLV_BHVR_TPLOCAL,
@@ -210,6 +217,13 @@ enum ERlvBehaviour {
 
 enum ERlvBehaviourModifier
 {
+	RLV_MODIFIER_FARTOUCHDIST,		// Radius of a sphere around the user in which they can interact with the world
+	RLV_MODIFIER_RECVIMDISTMIN,		// Minimum distance to receive an IM from an otherwise restricted sender (squared value)
+	RLV_MODIFIER_RECVIMDISTMAX,		// Maximum distance to receive an IM from an otherwise restricted sender (squared value)
+	RLV_MODIFIER_SENDIMDISTMIN,		// Minimum distance to send an IM to an otherwise restricted recipient (squared value)
+	RLV_MODIFIER_SENDIMDISTMAX,		// Maximum distance to send an IM to an otherwise restricted recipient (squared value)
+	RLV_MODIFIER_STARTIMDISTMIN,	// Minimum distance to start an IM to an otherwise restricted recipient (squared value)
+	RLV_MODIFIER_STARTIMDISTMAX,	// Maximum distance to start an IM to an otherwise restricted recipient (squared value)
 	RLV_MODIFIER_SETCAM_AVDISTMIN,
 	RLV_MODIFIER_SETCAM_AVDISTMAX,
 	RLV_MODIFIER_SETCAM_FOCUSDISTMIN,
@@ -219,6 +233,8 @@ enum ERlvBehaviourModifier
 	RLV_MODIFIER_SETCAM_FOVMIN,
 	RLV_MODIFIER_SETCAM_FOVMAX,
 	RLV_MODIFIER_SETCAM_TEXTURE,
+	RLV_MODIFIER_SITTPDIST,
+	RLV_MODIFIER_TPLOCALDIST,
 
 	RLV_MODIFIER_COUNT,
 	RLV_MODIFIER_UNKNOWN
@@ -318,7 +334,6 @@ enum ERlvAttachGroupType
 #define RLV_SETTING_LOGINLASTLOCATION	"RLVaLoginLastLocation"
 #define RLV_SETTING_SHAREDINVAUTORENAME	"RLVaSharedInvAutoRename"
 #define RLV_SETTING_SHOWASSERTIONFAIL	"RLVaShowAssertionFailures"
-#define RLV_SETTING_SHOWNAMETAGS		"RLVaShowNameTags"
 #define RLV_SETTING_TOPLEVELMENU		"RLVaTopLevelMenu"
 #define RLV_SETTING_WEARREPLACEUNLOCKED	"RLVaWearReplaceUnlocked"
 
@@ -333,6 +348,7 @@ enum ERlvAttachGroupType
 #define RLV_STRING_HIDDEN_PARCEL			"hidden_parcel"
 #define RLV_STRING_HIDDEN_REGION			"hidden_region"
 
+#define RLV_STRING_BLOCKED_AUTOPILOT		"blocked_autopilot"
 #define RLV_STRING_BLOCKED_GENERIC			"blocked_generic"
 #define RLV_STRING_BLOCKED_PERMATTACH		"blocked_permattach"
 #define RLV_STRING_BLOCKED_PERMTELEPORT		"blocked_permteleport"
@@ -342,6 +358,7 @@ enum ERlvAttachGroupType
 #define RLV_STRING_BLOCKED_STARTCONF		"blocked_startconf"
 #define RLV_STRING_BLOCKED_STARTIM			"blocked_startim"
 #define RLV_STRING_BLOCKED_TELEPORT			"blocked_teleport"
+#define RLV_STRING_BLOCKED_TELEPORT_OFFER   "blocked_teleport_offer"
 #define RLV_STRING_BLOCKED_TPLUREREQ_REMOTE	"blocked_tplurerequest_remote"
 #define RLV_STRING_BLOCKED_VIEWXXX			"blocked_viewxxx"
 #define RLV_STRING_BLOCKED_WIREFRAME		"blocked_wireframe"
diff --git a/indra/newview/rlvfloaters.cpp b/indra/newview/rlvfloaters.cpp
index 2ff3722797607bec8f1538b1f9a71907506fef37..f33fcc7220a66bfd99f92b48f5fa44dcbaa7b5ea 100644
--- a/indra/newview/rlvfloaters.cpp
+++ b/indra/newview/rlvfloaters.cpp
@@ -74,20 +74,26 @@ std::string rlvGetItemType(const LLViewerInventoryItem* pItem)
 	return "Unknown";
 }
 
-// Checked: 2010-03-11 (RLVa-1.2.0a) | Modified: RLVa-1.2.0g
 std::string rlvGetItemNameFromObjID(const LLUUID& idObj, bool fIncludeAttachPt = true)
 {
 	const LLViewerObject* pObj = gObjectList.findObject(idObj);
+	if ( (pObj) && (pObj->isAvatar()) )
+	{
+		LLAvatarName avName;
+		if (LLAvatarNameCache::get(pObj->getID(), &avName))
+			return avName.getCompleteName();
+		return ((LLVOAvatar*)pObj)->getFullname();
+	}
+
 	const LLViewerObject* pObjRoot = (pObj) ? pObj->getRootEdit() : NULL;
 	const LLViewerInventoryItem* pItem = ((pObjRoot) && (pObjRoot->isAttachment())) ? gInventory.getItem(pObjRoot->getAttachmentItemID()) : NULL;
 
-	std::string strItemName = (pItem) ? pItem->getName() : idObj.asString();
+	const std::string strItemName = (pItem) ? pItem->getName() : idObj.asString();
 	if ( (!fIncludeAttachPt) || (!pObj) || (!pObj->isAttachment()) || (!isAgentAvatarValid()) )
 		return strItemName;
 
-	const LLViewerJointAttachment* pAttachPt = 
-		get_if_there(gAgentAvatarp->mAttachmentPoints, RlvAttachPtLookup::getAttachPointIndex(pObjRoot), (LLViewerJointAttachment*)NULL);
-	std::string strAttachPtName = (pAttachPt) ? pAttachPt->getName() : std::string("Unknown");
+	const LLViewerJointAttachment* pAttachPt = get_if_there(gAgentAvatarp->mAttachmentPoints, RlvAttachPtLookup::getAttachPointIndex(pObjRoot), (LLViewerJointAttachment*)NULL);
+	const std::string strAttachPtName = (pAttachPt) ? pAttachPt->getName() : std::string("Unknown");
 	return llformat("%s (%s%s)", strItemName.c_str(), strAttachPtName.c_str(), (pObj == pObjRoot) ? "" : ", child");
 }
 
@@ -105,6 +111,8 @@ bool rlvGetShowException(ERlvBehaviour eBhvr)
 		case RLV_BHVR_TPREQUEST:
 		case RLV_BHVR_ACCEPTTP:
 		case RLV_BHVR_ACCEPTTPREQUEST:
+		case RLV_BHVR_SHOWNAMES:
+		case RLV_BHVR_SHOWNAMETAGS:
 			return true;
 		default:
 			return false;
@@ -275,15 +283,16 @@ BOOL RlvFloaterBehaviours::postBuild()
 	return TRUE;
 }
 
-// Checked: 2011-05-23 (RLVa-1.3.1c) | Modified: RLVa-1.3.1c
 void RlvFloaterBehaviours::refreshAll()
 {
 	LLCtrlListInterface* pBhvrList = childGetListInterface("behaviour_list");
 	LLCtrlListInterface* pExceptList = childGetListInterface("exception_list");
-	if ( (!pBhvrList) || (!pExceptList) )
+	LLCtrlListInterface* pModifierList = childGetListInterface("modifier_list");
+	if ( (!pBhvrList) || (!pExceptList) || (!pModifierList) )
 		return;
 	pBhvrList->operateOnAll(LLCtrlListInterface::OP_DELETE);
 	pExceptList->operateOnAll(LLCtrlListInterface::OP_DELETE);
+	pModifierList->operateOnAll(LLCtrlListInterface::OP_DELETE);
 
 	if (!isAgentAvatarValid())
 		return;
@@ -300,6 +309,11 @@ void RlvFloaterBehaviours::refreshAll()
 	sdExceptColumns[1] = LLSD().with("column", "option").with("type", "text");
 	sdExceptColumns[2] = LLSD().with("column", "issuer").with("type", "text");
 
+	LLSD sdModifierRow; LLSD& sdModifierColumns = sdModifierRow["columns"];
+	sdModifierColumns[0] = LLSD().with("column", "modifier").with("type", "text");
+	sdModifierColumns[1] = LLSD().with("column", "value").with("type", "text");
+	sdModifierColumns[2] = LLSD().with("column", "primary").with("type", "text");
+
 	//
 	// List behaviours
 	//
@@ -353,6 +367,35 @@ void RlvFloaterBehaviours::refreshAll()
 			}
 		}
 	}
+
+	//
+	// List modifiers
+	//
+	for (int idxModifier = 0; idxModifier < RLV_MODIFIER_COUNT; idxModifier++)
+	{
+		const RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().m_BehaviourModifiers[idxModifier];
+		if (pBhvrModifier)
+		{
+			sdModifierRow["enabled"] = (pBhvrModifier->hasValue());
+			sdModifierColumns[0]["value"] = pBhvrModifier->getName();
+
+			if (pBhvrModifier->hasValue())
+			{
+				const RlvBehaviourModifierValue& modValue = pBhvrModifier->getValue();
+				if (typeid(float) == modValue.type())
+					sdModifierColumns[1]["value"] = llformat("%f", boost::get<float>(modValue));
+				else if (typeid(int) == modValue.type())
+					sdModifierColumns[1]["value"] = llformat("%d", boost::get<int>(modValue));
+			}
+			else
+			{
+				sdModifierColumns[1]["value"] = "(default)";
+			}
+
+			sdModifierColumns[2]["value"] = (pBhvrModifier->getPrimaryObject().notNull()) ? rlvGetItemNameFromObjID(pBhvrModifier->getPrimaryObject()) : LLStringUtil::null;
+			pModifierList->addElement(sdModifierRow, ADD_BOTTOM);
+		}
+	}
 }
 
 // ============================================================================
@@ -703,6 +746,11 @@ BOOL RlvFloaterConsole::postBuild()
 	return TRUE;
 }
 
+void RlvFloaterConsole::onClose(bool fQuitting)
+{
+	gRlvHandler.processCommand(gAgent.getID(), "clear", true);
+}
+
 void RlvFloaterConsole::addCommandReply(const std::string& strCommand, const std::string& strReply)
 {
 	m_pOutputText->appendText(llformat("%s: ", strCommand.c_str()), true);
diff --git a/indra/newview/rlvfloaters.h b/indra/newview/rlvfloaters.h
index 683464694fe71b749707e636b8d9add7e9d9e781..8238aa68885e6d1b5308c10564a8acfbd9cd44ef 100644
--- a/indra/newview/rlvfloaters.h
+++ b/indra/newview/rlvfloaters.h
@@ -142,6 +142,7 @@ private:
 	 */
 public:
 	BOOL postBuild() override;
+	void onClose(bool fQuitting) override;
 	
 	/*
 	 * Member functions
diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp
index 29d0e13d64e1db162c55aeb14a1250bc11a240f1..c09843906fb0d721e9cf37d2077f3679a4239b69 100644
--- a/indra/newview/rlvhandler.cpp
+++ b/indra/newview/rlvhandler.cpp
@@ -31,19 +31,25 @@
 
 // Command specific includes
 #include "llagentcamera.h"				// @setcam and related
+#include "llavatarnamecache.h"			// @shownames
+#include "llavatarlist.h"				// @shownames
 #include "llenvmanager.h"				// @setenv
+#include "llfloatersidepanelcontainer.h"// @shownames
 #include "lloutfitslist.h"				// @showinv - "Appearance / My Outfits" panel
 #include "llpaneloutfitsinventory.h"	// @showinv - "Appearance" floater
+#include "llpanelpeople.h"				// @shownames
 #include "llpanelwearing.h"				// @showinv - "Appearance / Current Outfit" panel
 #include "llsidepanelappearance.h"		// @showinv - "Appearance / Edit appearance" panel
 #include "lltabcontainer.h"				// @showinv - Tab container control for inventory tabs
 #include "lltoolmgr.h"					// @edit
 #include "llviewercamera.h"				// @setcam and related
+#include "llworldmapmessage.h"			// @tpto
 #include "llviewertexturelist.h"		// @setcam_texture
 
 // RLVa includes
 #include "rlvactions.h"
 #include "rlvfloaters.h"
+#include "rlvactions.h"
 #include "rlvhandler.h"
 #include "rlvhelper.h"
 #include "rlvinventory.h"
@@ -704,25 +710,6 @@ void RlvHandler::onTeleportFinished(const LLVector3d& posArrival)
 // String/chat censoring functions
 //
 
-// Checked: 2010-03-06 (RLVa-1.2.0c) | Added: RLVa-1.1.0j
-bool RlvHandler::canSit(LLViewerObject* pObj, const LLVector3& posOffset /*= LLVector3::zero*/) const
-{
-	// The user can sit on the specified object if:
-	//   - not prevented from sitting
-	//   - not prevented from standing up or not currently sitting
-	//   - not standtp restricted or not currently sitting (if the user is sitting and tried to sit elsewhere the tp would just kick in)
-	//   - not a regular sit (i.e. due to @sit:<uuid>=force)
-	//   - not @sittp=n or @fartouch=n restricted or if they clicked on a point within 1.5m of the avie's current position
-	return
-		( (pObj) && (LL_PCODE_VOLUME == pObj->getPCode()) ) &&
-		(!hasBehaviour(RLV_BHVR_SIT)) && 
-		( ((!hasBehaviour(RLV_BHVR_UNSIT)) && (!hasBehaviour(RLV_BHVR_STANDTP))) || 
-		  ((isAgentAvatarValid()) && (!gAgentAvatarp->isSitting())) ) &&
-		( ( (NULL != getCurrentCommand()) && (RLV_BHVR_SIT == getCurrentCommand()->getBehaviourType()) ) ||
-		  ( (!hasBehaviour(RLV_BHVR_SITTP)) && (!hasBehaviour(RLV_BHVR_FARTOUCH)) ) ||
-		  (dist_vec_squared(gAgent.getPositionGlobal(), pObj->getPositionGlobal() + LLVector3d(posOffset)) < 1.5f * 1.5f) );
-}
-
 // Checked: 2010-04-11 (RLVa-1.3.0h) | Modified: RLVa-1.3.0h
 bool RlvHandler::canTouch(const LLViewerObject* pObj, const LLVector3& posOffset /*=LLVector3::zero*/) const
 {
@@ -730,16 +717,17 @@ bool RlvHandler::canTouch(const LLViewerObject* pObj, const LLVector3& posOffset
 	bool fCanTouch = (idRoot.notNull()) && ((pObj->isHUDAttachment()) || (!hasBehaviour(RLV_BHVR_TOUCHALL))) &&
 		((!hasBehaviour(RLV_BHVR_TOUCHTHIS)) || (!isException(RLV_BHVR_TOUCHTHIS, idRoot, RLV_CHECK_PERMISSIVE)));
 
+	static RlvCachedBehaviourModifier<float> s_nFartouchDist(RLV_MODIFIER_FARTOUCHDIST);
 	if (fCanTouch)
 	{
 		if ( (!pObj->isAttachment()) || (!pObj->permYouOwner()) )
 		{
 			// Rezzed prim or attachment worn by another avie
-			fCanTouch = 
+			fCanTouch =
 				( (!hasBehaviour(RLV_BHVR_TOUCHWORLD)) || (isException(RLV_BHVR_TOUCHWORLD, idRoot, RLV_CHECK_PERMISSIVE)) ) &&
 				( (!pObj->isAttachment()) || (!hasBehaviour(RLV_BHVR_TOUCHATTACHOTHER)) ) &&
-				( (!hasBehaviour(RLV_BHVR_FARTOUCH)) || 
-				  (dist_vec_squared(gAgent.getPositionGlobal(), pObj->getPositionGlobal() + LLVector3d(posOffset)) <= 1.5f * 1.5f) );
+				( (!hasBehaviour(RLV_BHVR_FARTOUCH)) ||
+				  (dist_vec_squared(gAgent.getPositionGlobal(), pObj->getPositionGlobal() + LLVector3d(posOffset)) <= s_nFartouchDist * s_nFartouchDist) );
 		}
 		else if (!pObj->isHUDAttachment())
 		{
@@ -854,7 +842,7 @@ bool RlvHandler::redirectChatOrEmote(const std::string& strUTF8Text) const
 			endRedir = m_Exceptions.upper_bound(eBhvr); itRedir != endRedir; ++itRedir)
 	{
 		S32 nChannel = boost::get<S32>(itRedir->second.varOption);
-		if ( (!hasBehaviour(RLV_BHVR_SENDCHANNEL)) || (isException(RLV_BHVR_SENDCHANNEL, nChannel)) )
+		if (RlvActions::canSendChannel(nChannel))
 			RlvUtil::sendChatReply(nChannel, strUTF8Text);
 	}
 
@@ -1290,6 +1278,7 @@ ERlvCmdRet RlvHandler::processAddRemCommand(const RlvCommand& rlvCmd)
 			if (rlvCmd.isStrict())
 				addException(rlvCmd.getObjectID(), RLV_BHVR_PERMISSIVE, eBhvr);
 			m_Behaviours[eBhvr]++;
+			rlvCmd.markRefCounted();
 		}
 		else
 		{
@@ -1322,6 +1311,7 @@ ERlvCmdRet RlvCommandHandlerBaseImpl<RLV_TYPE_ADDREM>::processCommand(const RlvC
 			if (rlvCmd.isStrict())
 				gRlvHandler.addException(rlvCmd.getObjectID(), RLV_BHVR_PERMISSIVE, eBhvr);
 			gRlvHandler.m_Behaviours[eBhvr]++;
+			rlvCmd.markRefCounted();
 		}
 		else
 		{
@@ -1609,9 +1599,9 @@ void RlvBehaviourToggleHandler<RLV_BHVR_EDIT>::onCommandToggle(ERlvBehaviour eBh
 		RlvUIEnabler::instance().removeGenericFloaterFilter("beacons");
 }
 
-// Handles: @sendchannel[:<channel>]=n|y
+// Handles: @sendchannel[:<channel>]=n|y and @sendchannel_except[:<channel>]=n|y
 template<> template<>
-ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_SENDCHANNEL>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
+ERlvCmdRet RlvBehaviourSendChannelHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
 {
 	// If there's an option then it should be a valid (= positive and non-zero) chat channel
 	if (rlvCmd.hasOption())
@@ -1632,6 +1622,59 @@ ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_SENDCHANNEL>::onCommand(const RlvCommand
 	return RLV_RET_SUCCESS;
 }
 
+// Handles: @recvim[:<uuid|range>]=n|y, @sendim[:<uuid|range>]=n|y and @startim[:<uuid|range>]=n|y
+template<> template<>
+ERlvCmdRet RlvBehaviourRecvSendStartIMHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
+{
+	ERlvCmdRet eRet = RlvBehaviourGenericHandler<RLV_OPTION_NONE_OR_EXCEPTION>::onCommand(rlvCmd, fRefCount);
+	if ( (RLV_RET_SUCCESS != eRet) && (rlvCmd.hasOption()) )
+	{
+		// Check for <dist_min>[;<dist_max>] option
+		std::vector<std::string> optionList; float nDistMin = F32_MAX, nDistMax = F32_MAX;
+		if ( (!RlvCommandOptionHelper::parseStringList(rlvCmd.getOption(), optionList)) || (optionList.size() > 2) ||
+			 (!RlvCommandOptionHelper::parseOption(optionList[0], nDistMin)) || (nDistMin < 0) ||
+			 ( (optionList.size() >= 2) && (!RlvCommandOptionHelper::parseOption(optionList[1], nDistMax)) ) || (nDistMax < 0) )
+		{
+			return RLV_RET_FAILED_OPTION;
+		}
+
+		// Valid option(s) - figure out which modifier(s) to change
+		ERlvBehaviourModifier eModDistMin, eModDistMax;
+		switch (rlvCmd.getBehaviourType())
+		{
+			case RLV_BHVR_RECVIM:
+				eModDistMin = RLV_MODIFIER_RECVIMDISTMIN; eModDistMax = RLV_MODIFIER_RECVIMDISTMAX;
+				break;
+			case RLV_BHVR_SENDIM:
+				eModDistMin = RLV_MODIFIER_SENDIMDISTMIN; eModDistMax = RLV_MODIFIER_SENDIMDISTMAX;
+				break;
+			case RLV_BHVR_STARTIM:
+				eModDistMin = RLV_MODIFIER_STARTIMDISTMIN; eModDistMax = RLV_MODIFIER_STARTIMDISTMAX;
+				break;
+			default:
+				return RLV_RET_FAILED_OPTION;
+		}
+
+		RlvBehaviourModifier *pBhvrModDistMin = RlvBehaviourDictionary::instance().getModifier(eModDistMin), *pBhvrModDistMax = RlvBehaviourDictionary::instance().getModifier(eModDistMax);
+		if (RLV_TYPE_ADD == rlvCmd.getParamType())
+		{
+			pBhvrModDistMin->addValue(nDistMin * nDistMin, rlvCmd.getObjectID());
+			if (optionList.size() >= 2)
+				pBhvrModDistMax->addValue(nDistMax * nDistMax, rlvCmd.getObjectID());
+		}
+		else
+		{
+			pBhvrModDistMin->removeValue(nDistMin * nDistMin, rlvCmd.getObjectID());
+			if (optionList.size() >= 2)
+				pBhvrModDistMax->removeValue(nDistMax * nDistMax, rlvCmd.getObjectID());
+		}
+
+		fRefCount = true;
+		return RLV_RET_SUCCESS;
+	}
+	return eRet;
+}
+
 // Handles: @sendim=n|y toggles
 template<> template<>
 void RlvBehaviourToggleHandler<RLV_BHVR_SENDIM>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
@@ -1643,7 +1686,6 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SENDIM>::onCommandToggle(ERlvBehaviour e
 template<>
 void RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_AVDISTMIN>::onValueChange() const
 {
-	const RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_AVDISTMIN);
 	if ( (gAgentCamera.cameraMouselook()) && (!RlvActions::canChangeToMouselook()) )
 		gAgentCamera.changeCameraToThirdPerson();
 }
@@ -1903,6 +1945,100 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SHOWINV>::onCommandToggle(ERlvBehaviour
 		RlvUIEnabler::instance().removeGenericFloaterFilter("inventory");
 }
 
+// Handles: @shownames[:<uuid>]=n|y toggles
+template<> template<>
+void RlvBehaviourToggleHandler<RLV_BHVR_SHOWNAMES>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
+{
+	if (LLApp::isQuitting())
+		return;	// Nothing to do if the viewer is shutting down
+
+	// Update the shownames context
+	RlvActions::setShowName(RlvActions::SNC_DEFAULT, !fHasBhvr);
+
+	// Refresh the nearby people list
+	LLPanelPeople* pPeoplePanel = LLFloaterSidePanelContainer::getPanel<LLPanelPeople>("people", "panel_people");
+	RLV_ASSERT( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) );
+	if ( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) )
+	{
+		if (pPeoplePanel->getNearbyList()->isInVisibleChain())
+			pPeoplePanel->onCommit();
+		pPeoplePanel->getNearbyList()->updateAvatarNames();
+	}
+
+	// Force the use of the "display name" cache so we can filter both display and legacy names (or return back to the user's preference)
+	if (fHasBhvr)
+	{
+		LLAvatarNameCache::setForceDisplayNames(true);
+	}
+	else
+	{
+		LLAvatarNameCache::setForceDisplayNames(false);
+		LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames"));
+	}
+
+	// Refresh all name tags and HUD text
+	LLVOAvatar::invalidateNameTags();
+	LLHUDText::refreshAllObjectText();
+}
+
+// Handles: @shownames[:<uuid>]=n|y
+template<> template<>
+ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_SHOWNAMES>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
+{
+	ERlvCmdRet eRet = RlvBehaviourGenericHandler<RLV_OPTION_NONE_OR_EXCEPTION>::onCommand(rlvCmd, fRefCount);
+	if ( (RLV_RET_SUCCESS == eRet) && (rlvCmd.hasOption()) && (!LLApp::isQuitting()) )
+	{
+		const LLUUID idAgent = RlvCommandOptionHelper::parseOption<LLUUID>(rlvCmd.getOption());
+
+		// Refresh the nearby people list (if necessary)
+		LLPanelPeople* pPeoplePanel = LLFloaterSidePanelContainer::getPanel<LLPanelPeople>("people", "panel_people");
+		RLV_ASSERT( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) );
+		if ( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) && (pPeoplePanel->getNearbyList()->contains(idAgent)) )
+		{
+			if (pPeoplePanel->getNearbyList()->isInVisibleChain())
+				pPeoplePanel->onCommit();
+			pPeoplePanel->getNearbyList()->updateAvatarNames();
+		}
+
+		// Refresh that avatar's name tag and all HUD text
+		LLVOAvatar::invalidateNameTag(idAgent);
+		LLHUDText::refreshAllObjectText();
+	}
+	return eRet;
+}
+
+// Handles: @shownametags[:<uuid>]=n|y toggles
+template<> template<>
+void RlvBehaviourToggleHandler<RLV_BHVR_SHOWNAMETAGS>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
+{
+	if (LLApp::isQuitting())
+		return;	// Nothing to do if the viewer is shutting down
+
+	// Update the shownames context
+	RlvActions::setShowName(RlvActions::SNC_NAMETAG, !fHasBhvr);
+
+	// Refresh all name tags
+	LLVOAvatar::invalidateNameTags();
+}
+
+// Handles: @shownametags[:<uuid>]=n|y
+template<> template<>
+ERlvCmdRet RlvBehaviourHandler<RLV_BHVR_SHOWNAMETAGS>::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
+{
+	ERlvCmdRet eRet = RlvBehaviourGenericHandler<RLV_OPTION_NONE_OR_EXCEPTION>::onCommand(rlvCmd, fRefCount);
+	if ( (RLV_RET_SUCCESS == eRet) && (rlvCmd.hasOption()) )
+		LLVOAvatar::invalidateNameTag(RlvCommandOptionHelper::parseOption<LLUUID>(rlvCmd.getOption()));
+	return eRet;
+}
+
+// Handles: @showself=n|y and @showselfhead=n|y toggles
+template<> template<>
+void RlvBehaviourShowSelfToggleHandler::onCommandToggle(ERlvBehaviour eBvhr, bool fHasBhvr)
+{
+	if (isAgentAvatarValid())
+		gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
+}
+
 // ============================================================================
 // Command handlers (RLV_TYPE_FORCE)
 //
@@ -2249,7 +2385,7 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_SIT>::onCommand(const RlvCommand& rlvCmd)
 	if ( (idTarget.isNull()) || ((pObj = gObjectList.findObject(idTarget)) == NULL) || (LL_PCODE_VOLUME != pObj->getPCode()) )
 		return RLV_RET_FAILED_OPTION;
 
-	if (!gRlvHandler.canSit(pObj))
+	if (!RlvActions::canSit(pObj))
 		return RLV_RET_FAILED_LOCK;
 	else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_STANDTP)) && (isAgentAvatarValid()) )
 	{
@@ -2271,35 +2407,49 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_SIT>::onCommand(const RlvCommand& rlvCmd)
 	return RLV_RET_SUCCESS;
 }
 
-// Handles: @tpto:<vector>[;<angle>]=force
+// Handles: @tpto:<vector>[;<angle>]=force and @tpto:<region>/<vector>[;<angle>]=force
 template<> template<>
 ERlvCmdRet RlvForceHandler<RLV_BHVR_TPTO>::onCommand(const RlvCommand& rlvCmd)
 {
 	std::vector<std::string> optionList;
 	if (!RlvCommandOptionHelper::parseStringList(rlvCmd.getOption(), optionList))
-		return RLV_RET_FAILED;
-
-	// First option specifies the destination
-	LLVector3d posGlobal;
-	if (!RlvCommandOptionHelper::parseOption(optionList[0], posGlobal))
 		return RLV_RET_FAILED_OPTION;
 
-	if (optionList.size() == 1)
-	{
-		gAgent.teleportViaLocation(posGlobal);
-	}
-	else
+	// We need the look-at first
+	LLVector3 vecLookAt = LLVector3::zero;
+	if (optionList.size() > 1)
 	{
-		// Second option specifies the angle
 		float nAngle = 0.0f;
 		if (!RlvCommandOptionHelper::parseOption(optionList[1], nAngle))
 			return RLV_RET_FAILED_OPTION;
 
-		LLVector3 vecLookAt(LLVector3::x_axis);
+		vecLookAt = LLVector3::x_axis;
 		vecLookAt.rotVec(nAngle, LLVector3::z_axis);
 		vecLookAt.normalize();
+	}
+
+	// Next figure out the destination
+	LLVector3d posGlobal;
+	if (RlvCommandOptionHelper::parseOption(optionList[0], posGlobal))
+	{
+		if (optionList.size() == 1)
+			gAgent.teleportViaLocation(posGlobal);
+		else
 		gAgent.teleportViaLocationLookAt(posGlobal, vecLookAt);
 	}
+	else
+	{
+		std::vector<std::string> posList; LLVector3 posRegion;
+		if ( (!RlvCommandOptionHelper::parseStringList(optionList[0], posList, std::string("/"))) || (4 != posList.size()) ||
+		     (!RlvCommandOptionHelper::parseOption(optionList[0].substr(posList[0].size() + 1), posRegion)) )
+		{
+			return RLV_RET_FAILED_OPTION;
+		}
+
+		LLWorldMapMessage::url_callback_t cb = boost::bind(&RlvUtil::teleportCallback, _1, posRegion, vecLookAt);
+		LLWorldMapMessage::getInstance()->sendNamedRegionRequest(posList[0], cb, std::string(""), true);
+	}
+
 	return RLV_RET_SUCCESS;
 }
 
diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h
index 35d9160b5d99a9f7582089e9b86446018436d654..6cac8be2bd6cfb4b721c198b4a44f95aacf82d36 100644
--- a/indra/newview/rlvhandler.h
+++ b/indra/newview/rlvhandler.h
@@ -98,9 +98,7 @@ public:
 	void              setSitSource(const LLVector3d& posSource)	{ m_posSitSource = posSource; }	// @standtp
 
 	// Command specific helper functions
-	bool canEdit(const LLViewerObject* pObj) const;												// @edit and @editobj
 	bool canShowHoverText(const LLViewerObject* pObj) const;									// @showhovertext* command family
-	bool canSit(LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero) const;
 	bool canTouch(const LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero) const;	// @touch
 	bool filterChat(std::string& strUTF8Text, bool fFilterEmote) const;							// @sendchat, @recvchat and @redirchat
 	bool redirectChatOrEmote(const std::string& strUTF8Test) const;								// @redirchat and @rediremote
@@ -232,18 +230,6 @@ extern rlv_handler_t gRlvHandler;
 // Inlined member functions
 //
 
-// Checked: 2010-11-29 (RLVa-1.3.0c) | Added: RLVa-1.3.0c
-inline bool RlvHandler::canEdit(const LLViewerObject* pObj) const
-{
-	// The specified object can be edited if:
-	//   - not generally restricted from editing (or the object's root is an exception)
-	//   - not specifically restricted from editing this object's root
-	return 
-		(pObj) &&
-		((!hasBehaviour(RLV_BHVR_EDIT)) || (isException(RLV_BHVR_EDIT, pObj->getRootEdit()->getID()))) &&
-		((!hasBehaviour(RLV_BHVR_EDITOBJ)) || (!isException(RLV_BHVR_EDITOBJ, pObj->getRootEdit()->getID())));
-}
-
 // Checked: 2010-03-27 (RLVa-1.4.0a) | Modified: RLVa-1.0.0f
 inline bool RlvHandler::canShowHoverText(const LLViewerObject *pObj) const
 {
diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp
index a7b3b8c9600c666874b1d13ed22ea90d275a27a1..5100f45dcaa1aabb71af24c90ebad438cb0c3ed7 100644
--- a/indra/newview/rlvhelper.cpp
+++ b/indra/newview/rlvhelper.cpp
@@ -59,7 +59,7 @@
  *   Definition: RlvBehaviourGenericProcessor<RLV_OPTION_TYPE>("commandname", RLV_BHVR_COMMANDNAME)
  *   Implement : nothing! (it automagically works)
  * For simple behaviours that only require recordkeeping and only run code when they toggle:
- *   Definition: RlvBehaviourToggleProcessor<RLV_BHVR_COMMANDNAME, RLV_OPTION_TYPE>("commandname"))
+ *   Definition: RlvBehaviourGenericToggleProcessor<RLV_BHVR_COMMANDNAME, RLV_OPTION_TYPE>("commandname"))
  *   Implement : void RlvBehaviourToggleHandler<RLV_BHVR_COMMANDNAME>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
  * For behaviours that require manual processing:
  *   Definition: RlvBehaviourProcessor<RLV_BHVR_COMMANDNAME>("commandname"))
@@ -96,10 +96,11 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
 	addEntry(new RlvBehaviourInfo("detachallthis",			RLV_BHVR_DETACHTHIS,			RLV_TYPE_ADDREM, RlvBehaviourInfo::FORCEWEAR_SUBTREE));
 	addEntry(new RlvBehaviourInfo("detachthis_except",		RLV_BHVR_DETACHTHISEXCEPT,		RLV_TYPE_ADDREM, RlvBehaviourInfo::FORCEWEAR_NODE));
 	addEntry(new RlvBehaviourInfo("detachallthis_except",	RLV_BHVR_DETACHTHISEXCEPT,		RLV_TYPE_ADDREM, RlvBehaviourInfo::FORCEWEAR_SUBTREE));
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_EDIT, RLV_OPTION_NONE_OR_EXCEPTION>("edit"));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_EDIT, RLV_OPTION_NONE_OR_EXCEPTION>("edit"));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("editobj", RLV_BHVR_EDITOBJ));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("emote", RLV_BHVR_EMOTE));
-	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("fartouch", RLV_BHVR_FARTOUCH));
+	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("fartouch", RLV_BHVR_FARTOUCH));
+	addModifier(RLV_BHVR_FARTOUCH, RLV_MODIFIER_FARTOUCHDIST, new RlvBehaviourModifier("Fartouch Distance", RLV_MODIFIER_FARTOUCH_DEFAULT, true, new RlvBehaviourModifier_CompMin));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("fly", RLV_BHVR_FLY));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("interact", RLV_BHVR_INTERACT, RlvBehaviourInfo::BHVR_EXTENDED));
 	addEntry(new RlvBehaviourInfo("notify",					RLV_BHVR_NOTIFY,				RLV_TYPE_ADDREM));
@@ -108,19 +109,25 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("recvchatfrom", RLV_BHVR_RECVCHATFROM, RlvBehaviourInfo::BHVR_STRICT));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("recvemote", RLV_BHVR_RECVEMOTE, RlvBehaviourInfo::BHVR_STRICT));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("recvemotefrom", RLV_BHVR_RECVEMOTEFROM, RlvBehaviourInfo::BHVR_STRICT));
-	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("recvim", RLV_BHVR_RECVIM, RlvBehaviourInfo::BHVR_STRICT));
+	addEntry(new RlvBehaviourProcessor<RLV_BHVR_RECVIM, RlvBehaviourRecvSendStartIMHandler>("recvim", RlvBehaviourInfo::BHVR_STRICT));
+	addModifier(RLV_BHVR_RECVIM, RLV_MODIFIER_RECVIMDISTMIN, new RlvBehaviourModifier("RecvIM Distance (Min)", F32_MAX, true, new RlvBehaviourModifier_CompMax));
+	addModifier(RLV_BHVR_RECVIM, RLV_MODIFIER_RECVIMDISTMAX, new RlvBehaviourModifier("RecvIM Distance (Max)", F32_MAX, true, new RlvBehaviourModifier_CompMin));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("recvimfrom", RLV_BHVR_RECVIMFROM, RlvBehaviourInfo::BHVR_STRICT));
 	addEntry(new RlvBehaviourInfo("redirchat",				RLV_BHVR_REDIRCHAT,				RLV_TYPE_ADDREM));
 	addEntry(new RlvBehaviourInfo("rediremote",				RLV_BHVR_REDIREMOTE,			RLV_TYPE_ADDREM));
 	addEntry(new RlvBehaviourProcessor<RLV_BHVR_REMATTACH, RlvBehaviourAddRemAttachHandler>("remattach"));
 	addEntry(new RlvBehaviourInfo("remoutfit",				RLV_BHVR_REMOUTFIT,				RLV_TYPE_ADDREM));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("rez", RLV_BHVR_REZ));
-	addEntry(new RlvBehaviourProcessor<RLV_BHVR_SENDCHANNEL>("sendchannel", RlvBehaviourInfo::BHVR_STRICT));
+	addEntry(new RlvBehaviourProcessor<RLV_BHVR_SENDCHANNEL, RlvBehaviourSendChannelHandler>("sendchannel", RlvBehaviourInfo::BHVR_STRICT));
+	addEntry(new RlvBehaviourProcessor<RLV_BHVR_SENDCHANNELEXCEPT, RlvBehaviourSendChannelHandler>("sendchannel_except", RlvBehaviourInfo::BHVR_STRICT));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("sendchat", RLV_BHVR_SENDCHAT));
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SENDIM, RLV_OPTION_NONE_OR_EXCEPTION>("sendim", RlvBehaviourInfo::BHVR_STRICT));
+	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SENDIM, RlvBehaviourRecvSendStartIMHandler>("sendim", RlvBehaviourInfo::BHVR_STRICT));
+	addModifier(RLV_BHVR_SENDIM, RLV_MODIFIER_SENDIMDISTMIN, new RlvBehaviourModifier("SendIM Distance (Min)", F32_MAX, true, new RlvBehaviourModifier_CompMax));
+	addModifier(RLV_BHVR_SENDIM, RLV_MODIFIER_SENDIMDISTMAX, new RlvBehaviourModifier("SendIM Distance (Max)", F32_MAX, true, new RlvBehaviourModifier_CompMin));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("sendimto", RLV_BHVR_SENDIMTO, RlvBehaviourInfo::BHVR_STRICT));
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SETDEBUG, RLV_OPTION_NONE>("setdebug"));
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SETENV, RLV_OPTION_NONE>("setenv"));
+	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("sendgesture", RLV_BHVR_SENDGESTURE, RlvBehaviourInfo::BHVR_EXPERIMENTAL));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETDEBUG, RLV_OPTION_NONE>("setdebug"));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETENV, RLV_OPTION_NONE>("setenv"));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("setgroup", RLV_BHVR_SETGROUP));
 	addEntry(new RlvBehaviourInfo("sharedunwear",			RLV_BHVR_SHAREDUNWEAR,			RLV_TYPE_ADDREM, RlvBehaviourInfo::BHVR_EXTENDED));
 	addEntry(new RlvBehaviourInfo("sharedwear",				RLV_BHVR_SHAREDWEAR,			RLV_TYPE_ADDREM, RlvBehaviourInfo::BHVR_EXTENDED));
@@ -128,29 +135,36 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("showhovertextall", RLV_BHVR_SHOWHOVERTEXTALL));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("showhovertexthud", RLV_BHVR_SHOWHOVERTEXTHUD));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("showhovertextworld", RLV_BHVR_SHOWHOVERTEXTWORLD));
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SHOWINV, RLV_OPTION_NONE>("showinv"));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SHOWINV, RLV_OPTION_NONE>("showinv"));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("showloc", RLV_BHVR_SHOWLOC));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("showminimap", RLV_BHVR_SHOWMINIMAP));
-	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("shownames", RLV_BHVR_SHOWNAMES));
+	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SHOWNAMES>("shownames", RlvBehaviourInfo::BHVR_STRICT));
+	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SHOWNAMETAGS>("shownametags", RlvBehaviourInfo::BHVR_STRICT ));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SHOWSELF, RLV_OPTION_NONE, RlvBehaviourShowSelfToggleHandler>("showself", RlvBehaviourInfo::BHVR_EXTENDED));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SHOWSELFHEAD, RLV_OPTION_NONE, RlvBehaviourShowSelfToggleHandler>("showselfhead", RlvBehaviourInfo::BHVR_EXTENDED));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("showworldmap", RLV_BHVR_SHOWWORLDMAP));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("sit", RLV_BHVR_SIT));
-	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("sittp", RLV_BHVR_SITTP));
+	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("sittp", RLV_BHVR_SITTP));
+	addModifier(RLV_BHVR_SITTP, RLV_MODIFIER_SITTPDIST, new RlvBehaviourModifier("SitTp Distance", RLV_MODIFIER_SITTP_DEFAULT, true, new RlvBehaviourModifier_CompMin));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("standtp", RLV_BHVR_STANDTP));
-	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("startim", RLV_BHVR_STARTIM, RlvBehaviourInfo::BHVR_STRICT));
+	addEntry(new RlvBehaviourProcessor<RLV_BHVR_STARTIM, RlvBehaviourRecvSendStartIMHandler>("startim", RlvBehaviourInfo::BHVR_STRICT));
+	addModifier(RLV_BHVR_STARTIM, RLV_MODIFIER_STARTIMDISTMIN, new RlvBehaviourModifier("StartIM Distance (Min)", F32_MAX, true, new RlvBehaviourModifier_CompMax));
+	addModifier(RLV_BHVR_STARTIM, RLV_MODIFIER_STARTIMDISTMAX, new RlvBehaviourModifier("StartIM Distance (Max)", F32_MAX, true, new RlvBehaviourModifier_CompMin));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("startimto", RLV_BHVR_STARTIMTO, RlvBehaviourInfo::BHVR_STRICT));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("temprun", RLV_BHVR_TEMPRUN));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("touchall", RLV_BHVR_TOUCHALL));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("touchattach", RLV_BHVR_TOUCHATTACH));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("touchattachother", RLV_BHVR_TOUCHATTACHOTHER));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("touchattachself", RLV_BHVR_TOUCHATTACHSELF));
-	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("touchfar", RLV_BHVR_FARTOUCH, RlvBehaviourInfo::BHVR_SYNONYM));
+	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("touchfar", RLV_BHVR_FARTOUCH, RlvBehaviourInfo::BHVR_SYNONYM));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("touchhud", RLV_BHVR_TOUCHHUD, RlvBehaviourInfo::BHVR_EXTENDED));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("touchme", RLV_BHVR_TOUCHME));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("touchthis", RLV_BHVR_TOUCHTHIS));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("touchworld", RLV_BHVR_TOUCHWORLD));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("tplm", RLV_BHVR_TPLM));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("tploc", RLV_BHVR_TPLOC));
-	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("tplocal", RLV_BHVR_TPLOCAL));
+	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("tplocal", RLV_BHVR_TPLOCAL));
+	addModifier(RLV_BHVR_TPLOCAL, RLV_MODIFIER_TPLOCALDIST, new RlvBehaviourModifier("Local Teleport Distance", RLV_MODIFIER_TPLOCAL_DEFAULT, true, new RlvBehaviourModifier_CompMin));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("tplure", RLV_BHVR_TPLURE, RlvBehaviourInfo::BHVR_STRICT));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("tprequest", RLV_BHVR_TPREQUEST, RlvBehaviourInfo::BHVR_STRICT | RlvBehaviourInfo::BHVR_EXTENDED));
 	addEntry(new RlvBehaviourInfo("unsharedunwear",			RLV_BHVR_UNSHAREDUNWEAR,		RLV_TYPE_ADDREM));
@@ -160,27 +174,27 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("viewscript", RLV_BHVR_VIEWSCRIPT));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("viewtexture", RLV_BHVR_VIEWTEXTURE));
 	// Camera
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SETCAM, RLV_OPTION_NONE>("setcam"));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM, RLV_OPTION_NONE>("setcam"));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_avdistmin", RLV_BHVR_SETCAM_AVDISTMIN));
-	addModifier(RLV_BHVR_SETCAM_AVDISTMIN, RLV_MODIFIER_SETCAM_AVDISTMIN, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_AVDISTMIN>(0.0f, false, new RlvBehaviourModifier_CompMax()));
+	addModifier(RLV_BHVR_SETCAM_AVDISTMIN, RLV_MODIFIER_SETCAM_AVDISTMIN, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_AVDISTMIN>("Camera - Avatar Distance (Min)", 0.0f, false, new RlvBehaviourModifier_CompMax()));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_avdistmax", RLV_BHVR_SETCAM_AVDISTMAX));
-	addModifier(RLV_BHVR_SETCAM_AVDISTMAX, RLV_MODIFIER_SETCAM_AVDISTMAX, new RlvBehaviourModifier(F32_MAX, false, new RlvBehaviourModifier_CompMin()));
+	addModifier(RLV_BHVR_SETCAM_AVDISTMAX, RLV_MODIFIER_SETCAM_AVDISTMAX, new RlvBehaviourModifier("Camera - Avatar Distance (Max)", F32_MAX, false, new RlvBehaviourModifier_CompMin));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_focusdistmin", RLV_BHVR_SETCAM_FOCUSDISTMIN));
-	addModifier(RLV_BHVR_SETCAM_FOCUSDISTMIN, RLV_MODIFIER_SETCAM_FOCUSDISTMIN, new RlvBehaviourModifier(0.0f, true, new RlvBehaviourModifier_CompMax()));
+	addModifier(RLV_BHVR_SETCAM_FOCUSDISTMIN, RLV_MODIFIER_SETCAM_FOCUSDISTMIN, new RlvBehaviourModifier("Camera - Focus Distance (Min)", 0.0f, true, new RlvBehaviourModifier_CompMax));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_focusdistmax", RLV_BHVR_SETCAM_FOCUSDISTMAX));
-	addModifier(RLV_BHVR_SETCAM_FOCUSDISTMAX, RLV_MODIFIER_SETCAM_FOCUSDISTMAX, new RlvBehaviourModifier(F32_MAX, true, new RlvBehaviourModifier_CompMin()));
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SETCAM_EYEOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_eyeoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
-	addModifier(RLV_BHVR_SETCAM_EYEOFFSET, RLV_MODIFIER_SETCAM_EYEOFFSET, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_EYEOFFSET>(LLVector3::zero, true, nullptr));
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_focusoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
-	addModifier(RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_MODIFIER_SETCAM_FOCUSOFFSET, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOCUSOFFSET>(LLVector3::zero, true, nullptr));
+	addModifier(RLV_BHVR_SETCAM_FOCUSDISTMAX, RLV_MODIFIER_SETCAM_FOCUSDISTMAX, new RlvBehaviourModifier("Camera - Focus Distance (Max)", F32_MAX, true, new RlvBehaviourModifier_CompMin));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_EYEOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_eyeoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
+	addModifier(RLV_BHVR_SETCAM_EYEOFFSET, RLV_MODIFIER_SETCAM_EYEOFFSET, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_EYEOFFSET>("Camera - Eye Offset", LLVector3::zero, true, nullptr));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_focusoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
+	addModifier(RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_MODIFIER_SETCAM_FOCUSOFFSET, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOCUSOFFSET>("Camera - Focus Offset", LLVector3::zero, true, nullptr));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_fovmin", RLV_BHVR_SETCAM_FOVMIN));
-	addModifier(RLV_BHVR_SETCAM_FOVMIN, RLV_MODIFIER_SETCAM_FOVMIN, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOVMIN>(DEFAULT_FIELD_OF_VIEW, true, new RlvBehaviourModifier_CompMax()));
+	addModifier(RLV_BHVR_SETCAM_FOVMIN, RLV_MODIFIER_SETCAM_FOVMIN, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOVMIN>("Camera - FOV (Min)", DEFAULT_FIELD_OF_VIEW, true, new RlvBehaviourModifier_CompMax));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_fovmax", RLV_BHVR_SETCAM_FOVMAX));
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SETCAM_MOUSELOOK, RLV_OPTION_NONE>("setcam_mouselook"));
-	addModifier(RLV_BHVR_SETCAM_FOVMAX, RLV_MODIFIER_SETCAM_FOVMAX, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOVMAX>(DEFAULT_FIELD_OF_VIEW, true, new RlvBehaviourModifier_CompMin()));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_MOUSELOOK, RLV_OPTION_NONE>("setcam_mouselook"));
+	addModifier(RLV_BHVR_SETCAM_FOVMAX, RLV_MODIFIER_SETCAM_FOVMAX, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOVMAX>("Camera - FOV (Max)", DEFAULT_FIELD_OF_VIEW, true, new RlvBehaviourModifier_CompMin));
 	addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("setcam_textures", RLV_BHVR_SETCAM_TEXTURES));
-	addModifier(RLV_BHVR_SETCAM_TEXTURES, RLV_MODIFIER_SETCAM_TEXTURE, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_TEXTURE>(IMG_DEFAULT, true, nullptr));
-	addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SETCAM_UNLOCK, RLV_OPTION_NONE>("setcam_unlock"));
+	addModifier(RLV_BHVR_SETCAM_TEXTURES, RLV_MODIFIER_SETCAM_TEXTURE, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_TEXTURE>("Camera - Forced Texture", IMG_DEFAULT, true, nullptr));
+	addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_UNLOCK, RLV_OPTION_NONE>("setcam_unlock"));
 
 	//
 	// Force-wear
@@ -388,8 +402,8 @@ void RlvBehaviourDictionary::toggleBehaviourFlag(const std::string& strBhvr, ERl
 // RlvBehaviourModifier
 //
 
-RlvBehaviourModifier::RlvBehaviourModifier(const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifier_Comp* pValueComparator)
-	: m_DefaultValue(defaultValue), m_fAddDefaultOnEmpty(fAddDefaultOnEmpty)
+RlvBehaviourModifier::RlvBehaviourModifier(std::string strName, const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifier_Comp* pValueComparator)
+	: m_strName(strName), m_DefaultValue(defaultValue), m_fAddDefaultOnEmpty(fAddDefaultOnEmpty), m_pValueComparator(pValueComparator)
 {
 	m_pValueComparator = (pValueComparator) ? pValueComparator : new RlvBehaviourModifier_Comp();
 }
@@ -500,15 +514,14 @@ bool RlvBehaviourModifier::convertOptionValue(const std::string& optionValue, Rl
 RlvCommand::RlvCommand(const LLUUID& idObj, const std::string& strCommand)
 	: m_fValid(false), m_idObj(idObj), m_pBhvrInfo(NULL), m_eParamType(RLV_TYPE_UNKNOWN), m_fStrict(false), m_eRet(RLV_RET_UNKNOWN)
 {
-	std::string strBehaviour;
-	if (m_fValid = parseCommand(strCommand, strBehaviour, m_strOption, m_strParam))
+	if (m_fValid = parseCommand(strCommand, m_strBehaviour, m_strOption, m_strParam))
 	{
 		S32 nTemp = 0;
 		if ( ("n" == m_strParam) || ("add" == m_strParam) )
 			m_eParamType = RLV_TYPE_ADD;
 		else if ( ("y" == m_strParam) || ("rem" == m_strParam) )
 			m_eParamType = RLV_TYPE_REMOVE;
-		else if (strBehaviour == "clear")						// clear is the odd one out so just make it its own type
+		else if (m_strBehaviour == "clear")						// clear is the odd one out so just make it its own type
 			m_eParamType = RLV_TYPE_CLEAR;
 		else if ("force" == m_strParam)
 			m_eParamType = RLV_TYPE_FORCE;
@@ -527,7 +540,7 @@ RlvCommand::RlvCommand(const LLUUID& idObj, const std::string& strCommand)
 		return;
 	}
 
-	m_pBhvrInfo = RlvBehaviourDictionary::instance().getBehaviourInfo(strBehaviour, m_eParamType, &m_fStrict);
+	m_pBhvrInfo = RlvBehaviourDictionary::instance().getBehaviourInfo(m_strBehaviour, m_eParamType, &m_fStrict);
 }
 
 bool RlvCommand::parseCommand(const std::string& strCommand, std::string& strBehaviour, std::string& strOption, std::string& strParam)
@@ -681,14 +694,6 @@ bool RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(const std::str
 	return true;
 }
 
-template<typename T>
-T RlvCommandOptionHelper::parseOption(const std::string& strOption)
-{
-	T value;
-	parseOption<T>(strOption, value);
-	return value;
-}
-
 bool RlvCommandOptionHelper::parseStringList(const std::string& strOption, std::vector<std::string>& optionList, const std::string& strSeparator)
 {
 	if (!strOption.empty())
@@ -921,9 +926,19 @@ bool RlvObject::hasBehaviour(ERlvBehaviour eBehaviour, bool fStrictOnly) const
 
 bool RlvObject::hasBehaviour(ERlvBehaviour eBehaviour, const std::string& strOption, bool fStrictOnly) const
 {
-	for (rlv_command_list_t::const_iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd)
-		if ( (itCmd->getBehaviourType() == eBehaviour) && (itCmd->getOption() == strOption) && ((!fStrictOnly) || (itCmd->isStrict())) )
+	for (const RlvCommand& rlvCmd : m_Commands)
+	{
+		// The specified behaviour is contained within the current object if:
+		//   - the (parsed) behaviour matches
+		//   - the option matches (or we're checking for an empty option and the command was reference counted)
+		//   - we're not matching on strict (or it is a strict command)
+		if ( (rlvCmd.getBehaviourType() == eBehaviour) &&
+			 ( (rlvCmd.getOption() == strOption) || ((strOption.empty()) && (rlvCmd.isRefCounted())) ) &&
+			 ( (!fStrictOnly) ||(rlvCmd.isStrict()) ) )
+		{
 			return true;
+		}
+	}
 	return false;
 }
 
diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h
index 35576d40516e01f4481ea64aadef3082668463cc..1e95052301fad92f5f2b9b870eeba109ecba80d8 100644
--- a/indra/newview/rlvhelper.h
+++ b/indra/newview/rlvhelper.h
@@ -116,6 +116,9 @@ template<ERlvBehaviour eBhvr> using RlvReplyHandler = RlvCommandHandler<RLV_TYPE
 // List of shared handlers
 typedef RlvBehaviourToggleHandler<RLV_BHVR_SETCAM_EYEOFFSET> RlvBehaviourCamEyeFocusOffsetHandler;	// Shared between @setcam_eyeoffset and @setcam_focusoffset
 typedef RlvBehaviourHandler<RLV_BHVR_REMATTACH> RlvBehaviourAddRemAttachHandler;					// Shared between @addattach and @remattach
+typedef RlvBehaviourHandler<RLV_BHVR_SENDCHANNEL> RlvBehaviourSendChannelHandler;	// Shared between @sendchannel and @sendchannel_except
+typedef RlvBehaviourHandler<RLV_BHVR_SENDIM> RlvBehaviourRecvSendStartIMHandler;	// Shared between @recvim, @sendim and @startim
+typedef RlvBehaviourToggleHandler<RLV_BHVR_SHOWSELF> RlvBehaviourShowSelfToggleHandler;	// Shared between @showself and @showselfhead
 typedef RlvForceHandler<RLV_BHVR_REMATTACH> RlvForceRemAttachHandler;								// Shared between @remattach and @detach
 typedef RlvForceHandler<RLV_BHVR_SETCAM_EYEOFFSET> RlvForceCamEyeFocusOffsetHandler;				// Shared between @setcam_eyeoffset and @setcam_focusoffset
 
@@ -150,13 +153,14 @@ template<ERlvBehaviourOptionType optionType> using RlvBehaviourGenericProcessor
 // RlvBehaviourProcessor and related classes - Handles add/rem comamnds aka "restrictions)
 //
 
-template <ERlvBehaviour eBhvr, ERlvBehaviourOptionType optionType, typename toggleHandlerImpl = RlvBehaviourToggleHandler<eBhvr>>
+template <ERlvBehaviour eBhvr, typename handlerImpl = RlvBehaviourHandler<eBhvr>, typename toggleHandlerImpl = RlvBehaviourToggleHandler<eBhvr>>
 class RlvBehaviourToggleProcessor : public RlvBehaviourInfo
 {
 public:
 	RlvBehaviourToggleProcessor(const std::string& strBhvr, U32 nBhvrFlags = 0) : RlvBehaviourInfo(strBhvr, eBhvr, RLV_TYPE_ADDREM, nBhvrFlags) {}
-	ERlvCmdRet processCommand(const RlvCommand& rlvCmd) const override { return RlvCommandHandlerBaseImpl<RLV_TYPE_ADDREM>::processCommand(rlvCmd, &RlvBehaviourGenericHandler<optionType>::onCommand, &toggleHandlerImpl::onCommandToggle); }
+	ERlvCmdRet processCommand(const RlvCommand& rlvCmd) const override { return RlvCommandHandlerBaseImpl<RLV_TYPE_ADDREM>::processCommand(rlvCmd, &handlerImpl::onCommand, &toggleHandlerImpl::onCommandToggle); }
 };
+template <ERlvBehaviour eBhvr, ERlvBehaviourOptionType optionType, typename toggleHandlerImpl = RlvBehaviourToggleHandler<eBhvr>> using RlvBehaviourGenericToggleProcessor = RlvBehaviourToggleProcessor<eBhvr, RlvBehaviourGenericHandler<optionType>, toggleHandlerImpl>;
 
 // ============================================================================
 // RlvBehaviourModifier - stores behaviour modifiers in an - optionally - sorted list and returns the first element (or default value if there are no modifiers)
@@ -199,7 +203,7 @@ struct RlvBehaviourModifier_CompMax : public RlvBehaviourModifier_Comp
 class RlvBehaviourModifier
 {
 public:
-	RlvBehaviourModifier(const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifier_Comp* pValueComparator = nullptr);
+	RlvBehaviourModifier(const std::string strName, const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifier_Comp* pValueComparator = nullptr);
 	virtual ~RlvBehaviourModifier();
 
 	/*
@@ -213,6 +217,7 @@ public:
 	bool                             getAddDefault() const { return m_fAddDefaultOnEmpty; }
 	const RlvBehaviourModifierValue& getDefaultValue() const { return m_DefaultValue; }
 	const LLUUID&                    getPrimaryObject() const;
+	const std::string&               getName() const { return m_strName; }
 	const RlvBehaviourModifierValue& getValue() const { return (hasValue()) ? m_Values.front().first : m_DefaultValue; }
 	template<typename T> const T&    getValue() const { return boost::get<T>(getValue()); }
 	bool                             hasValue() const;
@@ -226,6 +231,7 @@ public:
 	 * Member variables
 	 */
 protected:
+	std::string                          m_strName;
 	RlvBehaviourModifierValue            m_DefaultValue;
 	bool                                 m_fAddDefaultOnEmpty;
 	std::list<RlvBehaviourModifierValueTuple> m_Values;
@@ -238,8 +244,8 @@ class RlvBehaviourModifierHandler : public RlvBehaviourModifier
 {
 public:
 	//using RlvBehaviourModifier::RlvBehaviourModifier; // Needs VS2015 and up
-	RlvBehaviourModifierHandler(const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifier_Comp* pValueComparator)
-		: RlvBehaviourModifier(defaultValue, fAddDefaultOnEmpty, pValueComparator) {}
+	RlvBehaviourModifierHandler(const std::string& strName, const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifier_Comp* pValueComparator)
+		: RlvBehaviourModifier(strName, defaultValue, fAddDefaultOnEmpty, pValueComparator) {}
 protected:
 	void onValueChange() const override;
 };
@@ -313,6 +319,7 @@ protected:
 class RlvBehaviourDictionary : public LLSingleton<RlvBehaviourDictionary>
 {
 	friend class LLSingleton<RlvBehaviourDictionary>;
+	friend class RlvFloaterBehaviours;
 protected:
 	RlvBehaviourDictionary();
 	~RlvBehaviourDictionary();
@@ -362,7 +369,7 @@ public:
 	 */
 public:
 	std::string        asString() const;
-	const std::string& getBehaviour() const		{ return (m_pBhvrInfo) ? m_pBhvrInfo->getBehaviour() : LLStringUtil::null; }
+	const std::string& getBehaviour() const		{ return (m_pBhvrInfo) ? m_pBhvrInfo->getBehaviour() : m_strBehaviour; }
 	ERlvBehaviour      getBehaviourType() const	{ return (m_pBhvrInfo) ? m_pBhvrInfo->getBehaviourType() : RLV_BHVR_UNKNOWN; }
 	U32                getBehaviourFlags() const{ return (m_pBhvrInfo) ? m_pBhvrInfo->getBehaviourFlags() : 0; }
 	const LLUUID&      getObjectID() const		{ return m_idObj; }
@@ -372,12 +379,14 @@ public:
 	ERlvCmdRet         getReturnType() const	{ return m_eRet; }
 	bool               hasOption() const		{ return !m_strOption.empty(); }
 	bool               isBlocked() const        { return (m_pBhvrInfo) ? m_pBhvrInfo->isBlocked() : false; }
+	bool               isRefCounted() const     { return m_fRefCounted; }
 	bool               isStrict() const			{ return m_fStrict; }
 	bool               isValid() const			{ return m_fValid; }
-	ERlvCmdRet         processCommand() const   { return (m_pBhvrInfo) ? m_pBhvrInfo->processCommand(*this) : RLV_RET_FAILED_UNKNOWN; }
+	ERlvCmdRet         processCommand() const   { return (m_pBhvrInfo) ? m_pBhvrInfo->processCommand(*this) : RLV_RET_NO_PROCESSOR; }
 
 protected:
 	static bool parseCommand(const std::string& strCommand, std::string& strBehaviour, std::string& strOption,  std::string& strParam);
+	bool               markRefCounted() const   { return m_fRefCounted = true; }
 
 	/*
 	 * Operators
@@ -391,15 +400,18 @@ public:
 protected:
 	bool                    m_fValid;
 	LLUUID                  m_idObj;
+	std::string             m_strBehaviour;
 	const RlvBehaviourInfo* m_pBhvrInfo;
 	ERlvParamType           m_eParamType;
 	bool                    m_fStrict;
 	std::string             m_strOption;
 	std::string             m_strParam;
 	ERlvCmdRet              m_eRet;
+	mutable bool            m_fRefCounted;
 
 	friend class RlvHandler;
 	friend class RlvObject;
+	template<ERlvParamType> friend struct RlvCommandHandlerBaseImpl;
 };
 
 // ============================================================================
@@ -411,7 +423,12 @@ class RlvCommandOptionHelper
 public:
 	// NOTE: this function is destructive (reference value may still change on parsing failure)
 	template<typename T> static bool parseOption(const std::string& strOption, T& valueOption);
-	template<typename T> static T parseOption(const std::string& strOption);
+	template<typename T> static T parseOption(const std::string& strOption)
+	{
+		T value;
+		parseOption<T>(strOption, value);
+		return value;
+	}
 	static bool parseStringList(const std::string& strOption, std::vector<std::string>& optionList, const std::string& strSeparator = std::string(RLV_OPTION_SEPARATOR));
 };
 
diff --git a/indra/newview/rlvlocks.cpp b/indra/newview/rlvlocks.cpp
index 520a0ee959e0586b0f38e3a203b59af581ef3b11..d7f86b81b710671d554ba716153ff989036298a1 100644
--- a/indra/newview/rlvlocks.cpp
+++ b/indra/newview/rlvlocks.cpp
@@ -20,12 +20,14 @@
 #include "llattachmentsmgr.h"
 #include "lloutfitobserver.h"
 #include "llviewerobjectlist.h"
+#include "llviewermenu.h"
 #include "pipeline.h"
 
 #include "rlvlocks.h"
 #include "rlvhelper.h"
 #include "rlvinventory.h"
 
+
 // ============================================================================
 // RlvAttachPtLookup member functions
 //
@@ -401,8 +403,7 @@ void RlvAttachmentLocks::updateLockedHUD()
 	// Reset HUD visibility and wireframe options if at least one HUD attachment is locked
 	if (m_fHasLockedHUD)
 	{
-		LLPipeline::sShowHUDAttachments = TRUE;
-		gUseWireframe = FALSE;
+		set_use_wireframe(false);
 	}
 }
 
diff --git a/indra/newview/rlvui.cpp b/indra/newview/rlvui.cpp
index 951b1c223cc2a4203354e4a14a988cc396071234..8c4517c41c7e787052e083e60ec5f96e19c9cb9d 100644
--- a/indra/newview/rlvui.cpp
+++ b/indra/newview/rlvui.cpp
@@ -17,14 +17,11 @@
 #include "llviewerprecompiledheaders.h"
 #include "llagent.h"
 #include "llavataractions.h"			// LLAvatarActions::profileVisible()
-#include "llavatarlist.h"				// Avatar list control used by the "Nearby" tab in the "People" sidebar panel
-#include "llavatarnamecache.h"
 #include "llfloatersidepanelcontainer.h"
 #include "llhudtext.h"					// LLHUDText::refreshAllObjectText()
 #include "llimview.h"					// LLIMMgr::computeSessionID()
 #include "llmoveview.h"					// Movement panel (contains "Stand" and "Stop Flying" buttons)
 #include "llnavigationbar.h"			// Navigation bar
-#include "llpanelpeople.h"				// "People" sidebar panel
 #include "llparcel.h"
 #include "llpaneltopinfobar.h"
 #include "llteleporthistory.h"
@@ -47,7 +44,6 @@ RlvUIEnabler::RlvUIEnabler()
 
 	// onRefreshHoverText()
 	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWLOC, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
-	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWNAMES, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
 	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWHOVERTEXTALL, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
 	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWHOVERTEXTWORLD, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
 	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWHOVERTEXTHUD, boost::bind(&RlvUIEnabler::onRefreshHoverText, this)));
@@ -65,7 +61,6 @@ RlvUIEnabler::RlvUIEnabler()
 	// onToggleXXX
 	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWLOC, boost::bind(&RlvUIEnabler::onToggleShowLoc, this)));
 	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWMINIMAP, boost::bind(&RlvUIEnabler::onToggleShowMinimap, this)));
-	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWNAMES, boost::bind(&RlvUIEnabler::onToggleShowNames, this, _1)));
 	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_SHOWWORLDMAP, boost::bind(&RlvUIEnabler::onToggleShowWorldMap, this)));
 	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_UNSIT, boost::bind(&RlvUIEnabler::onToggleUnsit, this)));
 
@@ -211,42 +206,6 @@ void RlvUIEnabler::onToggleShowMinimap()
 	}
 }
 
-// Checked: 2010-12-08 (RLVa-1.4.0a) | Modified: RLVa-1.2.2c
-void RlvUIEnabler::onToggleShowNames(bool fQuitting)
-{
-	if (fQuitting)
-		return;							// Nothing to do if the viewer is shutting down
-
-	bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES);
-
-	// Refresh the nearby people list
-	LLPanelPeople* pPeoplePanel = LLFloaterSidePanelContainer::getPanel<LLPanelPeople>("people", "panel_people");
-	RLV_ASSERT( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) );
-	if ( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) )
-	{
-		if (pPeoplePanel->getNearbyList()->isInVisibleChain())
-			pPeoplePanel->onCommit();
-		pPeoplePanel->getNearbyList()->updateAvatarNames();
-	}
-
-//	// Refresh the speaker list
-//	LLCallFloater* pCallFloater = LLFloaterReg::findTypedInstance<LLCallFloater>("voice_controls");
-//	if (pCallFloater)
-//		pCallFloater->getAvatarCallerList()->updateAvatarNames();
-
-	// Force the use of the "display name" cache so we can filter both display and legacy names (or return back to the user's preference)
-	if (!fEnable)
-	{
-		LLAvatarNameCache::setForceDisplayNames(true);
-	}
-	else
-	{
-		LLAvatarNameCache::setForceDisplayNames(false);
-		LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames"));
-	}
-	LLVOAvatar::invalidateNameTags();	// See handleDisplayNamesOptionChanged()
-}
-
 // Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
 void RlvUIEnabler::onToggleShowWorldMap()
 {
diff --git a/indra/newview/rlvui.h b/indra/newview/rlvui.h
index a83d8bce5f6c870adaf2331ad7f51be485fd5587..72fb2891fb5690bbea2dfc7d5af30e0205f05fba 100644
--- a/indra/newview/rlvui.h
+++ b/indra/newview/rlvui.h
@@ -47,7 +47,6 @@ protected:
 	void onToggleMovement();											// fly, alwaysrun and temprun
 	void onToggleShowLoc();												// showloc
 	void onToggleShowMinimap();											// showminimap
-	void onToggleShowNames(bool fQuitting);								// shownames
 	void onToggleShowWorldMap();										// showworldmap
 	void onToggleTp();													// tploc and tplm
 	void onToggleUnsit();												// unsit
diff --git a/indra/newview/skins/default/xui/en/floater_rlv_behaviours.xml b/indra/newview/skins/default/xui/en/floater_rlv_behaviours.xml
index 861f8028485e4e627fc48625b629c4a3bde3b645..965b9172592aeb58b280d01b154e8370b6b0efd4 100644
--- a/indra/newview/skins/default/xui/en/floater_rlv_behaviours.xml
+++ b/indra/newview/skins/default/xui/en/floater_rlv_behaviours.xml
@@ -6,20 +6,20 @@
   can_resize="true"
   height="300"
   min_height="300"
-  min_width="300"
+  min_width="450"
   name="rlv_behaviours"
   save_rect="true"
   save_visibility="false"
   single_instance="true"
   title="ACTIVE RLV RESTRICTIONS"
-  width="300">
+  width="450">
   <tab_container
     follows="all"
     layout="topleft"
-    left="8"  
+    left="8"
     name="behaviour_tab"
     height="266"
-    right="-8"   
+    right="-8"
     tab_height="23"
     tab_min_width="120"
     tab_position="top"
@@ -31,16 +31,16 @@
       name="behaviour_panel"
       top="0">
       <scroll_list
-	draw_border="false"
-	draw_heading="true"
-	draw_stripes="true"
-	follows="all"
-	height="266"
-	layout="topleft"
-	multi_select="false"
-	name="behaviour_list"
-	tool_tip="List of current RLVa restrictions."
-	top_pad="0" >
+	     draw_border="false"
+	     draw_heading="true"
+	     draw_stripes="true"
+	     follows="all"
+	     height="266"
+	     layout="topleft"
+	     multi_select="false"
+	     name="behaviour_list"
+	     tool_tip="List of current RLVa restrictions."
+	     top_pad="0" >
         <scroll_list.columns label="Restriction" name="behaviour" width="70" />
         <scroll_list.columns label="Object Name" name="issuer" />
       </scroll_list>
@@ -52,21 +52,43 @@
       name="exception_panel"
       top="0"> 
       <scroll_list
-	draw_border="false"
-	draw_heading="true"
-	draw_stripes="true"
-	follows="all"
-	height="266"
-	layout="topleft"
-	multi_select="false"
-	name="exception_list"
-	tool_tip="List of current RLVa exceptions."
-	top_pad="0" >
+	     draw_border="false"
+	     draw_heading="true"
+	     draw_stripes="true"
+	     follows="all"
+	     height="266"
+	     layout="topleft"
+	     multi_select="false"
+	     name="exception_list"
+	     tool_tip="List of current RLVa exceptions."
+	     top_pad="0" >
         <scroll_list.columns label="Exception" name="behaviour" width="70" />
         <scroll_list.columns label="Source" name="option" width="105" />
         <scroll_list.columns label="Object Name" name="issuer" />
       </scroll_list>
     </panel>
+    <panel
+      follows="all"  height="265"
+      label="MODIFIERS"
+      layout="topleft"
+      name="modifier_panel"
+      top="0">
+      <scroll_list
+       draw_border="false"
+       draw_heading="true"
+       draw_stripes="true"
+       follows="all"
+       height="266"
+       layout="topleft"
+       multi_select="false"
+       name="modifier_list"
+       tool_tip="List of current RLVa modifiers."
+       top_pad="0" >
+        <scroll_list.columns label="Modifier" name="modifier" width="105" />
+        <scroll_list.columns label="Value" name="value" width="105" />
+        <scroll_list.columns label="Primary Object" name="primary" />
+      </scroll_list>
+    </panel>
   </tab_container>
   <panel
    background_visible="false"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
index 91516d3ec178e33e58ce9bff7e4470e9216074df..bfcaf28e3b4c07567dc111e05dfc91539e31e663 100755
--- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
@@ -10,8 +10,7 @@
          function="ShowAgentProfile"
          parameter="hit object" />
         <menu_item_call.on_enable
-         function="RLV.EnableIfNot"
-         parameter="shownames" />
+         function="RLV.CanShowName" />
     </menu_item_call>
    <menu_item_call
      enabled="false"
@@ -28,8 +27,7 @@
         <menu_item_call.on_click
          function="Avatar.SendIM" />
         <menu_item_call.on_enable
-         function="RLV.EnableIfNot"
-         parameter="shownames" />
+         function="RLV.CanShowName" />
     </menu_item_call>
     <menu_item_call
      label="Call"
@@ -45,8 +43,7 @@
         <menu_item_call.on_click
          function="Avatar.InviteToGroup" />
         <menu_item_call.on_enable
-         function="RLV.EnableIfNot"
-         parameter="shownames" />
+         function="RLV.CanShowName" />
       </menu_item_call>
    <menu_item_separator />
     <menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
index 597f8ce38e4154551077fbdf23eab65dd77f9efd..d88b42114f21581e98f920ef27edf4e1c85f4a4e 100755
--- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
@@ -10,8 +10,7 @@
          function="ShowAgentProfile"
          parameter="hit object" />
         <menu_item_call.on_enable
-         function="RLV.EnableIfNot"
-         parameter="shownames" />
+         function="RLV.CanShowName" />
     </menu_item_call>
    <menu_item_call
      enabled="false"
@@ -28,8 +27,7 @@
         <menu_item_call.on_click
          function="Avatar.SendIM" />
         <menu_item_call.on_enable
-         function="RLV.EnableIfNot"
-         parameter="shownames" />
+         function="RLV.CanShowName" />
     </menu_item_call>
     <menu_item_call
      label="Call"
@@ -45,8 +43,7 @@
         <menu_item_call.on_click
          function="Avatar.InviteToGroup" />
         <menu_item_call.on_enable
-         function="RLV.EnableIfNot"
-         parameter="shownames" />
+         function="RLV.CanShowName" />
       </menu_item_call>
     
    <menu_item_separator />
@@ -110,6 +107,8 @@
      name="Pay...">
         <menu_item_call.on_click
          function="PayObject" />       
+        <menu_item_call.on_enable
+         function="EnablePayAvatar" />
     </menu_item_call>
 
    <menu_item_separator />
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 2bce8488f4a1e1b4dc39a69d0deb79e7d0d98ce0..5bb12beb745a240b4474d68bc535b9a88912b45d 100755
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1643,16 +1643,6 @@
       	 function="ToggleControl"
       	 parameter="RestrainedLoveShowEllipsis" />
       </menu_item_check>
-      <menu_item_check
-       label="Show Name Tags"
-       name="Show Name Tags">
-      	<menu_item_check.on_check
-      	 function="CheckControl"
-      	 parameter="RLVaShowNameTags" />
-      	<menu_item_check.on_click
-      	 function="ToggleControl"
-      	 parameter="RLVaShowNameTags" />
-      </menu_item_check>
       <menu_item_check
        label="Wear Replaces Unlocked"
        name="Wear Replaces Unlocked">
diff --git a/indra/newview/skins/default/xui/en/rlva_strings.xml b/indra/newview/skins/default/xui/en/rlva_strings.xml
index 0e3c27ca0a945d5b12a5137b2894d6137f32c587..6861f9c4657bf7caee12ba1c0e0b35150435ff1e 100644
--- a/indra/newview/skins/default/xui/en/rlva_strings.xml
+++ b/indra/newview/skins/default/xui/en/rlva_strings.xml
@@ -46,6 +46,11 @@
 		</map>
 
 		<!-- Shown as notifications -->
+		<key>blocked_autopilot</key>
+		<map>
+			<key>value</key>
+			<string>Unable to use the autopilot due to RLV restrictions</string>
+		</map>
 		<key>blocked_generic</key>
 		<map>
 			<key>value</key>
@@ -76,6 +81,11 @@
 			<key>value</key>
 			<string>Unable to initiate teleport due to RLV restrictions</string>
 		</map>
+		<key>blocked_teleport_offer</key>
+		<map>
+			<key>value</key>
+			<string>Unable to offer teleport due to RLV restrictions</string>
+		</map>
 		<key>blocked_viewxxx</key>
 		<map>
 			<key>value</key>