diff --git a/indra/llappearance/llwearabletype.h b/indra/llappearance/llwearabletype.h
index a63f524fcc93ef2ad1050947b000e959377d47a8..a6cb875a00a959fc6a830b72e996a8d963e9a7f9 100644
--- a/indra/llappearance/llwearabletype.h
+++ b/indra/llappearance/llwearabletype.h
@@ -112,9 +112,9 @@ class LLWearableType final : public LLParamSingleton<LLWearableType>
         ~LLWearableDictionary() = default;
 
 // [RLVa:KB] - Checked: 2010-03-03 (RLVa-1.2.0a) | Added: RLVa-1.2.0a
-    protected:
-        // The default implementation asserts on 'notFound()' and returns -1 which isn't a valid EWearableType
-        virtual LLWearableType::EType notFound() const { return LLWearableType::WT_INVALID; }
+	protected:
+		// The default implementation asserts on 'notFound()' and returns -1 which isn't a valid EWearableType
+		LLWearableType::EType notFound() const override { return LLWearableType::WT_INVALID; }
 // [/RLVa:KB]
     };
 
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 8bdc00c14dac98839370f1545596065db1164906..00e0ae87ab9390d09189d3b9788f8cffc805071b 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -225,18 +225,6 @@ void LLAgentCamera::init()
 	
 	mCameraPreset = (ECameraPreset) gSavedSettings.getU32("CameraPresetType");
 
-// [RLVa:KB] - @setcam_eyeoffset, @setcam_focusoffset and @setcam_eyeoffsetscale
-	if (RlvActions::isRlvEnabled())
-	{
-		mRlvCameraOffsetInitialControl = gSavedSettings.declareVec3("CameraOffsetRLVaView", LLVector3::zero, "Declared in code", LLControlVariable::PERSIST_NO);
-		mRlvCameraOffsetInitialControl->setHiddenFromSettingsEditor(true);
-		mRlvCameraOffsetScaleControl = gSavedSettings.declareF32("CameraOffsetScaleRLVa", 0.0f, "Declared in code", LLControlVariable::PERSIST_NO);
-		mRlvCameraOffsetScaleControl->setHiddenFromSettingsEditor(true);
-		mRlvFocusOffsetInitialControl = gSavedSettings.declareVec3d("FocusOffsetRLVaView", LLVector3d::zero, "Declared in code", LLControlVariable::PERSIST_NO);
-		mRlvFocusOffsetInitialControl->setHiddenFromSettingsEditor(true);
-	}
-// [/RLVa:KB]
-
 	mCameraCollidePlane.clearVec();
 	mCurrentCameraDistance = getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale");
 	mTargetCameraDistance = mCurrentCameraDistance;
@@ -1793,11 +1781,11 @@ LLVector3d LLAgentCamera::calcThirdPersonFocusOffset()
 		agent_rot *= ((LLViewerObject*)(gAgentAvatarp->getParent()))->getRenderRotation();
 	}
 
-    //static LLCachedControl<LLVector3d> focus_offset_initial(gSavedSettings, "FocusOffsetRearView", LLVector3d());
 // [RLVa:KB] - @setcam_focusoffset
-	focus_offset_initial = getFocusOffsetInitial();
+    return getFocusOffsetInitial() * agent_rot;
 // [/RLVa:KB]
-	return focus_offset_initial * agent_rot;
+//    static LLCachedControl<LLVector3d> focus_offset_initial(gSavedSettings, "FocusOffsetRearView", LLVector3d());
+//	return focus_offset_initial * agent_rot;
 }
 
 void LLAgentCamera::setupSitCamera()
@@ -1946,7 +1934,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)
 		else
 		{
 // [RLVa:KB] - @setcam_eyeoffsetscale
-			local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * getCameraOffsetScale();
+            local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * getCameraOffsetScale();
 // [/RLVa:KB]
 //            static LLCachedControl<F32> camera_offset_scale(gSavedSettings, "CameraOffsetScale");
 //            local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * camera_offset_scale;
@@ -2256,8 +2244,9 @@ LLVector3 LLAgentCamera::getCameraOffsetInitial()
     // getCameraOffsetInitial and getFocusOffsetInitial can be called on update from idle before init()
     static LLCachedControl<LLVector3> camera_offset_initial (gSavedSettings, "CameraOffsetRearView", LLVector3());
 // [RLVa:KB] - @setcam_eyeoffset
-	return (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? camera_offset_initial : convert_from_llsd<LLVector3>(mRlvCameraOffsetInitialControl->get(), TYPE_VEC3, "");
-// [/RLVa:KB]	
+    static LLCachedControl<LLVector3> camera_offset_initial_rlv (gSavedSettings, "CameraOffsetRLVaView", LLVector3());
+    return (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? camera_offset_initial : camera_offset_initial_rlv;
+// [/RLVa:KB]
 //	return camera_offset_initial;
 }
 
@@ -2265,7 +2254,8 @@ LLVector3d LLAgentCamera::getFocusOffsetInitial()
 {
     static LLCachedControl<LLVector3d> focus_offset_initial(gSavedSettings, "FocusOffsetRearView", LLVector3d());
 // [RLVa:KB] - @setcam_focusoffset
-	return (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? focus_offset_initial :convert_from_llsd<LLVector3d>(mRlvFocusOffsetInitialControl->get(), TYPE_VEC3D, "");
+    static LLCachedControl<LLVector3d> focus_offset_initial_rlv(gSavedSettings, "FocusOffsetRLVaView", LLVector3d());
+    return (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? focus_offset_initial : focus_offset_initial_rlv;
 // [/RLVa:KB]
 //	return focus_offset_initial;
 }
@@ -2273,9 +2263,9 @@ LLVector3d LLAgentCamera::getFocusOffsetInitial()
 // [RLVa:KB] - @setcam_eyeoffsetscale
 F32 LLAgentCamera::getCameraOffsetScale() const
 {
-	static const LLCachedControl<F32> cam_offset_scale(gSavedSettings, "CameraOffsetScale");
-	static const LLCachedControl<F32> cam_offset_scale_rlva(gSavedSettings, "CameraOffsetScaleRLVa", 0.0f, "Declared in code");
-	return (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? cam_offset_scale : cam_offset_scale_rlva;
+    static LLCachedControl<F32> camera_offset_scale(gSavedSettings, "CameraOffsetScale");
+	static LLCachedControl<F32> camera_offset_scale_rlv(gSavedSettings, "CameraOffsetScaleRLVa");
+	return (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? camera_offset_scale : camera_offset_scale_rlv;
 }
 // [/RLVa:KB]
 
@@ -2718,9 +2708,9 @@ void LLAgentCamera::switchCameraPreset(ECameraPreset preset)
 			else
 			{
 				// When switching to our view, copy the current values
-				mRlvCameraOffsetInitialControl->setDefaultValue(convert_to_llsd(getCameraOffsetInitial()));
-				mRlvFocusOffsetInitialControl->setDefaultValue(convert_to_llsd(getFocusOffsetInitial()));
-				mRlvCameraOffsetScaleControl->setDefaultValue(getCameraOffsetScale());
+				gSavedSettings.setVector3("CameraOffsetRLVaView", getCameraOffsetInitial());
+				gSavedSettings.setVector3d("FocusOffsetRLVaView", getFocusOffsetInitial());
+				gSavedSettings.setF32("CameraOffsetScaleRLVa", getCameraOffsetScale());
 			}
 		}
 	}
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index ceff8c520f2af55121ae89134b9a9bdcdb13f401..b77ea4a44761fdfdef9aa37aeee3782426d9be7f 100644
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -144,19 +144,6 @@ class LLAgentCamera
 	/** Camera preset in Third Person Mode */
 	ECameraPreset mCameraPreset; 
 
-// [RLVa:KB] - @setcam_eyeoffset
-	LLPointer<LLControlVariable> mRlvCameraOffsetInitialControl;
-// [/RLVa:KB]
-
-// [RLVa:KB] - @setcam_eyeoffsetscale
-	LLPointer<LLControlVariable> mRlvCameraOffsetScaleControl;
-// [/RLVa:KB]
-
-//	LLPointer<LLControlVariable> mFocusOffsetInitial;
-// [RLVa:KB] - @setcam_focusoffset
-	LLPointer<LLControlVariable> mRlvFocusOffsetInitialControl;
-// [/RLVa:KB]
-
 	LLQuaternion mInitSitRot;
 
 	//--------------------------------------------------------------------
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 5ac65e5b903f6fbeb6172317c634236b5d780e19..8af3a09043fe8ae83508aed36aeacf5870793ee1 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -2198,7 +2198,7 @@ void LLAppearanceMgr::filterWearableItems(
                 continue;
 //            S32 start_index = llmax(0,size-max_per_type);
 // [SL:KB] - Patch: Appearance-Misc | Checked: 2010-05-11 (Catznip-2.0)
-			S32 start_index = llmax(0, size - ((LLWearableType::getInstance()->getAllowMultiwear((LLWearableType::EType)i)) ? max_per_type : 1));
+			S32 start_index = llmax(0, size - ((LLWearableType::instance().getAllowMultiwear((LLWearableType::EType)i)) ? max_per_type : 1));
 // [/SL:KB[
             for (S32 j = start_index; j<size; j++)
             {
diff --git a/indra/newview/llattachmentsmgr.cpp b/indra/newview/llattachmentsmgr.cpp
index 34b11a44082b50da6227960ee6a090f2945abaf6..d5a530e2f4fd3bc732c5377f24cd218ab37360c3 100644
--- a/indra/newview/llattachmentsmgr.cpp
+++ b/indra/newview/llattachmentsmgr.cpp
@@ -167,7 +167,7 @@ void LLAttachmentsMgr::onIdle()
 
 	expireOldDetachRequests();
 
-//    checkInvalidCOFLinks();
+//	checkInvalidCOFLinks();
 	
 	spamStatusInfo();
 }
@@ -592,51 +592,51 @@ bool LLAttachmentsMgr::isAttachmentStateComplete() const
 //	{
 //		return;
 //	}
-//        LLInventoryModel::cat_array_t cat_array;
-//        LLInventoryModel::item_array_t item_array;
-//        gInventory.collectDescendents(LLAppearanceMgr::instance().getCOF(),
-//                                      cat_array,item_array,LLInventoryModel::EXCLUDE_TRASH);
-//        for (S32 i=0; i<item_array.size(); i++)
-//        {
-//            const LLViewerInventoryItem* inv_item = item_array.at(i).get();
-//            const LLUUID& item_id = inv_item->getLinkedUUID();
-//            if (inv_item->getType() == LLAssetType::AT_OBJECT)
-//            {
-//                LLTimer timer;
-//                bool is_flagged_questionable = mQuestionableCOFLinks.getTime(item_id,timer);
-//                bool is_wearing_attachment = isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item_id);
-//                if (is_wearing_attachment && is_flagged_questionable)
-//                {
-//                    LL_DEBUGS("Avatar") << "ATT was flagged questionable but is now " 
-//                                        << (is_wearing_attachment ? "attached " : "") 
-//                                        <<"removing flag after "
-//                                        << timer.getElapsedTimeF32() << " item "
-//                                        << inv_item->getName() << " id " << item_id << LL_ENDL;
-//                    mQuestionableCOFLinks.removeTime(item_id);
-//                }
-//            }
-//        }
+//	LLInventoryModel::cat_array_t cat_array;
+//	LLInventoryModel::item_array_t item_array;
+//	gInventory.collectDescendents(LLAppearanceMgr::instance().getCOF(),
+//								  cat_array,item_array,LLInventoryModel::EXCLUDE_TRASH);
+//	for (S32 i=0; i<item_array.size(); i++)
+//	{
+//		const LLViewerInventoryItem* inv_item = item_array.at(i).get();
+//		const LLUUID& item_id = inv_item->getLinkedUUID();
+//		if (inv_item->getType() == LLAssetType::AT_OBJECT)
+//		{
+//			LLTimer timer;
+//			bool is_flagged_questionable = mQuestionableCOFLinks.getTime(item_id,timer);
+//			bool is_wearing_attachment = isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item_id);
+//			if (is_wearing_attachment && is_flagged_questionable)
+//			{
+//				LL_DEBUGS("Avatar") << "ATT was flagged questionable but is now " 
+//									<< (is_wearing_attachment ? "attached " : "") 
+//									<<"removing flag after "
+//									<< timer.getElapsedTimeF32() << " item "
+//									<< inv_item->getName() << " id " << item_id << LL_ENDL;
+//				mQuestionableCOFLinks.removeTime(item_id);
+//			}
+//		}
+//	}
 //
-//        for(LLItemRequestTimes::iterator it = mQuestionableCOFLinks.begin();
-//            it != mQuestionableCOFLinks.end(); )
-//        {
-//            LLItemRequestTimes::iterator curr_it = it;
-//            ++it;
-//            const LLUUID& item_id = curr_it->first;
-//            LLViewerInventoryItem *inv_item = gInventory.getItem(item_id);
-//            if (curr_it->second.getElapsedTimeF32() > MAX_BAD_COF_TIME)
-//            {
-//                if (LLAppearanceMgr::instance().isLinkedInCOF(item_id))
-//                {
-//                    LL_DEBUGS("Avatar") << "ATT Linked in COF but not attached or requested, deleting link after "
-//                                        << curr_it->second.getElapsedTimeF32() << " seconds for " 
-//                                        << (inv_item ? inv_item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
-//                    LLAppearanceMgr::instance().removeCOFItemLinks(item_id);
-//                }
-//				mQuestionableCOFLinks.erase(curr_it);
-//                continue;
-//            }
-//        }
+//	for(LLItemRequestTimes::iterator it = mQuestionableCOFLinks.begin();
+//		it != mQuestionableCOFLinks.end(); )
+//	{
+//		LLItemRequestTimes::iterator curr_it = it;
+//		++it;
+//		const LLUUID& item_id = curr_it->first;
+//		LLViewerInventoryItem *inv_item = gInventory.getItem(item_id);
+//		if (curr_it->second.getElapsedTimeF32() > MAX_BAD_COF_TIME)
+//		{
+//			if (LLAppearanceMgr::instance().isLinkedInCOF(item_id))
+//			{
+//				LL_DEBUGS("Avatar") << "ATT Linked in COF but not attached or requested, deleting link after "
+//									<< curr_it->second.getElapsedTimeF32() << " seconds for " 
+//									<< (inv_item ? inv_item->getName() : "UNKNOWN") << " id " << item_id << LL_ENDL;
+//				LLAppearanceMgr::instance().removeCOFItemLinks(item_id);
+//			}
+//			mQuestionableCOFLinks.erase(curr_it);
+//			continue;
+//		}
+//	}
 //}
 
 void LLAttachmentsMgr::spamStatusInfo()
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index cf476ed33d96e739ee378484167d302221f667fb..ec973c51a049b63cf4f919b25bc0840b83afc841 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -1477,7 +1477,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
 			}
 //			else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log && chat.mSourceType != CHAT_SOURCE_REGION)
 // [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
-			else if (chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log && chat.mSourceType != CHAT_SOURCE_REGION && !chat.mRlvNamesFiltered)
+			else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log && chat.mSourceType != CHAT_SOURCE_REGION && !chat.mRlvNamesFiltered)
 // [/RLVa:KB]
 			{
 				LLStyle::Params link_params(body_message_params);
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index 7a4ca69729efa3b0adf212c9d313b25c3b7c0645..5ea92cde22ced5cb5febc872072bdc1aea710790 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -36,6 +36,9 @@
 #include "llconversationmodel.h"
 #include "llimview.h" //For LLIMModel
 #include "lltrans.h"
+// [RLVa:KB] - @shownames
+#include "rlvactions.h"
+// [/RLVa:KB]
 
 //
 // Conversation items : common behaviors
@@ -598,8 +601,13 @@ void LLConversationItemParticipant::onAvatarNameCache(const LLAvatarName& av_nam
 
 void LLConversationItemParticipant::updateName(const LLAvatarName& av_name)
 {
-	mName = av_name.getUserName();
-	mDisplayName = av_name.getDisplayName();
+// [RLVa:KB] - @shownames
+	bool fRlvCanShowName = (!mRlvCheckShowNames) || (RlvActions::canShowName(RlvActions::SNC_DEFAULT, mUUID));
+	mName = (fRlvCanShowName) ? av_name.getUserName() : LLStringUtil::null;
+	mDisplayName = (fRlvCanShowName) ? av_name.getDisplayName() : RlvStrings::getAnonym(av_name);
+// [/RLVa:KB]
+//	mName = av_name.getUserName();
+//	mDisplayName = av_name.getDisplayName();
 	
 	if (mDisplayModeratorLabel)
 	{
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index 7efe03da21c5eab77ef349a66750fe020ac2bdfc..1e1bece1464613bf68a9921415dbfa2ae3e603d1 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -218,6 +218,10 @@ class LLConversationItemParticipant : public LLConversationItem
 	void setModeratorOptionsVisible(bool visible) { mDisplayModeratorOptions = visible; }
 	void setDisplayModeratorRole(bool displayRole);
 	void setGroupBanVisible(bool visible) { mDisplayGroupBanOptions = visible; }
+// [RLVa:KB] - @shownames
+	void setRlvCheckShowNames(bool fRlvCheckShowNames) { mRlvCheckShowNames = fRlvCheckShowNames; }
+// [/RLVa:KB]
+
 
 private:
 	void onAvatarNameCache(const LLAvatarName& av_name);	// callback used by fetchAvatarName
@@ -226,6 +230,9 @@ class LLConversationItemParticipant : public LLConversationItem
 	bool mIsModeratorMuted;	         // default is false
 	bool mIsModerator;	         // default is false
 	bool mDisplayModeratorLabel; // default is false
+// [RLVa:KB] - @shownames
+	bool mRlvCheckShowNames;
+// [/RLVa:KB]
 	std::string mDisplayName;
 	F64  mDistToAgent;  // Distance to the agent. A negative (meaningless) value means the distance has not been set.
 	boost::signals2::connection mAvatarNameCacheConnection;
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index c650446412968603eb53cd22beba6101609ff2b8..c55836d99fa2a569decad37baded7ede4238d167 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -1453,6 +1453,23 @@ void LLFloaterIMContainer::doToSelected(const LLSD& userdata)
     const LLConversationItem * conversationItem = getCurSelectedViewModelItem();
     uuid_vec_t selected_uuids;
 
+// [RLVa:KB] - @shownames
+	// Bulldozer block of all actions but both Catznip and Firestorm have no need for CHUI
+	if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT))
+	{
+		if (LLConversationItemParticipant* pParticipantItem = dynamic_cast<LLConversationItemParticipant*>(const_cast<LLConversationItem*>(conversationItem)))
+		{
+			if (LLConversationItemSession* pParentSession = pParticipantItem->getParentSession())
+			{
+				if ( (pParentSession->getUUID().isNull()) && (selected_uuids.size() != 1 || !RlvActions::canShowName(RlvActions::SNC_DEFAULT, selected_uuids.front())) )
+				{
+					return;
+				}
+			}
+		}
+	}
+// [/RLVa:KB]
+
     if(conversationItem != NULL)
     {
     	getParticipantUUIDs(selected_uuids);
@@ -1619,7 +1636,14 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
 	}
 
 	// Handle all other options
-	if (("can_invite" == item)
+// [RLVa:KB] - @pay
+    if ("can_pay" == item)
+    {
+		return is_single_select && RlvActions::canPayAvatar(single_id);
+    }
+	else if (("can_invite" == item)
+// [/RLVa:KB]
+//	if (("can_invite" == item)
         || ("can_chat_history" == item)
         || ("can_share" == item)
 // [RLVa:KB] - @pay
@@ -1630,12 +1654,6 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
 		// Those menu items are enable only if a single avatar is selected
 		return is_single_select;
 	}
-// [RLVa:KB] - @pay
-    else if ("can_pay" == item)
-    {
-		return is_single_select && RlvActions::canPayAvatar(single_id);
-    }
-// [/RLVa:KB]
     else if ("can_block" == item)
     {
         return (is_single_select ? LLAvatarActions::canBlock(single_id) : false);
diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h
index 1117abb00d8fee58c87854add445781a32d33823..583f41267c6f5b198c9d10d6fe1b1d42530ba3af 100644
--- a/indra/newview/llfloaterimsessiontab.h
+++ b/indra/newview/llfloaterimsessiontab.h
@@ -37,6 +37,9 @@
 #include "llconversationmodel.h"
 #include "llconversationview.h"
 #include "lltexteditor.h"
+// [RLVa:KB] - @shownames
+#include "rlvhelper.h"
+// [/RLVa:KB]
 
 class LLPanelChatControlPanel;
 class LLChatEntry;
@@ -46,6 +49,10 @@ class LLPanelEmojiComplete;
 class LLFloaterIMSessionTab
 	: public LLTransientDockableFloater
 {
+// [RLVa:KB] - @shownames
+	friend struct RlvCommandHandler<RLV_TYPE_ADDREM, RLV_BHVR_SHOWNAMES>;
+	friend struct RlvCommandHandler<RLV_TYPE_ADDREM, RLV_BHVR_SHOWNEARBY>;
+// [/RLVa:KB]
 	using super = LLTransientDockableFloater;
 
 public:
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 5678975830cfd834da03044fe29d8a487ca800e6..286556f1dae04d850c7cbed38657bbdcfe4f03f6 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1590,6 +1590,13 @@ void LLFloaterPreference::buildPopupLists()
 
 void LLFloaterPreference::refreshEnabledState()
 {
+// [RLVa:KB] - Checked: 2013-05-11 (RLVa-1.4.9)
+	if (RlvActions::isRlvEnabled())
+	{
+		getChild<LLUICtrl>("do_not_disturb_response")->setEnabled(!RlvActions::hasBehaviour(RLV_BHVR_SENDIM));
+	}
+// [/RLVa:KB]
+
 	// Cannot have floater active until caps have been received
 	getChild<LLButton>("default_creation_permissions")->setEnabled(LLStartUp::getStartupState() < STATE_STARTED ? false : true);
 
diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
index cc7a88475e9cc2a097ed9485f9c6d39c7b05a113..a4db2fd75492151b97f3210970f75b93cfd6e6ff 100644
--- a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
+++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
@@ -40,6 +40,9 @@
 #include "llviewertexturelist.h"
 #include "llvoavatar.h"
 #include "pipeline.h"
+// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a)
+#include "rlvactions.h"
+// [/RLVa:KB]
 
 
 LLFloaterPreferenceGraphicsAdvanced::LLFloaterPreferenceGraphicsAdvanced(const LLSD& key)
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index bc34dc407f4e49fc09a313d4abf05186126d043a..2bf67ae760cf2e3290393d15b733d83896d88454 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -1417,10 +1417,11 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
 // [RLVa:KB] - Checked: RLVa-1.4.9
 				if (rlv_handler_t::isEnabled())
 				{
-					if ( ((IM_LURE_USER == dialog) && (!RlvActions::canAcceptTpOffer(from_id))) ||
-					     ((IM_TELEPORT_REQUEST == dialog) && (!RlvActions::canAcceptTpRequest(from_id))) )
+                    bool fBlockTpLure = (IM_LURE_USER == dialog) && (!RlvActions::canAcceptTpOffer(from_id));
+                    bool fBlockTpRequest = (IM_TELEPORT_REQUEST == dialog) && (!RlvActions::canAcceptTpRequest(from_id));
+					if ( fBlockTpLure || fBlockTpRequest )
 					{
-						RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RlvStringKeys::Blocked::TpLureRequestRemote));
+						RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(fBlockTpLure ? RlvStringKeys::Blocked::TpLureRemote : RlvStringKeys::Blocked::TpRequestRemote));
 						if (is_do_not_disturb)
 							send_do_not_disturb_message(gMessageSystem, from_id);
 						return;
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index c8ba04708c3032b2564086f472756bd98d0d3b55..09e64c61db4e22dd26f8042593857f3b61ffde09 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -2328,14 +2328,14 @@ void LLInventoryModel::notifyObservers(const LLUUID& transaction_id)
 	mChangedItemIDs.insert(mChangedItemIDsBacklog.begin(), mChangedItemIDsBacklog.end());
 	mAddedItemIDs.clear();
 	mAddedItemIDs.insert(mAddedItemIDsBacklog.begin(), mAddedItemIDsBacklog.end());
+// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
+    mTransactionId.setNull();
+// [/SL:KB]
 
 	mModifyMaskBacklog = LLInventoryObserver::NONE;
 	mChangedItemIDsBacklog.clear();
 	mAddedItemIDsBacklog.clear();
 
-// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
-    mTransactionId.setNull();
-// [/SL:KB]
 	mIsNotifyObservers = FALSE;
 }
 
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 4e08427bd6ecbfdcbd582353ae845f3c66e343fb..2f7bf3277343e3690ea2447a3f762133614bac8a 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -608,6 +608,9 @@ class LLInventoryModel
 	U32 mModifyMask;
 	changed_items_t mChangedItemIDs;
 	changed_items_t mAddedItemIDs;
+// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
+    LLUUID mTransactionId;
+// [/SL:KB]
     // Fallback when notifyObservers is in progress
     U32 mModifyMaskBacklog;
     changed_items_t mChangedItemIDsBacklog;
@@ -616,9 +619,6 @@ class LLInventoryModel
     broken_links_t mPossiblyBrockenLinks; // there can be multiple links per item
     changed_items_t mLinksRebuildList;
     boost::signals2::connection mBulkFecthCallbackSlot;
-// [SL:KB] - Patch: UI-Notifications | Checked: Catznip-6.5
-    LLUUID mTransactionId;
-// [/SL:KB]
 	
 	
 	//--------------------------------------------------------------------
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 62f206495118cf77cbfb1a0f2bddbdfa4a45c480..c26daec7b7eb74ca88e052719628ec0cffea6a94 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -854,7 +854,7 @@ 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))
+//    if (handleToolTipAgent(mClosestAgentToCursor))
 // [RLVa:KB] - Checked: RLVa-1.2.2
 	bool fRlvCanShowName = (mClosestAgentToCursor.notNull()) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, mClosestAgentToCursor));
 	if ( (fRlvCanShowName) && (handleToolTipAgent(mClosestAgentToCursor)) )
@@ -863,11 +863,6 @@ BOOL LLNetMap::handleToolTip(S32 x, S32 y, MASK mask)
         return true;
     }
 
-// [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]
-
     // The popup menu uses the hover parcel when it is open and the mouse is on
     // top of it, with some additional tolerance. Returning early here prevents
     // fighting over that hover parcel when getting tooltip info in the
@@ -895,7 +890,7 @@ BOOL LLNetMap::handleToolTip(S32 x, S32 y, MASK mask)
     {
 //        std::string region_name = region->getName();
 // [RLVa:KB] - Checked: RLVa-1.2.2
-		std::string region_name = (RlvActions::canShowLocation()) ? region->getName() : RlvStrings::getString(RlvStringKeys::Hidden::Region);
+        std::string region_name = (RlvActions::canShowLocation()) ? region->getName() : RlvStrings::getString(RlvStringKeys::Hidden::Region);
 // [/RLVa:KB]
         if (!region_name.empty())
         {
@@ -967,13 +962,17 @@ BOOL LLNetMap::handleToolTip(S32 x, S32 y, MASK mask)
         tool_tip_hint_msg = mToolTipHintMsg;
     }
 
- //   LLStringUtil::format_map_t args;
+	LLStringUtil::format_map_t args;
     args["[PARCEL_NAME_MSG]"]       = parcel_name_msg.empty() ? "" : parcel_name_msg + '\n';
     args["[PARCEL_SALE_PRICE_MSG]"] = parcel_sale_price_msg.empty() ? "" : parcel_sale_price_msg + '\n';
     args["[PARCEL_SALE_AREA_MSG]"]  = parcel_sale_area_msg.empty() ? "" : parcel_sale_area_msg + '\n';
     args["[PARCEL_OWNER_MSG]"]      = parcel_owner_msg.empty() ? "" : parcel_owner_msg + '\n';
     args["[REGION_NAME_MSG]"]       = region_name_msg.empty() ? "" : region_name_msg + '\n';
     args["[TOOL_TIP_HINT_MSG]"]     = tool_tip_hint_msg.empty() ? "" : tool_tip_hint_msg + '\n';
+// [RLVa:KB] - Checked: RLVa-1.2.2
+	LLAvatarName avName;
+	args["[AGENT]"] = ( (!fRlvCanShowName) && (mClosestAgentToCursor.notNull()) && (LLAvatarNameCache::get(mClosestAgentToCursor, &avName)) ) ? RlvStrings::getAnonym(avName) + "\n" : "";
+// [/RLVa:KB]
 
     std::string msg                 = mToolTipMsg;
     LLStringUtil::format(msg, args);
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index ae89a8dbffae263e407e6434509da66355559bf6..764cd51eb4b4aa680152d2654cede788694ab58b 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -104,6 +104,19 @@ void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t c
 	mValidateSpeakerCallback = cb;
 }
 
+// [RLVa:KB] - @shownames
+void LLParticipantList::refreshNames()
+{
+	for (LLFolderViewModelItem* pChildItem : mChildren)
+	{
+		if (LLConversationItemParticipant* pConversationItem = dynamic_cast<LLConversationItemParticipant*>(pChildItem))
+		{
+			pConversationItem->updateName();
+		}
+	}
+}
+// [/RLVa:KB]
+
 void LLParticipantList::update()
 {
 	mSpeakerMgr->update(true);
@@ -215,6 +228,9 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
 		// Create a participant view model instance
 		participant = new LLConversationItemParticipant(display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name, avatar_id, mRootViewModel);
 	}
+// [RLVa:KB] - @shownames
+	participant->setRlvCheckShowNames(mSpeakerMgr->getSessionID().isNull());
+// [/RLVa:KB]
 
 	// *TODO : Need to update the online/offline status of the participant
 	// Hack for this: LLAvatarTracker::instance().isBuddyOnline(avatar_id))
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index f58a593d4f5824a5583559002db426abda63bf35..df3c1e8d28722421de485704e04a6d20e9319c60 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -50,6 +50,13 @@ class LLParticipantList : public LLConversationItemSession
 	 */
 	void addAvatarIDExceptAgent(const LLUUID& avatar_id);
 
+// [RLVa:KB] - @shownames
+	/**
+	 * Refreshes the name of each (avatar) participant
+	 */
+	void refreshNames();
+// [/RLVa:KB]
+
 	/**
 	 * Refreshes the participant list.
 	 */
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index b3db10764b61ec68f0431591a23f5d396de48686..323aa3e1614da01e5fdc9d49f600614dbc927cb5 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -771,9 +771,6 @@ void settings_setup_listeners()
     setting_setup_signal_listener(gSavedSettings, "RenderDeferredNoise", handleReleaseGLBufferChanged);
     setting_setup_signal_listener(gSavedSettings, "RenderDebugPipeline", handleRenderDebugPipelineChanged);
     setting_setup_signal_listener(gSavedSettings, "RenderResolutionDivisor", handleRenderResolutionDivisorChanged);
-// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
-	setting_setup_signal_listener(gSavedSettings, "RenderResolutionMultiplier", handleRenderResolutionDivisorChanged);
-// [/SL:KB]
     setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged);
     setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
     setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);
@@ -781,6 +778,9 @@ void settings_setup_listeners()
     setting_setup_signal_listener(gSavedSettings, "RenderShaderCacheEnabled", handleSetShaderChanged);
     setting_setup_signal_listener(gSavedSettings, "RenderShadowDetail", handleSetShaderChanged);
     setting_setup_signal_listener(gSavedSettings, "RenderDeferredSSAO", handleSetShaderChanged);
+// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
+	setting_setup_signal_listener(gSavedSettings, "RenderResolutionMultiplier", handleRenderResolutionDivisorChanged);
+// [/SL:KB]
     setting_setup_signal_listener(gSavedSettings, "RenderPerformanceTest", handleRenderPerfTestChanged);
     setting_setup_signal_listener(gSavedSettings, "ChatFontName", handleChatFontSizeChanged);
     setting_setup_signal_listener(gSavedSettings, "ChatFontSize", handleChatFontSizeChanged);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 6f9e07c3ff228602e08253fbb450c184e55ad3b0..3dc1c3b4986f3d8a6641f94ffaafa0ad7a84435f 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -3015,7 +3015,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updateMediaImage()
     llassert(!gCubeSnapshot);
 //    if (!mMediaSource)
 // [SL:KB] - Patch: Render-TextureToggle (Catznip-4.0)
-	if ( (!mMediaSource) || ((LLViewerFetchedTexture::sDefaultDiffuseImagep.notNull()) && (LLViewerFetchedTexture::sDefaultDiffuseImagep->getID() == mTextureId)))
+	if ( (!mMediaSource) || ((LLViewerFetchedTexture::sDefaultDiffuseImagep.notNull()) && (LLViewerFetchedTexture::sDefaultDiffuseImagep->getID() == mTextureId)) )
 // [/SL:KB]
     {
         return nullptr; // not ready for updating
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index f588320d359ed3b5549c458665c91351794cbf20..7c1ad3e0c499e6245b30a5ad6f99e22446b17114 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -4479,10 +4479,12 @@ class LLLandSit : public view_listener_t
 		if ( (rlv_handler_t::isEnabled()) && ((!RlvActions::canStand()) || (gRlvHandler.hasBehaviour(RLV_BHVR_SIT))) )
 			return true;
 // [/RLVa:KB]
+
         if (gAgent.isSitting())
         {
             gAgent.standUp();
         }
+
         LLVector3d posGlobal = LLToolPie::getInstance()->getPick().mPosGlobal;
 
         LLQuaternion target_rot;
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 126ffa0b45a10b2bdeec9ca480f0c245a93e3857..bdf2bd39246ecf0235dfa59c4514642146086dd8 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3258,6 +3258,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
 	const F32 time_visible = mTimeVisible.getElapsedTimeF32();
 	static const LLCachedControl<F32> NAME_SHOW_TIME(gSavedSettings, "RenderNameShowTime");	// seconds
 	static const LLCachedControl<F32> FADE_DURATION(gSavedSettings, "RenderNameFadeDuration"); // seconds
+    static LLCachedControl<bool> use_chat_bubbles(gSavedSettings, "UseChatBubbles");
 // [RLVa:KB] - Checked: RLVa-2.0.1
 	bool fRlvShowAvTag = true, fRlvShowAvName = true;
 	if (RlvActions::isRlvEnabled())
@@ -3266,14 +3267,15 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
 		fRlvShowAvName = (fRlvShowAvTag) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, getID()));
 	}
 // [/RLVa:KB]
-	static const LLCachedControl<bool> use_chat_bubble(gSavedSettings, "UseChatBubbles");
-	bool visible_chat = use_chat_bubble && (mChats.size() || mTyping);
+	bool visible_chat = use_chat_bubbles && (mChats.size() || mTyping);
 	bool render_name =	visible_chat ||
 // [RLVa:KB] - Checked: RLVa-2.0.1
-						((fRlvShowAvTag) &&
+		((fRlvShowAvTag) &&
+		 ((sRenderName == RENDER_NAME_ALWAYS) ||
+		  (sRenderName == RENDER_NAME_FADE && time_visible < NAME_SHOW_TIME)));
 // [/RLVa:KB]
-		((sRenderName == RENDER_NAME_ALWAYS) ||
-		                 (sRenderName == RENDER_NAME_FADE && time_visible < NAME_SHOW_TIME)));
+//		(((sRenderName == RENDER_NAME_ALWAYS) ||
+//		  (sRenderName == RENDER_NAME_FADE && time_visible < NAME_SHOW_TIME)));
 	// If it's your own avatar, don't draw in mouselook, and don't
 	// draw if we're specifically hiding our own name.
 	if (isSelf())
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 6b1e5cdd3c8528fa05e7e95e84308169c3005bea..b7f698d1281c9ef4191ce411210f9b47b864c0de 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -1552,35 +1552,6 @@ void LLWorld::getAvatars(region_gpos_map_t* umap, const LLVector3d& relative_to,
 	}
 }
 
-// [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 : getRegionList())
-	{
-		for (S32 idxAgent = 0, cntAgent = pRegion->mMapAvatarIDs.size(); idxAgent < cntAgent; ++idxAgent)
-		{
-			if (idAvatar == pRegion->mMapAvatarIDs[idxAgent])
-			{
-				posAvatar = unpackLocalToGlobalPosition(pRegion->mMapAvatars[idxAgent], pRegion->getOriginGlobal(), pRegion->getWidthScaleFactor());
-				return true;
-			}
-		}
-	}
-
-	return false;
-}
-// [/RLVa:KB]
-
 F32 LLWorld::getNearbyAvatarsAndMaxGPUTime(std::vector<LLCharacter*> &valid_nearby_avs)
 {
     static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 64);
@@ -1611,6 +1582,35 @@ F32 LLWorld::getNearbyAvatarsAndMaxGPUTime(std::vector<LLCharacter*> &valid_near
     return nearby_max_complexity;
 }
 
+// [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/rlvcommon.cpp b/indra/newview/rlvcommon.cpp
index a7ba58f900aebda10851e2ce99d097b20ebd57fc..70b30b744fd546074cbb8ec267db77ca6f21b32f 100644
--- a/indra/newview/rlvcommon.cpp
+++ b/indra/newview/rlvcommon.cpp
@@ -283,6 +283,23 @@ void RlvStrings::initClass()
 	}
 }
 
+// Used to provide fallback behaviour whenever we rename/split/join customizable string values
+LLSD& RlvStrings::cleanStringValues(LLSD& sdStringValues)
+{
+	LLSD sdValues(sdStringValues);
+	for (LLSD::map_const_iterator itString = sdValues.beginMap(); itString != sdValues.endMap(); ++itString)
+	{
+		if (itString->first == "blocked_tplurerequest_remote")
+		{
+			sdStringValues.erase("blocked_tplurerequest_remote");
+			sdStringValues[RlvStringKeys::Blocked::TpLureRemote] = itString->second;
+			sdStringValues[RlvStringKeys::Blocked::TpRequestRemote] = itString->second;
+		}
+	}
+
+	return sdStringValues;
+}
+
 // Checked: 2011-11-08 (RLVa-1.5.0)
 void RlvStrings::loadFromFile(const std::string& strFilePath, bool fUserOverride)
 {
@@ -293,7 +310,7 @@ void RlvStrings::loadFromFile(const std::string& strFilePath, bool fUserOverride
 
 	if (sdFileData.has("strings"))
 	{
-		const LLSD& sdStrings = sdFileData["strings"];
+		const LLSD sdStrings = (!fUserOverride) ? sdFileData["strings"] : cleanStringValues(sdFileData["strings"]);
 		for (LLSD::map_const_iterator itString = sdStrings.beginMap(); itString != sdStrings.endMap(); ++itString)
 		{
 			if ( (!itString->second.has("value")) || ((fUserOverride) && (!hasString(itString->first))) )
diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h
index 0d0313548a0a992879e4257d9ab6f8fc289098e9..97ec4a41489dc5efa9ebc82246ea39f6f8b51c56 100644
--- a/indra/newview/rlvcommon.h
+++ b/indra/newview/rlvcommon.h
@@ -133,6 +133,7 @@ class RlvStrings
 {
 public:
 	static void initClass();
+	static LLSD& cleanStringValues(LLSD& sdValues);
 	static void loadFromFile(const std::string& strFilePath, bool fDefault);
 	static void saveToFile(const std::string& strFilePath);
 
diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h
index 2a6285fc66d6fccecb11c388463a2d58b02da8fb..98c2a8eefe77bfcba75fba1aa869523a701348ce 100644
--- a/indra/newview/rlvdefines.h
+++ b/indra/newview/rlvdefines.h
@@ -34,8 +34,8 @@ const S32 RLV_VERSION_BUILD_COMPAT = 0;
 
 // Implementation version
 const S32 RLVa_VERSION_MAJOR = 2;
-const S32 RLVa_VERSION_MINOR = 4;
-const S32 RLVa_VERSION_PATCH = 2;
+const S32 RLVa_VERSION_MINOR = 5;
+const S32 RLVa_VERSION_PATCH = 0;
 const S32 RLVa_IMPL_ID = 13;
 
 // Uncomment before a final release
@@ -441,7 +441,8 @@ namespace RlvStringKeys
 		inline constexpr std::string_view StartIm = "blocked_startim"sv;
 		inline constexpr std::string_view Teleport = "blocked_teleport"sv;
 		inline constexpr std::string_view TeleportOffer = "blocked_teleport_offer"sv;
-		inline constexpr std::string_view TpLureRequestRemote = "blocked_tplurerequest_remote"sv;
+		inline constexpr std::string_view TpLureRemote = "blocked_tplure_remote"sv;
+		inline constexpr std::string_view TpRequestRemote = "blocked_tprequest_remote"sv;
 		inline constexpr std::string_view ViewXxx = "blocked_viewxxx"sv;
 		inline constexpr std::string_view Wireframe = "blocked_wireframe"sv;
 	}
diff --git a/indra/newview/rlvfloaters.cpp b/indra/newview/rlvfloaters.cpp
index d9733274f1420e63a2534d121355281b23e55698..af6a3bd5799ca76c7a031f34555f1841a58dc5e3 100644
--- a/indra/newview/rlvfloaters.cpp
+++ b/indra/newview/rlvfloaters.cpp
@@ -45,7 +45,7 @@ std::string rlvGetItemName(const LLViewerInventoryItem* pItem)
 {
 	if ( (pItem) && ((LLAssetType::AT_BODYPART == pItem->getType()) || (LLAssetType::AT_CLOTHING == pItem->getType())) )
 	{
-		return llformat("%s (%s)", pItem->getName().c_str(), LLWearableType::getInstance()->getTypeName(pItem->getWearableType()).c_str());
+		return llformat("%s (%s)", pItem->getName().c_str(), LLWearableType::instance().getTypeName(pItem->getWearableType()).c_str());
 	}
 	else if ( (pItem) && (LLAssetType::AT_OBJECT == pItem->getType()) && (isAgentAvatarValid()) )
 	{
@@ -192,7 +192,7 @@ std::string rlvFolderLockSourceToTarget(RlvFolderLocks::folderlock_source_t lock
 			}
 		case RlvFolderLocks::ST_WEARABLETYPE:
 			{
-				const std::string& strTypeName = LLWearableType::getInstance()->getTypeName(boost::get<LLWearableType::EType>(lockSource.second));
+				const std::string& strTypeName = LLWearableType::instance().getTypeName(boost::get<LLWearableType::EType>(lockSource.second));
 				return llformat("Wearable type (%s)", strTypeName.c_str());
 			}
 		default:
@@ -531,7 +531,7 @@ void RlvFloaterLocks::refreshAll()
 	for (RlvWearableLocks::rlv_wearabletypelock_map_t::const_iterator itWearableType = wearableTypeAdd.begin(); 
 			itWearableType != wearableTypeAdd.end(); ++itWearableType)
 	{
-		sdColumns[2]["value"] = LLWearableType::getInstance()->getTypeLabel(itWearableType->first);
+		sdColumns[2]["value"] = LLWearableType::instance().getTypeLabel(itWearableType->first);
 		sdColumns[3]["value"] = rlvGetItemNameFromObjID(itWearableType->second);
 
 		pLockList->addElement(sdRow, ADD_BOTTOM);
@@ -542,7 +542,7 @@ void RlvFloaterLocks::refreshAll()
 	for (RlvWearableLocks::rlv_wearabletypelock_map_t::const_iterator itWearableType = wearableTypeRem.begin(); 
 			itWearableType != wearableTypeRem.end(); ++itWearableType)
 	{
-		sdColumns[2]["value"] = LLWearableType::getInstance()->getTypeName(itWearableType->first);
+		sdColumns[2]["value"] = LLWearableType::instance().getTypeName(itWearableType->first);
 		sdColumns[3]["value"] = rlvGetItemNameFromObjID(itWearableType->second);
 
 		pLockList->addElement(sdRow, ADD_BOTTOM);
diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp
index df3518f67aa45085b5aac2d88f3534bb4f6c2b78..f147230af3049fe814034298e682773f97a55da7 100644
--- a/indra/newview/rlvhandler.cpp
+++ b/indra/newview/rlvhandler.cpp
@@ -38,6 +38,7 @@
 #include "llavatarnamecache.h"			// @shownames
 #include "llavatarlist.h"				// @shownames
 #include "llfloatercamera.h"			// @setcam family
+#include "llfloaterimnearbychat.h"		// @shownames
 #include "llfloatersidepanelcontainer.h"// @shownames
 #include "llnotifications.h"			// @list IM query
 #include "llnotificationsutil.h"
@@ -45,6 +46,7 @@
 #include "llpaneloutfitsinventory.h"	// @showinv - "Appearance" floater
 #include "llpanelpeople.h"				// @shownames
 #include "llpanelwearing.h"				// @showinv - "Appearance / Current Outfit" panel
+#include "llparticipantlist.h"			// @shownames
 #include "llregionhandle.h"				// @tpto
 #include "llsidepanelappearance.h"		// @showinv - "Appearance / Edit appearance" panel
 #include "lltabcontainer.h"				// @showinv - Tab container control for inventory tabs
@@ -1555,6 +1557,16 @@ bool RlvHandler::setEnabled(bool fEnable)
 		// Reset to show assertions if the viewer version changed
 		if (gSavedSettings.getString("LastRunVersion") != gLastRunVersion)
 			gSavedSettings.set<bool>(RlvSettingNames::ShowAssertionFail, TRUE);
+
+		// Set up camera debug controls
+		{
+			LLControlVariable* pCameraOffsetRLVaView = gSavedSettings.declareVec3("CameraOffsetRLVaView", LLVector3::zero, "Declared in code", LLControlVariable::PERSIST_NO);
+			pCameraOffsetRLVaView->setHiddenFromSettingsEditor(true);
+			LLControlVariable* pCameraOffsetScaleRLVa = gSavedSettings.declareF32("CameraOffsetScaleRLVa", 0.0f, "Declared in code", LLControlVariable::PERSIST_NO);
+			pCameraOffsetScaleRLVa->setHiddenFromSettingsEditor(true);
+			LLControlVariable* pFocusOffsetRLVaView = gSavedSettings.declareVec3d("FocusOffsetRLVaView", LLVector3d::zero, "Declared in code", LLControlVariable::PERSIST_NO);
+			pFocusOffsetRLVaView->setHiddenFromSettingsEditor(true);
+		}
 	}
 
 	return m_fEnabled;
@@ -2597,6 +2609,15 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SHOWNAMES>::onCommandToggle(ERlvBehaviou
 		pPeoplePanel->getNearbyList()->updateAvatarNames();
 	}
 
+	// Refresh the nearby participant list
+	if (LLFloaterIMNearbyChat* pNearbyChatFloater = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))
+	{
+		if (LLParticipantList* pParticipantList = pNearbyChatFloater->getParticipantList())
+		{
+			pParticipantList->refreshNames();
+		}
+	}
+
 	// 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)
 	{
@@ -2689,6 +2710,17 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SHOWNEARBY>::onCommandToggle(ERlvBehavio
 			pPeoplePanel->updateNearbyList();
 	}
 
+	// Refresh the nearby participant list
+	if (LLFloaterIMNearbyChat* pNearbyChatFloater = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"))
+	{
+#ifdef CATZNIP
+		pNearbyChatFloater->updateShowParticipantList();
+		pNearbyChatFloater->updateExpandCollapseBtn();
+#else
+		// *TODO - Solution for CHUI
+#endif // CATZNIP
+	}
+
 	// Refresh that avatar's name tag and all HUD text
 	LLHUDText::refreshAllObjectText();
 }
@@ -3839,7 +3871,7 @@ ERlvCmdRet RlvHandler::onGetOutfit(const RlvCommand& rlvCmd, std::string& strRep
 
 	// (Compatibility: RLV-1.16.1 will execute @getoutfit=<channel> if <layer> is invalid while we just return failure)
 	LLWearableType::EType wtType = LLWearableType::WT_INVALID;
-	if ( (rlvCmd.hasOption()) && ((wtType = LLWearableType::getInstance()->typeNameToType(rlvCmd.getOption())) == LLWearableType::WT_INVALID) )
+	if ( (rlvCmd.hasOption()) && ((wtType = LLWearableType::instance().typeNameToType(rlvCmd.getOption())) == LLWearableType::WT_INVALID) )
 		return RLV_RET_FAILED_OPTION;
 
 	const LLWearableType::EType wtRlvTypes[] =
@@ -3859,7 +3891,7 @@ ERlvCmdRet RlvHandler::onGetOutfit(const RlvCommand& rlvCmd, std::string& strRep
 			// (nor do we hide a layer if the issuing object is the only one that has this layer locked)
 			bool fWorn = (gAgentWearables.getWearableCount(wtRlvTypes[idxType]) > 0) && 
 				( (!RlvSettings::getHideLockedLayers()) || 
-				  (LLAssetType::AT_BODYPART == LLWearableType::getInstance()->getAssetType(wtRlvTypes[idxType])) ||
+				  (LLAssetType::AT_BODYPART == LLWearableType::instance().getAssetType(wtRlvTypes[idxType])) ||
 				  (RlvForceWear::isForceRemovable(wtRlvTypes[idxType], true, rlvCmd.getObjectID())) );
 			strReply.push_back( (fWorn) ? '1' : '0' );
 		}
@@ -3900,7 +3932,7 @@ ERlvCmdRet RlvHandler::onGetOutfitNames(const RlvCommand& rlvCmd, std::string& s
 		{
 			if (!strReply.empty())
 				strReply.push_back(',');
-			strReply.append(LLWearableType::getInstance()->getTypeName(wtType));
+			strReply.append(LLWearableType::instance().getTypeName(wtType));
 		}
 	}
 	return RLV_RET_SUCCESS;
diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp
index 55064629b62c22c6ff4786ec1354476fc4ffd9ca..19181b659b982c4c29c2443980435b24d6810c85 100644
--- a/indra/newview/rlvhelper.cpp
+++ b/indra/newview/rlvhelper.cpp
@@ -866,7 +866,7 @@ bool RlvCommandOptionHelper::parseOption<float>(const std::string& strOption, fl
 template<>
 bool RlvCommandOptionHelper::parseOption<LLWearableType::EType>(const std::string& strOption, LLWearableType::EType& wtOption)
 {
-	wtOption = LLWearableType::getInstance()->typeNameToType(strOption);
+	wtOption = LLWearableType::instance().typeNameToType(strOption);
 	return (LLWearableType::WT_INVALID != wtOption) && (LLWearableType::WT_NONE != wtOption);
 }
 
@@ -1909,13 +1909,13 @@ void RlvBehaviourNotifyHandler::sendNotification(const std::string& strText, con
 // Checked: 2011-03-31 (RLVa-1.3.0f) | Added: RLVa-1.3.0f
 void RlvBehaviourNotifyHandler::onWear(LLWearableType::EType eType, bool fAllowed)
 {
-	sendNotification(llformat("worn %s %s", (fAllowed) ? "legally" : "illegally", LLWearableType::getInstance()->getTypeName(eType).c_str()));
+	sendNotification(llformat("worn %s %s", (fAllowed) ? "legally" : "illegally", LLWearableType::instance().getTypeName(eType).c_str()));
 }
 
 // Checked: 2011-03-31 (RLVa-1.3.0f) | Added: RLVa-1.3.0f
 void RlvBehaviourNotifyHandler::onTakeOff(LLWearableType::EType eType, bool fAllowed)
 {
-	sendNotification(llformat("unworn %s %s", (fAllowed) ? "legally" : "illegally", LLWearableType::getInstance()->getTypeName(eType).c_str()));
+	sendNotification(llformat("unworn %s %s", (fAllowed) ? "legally" : "illegally", LLWearableType::instance().getTypeName(eType).c_str()));
 }
 
 // Checked: 2011-03-31 (RLVa-1.3.0f) | Added: RLVa-1.3.0f
diff --git a/indra/newview/skins/default/xui/en/rlva_strings.xml b/indra/newview/skins/default/xui/en/rlva_strings.xml
index 654cf2b96b2944cdaace9a579e8a46e18476d494..f97767ba66880edfdf7aef6205476cff784c208e 100644
--- a/indra/newview/skins/default/xui/en/rlva_strings.xml
+++ b/indra/newview/skins/default/xui/en/rlva_strings.xml
@@ -199,14 +199,25 @@
 			<key>customizable</key>
 			<boolean>1</boolean>
 		</map>
-		<key>blocked_tplurerequest_remote</key>
+		<key>blocked_tplure_remote</key>
 		<map>
 			<key>value</key>
 			<string>The Resident is currently prevented from accepting. Please try again later.</string>
 			<key>description</key>
-			<string>Sent to the remote party when their teleport offer or request was blocked</string>
+			<string>Sent to the remote party when their teleport offer was blocked</string>
 			<key>label</key>
-			<string>Blocked teleport offer/request (remote)</string>
+			<string>Blocked teleport offer (remote)</string>
+			<key>customizable</key>
+			<boolean>1</boolean>
+		</map>
+		<key>blocked_tprequest_remote</key>
+		<map>
+			<key>value</key>
+			<string>The Resident is currently prevented from accepting. Please try again later.</string>
+			<key>description</key>
+			<string>Sent to the remote party when their teleport request was blocked</string>
+			<key>label</key>
+			<string>Blocked teleport request (remote)</string>
 			<key>customizable</key>
 			<boolean>1</boolean>
 		</map>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 94448b98bdb3290f18c8f8baf8128dc26f172ca6..e4ff0fb5fa3e78f4e512de38fbb407f69ebf2f12 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -4488,7 +4488,7 @@ and report the problem.
 
 	<string
      name="MinimapToolTipMsg">
-		[PARCEL_NAME_MSG][PARCEL_SALE_PRICE_MSG][PARCEL_SALE_AREA_MSG][PARCEL_OWNER_MSG][REGION_NAME_MSG][TOOL_TIP_HINT_MSG]
+		[AGENT][PARCEL_NAME_MSG][PARCEL_SALE_PRICE_MSG][PARCEL_SALE_AREA_MSG][PARCEL_OWNER_MSG][REGION_NAME_MSG][TOOL_TIP_HINT_MSG]
 	</string>
 	<string
      name="MinimapParcelNameMsg">