diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index dd5eca0002c738f95224a261ddf5a03c08259e3c..7c3b814fe3a8a590033d2a0b61bf6f6b3643ebd3 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -420,6 +420,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>AlchemyMouselookIFFMarkers</key>
+    <map>
+      <key>Comment</key>
+      <string>Display target markers for offscreen avatars in mouselook</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>AlchemyMouselookIFFRange</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp
index fd030b8b9022d4b1089dae5e68b23356684f8c04..fdf4d7f8d03ac2eb5208959eea69321e0c8ca50b 100644
--- a/indra/newview/lltoolgun.cpp
+++ b/indra/newview/lltoolgun.cpp
@@ -51,8 +51,12 @@
 
 //#include "alavatarcolormgr.h"
 #include "llavatarnamecache.h"
+#include "llagent.h"
 #include "llnetmap.h"
 #include "llworld.h"
+#include "lltrans.h"
+#include "lltracker.h"
+#include "rlvhandler.h"
 
 LLToolGun::LLToolGun( LLToolComposite* composite )
 :	LLTool( std::string("gun"), composite ),
@@ -126,17 +130,17 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask)
 			static LLCachedControl<bool> mouse_sun(gSavedSettings, "MouseSun");
 			if (mouse_sun)
 			{
-                LLVector3 sunpos = LLViewerCamera::getInstance()->getAtAxis();
+                const LLVector3& sunpos = LLViewerCamera::getInstance()->getAtAxis();
 				gSky.setSunDirectionCFR(sunpos);
-				gSavedSettings.setVector3("SkySunDefaultPosition", LLViewerCamera::getInstance()->getAtAxis());
+				gSavedSettings.setVector3("SkySunDefaultPosition", sunpos);
 			}
 
 			static LLCachedControl<bool> mouse_moon(gSavedSettings, "MouseMoon");
             if (mouse_moon)
 			{
-                LLVector3 moonpos = LLViewerCamera::getInstance()->getAtAxis();
+				const LLVector3& moonpos = LLViewerCamera::getInstance()->getAtAxis();
 				gSky.setMoonDirectionCFR(moonpos);
-				gSavedSettings.setVector3("SkyMoonDefaultPosition", LLViewerCamera::getInstance()->getAtAxis());
+				gSavedSettings.setVector3("SkyMoonDefaultPosition", moonpos);
 			}
 
 			gViewerWindow->moveCursorToCenter();
@@ -162,53 +166,79 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask)
 
 void LLToolGun::draw()
 {
+	static const std::string unknown_agent = LLTrans::getString("UnknownAvatar");
+
 	static LLCachedControl<bool> show_crosshairs(gSavedSettings, "ShowCrosshairs");
 	static LLCachedControl<bool> show_iff(gSavedSettings, "AlchemyMouselookIFF", true);
+	static LLCachedControl<bool> show_iff_markers(gSavedSettings, "AlchemyMouselookIFFMarkers", false);
 	static LLCachedControl<F32> iff_range(gSavedSettings, "AlchemyMouselookIFFRange", 380.f);
-	if (show_crosshairs)
+	static LLCachedControl<F32> userPresetX(gSavedSettings, "AlchemyMouselookTextOffsetX", 0.f);
+	static LLCachedControl<F32> userPresetY(gSavedSettings, "AlchemyMouselookTextOffsetY", -25.f);
+	static LLCachedControl<U32> userPresetHAlign(gSavedSettings, "AlchemyMouselookTextHAlign", 2);
+
+	const S32 windowWidth = gViewerWindow->getWorldViewRectScaled().getWidth();
+	const S32 windowHeight = gViewerWindow->getWorldViewRectScaled().getHeight();
+
+	LLColor4 crosshair_color = LLColor4::white;
+	crosshair_color.mV[VALPHA] = 0.75f;
+
+	if (show_iff)
 	{
-		const S32 windowWidth = gViewerWindow->getWorldViewRectScaled().getWidth();
-		const S32 windowHeight = gViewerWindow->getWorldViewRectScaled().getHeight();
-		LLColor4 targetColor = LLColor4::white;
-		targetColor.mV[VALPHA] = 0.5f;
-		if (show_iff)
+		bool target_rendered = false;
+
+		LLVector3d myPosition = gAgentCamera.getCameraPositionGlobal();
+		LLQuaternion myRotation = LLViewerCamera::getInstance()->getQuaternion();
+		myRotation.set(-myRotation.mQ[VX], -myRotation.mQ[VY], -myRotation.mQ[VZ], myRotation.mQ[VW]);
+
+		LLWorld::pos_map_t positions;
+		LLWorld::getInstance()->getAvatars(&positions, gAgent.getPositionGlobal(), iff_range);
+		for (const auto& position : positions)
 		{
-			LLVector3d myPosition = gAgentCamera.getCameraPositionGlobal();
-			LLQuaternion myRotation = LLViewerCamera::getInstance()->getQuaternion();
-			myRotation.set(-myRotation.mQ[VX], -myRotation.mQ[VY], -myRotation.mQ[VZ], myRotation.mQ[VW]);
-
-			LLWorld::pos_map_t positions;
-			LLWorld::getInstance()->getAvatars(&positions, gAgent.getPositionGlobal(), iff_range);
-			for (const auto& position : positions)
-            {
-				const auto& id = position.first;
-				const auto& targetPosition = position.second;
-				if (id == gAgentID || targetPosition.isNull())
-				{
-					continue;
-				}
+			const auto& id = position.first;
+			const auto& targetPosition = position.second;
+			if (id == gAgentID || targetPosition.isNull())
+			{
+				continue;
+			}
 
+			if (show_iff_markers)
+			{
+				LLTracker::instance()->drawMarker(targetPosition, crosshair_color, true);
+			}
+
+			if (!target_rendered && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+			{
 				LLVector3d magicVector = (targetPosition - myPosition) * myRotation;
 				magicVector.setVec(-magicVector.mdV[VY], magicVector.mdV[VZ], magicVector.mdV[VX]);
+
 				if (magicVector.mdV[VX] > -0.75 && magicVector.mdV[VX] < 0.75 && magicVector.mdV[VZ] > 0.0 && magicVector.mdV[VY] > -1.5 && magicVector.mdV[VY] < 1.5) // Do not fuck with these, cheater. :(
 				{
 					LLAvatarName avatarName;
-					LLAvatarNameCache::get(id, &avatarName);
-					//targetColor = ALAvatarColorMgr::instance().getColor(id);
-					targetColor.mV[VALPHA] = 0.5f;
-					LLFontGL::getFontSansSerifBold()->renderUTF8(
-						llformat("%s : %.2fm", avatarName.getCompleteName().c_str(), (targetPosition - myPosition).magVec()),
-						0, (windowWidth / 2.f), (windowHeight / 2.f) - 25.f, targetColor,
-						LLFontGL::HCENTER, LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::NO_SHADOW
-						);
+					std::string targetName = unknown_agent;
+					if (LLAvatarNameCache::get(id, &avatarName))
+					{
+						targetName = avatarName.getCompleteName();
+					}
 
-					break;
+					LLFontGL::getFontSansSerifBold()->renderUTF8(
+						llformat("%s : %.2fm", targetName.c_str(), (targetPosition - myPosition).magVec()),
+						0, (windowWidth / 2.f) + userPresetX, (windowHeight / 2.f) + userPresetY, crosshair_color,
+						(LLFontGL::HAlign)((S32)userPresetHAlign), LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::NO_SHADOW
+					);
+
+					if (!show_iff_markers)
+					{
+						break;
+					}
+					target_rendered = true;
 				}
 			}
 		}
-
+	}
+	if (show_crosshairs)
+	{
 		mCrosshairp->draw(
 			(windowWidth - mCrosshairp->getWidth()) / 2,
-			(windowHeight - mCrosshairp->getHeight()) / 2, targetColor);
+			(windowHeight - mCrosshairp->getHeight()) / 2, crosshair_color);
 	}
-}
+}
\ No newline at end of file
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index 7e5b8797a7aafdc1d0788fc27e3e8d7ab82e627d..731b537f2a2b33b45c4c24187e9363c7853ff377 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -162,7 +162,7 @@ void LLTracker::drawHUDArrow()
 void LLTracker::render3D()
 {
 	static const LLCachedControl<bool> render_tracker_beacon(gSavedSettings, "RenderTrackerBeacon");
-	if (!gFloaterWorldMap || !render_tracker_beacon)
+	if (!instance()->isTracking(NULL) || !gFloaterWorldMap || !render_tracker_beacon)
 	{
 		return;
 	}
@@ -673,7 +673,7 @@ void LLTracker::clearFocus()
 	instance()->mTrackingStatus = TRACKING_NOTHING;
 }
 
-void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color)
+void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color, bool is_iff /*= false*/)
 {
 	// get position
 	LLVector3 pos_local = gAgent.getPosAgentFromGlobal(pos_global);
@@ -684,8 +684,9 @@ void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color)
 	S32 y = 0;
 	const BOOL CLAMP = TRUE;
 
-	if (LLViewerCamera::getInstance()->projectPosAgentToScreen(pos_local, screen, CLAMP)
-		|| LLViewerCamera::getInstance()->projectPosAgentToScreenEdge(pos_local, screen) )
+	bool on_screen = LLViewerCamera::getInstance()->projectPosAgentToScreen(pos_local, screen, CLAMP);
+	if (on_screen && is_iff) return;
+	if (on_screen || LLViewerCamera::getInstance()->projectPosAgentToScreenEdge(pos_local, screen) )
 	{
 		gHUDView->screenPointToLocal(screen.mX, screen.mY, &x, &y);
 
@@ -703,6 +704,7 @@ void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color)
 		S32 y_center = lltrunc(0.5f * (F32)rect.getHeight());
 		x = x - x_center;	// x and y relative to center
 		y = y - y_center;
+		if (is_iff) y += 100;
 		F32 dist = sqrt((F32)(x*x + y*y));
 		S32 half_arrow_size = lltrunc(0.5f * HUD_ARROW_SIZE);
 		if (dist > 0.f)
@@ -752,7 +754,9 @@ void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color)
 									 mHUDArrowCenterY - half_arrow_size, 
 									 HUD_ARROW_SIZE, HUD_ARROW_SIZE, 
 									 RAD_TO_DEG * angle, 
-									 LLWorldMapView::sTrackArrowImage->getImage(), 
+									 is_iff ?
+										LLWorldMapView::sIFFArrowImage->getImage() :
+										LLWorldMapView::sTrackArrowImage->getImage(),
 									 color);
 	}
 }
diff --git a/indra/newview/lltracker.h b/indra/newview/lltracker.h
index 4a6f10b767dda24893c8d494501227fec2f9137b..dbc8d8bd1356282f5d452f8a192176f950ee3ebd 100644
--- a/indra/newview/lltracker.h
+++ b/indra/newview/lltracker.h
@@ -103,6 +103,9 @@ class LLTracker
 	
 	static const std::string& getLabel() { return instance()->mLabel; }
 	static const std::string& getToolTip() { return instance()->mToolTip; }
+
+	void drawMarker(const LLVector3d& pos_global, const LLColor4& color, bool is_iff = false);
+
 protected:
 	LLTracker();
 	~LLTracker();
@@ -119,7 +122,6 @@ class LLTracker
 	void stopTrackingLocation(bool clear_ui = false, bool dest_reached = false);
 	void stopTrackingLandmark(bool clear_ui = false);
 
-	void drawMarker(const LLVector3d& pos_global, const LLColor4& color);
 	void setLandmarkVisited();
 	void cacheLandmarkPosition();
 	void purgeBeaconText();
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index ddd9e856d02fc31089ba6ed677e6e709d42651b0..7c8c24dc00994e382c8293d07d4dd1d909897c3e 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -91,6 +91,7 @@ LLUIImagePtr LLWorldMapView::sEventAdultImage = NULL;
 
 LLUIImagePtr LLWorldMapView::sTrackCircleImage = NULL;
 LLUIImagePtr LLWorldMapView::sTrackArrowImage = NULL;
+LLUIImagePtr LLWorldMapView::sIFFArrowImage = NULL;
 
 LLUIImagePtr LLWorldMapView::sClassifiedsImage = NULL;
 LLUIImagePtr LLWorldMapView::sForSaleImage = NULL;
@@ -136,6 +137,7 @@ void LLWorldMapView::initClass()
 
 	sTrackCircleImage =		LLUI::getUIImage("map_track_16.tga");
 	sTrackArrowImage =		LLUI::getUIImage("direction_arrow.tga");
+	sIFFArrowImage =		LLUI::getUIImage("target_arrow.tga");
 	sClassifiedsImage =		LLUI::getUIImage("icon_top_pick.tga");
 	sForSaleImage =			LLUI::getUIImage("icon_for_sale.tga");
 	// To Do: update the image resource for adult lands on sale.
@@ -165,6 +167,7 @@ void LLWorldMapView::cleanupClass()
 
 	sTrackCircleImage = NULL;
 	sTrackArrowImage = NULL;
+	sIFFArrowImage = NULL;
 	sClassifiedsImage = NULL;
 	sForSaleImage = NULL;
 	sForSaleAdultImage = NULL;
diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h
index 7391a762bd78f4a32dbce5c3fdb0f217204ea79c..c607816192304365fe38366b67d3c9fd6fc8846d 100644
--- a/indra/newview/llworldmapview.h
+++ b/indra/newview/llworldmapview.h
@@ -152,6 +152,7 @@ class LLWorldMapView final : public LLPanel
 	static LLUIImagePtr	sClassifiedsImage;
 	static LLUIImagePtr	sForSaleImage;
 	static LLUIImagePtr	sForSaleAdultImage;
+	static LLUIImagePtr	sIFFArrowImage;
 
 	static F32		sMapScale;				// scale = size of a region in pixels
 
diff --git a/indra/newview/skins/default/textures/direction_arrow.tga b/indra/newview/skins/default/textures/direction_arrow.tga
index f3ef1068c4725af68f190c9e0330ed0447410ebc..59149e1d505b16c6f100910eeb858da92d97bc78 100644
Binary files a/indra/newview/skins/default/textures/direction_arrow.tga and b/indra/newview/skins/default/textures/direction_arrow.tga differ
diff --git a/indra/newview/skins/default/textures/target_arrow.tga b/indra/newview/skins/default/textures/target_arrow.tga
new file mode 100644
index 0000000000000000000000000000000000000000..cd14b7df9a27a81792346b828ae4aa7bc594cba7
Binary files /dev/null and b/indra/newview/skins/default/textures/target_arrow.tga differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 94d55363f0d73274785415a7ec956d8c78ee838b..4d079281bfd2b240f4e5a2f7b7b34b94a4cbd8ac 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -788,7 +788,8 @@ with the same filename but different name
   <texture name="button_anim_play.tga" />
   <texture name="button_anim_play_selected.tga" />
   <texture name="crosshairs.tga" />
-  <texture name="direction_arrow.tga" file_name="world/BeaconArrow.png" />
+  <texture name="direction_arrow.tga" />
+  <texture name="target_arrow.tga" />
 
   <texture name="icon_avatar_offline.tga" />
   <texture name="icon_avatar_online.tga" />
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 646beef124b9942ff750bd2d573e502f3dc0f73e..8d80dd76bc30ee3f488f7f95d59b5941e92aa71e 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -4330,4 +4330,7 @@ and report the problem.
 
   <string name="outfit_photo_load_codec_error">Invalid image format. Please use another image</string>
 
+  <!-- Alchemy Strings -->
+  <string name="UnknownAvatar">Unknown Avatar</string>
+  
 </strings>