diff --git a/.hgignore b/.hgignore
index b3670902270feeb9c8db67c0079228467b59722d..b180d9200349eb5cb3f63baa0126d399860bf30a 100644
--- a/.hgignore
+++ b/.hgignore
@@ -36,7 +36,7 @@ indra/newview/fmod.dll
 indra/newview/mozilla-theme
 indra/newview/mozilla-universal-darwin.tgz
 indra/newview/res/ll_icon.*
-indra/newview/res-sdl
+indra/newview/res-sdl/ll_icon.*
 indra/newview/vivox-runtime
 indra/server-linux-*
 indra/temp
diff --git a/.hgtags b/.hgtags
index 588b32f81d0416fc194d4d65c6355184358125f2..e64c06c43a42345bb8dd60808c584fac72172141 100644
--- a/.hgtags
+++ b/.hgtags
@@ -352,6 +352,7 @@ a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182
 1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1
 9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
 ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198
+507bdfbd6bf844a511c1ffeda4baa80016ed1346 DRTVWR-197
 e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193
 33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195
 421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192
diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp
index 97f279268647a1e5a247fd558eba5344c803fafa..ff31f7665e258817bf888c613253ef212c3da295 100644
--- a/indra/llmessage/llavatarnamecache.cpp
+++ b/indra/llmessage/llavatarnamecache.cpp
@@ -651,8 +651,10 @@ void LLAvatarNameCache::fireSignal(const LLUUID& agent_id,
 	signal(agent_id, av_name);
 }
 
-void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
+LLAvatarNameCache::callback_connection_t LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
 {
+	callback_connection_t connection;
+
 	if (sRunning)
 	{
 		// ...only do immediate lookups when cache is running
@@ -668,7 +670,7 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
 				{
 					// ...name already exists in cache, fire callback now
 					fireSignal(agent_id, slot, av_name);
-					return;
+					return connection;
 				}
 			}
 		}
@@ -681,7 +683,7 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
 				LLAvatarName av_name;
 				buildLegacyName(full_name, &av_name);
 				fireSignal(agent_id, slot, av_name);
-				return;
+				return connection;
 			}
 		}
 	}
@@ -698,15 +700,17 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
 	{
 		// ...new callback for this id
 		callback_signal_t* signal = new callback_signal_t();
-		signal->connect(slot);
+		connection = signal->connect(slot);
 		sSignalMap[agent_id] = signal;
 	}
 	else
 	{
 		// ...existing callback, bind additional slot
 		callback_signal_t* signal = sig_it->second;
-		signal->connect(slot);
+		connection = signal->connect(slot);
 	}
+
+	return connection;
 }
 
 
diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h
index 59c1329ffa5db3ac04a0775434a0a928f7bf2981..064942fe53d2c4a206a83f52185094b7e88ba450 100644
--- a/indra/llmessage/llavatarnamecache.h
+++ b/indra/llmessage/llavatarnamecache.h
@@ -71,10 +71,11 @@ namespace LLAvatarNameCache
 		void (const LLUUID& agent_id, const LLAvatarName& av_name)>
 			callback_signal_t;
 	typedef callback_signal_t::slot_type callback_slot_t;
+	typedef boost::signals2::connection callback_connection_t;
 
 	// Fetches name information and calls callback.
 	// If name information is in cache, callback will be called immediately.
-	void get(const LLUUID& agent_id, callback_slot_t slot);
+	callback_connection_t get(const LLUUID& agent_id, callback_slot_t slot);
 
 	// Allow display names to be explicitly disabled for testing.
 	void setUseDisplayNames(bool use);
diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp
index cb3b7abb1437a78c44f85f015e4396370e00690f..74ed72ef97a9a030fd65bbf949002b5693af001f 100644
--- a/indra/llui/tests/llurlentry_stub.cpp
+++ b/indra/llui/tests/llurlentry_stub.cpp
@@ -40,9 +40,10 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)
 	return false;
 }
 
-void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
+LLAvatarNameCache::callback_connection_t LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
 {
-	return;
+	callback_connection_t connection;
+	return connection;
 }
 
 bool LLAvatarNameCache::useDisplayNames()
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 32bb84cba59171dfe2450ea77801103682e094e8..97637c937fe6efe6e236dab40183113e6e8b177e 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -2809,42 +2809,48 @@ const char* cursorIDToName(int id)
 {
 	switch (id)
 	{
-		case UI_CURSOR_ARROW:			return "UI_CURSOR_ARROW";
-		case UI_CURSOR_WAIT:			return "UI_CURSOR_WAIT";
-		case UI_CURSOR_HAND:			return "UI_CURSOR_HAND";
-		case UI_CURSOR_IBEAM:			return "UI_CURSOR_IBEAM";
-		case UI_CURSOR_CROSS:			return "UI_CURSOR_CROSS";
-		case UI_CURSOR_SIZENWSE:		return "UI_CURSOR_SIZENWSE";
-		case UI_CURSOR_SIZENESW:		return "UI_CURSOR_SIZENESW";
-		case UI_CURSOR_SIZEWE:			return "UI_CURSOR_SIZEWE";
-		case UI_CURSOR_SIZENS:			return "UI_CURSOR_SIZENS";
-		case UI_CURSOR_NO:				return "UI_CURSOR_NO";
-		case UI_CURSOR_WORKING:			return "UI_CURSOR_WORKING";
-		case UI_CURSOR_TOOLGRAB:		return "UI_CURSOR_TOOLGRAB";
-		case UI_CURSOR_TOOLLAND:		return "UI_CURSOR_TOOLLAND";
-		case UI_CURSOR_TOOLFOCUS:		return "UI_CURSOR_TOOLFOCUS";
-		case UI_CURSOR_TOOLCREATE:		return "UI_CURSOR_TOOLCREATE";
-		case UI_CURSOR_ARROWDRAG:		return "UI_CURSOR_ARROWDRAG";
-		case UI_CURSOR_ARROWCOPY:		return "UI_CURSOR_ARROWCOPY";
-		case UI_CURSOR_ARROWDRAGMULTI:	return "UI_CURSOR_ARROWDRAGMULTI";
-		case UI_CURSOR_ARROWCOPYMULTI:	return "UI_CURSOR_ARROWCOPYMULTI";
-		case UI_CURSOR_NOLOCKED:		return "UI_CURSOR_NOLOCKED";
-		case UI_CURSOR_ARROWLOCKED:		return "UI_CURSOR_ARROWLOCKED";
-		case UI_CURSOR_GRABLOCKED:		return "UI_CURSOR_GRABLOCKED";
-		case UI_CURSOR_TOOLTRANSLATE:	return "UI_CURSOR_TOOLTRANSLATE";
-		case UI_CURSOR_TOOLROTATE:		return "UI_CURSOR_TOOLROTATE";
-		case UI_CURSOR_TOOLSCALE:		return "UI_CURSOR_TOOLSCALE";
-		case UI_CURSOR_TOOLCAMERA:		return "UI_CURSOR_TOOLCAMERA";
-		case UI_CURSOR_TOOLPAN:			return "UI_CURSOR_TOOLPAN";
-		case UI_CURSOR_TOOLZOOMIN:		return "UI_CURSOR_TOOLZOOMIN";
-		case UI_CURSOR_TOOLPICKOBJECT3:	return "UI_CURSOR_TOOLPICKOBJECT3";
-		case UI_CURSOR_TOOLPLAY:		return "UI_CURSOR_TOOLPLAY";
-		case UI_CURSOR_TOOLPAUSE:		return "UI_CURSOR_TOOLPAUSE";
-		case UI_CURSOR_TOOLMEDIAOPEN:	return "UI_CURSOR_TOOLMEDIAOPEN";
-		case UI_CURSOR_PIPETTE:			return "UI_CURSOR_PIPETTE";
-		case UI_CURSOR_TOOLSIT:			return "UI_CURSOR_TOOLSIT";
-		case UI_CURSOR_TOOLBUY:			return "UI_CURSOR_TOOLBUY";
-		case UI_CURSOR_TOOLOPEN:		return "UI_CURSOR_TOOLOPEN";
+		case UI_CURSOR_ARROW:							return "UI_CURSOR_ARROW";
+		case UI_CURSOR_WAIT:							return "UI_CURSOR_WAIT";
+		case UI_CURSOR_HAND:							return "UI_CURSOR_HAND";
+		case UI_CURSOR_IBEAM:							return "UI_CURSOR_IBEAM";
+		case UI_CURSOR_CROSS:							return "UI_CURSOR_CROSS";
+		case UI_CURSOR_SIZENWSE:						return "UI_CURSOR_SIZENWSE";
+		case UI_CURSOR_SIZENESW:						return "UI_CURSOR_SIZENESW";
+		case UI_CURSOR_SIZEWE:							return "UI_CURSOR_SIZEWE";
+		case UI_CURSOR_SIZENS:							return "UI_CURSOR_SIZENS";
+		case UI_CURSOR_NO:								return "UI_CURSOR_NO";
+		case UI_CURSOR_WORKING:							return "UI_CURSOR_WORKING";
+		case UI_CURSOR_TOOLGRAB:						return "UI_CURSOR_TOOLGRAB";
+		case UI_CURSOR_TOOLLAND:						return "UI_CURSOR_TOOLLAND";
+		case UI_CURSOR_TOOLFOCUS:						return "UI_CURSOR_TOOLFOCUS";
+		case UI_CURSOR_TOOLCREATE:						return "UI_CURSOR_TOOLCREATE";
+		case UI_CURSOR_ARROWDRAG:						return "UI_CURSOR_ARROWDRAG";
+		case UI_CURSOR_ARROWCOPY:						return "UI_CURSOR_ARROWCOPY";
+		case UI_CURSOR_ARROWDRAGMULTI:					return "UI_CURSOR_ARROWDRAGMULTI";
+		case UI_CURSOR_ARROWCOPYMULTI:					return "UI_CURSOR_ARROWCOPYMULTI";
+		case UI_CURSOR_NOLOCKED:						return "UI_CURSOR_NOLOCKED";
+		case UI_CURSOR_ARROWLOCKED:						return "UI_CURSOR_ARROWLOCKED";
+		case UI_CURSOR_GRABLOCKED:						return "UI_CURSOR_GRABLOCKED";
+		case UI_CURSOR_TOOLTRANSLATE:					return "UI_CURSOR_TOOLTRANSLATE";
+		case UI_CURSOR_TOOLROTATE:						return "UI_CURSOR_TOOLROTATE";
+		case UI_CURSOR_TOOLSCALE:						return "UI_CURSOR_TOOLSCALE";
+		case UI_CURSOR_TOOLCAMERA:						return "UI_CURSOR_TOOLCAMERA";
+		case UI_CURSOR_TOOLPAN:							return "UI_CURSOR_TOOLPAN";
+		case UI_CURSOR_TOOLZOOMIN:						return "UI_CURSOR_TOOLZOOMIN";
+		case UI_CURSOR_TOOLPICKOBJECT3:					return "UI_CURSOR_TOOLPICKOBJECT3";
+		case UI_CURSOR_TOOLPLAY:						return "UI_CURSOR_TOOLPLAY";
+		case UI_CURSOR_TOOLPAUSE:						return "UI_CURSOR_TOOLPAUSE";
+		case UI_CURSOR_TOOLMEDIAOPEN:					return "UI_CURSOR_TOOLMEDIAOPEN";
+		case UI_CURSOR_PIPETTE:							return "UI_CURSOR_PIPETTE";
+		case UI_CURSOR_TOOLSIT:							return "UI_CURSOR_TOOLSIT";
+		case UI_CURSOR_TOOLBUY:							return "UI_CURSOR_TOOLBUY";
+		case UI_CURSOR_TOOLOPEN:						return "UI_CURSOR_TOOLOPEN";
+		case UI_CURSOR_TOOLPATHFINDING:					return "UI_CURSOR_PATHFINDING";
+		case UI_CURSOR_TOOLPATHFINDING_PATH_START:		return "UI_CURSOR_PATHFINDING_START";
+		case UI_CURSOR_TOOLPATHFINDING_PATH_START_ADD:	return "UI_CURSOR_PATHFINDING_START_ADD";
+		case UI_CURSOR_TOOLPATHFINDING_PATH_END:		return "UI_CURSOR_PATHFINDING_END";
+		case UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD:	return "UI_CURSOR_PATHFINDING_END_ADD";
+		case UI_CURSOR_TOOLNO:							return "UI_CURSOR_NO";
 	}
 
 	llerrs << "cursorIDToName: unknown cursor id" << id << llendl;
@@ -2950,6 +2956,12 @@ void LLWindowMacOSX::updateCursor()
 	case UI_CURSOR_TOOLSIT:
 	case UI_CURSOR_TOOLBUY:
 	case UI_CURSOR_TOOLOPEN:
+	case UI_CURSOR_TOOLPATHFINDING:
+	case UI_CURSOR_TOOLPATHFINDING_PATH_START:
+	case UI_CURSOR_TOOLPATHFINDING_PATH_START_ADD:
+	case UI_CURSOR_TOOLPATHFINDING_PATH_END:
+	case UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD:
+	case UI_CURSOR_TOOLNO:
 		result = setImageCursor(gCursors[mNextCursor]);
 		break;
 
@@ -2994,6 +3006,12 @@ void LLWindowMacOSX::initCursors()
 	initPixmapCursor(UI_CURSOR_TOOLSIT, 20, 15);
 	initPixmapCursor(UI_CURSOR_TOOLBUY, 20, 15);
 	initPixmapCursor(UI_CURSOR_TOOLOPEN, 20, 15);
+	initPixmapCursor(UI_CURSOR_TOOLPATHFINDING, 16, 16);
+	initPixmapCursor(UI_CURSOR_TOOLPATHFINDING_PATH_START, 16, 16);
+	initPixmapCursor(UI_CURSOR_TOOLPATHFINDING_PATH_START_ADD, 16, 16);
+	initPixmapCursor(UI_CURSOR_TOOLPATHFINDING_PATH_END, 16, 16);
+	initPixmapCursor(UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD, 16, 16);
+	initPixmapCursor(UI_CURSOR_TOOLNO, 8, 8);
 
 	initPixmapCursor(UI_CURSOR_SIZENWSE, 10, 10);
 	initPixmapCursor(UI_CURSOR_SIZENESW, 10, 10);
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index 3d33af9d9bc97289a4f67030576d2f3f75613983..3bf4a48cb6ddcb0e037a2662172f6dd164aabf27 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -2117,6 +2117,12 @@ void LLWindowSDL::initCursors()
 	mSDLCursors[UI_CURSOR_TOOLSIT] = makeSDLCursorFromBMP("toolsit.BMP",20,15);
 	mSDLCursors[UI_CURSOR_TOOLBUY] = makeSDLCursorFromBMP("toolbuy.BMP",20,15);
 	mSDLCursors[UI_CURSOR_TOOLOPEN] = makeSDLCursorFromBMP("toolopen.BMP",20,15);
+	mSDLCursors[UI_CURSOR_TOOLPATHFINDING] = makeSDLCursorFromBMP("lltoolpathfinding.BMP", 16, 16);
+	mSDLCursors[UI_CURSOR_TOOLPATHFINDING_PATH_START] = makeSDLCursorFromBMP("lltoolpathfindingpathstart.BMP", 16, 16);
+	mSDLCursors[UI_CURSOR_TOOLPATHFINDING_PATH_START_ADD] = makeSDLCursorFromBMP("lltoolpathfindingpathstartadd.BMP", 16, 16);
+	mSDLCursors[UI_CURSOR_TOOLPATHFINDING_PATH_END] = makeSDLCursorFromBMP("lltoolpathfindingpathend.BMP", 16, 16);
+	mSDLCursors[UI_CURSOR_TOOLPATHFINDING_PATH_END_ADD] = makeSDLCursorFromBMP("lltoolpathfindingpathendadd.BMP", 16, 16);
+	mSDLCursors[UI_CURSOR_TOOLNO] = makeSDLCursorFromBMP("llno.BMP",8,8);
 
 	if (getenv("LL_ATI_MOUSE_CURSOR_BUG") != NULL) {
 		llinfos << "Disabling cursor updating due to LL_ATI_MOUSE_CURSOR_BUG" << llendl;
diff --git a/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING.tif b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING.tif
new file mode 100644
index 0000000000000000000000000000000000000000..ba6f30fa0e8b8cc8abfc5c2870ebc8bdbcf9d4e2
Binary files /dev/null and b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING.tif differ
diff --git a/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_END.tif b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_END.tif
new file mode 100644
index 0000000000000000000000000000000000000000..830d5692fd3f1c77820ada0d47399ca46d098187
Binary files /dev/null and b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_END.tif differ
diff --git a/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_END_ADD.tif b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_END_ADD.tif
new file mode 100644
index 0000000000000000000000000000000000000000..e05284214a78b096c3186e4f81ac25b4904db2bc
Binary files /dev/null and b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_END_ADD.tif differ
diff --git a/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_START.tif b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_START.tif
new file mode 100644
index 0000000000000000000000000000000000000000..c4822adf6400cf4e2939d9d78ecbcaf66074b62a
Binary files /dev/null and b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_START.tif differ
diff --git a/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_START_ADD.tif b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_START_ADD.tif
new file mode 100644
index 0000000000000000000000000000000000000000..5166af6e05174445cba3975c025f2d76534b946c
Binary files /dev/null and b/indra/newview/cursors_mac/UI_CURSOR_PATHFINDING_START_ADD.tif differ
diff --git a/indra/newview/llfloaterpathfindingcharacters.cpp b/indra/newview/llfloaterpathfindingcharacters.cpp
index 99d262344cbde45031737a33720964f8fc776b5a..69c9d94dfad653d8f1f124be9522138a293b66f9 100644
--- a/indra/newview/llfloaterpathfindingcharacters.cpp
+++ b/indra/newview/llfloaterpathfindingcharacters.cpp
@@ -134,26 +134,20 @@ void LLFloaterPathfindingCharacters::requestGetObjects()
 	LLPathfindingManager::getInstance()->requestGetCharacters(getNewRequestId(), boost::bind(&LLFloaterPathfindingCharacters::handleNewObjectList, this, _1, _2, _3));
 }
 
-LLSD LLFloaterPathfindingCharacters::convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr)
+void LLFloaterPathfindingCharacters::buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr)
 {
 	llassert(pObjectListPtr != NULL);
 	llassert(!pObjectListPtr->isEmpty());
 
-	LLSD scrollListData = LLSD::emptyArray();
-
 	for (LLPathfindingObjectList::const_iterator objectIter = pObjectListPtr->begin();	objectIter != pObjectListPtr->end(); ++objectIter)
 	{
-		const LLPathfindingCharacter *characterPtr = dynamic_cast<const LLPathfindingCharacter *>(objectIter->second.get());
-		LLSD element = buildCharacterScrollListData(characterPtr);
-		scrollListData.append(element);
+		const LLPathfindingObjectPtr objectPtr = objectIter->second;
+		const LLPathfindingCharacter *characterPtr = dynamic_cast<const LLPathfindingCharacter *>(objectPtr.get());
+		llassert(characterPtr != NULL);
 
-		if (characterPtr->hasOwner() && !characterPtr->hasOwnerName())
-		{
-			rebuildScrollListAfterAvatarNameLoads(characterPtr->getUUID());
-		}
+		LLSD scrollListItemData = buildCharacterScrollListItemData(characterPtr);
+		addObjectToScrollList(objectPtr, scrollListItemData);
 	}
-
-	return scrollListData;
 }
 
 void LLFloaterPathfindingCharacters::updateControlsOnScrollListChange()
@@ -168,6 +162,22 @@ S32 LLFloaterPathfindingCharacters::getNameColumnIndex() const
 	return 0;
 }
 
+S32 LLFloaterPathfindingCharacters::getOwnerNameColumnIndex() const
+{
+	return 2;
+}
+
+std::string LLFloaterPathfindingCharacters::getOwnerName(const LLPathfindingObject *pObject) const
+{
+	return (pObject->hasOwner()
+		? (pObject->hasOwnerName()
+		? (pObject->isGroupOwned()
+		? (pObject->getOwnerName() + " " + getString("character_owner_group"))
+		: pObject->getOwnerName())
+		: getString("character_owner_loading"))
+		: getString("character_owner_unknown"));
+}
+
 const LLColor4 &LLFloaterPathfindingCharacters::getBeaconColor() const
 {
 	return mBeaconColor;
@@ -201,9 +211,9 @@ void LLFloaterPathfindingCharacters::onShowPhysicsCapsuleClicked()
 	}
 }
 
-LLSD LLFloaterPathfindingCharacters::buildCharacterScrollListData(const LLPathfindingCharacter *pCharacterPtr) const
+LLSD LLFloaterPathfindingCharacters::buildCharacterScrollListItemData(const LLPathfindingCharacter *pCharacterPtr) const
 {
-	LLSD columns;
+	LLSD columns = LLSD::emptyArray();
 
 	columns[0]["column"] = "name";
 	columns[0]["value"] = pCharacterPtr->getName();
@@ -212,13 +222,7 @@ LLSD LLFloaterPathfindingCharacters::buildCharacterScrollListData(const LLPathfi
 	columns[1]["value"] = pCharacterPtr->getDescription();
 
 	columns[2]["column"] = "owner";
-	columns[2]["value"] = (pCharacterPtr->hasOwner()
-			? (pCharacterPtr->hasOwnerName()
-			? (pCharacterPtr->isGroupOwned()
-			? (pCharacterPtr->getOwnerName() + " " + getString("character_owner_group"))
-			: pCharacterPtr->getOwnerName())
-			: getString("character_owner_loading"))
-			: getString("character_owner_unknown"));
+	columns[2]["value"] = getOwnerName(pCharacterPtr);
 
 	S32 cpuTime = llround(pCharacterPtr->getCPUTime());
 	std::string cpuTimeString = llformat("%d", cpuTime);
@@ -231,11 +235,7 @@ LLSD LLFloaterPathfindingCharacters::buildCharacterScrollListData(const LLPathfi
 	columns[4]["column"] = "altitude";
 	columns[4]["value"] = llformat("%1.0f m", pCharacterPtr->getLocation()[2]);
 
-	LLSD element;
-	element["id"] = pCharacterPtr->getUUID().asString();
-	element["column"] = columns;
-
-	return element;
+	return columns;
 }
 
 void LLFloaterPathfindingCharacters::updateStateOnDisplayControls()
diff --git a/indra/newview/llfloaterpathfindingcharacters.h b/indra/newview/llfloaterpathfindingcharacters.h
index ef389ad4289df68d185fc49592a3271ec15104f0..4021f4f119ac4f1bb6c0d3342ca8ce0261357665 100644
--- a/indra/newview/llfloaterpathfindingcharacters.h
+++ b/indra/newview/llfloaterpathfindingcharacters.h
@@ -62,11 +62,13 @@ protected:
 
 	virtual void                       requestGetObjects();
 
-	virtual LLSD                       convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr);
+	virtual void                       buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr);
 
 	virtual void                       updateControlsOnScrollListChange();
 
 	virtual S32                        getNameColumnIndex() const;
+	virtual S32                        getOwnerNameColumnIndex() const;
+	virtual std::string                getOwnerName(const LLPathfindingObject *pObject) const;
 	virtual const LLColor4             &getBeaconColor() const;
 
 	virtual LLPathfindingObjectListPtr getEmptyObjectList() const;
@@ -74,7 +76,7 @@ protected:
 private:
 	void onShowPhysicsCapsuleClicked();
 
-	LLSD buildCharacterScrollListData(const LLPathfindingCharacter *pCharacterPtr) const;
+	LLSD buildCharacterScrollListItemData(const LLPathfindingCharacter *pCharacterPtr) const;
 
 	void updateStateOnDisplayControls();
 	void showSelectedCharacterCapsules();
diff --git a/indra/newview/llfloaterpathfindinglinksets.cpp b/indra/newview/llfloaterpathfindinglinksets.cpp
index 877bd0822d7b8233d140d204b74a37a20518beeb..0fe0e151fb41e953be2d6229dd03488e58815414 100644
--- a/indra/newview/llfloaterpathfindinglinksets.cpp
+++ b/indra/newview/llfloaterpathfindinglinksets.cpp
@@ -215,7 +215,7 @@ void LLFloaterPathfindingLinksets::requestGetObjects()
 	LLPathfindingManager::getInstance()->requestGetLinksets(getNewRequestId(), boost::bind(&LLFloaterPathfindingLinksets::handleNewObjectList, this, _1, _2, _3));
 }
 
-LLSD LLFloaterPathfindingLinksets::convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr)
+void LLFloaterPathfindingLinksets::buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr)
 {
 	llassert(pObjectListPtr != NULL);
 	llassert(!pObjectListPtr->isEmpty());
@@ -227,7 +227,6 @@ LLSD LLFloaterPathfindingLinksets::convertObjectsIntoScrollListData(const LLPath
 	bool isFilteringDescription = !descriptionFilter.empty();
 	bool isFilteringLinksetUse = (linksetUseFilter != LLPathfindingLinkset::kUnknown);
 
-	LLSD scrollListData = LLSD::emptyArray();
 	const LLVector3& avatarPosition = gAgent.getPositionAgent();
 
 	if (isFilteringName || isFilteringDescription || isFilteringLinksetUse)
@@ -236,22 +235,21 @@ LLSD LLFloaterPathfindingLinksets::convertObjectsIntoScrollListData(const LLPath
 		LLStringUtil::toUpper(descriptionFilter);
 		for (LLPathfindingObjectList::const_iterator objectIter = pObjectListPtr->begin();	objectIter != pObjectListPtr->end(); ++objectIter)
 		{
-			const LLPathfindingLinkset *linksetPtr = dynamic_cast<const LLPathfindingLinkset *>(objectIter->second.get());
+			const LLPathfindingObjectPtr objectPtr = objectIter->second;
+			const LLPathfindingLinkset *linksetPtr = dynamic_cast<const LLPathfindingLinkset *>(objectPtr.get());
+			llassert(linksetPtr != NULL);
+
 			std::string linksetName = (linksetPtr->isTerrain() ? getString("linkset_terrain_name") : linksetPtr->getName());
 			std::string linksetDescription = linksetPtr->getDescription();
 			LLStringUtil::toUpper(linksetName);
 			LLStringUtil::toUpper(linksetDescription);
+
 			if ((!isFilteringName || (linksetName.find(nameFilter) != std::string::npos)) &&
 				(!isFilteringDescription || (linksetDescription.find(descriptionFilter) != std::string::npos)) &&
 				(!isFilteringLinksetUse || (linksetPtr->getLinksetUse() == linksetUseFilter)))
 			{
-				LLSD element = buildLinksetScrollListData(linksetPtr, avatarPosition);
-				scrollListData.append(element);
-
-				if (linksetPtr->hasOwner() && !linksetPtr->hasOwnerName())
-				{
-					rebuildScrollListAfterAvatarNameLoads(linksetPtr->getUUID());
-				}
+				LLSD scrollListItemData = buildLinksetScrollListItemData(linksetPtr, avatarPosition);
+				addObjectToScrollList(objectPtr, scrollListItemData);
 			}
 		}
 	}
@@ -259,18 +257,14 @@ LLSD LLFloaterPathfindingLinksets::convertObjectsIntoScrollListData(const LLPath
 	{
 		for (LLPathfindingObjectList::const_iterator objectIter = pObjectListPtr->begin();	objectIter != pObjectListPtr->end(); ++objectIter)
 		{
-			const LLPathfindingLinkset *linksetPtr = dynamic_cast<const LLPathfindingLinkset *>(objectIter->second.get());
-			LLSD element = buildLinksetScrollListData(linksetPtr, avatarPosition);
-			scrollListData.append(element);
+			const LLPathfindingObjectPtr objectPtr = objectIter->second;
+			const LLPathfindingLinkset *linksetPtr = dynamic_cast<const LLPathfindingLinkset *>(objectPtr.get());
+			llassert(linksetPtr != NULL);
 
-			if (linksetPtr->hasOwner() && !linksetPtr->hasOwnerName())
-			{
-				rebuildScrollListAfterAvatarNameLoads(linksetPtr->getUUID());
-			}
+			LLSD scrollListItemData = buildLinksetScrollListItemData(linksetPtr, avatarPosition);
+			addObjectToScrollList(objectPtr, scrollListItemData);
 		}
 	}
-
-	return scrollListData;
 }
 
 void LLFloaterPathfindingLinksets::updateControlsOnScrollListChange()
@@ -286,6 +280,22 @@ S32 LLFloaterPathfindingLinksets::getNameColumnIndex() const
 	return 0;
 }
 
+S32 LLFloaterPathfindingLinksets::getOwnerNameColumnIndex() const
+{
+	return 2;
+}
+
+std::string LLFloaterPathfindingLinksets::getOwnerName(const LLPathfindingObject *pObject) const
+{
+	return (pObject->hasOwner()
+		? (pObject->hasOwnerName()
+		? (pObject->isGroupOwned()
+		? (pObject->getOwnerName() + " " + getString("linkset_owner_group"))
+		: pObject->getOwnerName())
+		: getString("linkset_owner_loading"))
+		: getString("linkset_owner_unknown"));
+}
+
 const LLColor4 &LLFloaterPathfindingLinksets::getBeaconColor() const
 {
 	return mBeaconColor;
@@ -373,10 +383,10 @@ void LLFloaterPathfindingLinksets::updateEditFieldValues()
 	}
 }
 
-LLSD LLFloaterPathfindingLinksets::buildLinksetScrollListData(const LLPathfindingLinkset *pLinksetPtr, const LLVector3 &pAvatarPosition) const
+LLSD LLFloaterPathfindingLinksets::buildLinksetScrollListItemData(const LLPathfindingLinkset *pLinksetPtr, const LLVector3 &pAvatarPosition) const
 {
 	llassert(pLinksetPtr != NULL);
-	LLSD columns;
+	LLSD columns = LLSD::emptyArray();
 
 	if (pLinksetPtr->isTerrain())
 	{
@@ -389,11 +399,14 @@ LLSD LLFloaterPathfindingLinksets::buildLinksetScrollListData(const LLPathfindin
 		columns[2]["column"] = "owner";
 		columns[2]["value"] = getString("linkset_terrain_owner");
 
-		columns[3]["column"] = "land_impact";
-		columns[3]["value"] = getString("linkset_terrain_land_impact");
+		columns[3]["column"] = "scripted";
+		columns[3]["value"] = getString("linkset_terrain_scripted");
 
-		columns[4]["column"] = "dist_from_you";
-		columns[4]["value"] = getString("linkset_terrain_dist_from_you");
+		columns[4]["column"] = "land_impact";
+		columns[4]["value"] = getString("linkset_terrain_land_impact");
+
+		columns[5]["column"] = "dist_from_you";
+		columns[5]["value"] = getString("linkset_terrain_dist_from_you");
 	}
 	else
 	{
@@ -404,22 +417,23 @@ LLSD LLFloaterPathfindingLinksets::buildLinksetScrollListData(const LLPathfindin
 		columns[1]["value"] = pLinksetPtr->getDescription();
 
 		columns[2]["column"] = "owner";
-		columns[2]["value"] = (pLinksetPtr->hasOwner()
-			? (pLinksetPtr->hasOwnerName()
-			? (pLinksetPtr->isGroupOwned()
-			? (pLinksetPtr->getOwnerName() + " " + getString("linkset_owner_group"))
-			: pLinksetPtr->getOwnerName())
-			: getString("linkset_owner_loading"))
-			: getString("linkset_owner_unknown"));
-
-		columns[3]["column"] = "land_impact";
-		columns[3]["value"] = llformat("%1d", pLinksetPtr->getLandImpact());
-
-		columns[4]["column"] = "dist_from_you";
-		columns[4]["value"] = llformat("%1.0f m", dist_vec(pAvatarPosition, pLinksetPtr->getLocation()));
+		columns[2]["value"] = getOwnerName(pLinksetPtr);
+
+		columns[3]["column"] = "scripted";
+		columns[3]["value"] = (pLinksetPtr->hasIsScripted()
+			? (pLinksetPtr->isScripted()
+			? getString("linkset_is_scripted")
+			: getString("linkset_is_not_scripted"))
+			: getString("linkset_is_unknown_scripted"));
+
+		columns[4]["column"] = "land_impact";
+		columns[4]["value"] = llformat("%1d", pLinksetPtr->getLandImpact());
+
+		columns[5]["column"] = "dist_from_you";
+		columns[5]["value"] = llformat("%1.0f m", dist_vec(pAvatarPosition, pLinksetPtr->getLocation()));
 	}
 
-	columns[5]["column"] = "linkset_use";
+	columns[6]["column"] = "linkset_use";
 	std::string linksetUse = getLinksetUseString(pLinksetPtr->getLinksetUse());
 	if (pLinksetPtr->isTerrain())
 	{
@@ -437,25 +451,21 @@ LLSD LLFloaterPathfindingLinksets::buildLinksetScrollListData(const LLPathfindin
 	{
 		linksetUse += (" " + getString("linkset_is_restricted_non_volume_state"));
 	}
-	columns[5]["value"] = linksetUse;
-
-	columns[6]["column"] = "a_percent";
-	columns[6]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientA());
+	columns[6]["value"] = linksetUse;
 
-	columns[7]["column"] = "b_percent";
-	columns[7]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientB());
+	columns[7]["column"] = "a_percent";
+	columns[7]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientA());
 
-	columns[8]["column"] = "c_percent";
-	columns[8]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientC());
+	columns[8]["column"] = "b_percent";
+	columns[8]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientB());
 
-	columns[9]["column"] = "d_percent";
-	columns[9]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientD());
+	columns[9]["column"] = "c_percent";
+	columns[9]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientC());
 
-	LLSD element;
-	element["id"] = pLinksetPtr->getUUID().asString();
-	element["column"] = columns;
+	columns[10]["column"] = "d_percent";
+	columns[10]["value"] = llformat("%3d", pLinksetPtr->getWalkabilityCoefficientD());
 
-	return element;
+	return columns;
 }
 
 LLSD LLFloaterPathfindingLinksets::buildLinksetUseScrollListData(const std::string &pLabel, S32 pValue) const
@@ -490,6 +500,23 @@ bool LLFloaterPathfindingLinksets::isShowUnmodifiablePhantomWarning(LLPathfindin
 	return isShowWarning;
 }
 
+bool LLFloaterPathfindingLinksets::isShowPhantomToggleWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
+{
+	bool isShowWarning = false;
+
+	if (pLinksetUse != LLPathfindingLinkset::kUnknown)
+	{
+		LLPathfindingObjectListPtr selectedObjects = getSelectedObjects();
+		if ((selectedObjects != NULL) && !selectedObjects->isEmpty())
+		{
+			const LLPathfindingLinksetList *linksetList = dynamic_cast<const LLPathfindingLinksetList *>(selectedObjects.get());
+			isShowWarning = linksetList->isShowPhantomToggleWarning(pLinksetUse);
+		}
+	}
+
+	return isShowWarning;
+}
+
 bool LLFloaterPathfindingLinksets::isShowCannotBeVolumeWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
 {
 	bool isShowWarning = false;
@@ -559,29 +586,41 @@ void LLFloaterPathfindingLinksets::applyEdit()
 {
 	LLPathfindingLinkset::ELinksetUse linksetUse = getEditLinksetUse();
 
+	bool showPhantomToggleWarning = isShowPhantomToggleWarning(linksetUse);
 	bool showUnmodifiablePhantomWarning = isShowUnmodifiablePhantomWarning(linksetUse);
 	bool showCannotBeVolumeWarning = isShowCannotBeVolumeWarning(linksetUse);
 
-	if (showUnmodifiablePhantomWarning || showCannotBeVolumeWarning)
+	if (showPhantomToggleWarning || showUnmodifiablePhantomWarning || showCannotBeVolumeWarning)
 	{
 		LLPathfindingLinkset::ELinksetUse restrictedLinksetUse = LLPathfindingLinkset::getLinksetUseWithToggledPhantom(linksetUse);
 		LLSD substitutions;
 		substitutions["REQUESTED_TYPE"] = getLinksetUseString(linksetUse);
 		substitutions["RESTRICTED_TYPE"] = getLinksetUseString(restrictedLinksetUse);
 
-		std::string notificationName;
-		if (showUnmodifiablePhantomWarning && showCannotBeVolumeWarning)
+		// Build one of the following notifications names
+		//   - PathfindingLinksets_WarnOnPhantom
+		//   - PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted
+		//   - PathfindingLinksets_WarnOnPhantom_MismatchOnVolume
+		//   - PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume
+		//   - PathfindingLinksets_MismatchOnRestricted
+		//   - PathfindingLinksets_MismatchOnVolume
+		//   - PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume
+
+		std::string notificationName = "PathfindingLinksets";
+
+		if (showPhantomToggleWarning)
 		{
-			notificationName = "PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume";
+			notificationName += "_WarnOnPhantom";
 		}
-		else if (showUnmodifiablePhantomWarning)
+		if (showUnmodifiablePhantomWarning)
 		{
-			notificationName = "PathfindingLinksets_SetLinksetUseMismatchOnRestricted";
+			notificationName += "_MismatchOnRestricted";
 		}
-		else
+		if (showCannotBeVolumeWarning)
 		{
-			notificationName = "PathfindingLinksets_SetLinksetUseMismatchOnVolume";
+			notificationName += "_MismatchOnVolume";
 		}
+
 		LLNotificationsUtil::add(notificationName, substitutions, LLSD(), boost::bind(&LLFloaterPathfindingLinksets::handleApplyEdit, this, _1, _2));
 	}
 	else
diff --git a/indra/newview/llfloaterpathfindinglinksets.h b/indra/newview/llfloaterpathfindinglinksets.h
index 342a64fc7753ed74eaa656b52a5b42f27878b40c..65383081221634fe562f6efb29a0aba37d308e00 100644
--- a/indra/newview/llfloaterpathfindinglinksets.h
+++ b/indra/newview/llfloaterpathfindinglinksets.h
@@ -58,11 +58,13 @@ protected:
 
 	virtual void                       requestGetObjects();
 
-	virtual LLSD                       convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr);
+	virtual void                       buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr);
 
 	virtual void                       updateControlsOnScrollListChange();
 
 	virtual S32                        getNameColumnIndex() const;
+	virtual S32                        getOwnerNameColumnIndex() const;
+	virtual std::string                getOwnerName(const LLPathfindingObject *pObject) const;
 	virtual const LLColor4             &getBeaconColor() const;
 
 	virtual LLPathfindingObjectListPtr getEmptyObjectList() const;
@@ -78,10 +80,11 @@ private:
 	void clearFilters();
 
 	void updateEditFieldValues();
-	LLSD buildLinksetScrollListData(const LLPathfindingLinkset *pLinksetPtr, const LLVector3 &pAvatarPosition) const;
+	LLSD buildLinksetScrollListItemData(const LLPathfindingLinkset *pLinksetPtr, const LLVector3 &pAvatarPosition) const;
 	LLSD buildLinksetUseScrollListData(const std::string &pLabel, S32 pValue) const;
 
 	bool isShowUnmodifiablePhantomWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
+	bool isShowPhantomToggleWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
 	bool isShowCannotBeVolumeWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
 
 	void updateStateOnEditFields();
diff --git a/indra/newview/llfloaterpathfindingobjects.cpp b/indra/newview/llfloaterpathfindingobjects.cpp
index e246265be93299e11c1a4de0b54fe8edcd30a09e..20c1215bcb66f92594c962b570cc55ba23c1fdf7 100644
--- a/indra/newview/llfloaterpathfindingobjects.cpp
+++ b/indra/newview/llfloaterpathfindingobjects.cpp
@@ -29,6 +29,8 @@
 
 #include "llfloaterpathfindingobjects.h"
 
+#include <string>
+#include <map>
 #include <vector>
 
 #include <boost/bind.hpp>
@@ -96,7 +98,6 @@ void LLFloaterPathfindingObjects::onOpen(const LLSD &pKey)
 
 void LLFloaterPathfindingObjects::onClose(bool pIsAppQuitting)
 {
-	
 	if (mGodLevelChangeSlot.connected())
 	{
 		mGodLevelChangeSlot.disconnect();
@@ -119,6 +120,11 @@ void LLFloaterPathfindingObjects::onClose(bool pIsAppQuitting)
 	{
 		mObjectsSelection.clear();
 	}
+
+	if (pIsAppQuitting)
+	{
+		clearAllObjects();
+	}
 }
 
 void LLFloaterPathfindingObjects::draw()
@@ -168,13 +174,13 @@ LLFloaterPathfindingObjects::LLFloaterPathfindingObjects(const LLSD &pSeed)
 	mReturnButton(NULL),
 	mDeleteButton(NULL),
 	mTeleportButton(NULL),
-	mLoadingAvatarNames(),
 	mDefaultBeaconColor(),
 	mDefaultBeaconTextColor(),
 	mErrorTextColor(),
 	mWarningTextColor(),
 	mMessagingState(kMessagingUnknown),
 	mMessagingRequestId(0U),
+	mMissingNameObjectsScrollListItems(),
 	mObjectList(),
 	mObjectsSelection(),
 	mHasObjectsToBeSelected(false),
@@ -186,6 +192,7 @@ LLFloaterPathfindingObjects::LLFloaterPathfindingObjects(const LLSD &pSeed)
 
 LLFloaterPathfindingObjects::~LLFloaterPathfindingObjects()
 {
+	clearAllObjects();
 }
 
 BOOL LLFloaterPathfindingObjects::postBuild()
@@ -343,54 +350,21 @@ void LLFloaterPathfindingObjects::rebuildObjectsScrollList()
 
 	S32 origScrollPosition = mObjectsScrollList->getScrollPos();
 	mObjectsScrollList->deleteAllItems();
+	mMissingNameObjectsScrollListItems.clear();
 
 	if ((mObjectList != NULL) && !mObjectList->isEmpty())
 	{
-		LLSD scrollListData = convertObjectsIntoScrollListData(mObjectList);
-		llassert(scrollListData.isArray());
+		buildObjectsScrollList(mObjectList);
 
-		LLScrollListCell::Params cellParams;
-		cellParams.font = LLFontGL::getFontSansSerif();
-
-		for (LLSD::array_const_iterator rowElementIter = scrollListData.beginArray(); rowElementIter != scrollListData.endArray(); ++rowElementIter)
+		mObjectsScrollList->selectMultiple(mObjectsToBeSelected);
+		if (mHasObjectsToBeSelected)
 		{
-			const LLSD &rowElement = *rowElementIter;
-
-			LLScrollListItem::Params rowParams;
-			llassert(rowElement.has("id"));
-			llassert(rowElement.get("id").isString());
-			rowParams.value = rowElement.get("id");
-
-			llassert(rowElement.has("column"));
-			llassert(rowElement.get("column").isArray());
-			const LLSD &columnElement = rowElement.get("column");
-			for (LLSD::array_const_iterator cellIter = columnElement.beginArray(); cellIter != columnElement.endArray(); ++cellIter)
-			{
-				const LLSD &cellElement = *cellIter;
-
-				llassert(cellElement.has("column"));
-				llassert(cellElement.get("column").isString());
-				cellParams.column = cellElement.get("column").asString();
-
-				llassert(cellElement.has("value"));
-				llassert(cellElement.get("value").isString());
-				cellParams.value = cellElement.get("value").asString();
-
-				rowParams.columns.add(cellParams);
-			}
-
-			mObjectsScrollList->addRow(rowParams);
+			mObjectsScrollList->scrollToShowSelected();
+		}
+		else
+		{
+			mObjectsScrollList->setScrollPos(origScrollPosition);
 		}
-	}
-
-	mObjectsScrollList->selectMultiple(mObjectsToBeSelected);
-	if (mHasObjectsToBeSelected)
-	{
-		mObjectsScrollList->scrollToShowSelected();
-	}
-	else
-	{
-		mObjectsScrollList->setScrollPos(origScrollPosition);
 	}
 
 	mObjectsToBeSelected.clear();
@@ -399,20 +373,42 @@ void LLFloaterPathfindingObjects::rebuildObjectsScrollList()
 	updateControlsOnScrollListChange();
 }
 
-LLSD LLFloaterPathfindingObjects::convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr)
+void LLFloaterPathfindingObjects::buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr)
 {
 	llassert(0);
-	LLSD nullObjs = LLSD::emptyArray();
-	return nullObjs;
 }
 
-void LLFloaterPathfindingObjects::rebuildScrollListAfterAvatarNameLoads(const LLUUID &pAvatarId)
+void LLFloaterPathfindingObjects::addObjectToScrollList(const LLPathfindingObjectPtr pObjectPtr, const LLSD &pScrollListItemData)
 {
-	std::set<LLUUID>::const_iterator iter = mLoadingAvatarNames.find(pAvatarId);
-	if (iter == mLoadingAvatarNames.end())
+	LLScrollListCell::Params cellParams;
+	cellParams.font = LLFontGL::getFontSansSerif();
+
+	LLScrollListItem::Params rowParams;
+	rowParams.value = pObjectPtr->getUUID().asString();
+
+	llassert(pScrollListItemData.isArray());
+	for (LLSD::array_const_iterator cellIter = pScrollListItemData.beginArray();
+		cellIter != pScrollListItemData.endArray(); ++cellIter)
+	{
+		const LLSD &cellElement = *cellIter;
+
+		llassert(cellElement.has("column"));
+		llassert(cellElement.get("column").isString());
+		cellParams.column = cellElement.get("column").asString();
+
+		llassert(cellElement.has("value"));
+		llassert(cellElement.get("value").isString());
+		cellParams.value = cellElement.get("value").asString();
+
+		rowParams.columns.add(cellParams);
+	}
+
+	LLScrollListItem *scrollListItem = mObjectsScrollList->addRow(rowParams);
+
+	if (pObjectPtr->hasOwner() && !pObjectPtr->hasOwnerName())
 	{
-		mLoadingAvatarNames.insert(pAvatarId);
-		LLAvatarNameCache::get(pAvatarId, boost::bind(&LLFloaterPathfindingObjects::handleAvatarNameLoads, this, _1, _2));
+		mMissingNameObjectsScrollListItems.insert(std::make_pair<std::string, LLScrollListItem *>(pObjectPtr->getUUID().asString(), scrollListItem));
+		pObjectPtr->registerOwnerNameListener(boost::bind(&LLFloaterPathfindingObjects::handleObjectNameResponse, this, _1));
 	}
 }
 
@@ -434,6 +430,18 @@ S32 LLFloaterPathfindingObjects::getNameColumnIndex() const
 	return 0;
 }
 
+S32 LLFloaterPathfindingObjects::getOwnerNameColumnIndex() const
+{
+	return 2;
+}
+
+std::string LLFloaterPathfindingObjects::getOwnerName(const LLPathfindingObject *pObject) const
+{
+	llassert(0);
+	std::string returnVal;
+	return returnVal;
+}
+
 const LLColor4 &LLFloaterPathfindingObjects::getBeaconColor() const
 {
 	return mDefaultBeaconColor;
@@ -496,6 +504,7 @@ void LLFloaterPathfindingObjects::clearAllObjects()
 {
 	selectNoneObjects();
 	mObjectsScrollList->deleteAllItems();
+	mMissingNameObjectsScrollListItems.clear();
 	mObjectList.reset();
 }
 
@@ -683,13 +692,22 @@ void LLFloaterPathfindingObjects::onGodLevelChange(U8 pGodLevel)
 	requestGetObjects();
 }
 
-void LLFloaterPathfindingObjects::handleAvatarNameLoads(const LLUUID &pAvatarId, const LLAvatarName &pAvatarName)
+void LLFloaterPathfindingObjects::handleObjectNameResponse(const LLPathfindingObject *pObject)
 {
-	llassert(mLoadingAvatarNames.find(pAvatarId) != mLoadingAvatarNames.end());
-	mLoadingAvatarNames.erase(pAvatarId);
-	if (mLoadingAvatarNames.empty())
+	llassert(pObject != NULL);
+	const std::string uuid = pObject->getUUID().asString();
+	scroll_list_item_map::iterator scrollListItemIter = mMissingNameObjectsScrollListItems.find(uuid);
+	if (scrollListItemIter != mMissingNameObjectsScrollListItems.end())
 	{
-		rebuildObjectsScrollList();
+		LLScrollListItem *scrollListItem = scrollListItemIter->second;
+		llassert(scrollListItem != NULL);
+
+		LLScrollListCell *scrollListCell = scrollListItem->getColumn(getOwnerNameColumnIndex());
+		LLSD ownerName = getOwnerName(pObject);
+
+		scrollListCell->setValue(ownerName);
+
+		mMissingNameObjectsScrollListItems.erase(scrollListItemIter);
 	}
 }
 
diff --git a/indra/newview/llfloaterpathfindingobjects.h b/indra/newview/llfloaterpathfindingobjects.h
index e8d446b598963374700d607fbc9d49c24d339498..4024e15fd63ee1a6e25a9203f72acbdbea02cfbe 100644
--- a/indra/newview/llfloaterpathfindingobjects.h
+++ b/indra/newview/llfloaterpathfindingobjects.h
@@ -27,7 +27,8 @@
 #ifndef LL_LLFLOATERPATHFINDINGOBJECTS_H
 #define LL_LLFLOATERPATHFINDINGOBJECTS_H
 
-#include <set>
+#include <string>
+#include <map>
 
 #include <boost/signals2.hpp>
 
@@ -80,14 +81,15 @@ protected:
 	void                               handleUpdateObjectList(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::ERequestStatus pRequestStatus, LLPathfindingObjectListPtr pObjectList);
 
 	void                               rebuildObjectsScrollList();
-	virtual LLSD                       convertObjectsIntoScrollListData(const LLPathfindingObjectListPtr pObjectListPtr);
-
-	void                               rebuildScrollListAfterAvatarNameLoads(const LLUUID &pAvatarId);
+	virtual void                       buildObjectsScrollList(const LLPathfindingObjectListPtr pObjectListPtr);
+	void                               addObjectToScrollList(const LLPathfindingObjectPtr pObjectPr, const LLSD &pScrollListItemData);
 
 	virtual void                       updateControlsOnScrollListChange();
 	virtual void                       updateControlsOnInWorldSelectionChange();
 
 	virtual S32                        getNameColumnIndex() const;
+	virtual S32                        getOwnerNameColumnIndex() const;
+	virtual std::string                getOwnerName(const LLPathfindingObject *pObject) const;
 	virtual const LLColor4             &getBeaconColor() const;
 	virtual const LLColor4             &getBeaconTextColor() const;
 	virtual S32                        getBeaconWidth() const;
@@ -126,7 +128,7 @@ private:
 	void                   onRegionBoundaryCrossed();
 	void                   onGodLevelChange(U8 pGodLevel);
 
-	void                   handleAvatarNameLoads(const LLUUID &pAvatarId, const LLAvatarName &pAvatarName);
+	void                   handleObjectNameResponse(const LLPathfindingObject *pObject);
 
 	void                   updateMessagingStatus();
 	void                   updateStateOnListControls();
@@ -151,8 +153,6 @@ private:
 	LLButton                           *mDeleteButton;
 	LLButton                           *mTeleportButton;
 
-	std::set<LLUUID>                   mLoadingAvatarNames;
-
 	LLColor4                           mDefaultBeaconColor;
 	LLColor4                           mDefaultBeaconTextColor;
 	LLColor4                           mErrorTextColor;
@@ -161,6 +161,9 @@ private:
 	EMessagingState                    mMessagingState;
 	LLPathfindingManager::request_id_t mMessagingRequestId;
 
+	typedef std::map<std::string, LLScrollListItem *> scroll_list_item_map;
+	scroll_list_item_map               mMissingNameObjectsScrollListItems;
+
 	LLPathfindingObjectListPtr         mObjectList;
 
 	LLObjectSelectionHandle            mObjectsSelection;
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 99ebb0eb3462fe01f7fbacf78017222571ad452c..48484786f69191b2a2142e9612c09714351dab69 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -133,7 +133,6 @@ public:
 		if(tools_floater)
 		{
 			tools_floater->updateLandImpacts();
-			tools_floater->dirty();
 		}
 	}
 };
diff --git a/indra/newview/llpathfindinglinkset.cpp b/indra/newview/llpathfindinglinkset.cpp
index fe4daabd89dbb9e85d84c84abfc5ae966d5904a7..50b76378f5e29f0ffced23bf53f2961ca4ded652 100644
--- a/indra/newview/llpathfindinglinkset.cpp
+++ b/indra/newview/llpathfindinglinkset.cpp
@@ -39,6 +39,7 @@
 #define LINKSET_MODIFIABLE_FIELD    "modifiable"
 #define LINKSET_CATEGORY_FIELD      "navmesh_category"
 #define LINKSET_CAN_BE_VOLUME       "can_be_volume"
+#define LINKSET_IS_SCRIPTED_FIELD   "is_scripted"
 #define LINKSET_PHANTOM_FIELD       "phantom"
 #define LINKSET_WALKABILITY_A_FIELD "A"
 #define LINKSET_WALKABILITY_B_FIELD "B"
@@ -62,6 +63,8 @@ LLPathfindingLinkset::LLPathfindingLinkset(const LLSD& pTerrainData)
 	mLandImpact(0U),
 	mIsModifiable(FALSE),
 	mCanBeVolume(FALSE),
+	mIsScripted(FALSE),
+	mHasIsScripted(TRUE),
 	mLinksetUse(kUnknown),
 	mWalkabilityCoefficientA(MIN_WALKABILITY_VALUE),
 	mWalkabilityCoefficientB(MIN_WALKABILITY_VALUE),
@@ -77,6 +80,8 @@ LLPathfindingLinkset::LLPathfindingLinkset(const std::string &pUUID, const LLSD&
 	mLandImpact(0U),
 	mIsModifiable(TRUE),
 	mCanBeVolume(TRUE),
+	mIsScripted(FALSE),
+	mHasIsScripted(FALSE),
 	mLinksetUse(kUnknown),
 	mWalkabilityCoefficientA(MIN_WALKABILITY_VALUE),
 	mWalkabilityCoefficientB(MIN_WALKABILITY_VALUE),
@@ -93,6 +98,8 @@ LLPathfindingLinkset::LLPathfindingLinkset(const LLPathfindingLinkset& pOther)
 	mLandImpact(pOther.mLandImpact),
 	mIsModifiable(pOther.mIsModifiable),
 	mCanBeVolume(pOther.mCanBeVolume),
+	mIsScripted(pOther.mIsScripted),
+	mHasIsScripted(pOther.mHasIsScripted),
 	mLinksetUse(pOther.mLinksetUse),
 	mWalkabilityCoefficientA(pOther.mWalkabilityCoefficientA),
 	mWalkabilityCoefficientB(pOther.mWalkabilityCoefficientB),
@@ -113,6 +120,8 @@ LLPathfindingLinkset& LLPathfindingLinkset::operator =(const LLPathfindingLinkse
 	mLandImpact = pOther.mLandImpact;
 	mIsModifiable = pOther.mIsModifiable;
 	mCanBeVolume = pOther.mCanBeVolume;
+	mIsScripted = pOther.mIsScripted;
+	mHasIsScripted = pOther.mHasIsScripted;
 	mLinksetUse = pOther.mLinksetUse;
 	mWalkabilityCoefficientA = pOther.mWalkabilityCoefficientA;
 	mWalkabilityCoefficientB = pOther.mWalkabilityCoefficientB;
@@ -140,6 +149,11 @@ bool LLPathfindingLinkset::isShowUnmodifiablePhantomWarning(ELinksetUse pLinkset
 	return (!isModifiable() && (isPhantom() != isPhantom(pLinksetUse)));
 }
 
+bool LLPathfindingLinkset::isShowPhantomToggleWarning(ELinksetUse pLinksetUse) const
+{
+	return (isModifiable() && (isPhantom() != isPhantom(pLinksetUse)));
+}
+
 bool LLPathfindingLinkset::isShowCannotBeVolumeWarning(ELinksetUse pLinksetUse) const
 {
 	return (!canBeVolume() && ((pLinksetUse == kMaterialVolume) || (pLinksetUse == kExclusionVolume)));
@@ -193,6 +207,13 @@ void LLPathfindingLinkset::parseLinksetData(const LLSD &pLinksetData)
 	llassert(pLinksetData.has(LINKSET_MODIFIABLE_FIELD));
 	llassert(pLinksetData.get(LINKSET_MODIFIABLE_FIELD).isBoolean());
 	mIsModifiable = pLinksetData.get(LINKSET_MODIFIABLE_FIELD).asBoolean();
+
+	mHasIsScripted = pLinksetData.has(LINKSET_IS_SCRIPTED_FIELD);
+	if (mHasIsScripted)
+	{
+		llassert(pLinksetData.get(LINKSET_IS_SCRIPTED_FIELD).isBoolean());
+		mIsScripted = pLinksetData.get(LINKSET_IS_SCRIPTED_FIELD).asBoolean();
+	}
 }
 
 void LLPathfindingLinkset::parsePathfindingData(const LLSD &pLinksetData)
diff --git a/indra/newview/llpathfindinglinkset.h b/indra/newview/llpathfindinglinkset.h
index 73b4d6bad41f87c7d017e5926b5515cbc3a8e317..308a3a1e0f580a1d402a8562e2ce10d0a2d15357 100644
--- a/indra/newview/llpathfindinglinkset.h
+++ b/indra/newview/llpathfindinglinkset.h
@@ -63,12 +63,16 @@ public:
 
 	inline ELinksetUse getLinksetUse() const               {return mLinksetUse;};
 
+	inline BOOL        isScripted() const                  {return mIsScripted;};
+	inline BOOL        hasIsScripted() const               {return mHasIsScripted;};
+
 	inline S32         getWalkabilityCoefficientA() const  {return mWalkabilityCoefficientA;};
 	inline S32         getWalkabilityCoefficientB() const  {return mWalkabilityCoefficientB;};
 	inline S32         getWalkabilityCoefficientC() const  {return mWalkabilityCoefficientC;};
 	inline S32         getWalkabilityCoefficientD() const  {return mWalkabilityCoefficientD;};
 
 	bool               isShowUnmodifiablePhantomWarning(ELinksetUse pLinksetUse) const;
+	bool               isShowPhantomToggleWarning(ELinksetUse pLinksetUse) const;
 	bool               isShowCannotBeVolumeWarning(ELinksetUse pLinksetUse) const;
 	LLSD               encodeAlteredFields(ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD) const;
 
@@ -98,6 +102,8 @@ private:
 	U32          mLandImpact;
 	BOOL         mIsModifiable;
 	BOOL         mCanBeVolume;
+	BOOL         mIsScripted;
+	BOOL         mHasIsScripted;
 	ELinksetUse  mLinksetUse;
 	S32          mWalkabilityCoefficientA;
 	S32          mWalkabilityCoefficientB;
diff --git a/indra/newview/llpathfindinglinksetlist.cpp b/indra/newview/llpathfindinglinksetlist.cpp
index 746fa342a110e0f447515ae5a25651fb1f20fd6e..b886e46765804bf92bc9d1978eaaf90580be33d3 100644
--- a/indra/newview/llpathfindinglinksetlist.cpp
+++ b/indra/newview/llpathfindinglinksetlist.cpp
@@ -113,6 +113,20 @@ bool LLPathfindingLinksetList::isShowUnmodifiablePhantomWarning(LLPathfindingLin
 	return isShowWarning;
 }
 
+bool LLPathfindingLinksetList::isShowPhantomToggleWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
+{
+	bool isShowWarning = false;
+
+	for (const_iterator objectIter = begin(); !isShowWarning && (objectIter != end()); ++objectIter)
+	{
+		const LLPathfindingObjectPtr objectPtr = objectIter->second;
+		const LLPathfindingLinkset *linkset = dynamic_cast<const LLPathfindingLinkset *>(objectPtr.get());
+		isShowWarning = linkset->isShowPhantomToggleWarning(pLinksetUse);
+	}
+
+	return isShowWarning;
+}
+
 bool LLPathfindingLinksetList::isShowCannotBeVolumeWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const
 {
 	bool isShowWarning = false;
diff --git a/indra/newview/llpathfindinglinksetlist.h b/indra/newview/llpathfindinglinksetlist.h
index 77c63586401728baf80ed666d55ccdc7d6a0d786..1d38e4c11a1c41b6488bf51dbbb1ca9bc1773608 100644
--- a/indra/newview/llpathfindinglinksetlist.h
+++ b/indra/newview/llpathfindinglinksetlist.h
@@ -43,6 +43,7 @@ public:
 	LLSD encodeTerrainFields(LLPathfindingLinkset::ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD) const;
 
 	bool isShowUnmodifiablePhantomWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
+	bool isShowPhantomToggleWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
 	bool isShowCannotBeVolumeWarning(LLPathfindingLinkset::ELinksetUse pLinksetUse) const;
 
 	void determinePossibleStates(BOOL &pCanBeWalkable, BOOL &pCanBeStaticObstacle, BOOL &pCanBeDynamicObstacle,
diff --git a/indra/newview/llpathfindingobject.cpp b/indra/newview/llpathfindingobject.cpp
index 916eceb4c899bfca34f1e59cd2b0d108ce7be24d..858d3203c0c4be8c6079d61e7bb166ac12cd43b5 100644
--- a/indra/newview/llpathfindingobject.cpp
+++ b/indra/newview/llpathfindingobject.cpp
@@ -55,8 +55,10 @@ LLPathfindingObject::LLPathfindingObject()
 	mOwnerUUID(),
 	mHasOwnerName(false),
 	mOwnerName(),
+	mAvatarNameCacheConnection(),
 	mIsGroupOwned(false),
-	mLocation()
+	mLocation(),
+	mOwnerNameSignal()
 {
 }
 
@@ -67,8 +69,10 @@ LLPathfindingObject::LLPathfindingObject(const std::string &pUUID, const LLSD &p
 	mOwnerUUID(),
 	mHasOwnerName(false),
 	mOwnerName(),
+	mAvatarNameCacheConnection(),
 	mIsGroupOwned(false),
-	mLocation()
+	mLocation(),
+	mOwnerNameSignal()
 {
 	parseObjectData(pObjectData);
 }
@@ -80,14 +84,17 @@ LLPathfindingObject::LLPathfindingObject(const LLPathfindingObject& pOther)
 	mOwnerUUID(pOther.mOwnerUUID),
 	mHasOwnerName(false),
 	mOwnerName(),
+	mAvatarNameCacheConnection(),
 	mIsGroupOwned(pOther.mIsGroupOwned),
-	mLocation(pOther.mLocation)
+	mLocation(pOther.mLocation),
+	mOwnerNameSignal()
 {
 	fetchOwnerName();
 }
 
 LLPathfindingObject::~LLPathfindingObject()
 {
+	disconnectAvatarNameCacheConnection();
 }
 
 LLPathfindingObject &LLPathfindingObject::operator =(const LLPathfindingObject& pOther)
@@ -115,6 +122,23 @@ std::string LLPathfindingObject::getOwnerName() const
 	return ownerName;
 }
 
+LLPathfindingObject::name_connection_t LLPathfindingObject::registerOwnerNameListener(name_callback_t pOwnerNameCallback)
+{
+	llassert(hasOwner());
+
+	name_connection_t connection;
+	if (hasOwnerName())
+	{
+		pOwnerNameCallback(this);
+	}
+	else
+	{
+		connection = mOwnerNameSignal.connect(pOwnerNameCallback);
+	}
+
+	return connection;
+}
+
 void LLPathfindingObject::parseObjectData(const LLSD &pObjectData)
 {
 	llassert(pObjectData.has(PATHFINDING_OBJECT_NAME_FIELD));
@@ -149,7 +173,7 @@ void LLPathfindingObject::fetchOwnerName()
 		mHasOwnerName = LLAvatarNameCache::get(mOwnerUUID, &mOwnerName);
 		if (!mHasOwnerName)
 		{
-			LLAvatarNameCache::get(mOwnerUUID, boost::bind(&LLPathfindingObject::handleAvatarNameFetch, this, _1, _2));
+			mAvatarNameCacheConnection = LLAvatarNameCache::get(mOwnerUUID, boost::bind(&LLPathfindingObject::handleAvatarNameFetch, this, _1, _2));
 		}
 	}
 }
@@ -157,6 +181,19 @@ void LLPathfindingObject::fetchOwnerName()
 void LLPathfindingObject::handleAvatarNameFetch(const LLUUID &pOwnerUUID, const LLAvatarName &pAvatarName)
 {
 	llassert(mOwnerUUID == pOwnerUUID);
+
 	mOwnerName = pAvatarName;
 	mHasOwnerName = true;
+
+	disconnectAvatarNameCacheConnection();
+
+	mOwnerNameSignal(this);
+}
+
+void LLPathfindingObject::disconnectAvatarNameCacheConnection()
+{
+	if (mAvatarNameCacheConnection.connected())
+	{
+		mAvatarNameCacheConnection.disconnect();
+	}
 }
diff --git a/indra/newview/llpathfindingobject.h b/indra/newview/llpathfindingobject.h
index d45cc554fd793d15919ef9e52733603594ab43e8..b8d3ca236413f08be20eafa37b6a8c28acb89ebc 100644
--- a/indra/newview/llpathfindingobject.h
+++ b/indra/newview/llpathfindingobject.h
@@ -30,8 +30,11 @@
 #include <string>
 
 #include <boost/shared_ptr.hpp>
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
 
 #include "llavatarname.h"
+#include "llavatarnamecache.h"
 #include "lluuid.h"
 #include "v3math.h"
 
@@ -59,6 +62,12 @@ public:
 	inline BOOL               isGroupOwned() const   {return mIsGroupOwned;};
 	inline const LLVector3&   getLocation() const    {return mLocation;};
 
+	typedef boost::function<void (const LLPathfindingObject *)>         name_callback_t;
+	typedef boost::signals2::signal<void (const LLPathfindingObject *)> name_signal_t;
+	typedef boost::signals2::connection                                 name_connection_t;
+
+	name_connection_t registerOwnerNameListener(name_callback_t pOwnerNameCallback);
+
 protected:
 
 private:
@@ -66,15 +75,18 @@ private:
 
 	void fetchOwnerName();
 	void handleAvatarNameFetch(const LLUUID &pOwnerUUID, const LLAvatarName &pAvatarName);
+	void disconnectAvatarNameCacheConnection();
 
-	LLUUID       mUUID;
-	std::string  mName;
-	std::string  mDescription;
-	LLUUID       mOwnerUUID;
-	bool         mHasOwnerName;
-	LLAvatarName mOwnerName;
-	BOOL         mIsGroupOwned;
-	LLVector3    mLocation;
+	LLUUID                                   mUUID;
+	std::string                              mName;
+	std::string                              mDescription;
+	LLUUID                                   mOwnerUUID;
+	bool                                     mHasOwnerName;
+	LLAvatarName                             mOwnerName;
+	LLAvatarNameCache::callback_connection_t mAvatarNameCacheConnection;
+	BOOL                                     mIsGroupOwned;
+	LLVector3                                mLocation;
+	name_signal_t                            mOwnerNameSignal;
 };
 
 #endif // LL_LLPATHFINDINGOBJECT_H
diff --git a/indra/newview/llpathfindingobjectlist.cpp b/indra/newview/llpathfindingobjectlist.cpp
index 68a7e736e61327d5b995fcf804e6ed2ce039c36d..f1ecb45fc021b51fbc01b6a92c287b083eb174bb 100644
--- a/indra/newview/llpathfindingobjectlist.cpp
+++ b/indra/newview/llpathfindingobjectlist.cpp
@@ -45,6 +45,7 @@ LLPathfindingObjectList::LLPathfindingObjectList()
 
 LLPathfindingObjectList::~LLPathfindingObjectList()
 {
+	clear();
 }
 
 bool LLPathfindingObjectList::isEmpty() const
@@ -52,6 +53,15 @@ bool LLPathfindingObjectList::isEmpty() const
 	return mObjectMap.empty();
 }
 
+void LLPathfindingObjectList::clear()
+{
+	for (LLPathfindingObjectMap::iterator objectIter = mObjectMap.begin(); objectIter != mObjectMap.end(); ++objectIter)
+	{
+		objectIter->second.reset();
+	}
+	mObjectMap.clear();
+}
+
 void LLPathfindingObjectList::update(LLPathfindingObjectPtr pUpdateObjectPtr)
 {
 	if (pUpdateObjectPtr != NULL)
diff --git a/indra/newview/llpathfindingobjectlist.h b/indra/newview/llpathfindingobjectlist.h
index 3ad8e8b096357c574db5fd1d275fb366fed77bda..61580582d370bdd4d2356d54ab6d9ab6678c640e 100644
--- a/indra/newview/llpathfindingobjectlist.h
+++ b/indra/newview/llpathfindingobjectlist.h
@@ -47,6 +47,8 @@ public:
 
 	bool isEmpty() const;
 
+	void clear();
+
 	void update(LLPathfindingObjectPtr pUpdateObjectPtr);
 	void update(LLPathfindingObjectListPtr pUpdateObjectListPtr);
 
@@ -56,7 +58,6 @@ public:
 	const_iterator begin() const;
 	const_iterator end() const;
 
-
 protected:
 	LLPathfindingObjectMap &getObjectMap();
 
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index fc8192f14b454f6a526be3eafeee5a9b9650fbc1..bbbf071570b4aeb9c184bb7844c1bcfe130738a2 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -2075,7 +2075,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
 	{
 		if (new_angv != old_angv)
 		{
-			resetRot();
+			resetRotTime();
 		}
 
 		// Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)
@@ -5547,9 +5547,14 @@ void LLViewerObject::applyAngularVelocity(F32 dt)
 	}
 }
 
-void LLViewerObject::resetRot()
+void LLViewerObject::resetRotTime()
 {
 	mRotTime = 0.0f;
+}
+
+void LLViewerObject::resetRot()
+{
+	resetRotTime();
 
 	// Reset the accumulated angular velocity rotation
 	mAngularVelocityRot.loadIdentity(); 
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 530d6531f3f50dd9659e607b4d4eb5d2cd8de95b..05d017dee3a6160bb3fe6b652cf0b20363691b5e 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -212,6 +212,9 @@ public:
 	virtual BOOL		updateLOD();
 	virtual BOOL		setDrawableParent(LLDrawable* parentp);
 	F32					getRotTime() { return mRotTime; }
+private:
+	void				resetRotTime();
+public:
 	void				resetRot();
 	void				applyAngularVelocity(F32 dt);
 
@@ -224,7 +227,7 @@ public:
 	LLViewerRegion* getRegion() const				{ return mRegionp; }
 
 	BOOL isSelected() const							{ return mUserSelected; }
-	virtual void setSelected(BOOL sel)				{ mUserSelected = sel; mRotTime = 0.f;}
+	virtual void setSelected(BOOL sel)				{ mUserSelected = sel; resetRot();}
 
 	const LLUUID &getID() const						{ return mID; }
 	U32 getLocalID() const							{ return mLocalID; }
diff --git a/indra/newview/res-sdl/lltoolpathfinding.BMP b/indra/newview/res-sdl/lltoolpathfinding.BMP
new file mode 100644
index 0000000000000000000000000000000000000000..a567951b7a4be1f640d6eb563b5e6f1a8104e280
Binary files /dev/null and b/indra/newview/res-sdl/lltoolpathfinding.BMP differ
diff --git a/indra/newview/res-sdl/lltoolpathfindingpathend.BMP b/indra/newview/res-sdl/lltoolpathfindingpathend.BMP
new file mode 100644
index 0000000000000000000000000000000000000000..aacea8237ff34602db29d0fb3da3898f142df9a5
Binary files /dev/null and b/indra/newview/res-sdl/lltoolpathfindingpathend.BMP differ
diff --git a/indra/newview/res-sdl/lltoolpathfindingpathendadd.BMP b/indra/newview/res-sdl/lltoolpathfindingpathendadd.BMP
new file mode 100644
index 0000000000000000000000000000000000000000..fa19f3f1058dbe586920d7c42c9c1891b8d2ed46
Binary files /dev/null and b/indra/newview/res-sdl/lltoolpathfindingpathendadd.BMP differ
diff --git a/indra/newview/res-sdl/lltoolpathfindingpathstart.BMP b/indra/newview/res-sdl/lltoolpathfindingpathstart.BMP
new file mode 100644
index 0000000000000000000000000000000000000000..912b7f931a744d3cf4e775aba5198ba0518e42a9
Binary files /dev/null and b/indra/newview/res-sdl/lltoolpathfindingpathstart.BMP differ
diff --git a/indra/newview/res-sdl/lltoolpathfindingpathstartadd.BMP b/indra/newview/res-sdl/lltoolpathfindingpathstartadd.BMP
new file mode 100644
index 0000000000000000000000000000000000000000..4e8999ae0bff6c34b7b442bcc457d4803f7fb64f
Binary files /dev/null and b/indra/newview/res-sdl/lltoolpathfindingpathstartadd.BMP differ
diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
index eaed92ac55f7e42c42dde11de8170fc17395d09b..9bc5c7d5a4b12cdefbbc2d75a534ccbc2af03910 100644
--- a/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/en/floater_pathfinding_linksets.xml
@@ -4,9 +4,9 @@
     can_resize="true"
     can_tear_off="false"
     height="395"
-    width="1015"
+    width="1075"
     min_height="395"
-    min_width="1015"
+    min_width="1075"
     layout="topleft"
     name="floater_pathfinding_linksets"
     help_topic="floater_pathfinding_linksets"
@@ -25,11 +25,15 @@
   <floater.string name="linkset_terrain_name">[Terrain]</floater.string>
   <floater.string name="linkset_terrain_description">--</floater.string>
   <floater.string name="linkset_terrain_owner">--</floater.string>
+  <floater.string name="linkset_terrain_scripted">--</floater.string>
   <floater.string name="linkset_terrain_land_impact">--</floater.string>
   <floater.string name="linkset_terrain_dist_from_you">--</floater.string>
   <floater.string name="linkset_owner_loading">[Loading]</floater.string>
   <floater.string name="linkset_owner_unknown">[Unknown]</floater.string>
   <floater.string name="linkset_owner_group">[group]</floater.string>
+  <floater.string name="linkset_is_scripted">Yes</floater.string>
+  <floater.string name="linkset_is_not_scripted">No</floater.string>
+  <floater.string name="linkset_is_unknown_scripted">Unknown</floater.string>
   <floater.string name="linkset_use_walkable">Walkable</floater.string>
   <floater.string name="linkset_use_static_obstacle">Static obstacle</floater.string>
   <floater.string name="linkset_use_dynamic_obstacle">Movable obstacle</floater.string>
@@ -47,7 +51,7 @@
       follows="left|top|right|bottom"
       layout="topleft"
       height="226"
-      width="999">
+      width="1059">
     <text
         height="13"
         word_wrap="false"
@@ -155,7 +159,7 @@
         layout="topleft"
         name="apply_filters"
         top_pad="-21"
-        left_pad="31"
+        left_pad="91"
         width="73"/>
     <button
         follows="right|top"
@@ -177,7 +181,7 @@
         tab_stop="false"
         multi_select="true"
         name="objects_scroll_list"
-        width="980">
+        width="1040">
       <scroll_list.columns
           label="Name (root prim)"
           name="name"
@@ -190,6 +194,10 @@
           label="Owner"
           name="owner"
           width="141" />
+      <scroll_list.columns
+          label="Scripted"
+          name="scripted"
+          width="60" />
       <scroll_list.columns
           label="Impact"
           name="land_impact"
@@ -230,7 +238,7 @@
         layout="topleft"
         name="messaging_status"
         top_pad="17"
-        width="619">
+        width="679">
       Linksets:
     </text>
     <button
@@ -269,7 +277,7 @@
       name="horiz_separator"
       top_pad="0"
       left="18"
-      width="979"/>
+      width="1039"/>
   <panel
       border="false"
       bevel_style="none"
@@ -277,7 +285,7 @@
       layout="topleft"
       left="0"
       height="67"
-      width="950">
+      width="1010">
     <text
         height="13"
         word_wrap="false"
@@ -327,7 +335,7 @@
         layout="topleft"
         name="teleport_me_to_object"
         top_pad="-21"
-        left_pad="206"
+        left_pad="239"
         width="160"/>
     <button
         follows="right|bottom"
@@ -336,7 +344,7 @@
         layout="topleft"
         name="return_objects"
         top_pad="-21"
-        left_pad="220"
+        left_pad="252"
         width="95"/>
     <button
         follows="right|bottom"
@@ -356,7 +364,7 @@
       name="horiz_separator"
       top_pad="0"
       left="18"
-      width="979"/>
+      width="1039"/>
   <panel
       border="false"
       bevel_style="none"
@@ -364,7 +372,7 @@
       layout="topleft"
       left="0"
       height="75"
-      width="950">
+      width="1010">
     <text
         height="13"
         word_wrap="false"
@@ -376,7 +384,7 @@
         layout="topleft"
         left="18"
         top_pad="8"
-        width="912">
+        width="972">
       Edit attributes of selected linksets and press the button to apply changes
     </text>
     <combo_box
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index dfd8a82c96b7ec6add66e45c5baf7b32460db768..ae5278b7ecff07c957a1be4c589d70a0c83be749 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -8075,9 +8075,26 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
 
   <notification
    icon="alertmodal.tga"
-   name="PathfindingLinksets_SetLinksetUseMismatchOnRestricted"
+   name="PathfindingLinksets_WarnOnPhantom"
    type="alertmodal">
-    Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
+Some selected linksets will have the Phantom flag toggled.
+
+Do you wish to continue?
+    <tag>confirm</tag>
+    <usetemplate
+     ignoretext="Some selected linksets phantom flag will be toggled."
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="OK"/>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="PathfindingLinksets_MismatchOnRestricted"
+   type="alertmodal">
+Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
+
+Do you wish to continue?
     <tag>confirm</tag>
     <usetemplate
      ignoretext="Some selected linksets cannot be set because of permission restrictions on the linkset."
@@ -8088,9 +8105,11 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
 
   <notification
    icon="alertmodal.tga"
-   name="PathfindingLinksets_SetLinksetUseMismatchOnVolume"
+   name="PathfindingLinksets_MismatchOnVolume"
    type="alertmodal">
-    Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex.
+Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex.
+
+Do you wish to continue?
     <tag>confirm</tag>
     <usetemplate
      ignoretext="Some selected linksets cannot be set because the shape is non-convex"
@@ -8101,10 +8120,47 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
 
   <notification
    icon="alertmodal.tga"
-   name="PathfindingLinksets_SetLinksetUseMismatchOnRestrictedAndVolume"
+   name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted"
+   type="alertmodal">
+Some selected linksets will have the Phantom flag toggled.
+
+Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
+
+Do you wish to continue?
+    <tag>confirm</tag>
+    <usetemplate
+     ignoretext="Some selected linksets phantom flag will be toggled and others cannot be set because of permission restrictions on the linkset."
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="OK"/>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume"
+   type="alertmodal">
+Some selected linksets will have the Phantom flag toggled.
+
+Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex.
+
+Do you wish to continue?
+    <tag>confirm</tag>
+    <usetemplate
+     ignoretext="Some selected linksets phantom flag will be toggled and others cannot be set because the shape is non-convex"
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="OK"/>
+  </notification>
+
+  <notification
+   icon="alertmodal.tga"
+   name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume"
    type="alertmodal">
-    Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
- Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex. These linksets&apos; use types will not change.
+Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
+
+Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex. These linksets&apos; use types will not change.
+
+Do you wish to continue?
     <tag>confirm</tag>
     <usetemplate
      ignoretext="Some selected linksets cannot be set because of permission restrictions on the linkset and because the shape is non-convex."
@@ -8113,6 +8169,25 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
      yestext="OK"/>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume"
+   type="alertmodal">
+Some selected linksets will have the Phantom flag toggled.
+
+Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
+
+Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex. These linksets&apos; use types will not change.
+
+Do you wish to continue?
+    <tag>confirm</tag>
+    <usetemplate
+     ignoretext="Some selected linksets phantom flag will be toggled and others cannot be set because of permission restrictions on the linkset and because the shape is non-convex."
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="OK"/>
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="PathfindingLinksets_ChangeToFlexiblePath"