diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 751336a05fac0a15dd0dd7d5e94cd6fe0a3d20f0..4244703f400d1b7333f91209baae1d258f3031bc 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11779,6 +11779,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+	<key>RenderParcelSelectionToMaxHeight</key>
+	<map>
+		<key>Comment</key>
+		<string>Display selected parcel outline to max build height</string>
+		<key>Persist</key>
+		<integer>1</integer>
+		<key>Type</key>
+		<string>Boolean</string>
+		<key>Value</key>
+		<integer>0</integer>
+	</map>
     <key>RenderShaderCacheEnabled</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 3ea3bcbe1473990a180da9ea2a3b87eec594cd5e..822b982bfc37292946714c44e0a2991e3595fea6 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -492,7 +492,7 @@ void LLViewerParcelMgr::renderParcel(LLParcel* parcel )
 
 // north = a wall going north/south.  Need that info to set up texture
 // coordinates correctly.
-void LLViewerParcelMgr::renderOneSegment(F32 x1, F32 y1, F32 x2, F32 y2, F32 height, U8 direction, LLViewerRegion* regionp)
+void LLViewerParcelMgr::renderOneSegment(F32 x1, F32 y1, F32 x2, F32 y2, F32 height, U8 direction, LLViewerRegion* regionp, bool absolute_height /* = false */)
 {
 	// HACK: At edge of last region of world, we need to make sure the region
 	// resolves correctly so we can get a height value.
@@ -524,16 +524,19 @@ void LLViewerParcelMgr::renderOneSegment(F32 x1, F32 y1, F32 x2, F32 y2, F32 hei
 
 	if (height < 1.f)
 	{
-		z = z1+height;
+		z = absolute_height ? height : z1+height;
 		gGL.vertex3f(x1, y1, z);
 
 		gGL.vertex3f(x1, y1, z1);
 
-		z = z2 + height;
-		gGL.vertex3f(x2, y2, z);
-		gGL.vertex3f(x2, y2, z);
-		gGL.vertex3f(x1, y1, z1);
 		gGL.vertex3f(x2, y2, z2);
+
+		gGL.vertex3f(x1, y1, z);
+		gGL.vertex3f(x2, y2, z2);
+
+		z = absolute_height ? height : z2+height;
+
+		gGL.vertex3f(x2, y2, z);
 	}
 	else
 	{
@@ -569,15 +572,16 @@ void LLViewerParcelMgr::renderOneSegment(F32 x1, F32 y1, F32 x2, F32 y2, F32 hei
 		gGL.vertex3f(x2, y2, z2);
 
 		// top edge stairsteps
-		z = llmax(z2+height, z1+height);
-		gGL.texCoord2f(tex_coord1*0.5f + 0.5f, z*0.5f);
-		gGL.vertex3f(x1, y1, z);
-		gGL.texCoord2f(tex_coord1*0.5f + 0.5f, z*0.5f);
-		gGL.vertex3f(x1, y1, z);
+		z = absolute_height ? height : llmax(z2+height, z1+height);
+
 		gGL.texCoord2f(tex_coord2*0.5f+0.5f, z*0.5f);
 		gGL.vertex3f(x2, y2, z);
 		gGL.texCoord2f(tex_coord1*0.5f + 0.5f, z1*0.5f);
 		gGL.vertex3f(x1, y1, z1);
+		gGL.texCoord2f(tex_coord2*0.5f+0.5f, z*0.5f);
+		gGL.vertex3f(x2, y2, z);
+		gGL.texCoord2f(tex_coord1*0.5f + 0.5f, z*0.5f);
+		gGL.vertex3f(x1, y1, z);
 	}
 }
 
@@ -591,7 +595,10 @@ void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegi
 
 	LLGLSUIDefault gls_ui;
 	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-	LLGLDepthTest gls_depth(GL_TRUE);
+	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
+
+	static LLCachedControl<bool> RenderParcelSelectionToMaxBuildHeight(gSavedSettings, "RenderParcelSelectionToMaxHeight", false);
+	F32 height = RenderParcelSelectionToMaxBuildHeight ? LLWorld::instance().getRegionMaxHeight() : PARCEL_POST_HEIGHT;
 
 	gGL.color4f(1.f, 1.f, 0.f, 0.2f);
 
@@ -619,7 +626,7 @@ void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegi
 					has_segments = true;
 					gGL.begin(LLRender::TRIANGLES);
 				}
-				renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, SOUTH_MASK, regionp);
+				renderOneSegment(x1, y1, x2, y2, height, SOUTH_MASK, regionp, RenderParcelSelectionToMaxBuildHeight);
 			}
 
 			if (segment_mask & WEST_MASK)
@@ -635,7 +642,7 @@ void LLViewerParcelMgr::renderHighlightSegments(const U8* segments, LLViewerRegi
 					has_segments = true;
 					gGL.begin(LLRender::TRIANGLES);
 				}
-				renderOneSegment(x1, y1, x2, y2, PARCEL_POST_HEIGHT, WEST_MASK, regionp);
+				renderOneSegment(x1, y1, x2, y2, height, WEST_MASK, regionp, RenderParcelSelectionToMaxBuildHeight);
 			}
 		}
 	}
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index 34704ed4e19cb4bbdc6cbf4a17e773bfbd182f7c..e3bffb9c0f0ff0760a93f18674ee04f7b72674c2 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -145,14 +145,15 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()
 	addEntry(LLFolderType::FT_MARKETPLACE_LISTINGS, new ViewerFolderEntry("Marketplace Listings",   "Inv_SysOpen",			"Inv_SysClosed",		FALSE,     boxes_invisible));
 	addEntry(LLFolderType::FT_MARKETPLACE_STOCK,    new ViewerFolderEntry("New Stock",              "Inv_StockFolderOpen",	"Inv_StockFolderClosed",		FALSE,     false, "default"));
 	addEntry(LLFolderType::FT_MARKETPLACE_VERSION,  new ViewerFolderEntry("New Version",            "Inv_VersionFolderOpen","Inv_VersionFolderClosed",		FALSE,     false, "default"));
-	addEntry(LLFolderType::FT_SUITCASE,				new ViewerFolderEntry("My Suitcase",			"Inv_SysOpen", "Inv_SysClosed",							FALSE,		false));
-	addEntry(LLFolderType::FT_ANIM_OVERRIDES,		new ViewerFolderEntry("Animation Overrides",	"Inv_SysOpen",			"Inv_SysClosed",		FALSE,	false));
 
 	addEntry(LLFolderType::FT_NONE, 				new ViewerFolderEntry("New Folder",				"Inv_FolderOpen",		"Inv_FolderClosed",		FALSE,     false, "default"));
-	addEntry(LLFolderType::FT_TOXIC, 			new ViewerFolderEntry("Firstorm",				"Inv_FolderOpenToxic",		"Inv_FolderClosedToxic",		FALSE,     false));
-	addEntry(LLFolderType::FT_RLV, 					new ViewerFolderEntry("RlvRoot",				"Inv_SysOpen",			"Inv_SysClosed",		FALSE,     false));
-    addEntry(LLFolderType::FT_LOCAL,				new ViewerFolderEntry("Local Inventory",		"Inv_SysOpen",		"Inv_SysClosed",		FALSE, true));
 
+	addEntry(LLFolderType::FT_ANIM_OVERRIDES,		new ViewerFolderEntry("Animation Overrides",	"Inv_SysOpen",			"Inv_SysClosed",		FALSE,	false));
+	addEntry(LLFolderType::FT_TOXIC, 				new ViewerFolderEntry("Firestorm",				"Inv_FolderOpenToxic",	"Inv_FolderClosedToxic",	FALSE,     true));
+	addEntry(LLFolderType::FT_RLV, 					new ViewerFolderEntry("RlvRoot",				"Inv_SysOpen",			"Inv_SysClosed",			FALSE,  true));
+    addEntry(LLFolderType::FT_LOCAL,				new ViewerFolderEntry("Local Inventory",		"Inv_SysOpen",			"Inv_SysClosed",			FALSE,	true));
+
+	addEntry(LLFolderType::FT_SUITCASE,				new ViewerFolderEntry("My Suitcase",			"Inv_SysOpen", "Inv_SysClosed",							FALSE,		true));
 
 	for (U32 type = (U32)LLFolderType::FT_ENSEMBLE_START; type <= (U32)LLFolderType::FT_ENSEMBLE_END; ++type)
 	{
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 888e448b81c4fe51b7730cc23decdee80e4dcb0e..1f40c5f27d9388c7afb3c1e81dc33cae5ebc4f00 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -81,6 +81,7 @@ void no_op_llsd_func(const LLSD&) {}
 void no_op() {}
 
 static const char * const LOG_INV("Inventory");
+static const char * const LOG_LOCAL("InventoryLocalize");
 static const char * const LOG_NOTECARD("copy_inventory_from_notecard");
 
 static const std::string INV_OWNER_ID("owner_id");
@@ -117,7 +118,7 @@ class LLLocalizedInventoryItemsDictionary final : public LLSingleton<LLLocalized
 	bool localizeInventoryObjectName(std::string& object_name)
 	{
 #ifdef SHOW_DEBUG
-		LL_DEBUGS("InventoryLocalize") << "Searching for localization: " << object_name << LL_ENDL;
+		LL_DEBUGS(LOG_LOCAL) << "Searching for localization: " << object_name << LL_ENDL;
 #endif
 
 		std::map<std::string, std::string>::const_iterator dictionary_iter = mInventoryItemsDict.find(object_name);
@@ -127,7 +128,7 @@ class LLLocalizedInventoryItemsDictionary final : public LLSingleton<LLLocalized
 		{
 			object_name = dictionary_iter->second;
 #ifdef SHOW_DEBUG
-			LL_DEBUGS("InventoryLocalize") << "Found, new name is: " << object_name << LL_ENDL;
+			LL_DEBUGS(LOG_LOCAL) << "Found, new name is: " << object_name << LL_ENDL;
 #endif
 		}
 		return found;
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 6d0e9822416671af7c69effedc339c2da2c3ce13..3dde65c5347ebbb2518c38818d2d275b71d86d83 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -213,7 +213,7 @@ class LLViewerParcelMgr final : public LLSingleton<LLViewerParcelMgr>
 
 	void	renderRect(	const LLVector3d &west_south_bottom, 
 						const LLVector3d &east_north_top );
-	void	renderOneSegment(F32 x1, F32 y1, F32 x2, F32 y2, F32 height, U8 direction, LLViewerRegion* regionp);
+	void	renderOneSegment(F32 x1, F32 y1, F32 x2, F32 y2, F32 height, U8 direction, LLViewerRegion* regionp, bool absolute_height = false);
 	void	renderHighlightSegments(const U8* segments, LLViewerRegion* regionp);
 	void	renderCollisionSegments(U8* segments, BOOL use_pass, LLViewerRegion* regionp);
 
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index b3d230cb5173f1c1a914eee4656374597dccacc5..51ae654825f6e98666050c74aa5815b7e42bf4b4 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -550,13 +550,17 @@ bool viewerChoosesConnectionHandles()
 void LLVivoxVoiceClient::connectorCreate()
 {
 	std::ostringstream stream;
-	std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
+	// Transition to stateConnectorStarted when the connector handle comes back.
+	std::string logdir = gSavedSettings.getString("VivoxLogDirectory");
+	if (logdir.empty())
+	{
+		logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
+	}
 	if (LLStringUtil::endsWith(logdir, gDirUtilp->getDirDelimiter()))
 	{
 		logdir = logdir.substr(0, logdir.size() - gDirUtilp->getDirDelimiter().size());
 	}
 	
-	// Transition to stateConnectorStarted when the connector handle comes back.
 	std::string vivoxLogLevel = gSavedSettings.getString("VivoxDebugLevel");
     if ( vivoxLogLevel.empty() )
     {
@@ -1061,7 +1065,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
                 {
                     voice_port->setValue(LLSD(port_nr), false);
                     params.args.add("-i");
-                    params.args.add(llformat("127.0.0.1:%u", gSavedSettings.getU32("VivoxVoicePort")));
+                    params.args.add(llformat("%s:%u", gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort")));
                 }
             }
 
@@ -1087,7 +1091,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
 
             sGatewayPtr = LLProcess::create(params);
 
-            mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort"));
+            mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost"), gSavedSettings.getU32("VivoxVoicePort"));
         }
         else
         {
@@ -5005,7 +5009,6 @@ bool LLVivoxVoiceClient::checkParcelChanged(bool update)
 				{
 					mCurrentParcelLocalID = parcelLocalID;
 					mCurrentRegionName = regionName;
-					mAreaVoiceDisabled = false;
 				}
 				return true;
 			}
@@ -5359,7 +5362,12 @@ bool LLVivoxVoiceClient::inProximalChannel()
 
 std::string LLVivoxVoiceClient::sipURIFromID(const LLUUID &id)
 {
-	std::string result = fmt::format(FMT_COMPILE("sip:{}@{}"), nameFromID(id), mVoiceSIPURIHostName);
+	std::string result;
+	result = "sip:";
+	result += nameFromID(id);
+	result += "@";
+	result += mVoiceSIPURIHostName;
+	
 	return result;
 }
 
@@ -5368,8 +5376,12 @@ std::string LLVivoxVoiceClient::sipURIFromAvatar(LLVOAvatar *avatar)
 	std::string result;
 	if(avatar)
 	{
-		result = fmt::format(FMT_COMPILE("sip:{}@{}"), nameFromID(avatar->getID()), mVoiceSIPURIHostName);
+		result = "sip:";
+		result += nameFromID(avatar->getID());
+		result += "@";
+		result += mVoiceSIPURIHostName;
 	}
+	
 	return result;
 }
 
@@ -5464,8 +5476,14 @@ std::string LLVivoxVoiceClient::displayNameFromAvatar(LLVOAvatar *avatar)
 
 std::string LLVivoxVoiceClient::sipURIFromName(std::string_view name)
 {
-	std::string result = fmt::format(FMT_COMPILE("sip:{}@{}"), name, mVoiceSIPURIHostName);
+	std::string result;
+	result = "sip:";
+	result += name;
+	result += "@";
+	result += mVoiceSIPURIHostName;
+
 //	LLStringUtil::toLower(result);
+
 	return result;
 }
 
@@ -6077,7 +6095,7 @@ LLVivoxVoiceClient::sessionState::~sessionState()
     if (mMyIterator != mSession.end())
         mSession.erase(mMyIterator);
 
-    removeAllParticipants();
+	removeAllParticipants();
 }
 
 bool LLVivoxVoiceClient::sessionState::isCallBackPossible()
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 0bf297f518743f293da6d7769d32c22a92d90aea..9d087919ef111bc534da2bfd58f94e723b1baa93 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1674,6 +1674,29 @@ function="World.EnvPreset"
                      function="ToggleControl"
                      parameter="ShowSelectionBeam" />
                 </menu_item_check>
+	        <menu_item_check
+	         label="Show Parcel Boundary Outline"
+	         name="RenderParcelSelection">
+			  <menu_item_check.on_check
+				 function="CheckControl"
+				 parameter="RenderParcelSelection" />
+			  <menu_item_check.on_click
+				 function="ToggleControl"
+				 parameter="RenderParcelSelection" />
+			</menu_item_check>
+	        <menu_item_check
+	         label="Show Boundary up to maximum build height"
+	         name="RenderParcelSelectionToMaxHeight">
+			  <menu_item_check.on_check
+				 function="CheckControl"
+				 parameter="RenderParcelSelectionToMaxHeight" />
+			  <menu_item_check.on_click
+				 function="ToggleControl"
+				 parameter="RenderParcelSelectionToMaxHeight" />
+				<menu_item_check.on_enable
+				   function="CheckControl"
+				   parameter="RenderParcelSelection" />
+			</menu_item_check>
                 <menu_item_check
                        label="Highlight Transparent"
                        name="Highlight Transparent"
@@ -1684,6 +1707,7 @@ function="World.EnvPreset"
                   <menu_item_check.on_click
                    function="View.HighlightTransparent" />
                 </menu_item_check>
+		    	<menu_item_separator/>
                 <menu_item_check
                        label="Grab objects with Ctrl-Drag"
                        name="EnableCtrlDragMovement">