diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 32d72e5c1d8589acb573eeff89469bdf6d8f1487..3bb7f18b987f61104747bab942846d1e96e3e23b 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -3311,10 +3311,11 @@ void LLAgent::teleportRequest(
 // Landmark ID = LLUUID::null means teleport home
 void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
 {
-// [RLVa:KB] - Checked: 2010-04-01 (RLVa-1.2.0c) | Modified: RLVa-1.0.0d
-	// TODO-RLVa: [RLVa-1.2.1] Allow teleporting home if @tplm=n restricted but not @tploc=n restricted and vice versa?
+// [RLVa:KB] - Checked: 2010-08-22 (RLVa-1.2.1a) | Modified: RLVa-1.2.1a
+	// NOTE: we'll allow teleporting home unless both @tplm=n *and* @tploc=n restricted
 	if ( (rlv_handler_t::isEnabled()) &&
-		 ( (gRlvHandler.hasBehaviour(RLV_BHVR_TPLM)) || 
+		 ( ( (landmark_asset_id.notNull()) ? gRlvHandler.hasBehaviour(RLV_BHVR_TPLM)
+		                                   : gRlvHandler.hasBehaviour(RLV_BHVR_TPLM) && gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC) ) ||
 		   ((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (isAgentAvatarValid()) && (gAgentAvatarp->isSitting())) ))
 	{
 		return;
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 2651ab967125caf2b8284503cff86aa25fde1ec4..298f50f2bf27099e3b54a37588f01a3bbb82de16 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -75,6 +75,10 @@
 
 #include "llwindow.h"			// copyTextToClipboard()
 
+// [RLVa:KB] - Checked: 2010-08-22 (RLVa-1.2.1a)
+#include "rlvhandler.h"
+// [/RLVa:KB]
+
 //---------------------------------------------------------------------------
 // Constants
 //---------------------------------------------------------------------------
@@ -434,6 +438,10 @@ void LLFloaterWorldMap::draw()
 //	childSetEnabled("Clear", (BOOL)tracking_status);
 	childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->isTracking());
 	childSetEnabled("copy_slurl", (mSLURL.isValid()) );
+// [RLVa:KB] - Checked: 2010-08-22 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
+	childSetEnabled("Go Home", 
+		(!rlv_handler_t::isEnabled()) || !(gRlvHandler.hasBehaviour(RLV_BHVR_TPLM) && gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC)));
+// [/RLVa:KB]
 
 	setMouseOpaque(TRUE);
 	getDragHandle()->setMouseOpaque(TRUE);
diff --git a/indra/newview/rlvui.cpp b/indra/newview/rlvui.cpp
index 3fc008ffa59e06b3598f629d51ccb7ce3517aaa2..1100ef60e5e7b685f93c0e49b9a3e1e1a38c76c8 100644
--- a/indra/newview/rlvui.cpp
+++ b/indra/newview/rlvui.cpp
@@ -69,6 +69,10 @@ RlvUIEnabler::RlvUIEnabler()
 	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)));
 
+	// onToggleTp
+	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_TPLOC, boost::bind(&RlvUIEnabler::onToggleTp, this)));
+	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_TPLM, boost::bind(&RlvUIEnabler::onToggleTp, this)));
+
 	// onUpdateLoginLastLocation
 	#ifdef RLV_EXTENSION_STARTLOCATION
 	m_Handlers.insert(std::pair<ERlvBehaviour, behaviour_handler_t>(RLV_BHVR_TPLOC, boost::bind(&RlvUIEnabler::onUpdateLoginLastLocation, this)));
@@ -323,6 +327,16 @@ void RlvUIEnabler::onToggleShowWorldMap()
 		removeGenericFloaterFilter("world_map");
 }
 
+// Checked: 2010-08-22 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
+void RlvUIEnabler::onToggleTp()
+{
+	// Disable the navigation bar "Home" button if both @tplm=n *and* @tploc=n restricted
+	LLButton* pNavBarHomeBtn = LLNavigationBar::getInstance()->getChild<LLButton>("home_btn");
+	RLV_ASSERT(pNavBarHomeBtn);
+	if (pNavBarHomeBtn)
+		pNavBarHomeBtn->setEnabled(!(gRlvHandler.hasBehaviour(RLV_BHVR_TPLM) && gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC)));
+}
+
 // Checked: 2010-03-01 (RLVa-1.2.0c) | Added: RLVa-1.2.0a
 void RlvUIEnabler::onToggleUnsit()
 {
diff --git a/indra/newview/rlvui.h b/indra/newview/rlvui.h
index 9625ec90b792611f0033074791f7383d6b7e6980..6c6a6a40eb2ebdba22854c7fccd143502d3e8891 100644
--- a/indra/newview/rlvui.h
+++ b/indra/newview/rlvui.h
@@ -52,6 +52,7 @@ protected:
 	void onToggleShowMinimap();											// showminimap
 	void onToggleShowNames();											// shownames
 	void onToggleShowWorldMap();										// showworldmap
+	void onToggleTp();													// tploc and tplm
 	void onToggleUnsit();												// unsit
 	void onToggleViewXXX();												// viewnote, viewscript, viewtexture
 	void onUpdateLoginLastLocation();									// tploc and unsit