diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h
index 16319ef6211dcb76a7ea9910d07916e98cd4b318..43911f4ed7edbb268d813ae427b8e6733378f375 100644
--- a/indra/llcharacter/llvisualparam.h
+++ b/indra/llcharacter/llvisualparam.h
@@ -119,9 +119,9 @@ public:
 	const LLString&			getMaxDisplayName() const	{ return mInfo->mMaxName; }
 	const LLString&			getMinDisplayName() const	{ return mInfo->mMinName; }
 
-	void					setDisplayName(const char* s) 	 { mInfo->mDisplayName = s; }
-	void					setMaxDisplayName(const char* s) { mInfo->mMaxName = s; }
-	void					setMinDisplayName(const char* s) { mInfo->mMinName = s; }
+	void					setDisplayName(const LLString& s) 	 { mInfo->mDisplayName = s; }
+	void					setMaxDisplayName(const LLString& s) { mInfo->mMaxName = s; }
+	void					setMinDisplayName(const LLString& s) { mInfo->mMinName = s; }
 
 	EVisualParamGroup		getGroup() 			{ return mInfo->mGroup; }
 	F32						getMinWeight() 		{ return mInfo->mMinWeight; }
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 649fcd41a6fea759095c54589049e030f7cf1dc0..70f7d5483efdd4970b4bf2ea613c82bb2e1edef7 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -321,6 +321,18 @@ template<class T> LLStringBase<T> LLStringBase<T>::null;
 typedef LLStringBase<char> LLString;
 typedef LLStringBase<llwchar> LLWString;
 
+//@ Use this where we want to disallow input in the form of "foo"
+//  This is used to catch places where english text is embedded in the code
+//  instead of in a translatable XUI file.
+class LLStringExplicit : public LLString
+{
+public:
+	explicit LLStringExplicit(const char* s) : LLString(s) {}
+	LLStringExplicit(const LLString& s) : LLString(s) {}
+	LLStringExplicit(const std::string& s) : LLString(s) {}
+	LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : LLString(s, pos, n) {}
+};
+
 struct LLDictionaryLess
 {
 public:
@@ -336,7 +348,7 @@ public:
  */
 
 /**
- * @breif chop off the trailing characters in a string.
+ * @brief chop off the trailing characters in a string.
  *
  * This function works on bytes rather than glyphs, so this will
  * incorrectly truncate non-single byte strings.
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index ae5f5eb55f1bc498146aabf0cd138b3fbf50eda6..65a7c54a50d469139e011f2a93e4e815bebdd15f 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -114,7 +114,7 @@ protected:
 public:
 	static const LLString& getLastError() {return sLastErrorMessage;};
 	static void resetLastError() {sLastErrorMessage = LLString("No Error"); };
-	static BOOL setLastError(const LLString& message, const LLString& filename = ""); // returns FALSE
+	static BOOL setLastError(const LLString& message, const LLString& filename = LLString()); // returns FALSE
 
 	static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels);
 	
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 92049c068bcc0fde4c3b498ab5d706378d86e70e..3a67385030bd66e4dd0ff304d7fa75ec63d32934 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -259,42 +259,25 @@ void LLParcel::overrideParcelFlags(U32 flags)
 	mParcelFlags = flags;
 }
 
-void set_std_string(const char* src, std::string& dest)
-{
-	if(src)
-	{
-		dest.assign(src);
-	}
-	else
-	{
-#if (LL_LINUX && __GNUC__ < 3)
-		dest.assign(std::string(""));
-#else
-		dest.clear();
-#endif
-	}
-}
-
-void LLParcel::setName(const char* name)
+void LLParcel::setName(const LLString& name)
 {
 	// The escaping here must match the escaping in the database
 	// abstraction layer.
-	set_std_string(name, mName);
+	mName = name;
 	LLStringFn::replace_nonprintable(mName, LL_UNKNOWN_CHAR);
 }
 
-void LLParcel::setDesc(const char* desc)
+void LLParcel::setDesc(const LLString& desc)
 {
 	// The escaping here must match the escaping in the database
 	// abstraction layer.
-	set_std_string(desc, mDesc);
+	mDesc = desc;
 	mDesc = rawstr_to_utf8(mDesc);
 }
 
-void LLParcel::setMusicURL(const char* url)
+void LLParcel::setMusicURL(const LLString& url)
 {
-	set_std_string(url, mMusicURL);
-
+	mMusicURL = url;
 	// The escaping here must match the escaping in the database
 	// abstraction layer.
 	// This should really filter the url in some way. Other than
@@ -302,10 +285,9 @@ void LLParcel::setMusicURL(const char* url)
 	LLStringFn::replace_nonprintable(mMusicURL, LL_UNKNOWN_CHAR);
 }
 
-void LLParcel::setMediaURL(const char* url)
+void LLParcel::setMediaURL(const LLString& url)
 {
-	set_std_string(url, mMediaURL);
-
+	mMediaURL = url;
 	// The escaping here must match the escaping in the database
 	// abstraction layer if it's ever added.
 	// This should really filter the url in some way. Other than
@@ -571,19 +553,19 @@ BOOL LLParcel::importStream(std::istream& input_stream)
 		}
 		else if ("name" == keyword)
 		{
-			setName( value.c_str() );
+			setName( value );
 		}
 		else if ("desc" == keyword)
 		{
-			setDesc( value.c_str() );
+			setDesc( value );
 		}
 		else if ("music_url" == keyword)
 		{
-			setMusicURL( value.c_str() );
+			setMusicURL( value );
 		}
 		else if ("media_url" == keyword)
 		{
-			setMediaURL( value.c_str() );
+			setMediaURL( value );
 		}
 		else if ("media_id" == keyword)
 		{
@@ -1838,3 +1820,4 @@ LLParcel::ECategory category_ui_string_to_category(const char* s)
 	return LLParcel::C_ANY;
 }
 
+
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index efabde33589a6f70cb81389e6282088fd800668e..9c6300811b5e7da5559666e91ab26670784275f0 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -203,10 +203,10 @@ public:
 
 	// MANIPULATORS
 	void generateNewID() { mID.generate(); }
-	void setName(const char* name);
-	void setDesc(const char* desc);
-	void setMusicURL(const char* url);
-	void setMediaURL(const char* url);
+	void setName(const LLString& name);
+	void setDesc(const LLString& desc);
+	void setMusicURL(const LLString& url);
+	void setMediaURL(const LLString& url);
 	void	setMediaID(const LLUUID& id) { mMediaID = id; }
 	void	setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }
 	virtual void	setLocalID(S32 local_id);
@@ -256,7 +256,7 @@ public:
 	void	setDrawDistance(F32 dist)	{ mDrawDistance = dist; }
 	void	setSalePrice(S32 price)		{ mSalePrice = price; }
 	void	setGroupID(const LLUUID& id)	{ mGroupID = id; }
-	//void	setGroupName(const char* s)	{ mGroupName.assign(s); }
+	//void	setGroupName(const LLString& s)	{ mGroupName.assign(s); }
 	void	setPassPrice(S32 price)				{ mPassPrice = price; }
 	void	setPassHours(F32 hours)				{ mPassHours = hours; }
 
@@ -292,10 +292,10 @@ public:
 
 	// ACCESSORS
 	const LLUUID&	getID() const				{ return mID; }
-	const char*		getName() const				{ return mName.c_str(); }
-	const char*		getDesc() const				{ return mDesc.c_str(); }
-	const char*		getMusicURL() const			{ return mMusicURL.c_str(); }
-	const char*		getMediaURL() const			{ return mMediaURL.c_str(); }
+	const LLString&	getName() const			{ return mName; }
+	const LLString&	getDesc() const			{ return mDesc; }
+	const LLString&	getMusicURL() const		{ return mMusicURL; }
+	const LLString&	getMediaURL() const		{ return mMediaURL; }
 	const LLUUID&	getMediaID() const			{ return mMediaID; }
 	U8				getMediaAutoScale() const	{ return mMediaAutoScale; }
 	S32				getLocalID() const			{ return mLocalID; }
@@ -567,10 +567,10 @@ protected:
 	F32					mDrawDistance;
 	U32					mParcelFlags;
 	S32					mSalePrice;				// linden dollars
-	std::string mName;
-	std::string mDesc;
-	std::string mMusicURL;
-	std::string mMediaURL;
+	LLString 			mName;
+	LLString 			mDesc;
+	LLString 			mMusicURL;
+	LLString 			mMediaURL;
 	U8					mMediaAutoScale;
 	LLUUID				mMediaID;
 	S32					mPassPrice;
diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp
index 4b44fc24f6c2d4a05ab596f7c5508ce7380b42af..8f9f73d0bdaf4daafed90d94e9bc828c0e418b09 100644
--- a/indra/llinventory/llpermissions.cpp
+++ b/indra/llinventory/llpermissions.cpp
@@ -1143,6 +1143,12 @@ void mask_to_string(U32 mask, char* str)
 	*str = '\0';
 }
 
+std::string mask_to_string(U32 mask)
+{
+	char str[16];
+	mask_to_string(mask, str);
+	return std::string(str);
+}
 
 ///----------------------------------------------------------------------------
 /// exported functions
diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h
index ab12abb9ede74aee0e06224b678a063f0cbf8aea..9370d6480b7d8b698900f65ea25916afb08c83b2 100644
--- a/indra/llinventory/llpermissions.h
+++ b/indra/llinventory/llpermissions.h
@@ -41,6 +41,7 @@
 // prototypes
 class LLMessageSystem;
 extern void mask_to_string(U32 mask, char* str);
+extern std::string mask_to_string(U32 mask);
 template<class T> class LLMetaClassT;
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/llmessage/lltransfertargetfile.h b/indra/llmessage/lltransfertargetfile.h
index 6b30aa2941e347424d5d2ccf1afd3e3a89d77c02..18b44e26111c5bdfe05131256a78993aa1b3bb38 100644
--- a/indra/llmessage/lltransfertargetfile.h
+++ b/indra/llmessage/lltransfertargetfile.h
@@ -40,7 +40,7 @@ class LLTransferTargetParamsFile : public LLTransferTargetParams
 {
 public:
 	LLTransferTargetParamsFile() : LLTransferTargetParams(LLTTT_FILE) {}
-	void setFilename(const char *filename)			{ mFilename = filename; }
+	void setFilename(const LLString& filename)	{ mFilename = filename; }
 	void setCallback(LLTTFCompleteCallback cb, void *user_data)		{ mCompleteCallback = cb; mUserData = user_data; }
 
 	friend class LLTransferTargetFile;
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index e3718fe578d9d429d0bb97caf827ebbb848f6838..628f7f8cc83d12aeb9efd77f0d163e6b49363d65 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -1660,6 +1660,52 @@ void LLPrimitive::setTextureList(LLTextureEntry *listp)
 
 //============================================================================
 
+// Moved from llselectmgr.cpp
+// BUG: Only works for boxes.
+// Face numbering for flex boxes as of 1.14.2
+
+// static
+bool LLPrimitive::getTESTAxes(const U8 face, U32* s_axis, U32* t_axis)
+{
+	if (face == 0)
+	{
+		*s_axis = VX; *t_axis = VY;
+		return true;
+	}
+	else if (face == 1)
+	{
+		*s_axis = VX; *t_axis = VZ;
+		return true;
+	}
+	else if (face == 2)
+	{
+		*s_axis = VY; *t_axis = VZ;
+		return true;
+	}
+	else if (face == 3)
+	{
+		*s_axis = VX; *t_axis = VZ;
+		return true;
+	}
+	else if (face == 4)
+	{
+		*s_axis = VY; *t_axis = VZ;
+		return true;
+	}
+	else if (face == 5)
+	{
+		*s_axis = VX; *t_axis = VY;
+		return true;
+	}
+	else
+	{
+		// unknown face
+		return false;
+	}
+}
+
+//============================================================================
+
 //static 
 BOOL LLNetworkData::isValid(U16 param_type, U32 size)
 {
diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h
index 98b70a47d848cca7b62c45a521f87447bd9e630d..53b17bc2efa8bcb28662f20ab37313ab457c1400 100644
--- a/indra/llprimitive/llprimitive.h
+++ b/indra/llprimitive/llprimitive.h
@@ -362,7 +362,8 @@ public:
 	static const char *pCodeToString(const LLPCode pcode);
 	static LLPCode legacyToPCode(const U8 legacy);
 	static U8 pCodeToLegacy(const LLPCode pcode);
-
+	static bool getTESTAxes(const U8 face, U32* s_axis, U32* t_axis);
+	
 	inline static BOOL isPrimitive(const LLPCode pcode);
 	inline static BOOL isApp(const LLPCode pcode);
 
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 5c9b49c5a88886a55314afaea674792de451eeec..65cbcf3634c04e7e3e3504de1bfcfaa8180da16b 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -776,36 +776,36 @@ LLSD LLButton::getValue() const
 	return mToggleState;
 }
 
-void LLButton::setLabel( const LLString& label )
+void LLButton::setLabel( const LLStringExplicit& label )
 {
 	setLabelUnselected(label);
 	setLabelSelected(label);
 }
 
 //virtual
-BOOL LLButton::setLabelArg( const LLString& key, const LLString& text )
+BOOL LLButton::setLabelArg( const LLString& key, const LLStringExplicit& text )
 {
 	mUnselectedLabel.setArg(key, text);
 	mSelectedLabel.setArg(key, text);
 	return TRUE;
 }
 
-void LLButton::setLabelUnselected( const LLString& label )
+void LLButton::setLabelUnselected( const LLStringExplicit& label )
 {
 	mUnselectedLabel = label;
 }
 
-void LLButton::setLabelSelected( const LLString& label )
+void LLButton::setLabelSelected( const LLStringExplicit& label )
 {
 	mSelectedLabel = label;
 }
 
-void LLButton::setDisabledLabel( const LLString& label )
+void LLButton::setDisabledLabel( const LLStringExplicit& label )
 {
 	mDisabledLabel = label;
 }
 
-void LLButton::setDisabledSelectedLabel( const LLString& label )
+void LLButton::setDisabledSelectedLabel( const LLStringExplicit& label )
 {
 	mDisabledSelectedLabel = label;
 }
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 74926f2b52ace273102cf3d5fdc672dbc951d0fe..5f7d917b4e16a6387691c42c0b33256b61ff5527 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -68,7 +68,7 @@ class LLButton
 {
 public:
 	// simple button with text label
-	LLButton(const LLString& name, const LLRect &rect, const LLString& control_name = "", 
+	LLButton(const LLString& name, const LLRect &rect, const LLString& control_name = LLString(), 
 			 void (*on_click)(void*) = NULL, void *data = NULL);
 
 	LLButton(const LLString& name, const LLRect& rect, 
@@ -152,12 +152,12 @@ public:
 	virtual void	setValue(const LLSD& value );
 	virtual LLSD	getValue() const;
 
-	void			setLabel( const LLString& label);
-	virtual BOOL	setLabelArg( const LLString& key, const LLString& text );
-	void			setLabelUnselected(const LLString& label);
-	void			setLabelSelected(const LLString& label);
-	void			setDisabledLabel(const LLString& disabled_label);
-	void			setDisabledSelectedLabel(const LLString& disabled_label);
+	void			setLabel( const LLStringExplicit& label);
+	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );
+	void			setLabelUnselected(const LLStringExplicit& label);
+	void			setLabelSelected(const LLStringExplicit& label);
+	void			setDisabledLabel(const LLStringExplicit& disabled_label);
+	void			setDisabledSelectedLabel(const LLStringExplicit& disabled_label);
 	void			setDisabledLabelColor( const LLColor4& c )		{ mDisabledLabelColor = c; }
 	
 	void			setFont(const LLFontGL *font)		
@@ -288,12 +288,12 @@ class LLSquareButton
 {
 public:
 	LLSquareButton(const LLString& name, const LLRect& rect, 
-		const LLString& label,
-		const LLFontGL *font = NULL,
-		const LLString& control_name = "",	
-		void (*click_callback)(void*) = NULL,
-		void *callback_data = NULL,
-		const LLString& selected_label = LLString::null );
+				   const LLString& label,
+				   const LLFontGL *font = NULL,
+				   const LLString& control_name = LLString(),	
+				   void (*click_callback)(void*) = NULL,
+				   void *callback_data = NULL,
+				   const LLString& selected_label = LLString::null );
 };
 
 // Helpful functions
diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
index 08ebfafa53a3a889b26310f084a000e1549e3a47..504b342003ea62e81f4f32573d6b9b1e593abfcd 100644
--- a/indra/llui/llcheckboxctrl.cpp
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -242,7 +242,7 @@ LLSD LLCheckBoxCtrl::getValue() const
 	return mButton->getToggleState();
 }
 
-void LLCheckBoxCtrl::setLabel( const LLString& label )
+void LLCheckBoxCtrl::setLabel( const LLStringExplicit& label )
 {
 	mLabel->setText( label );
 	reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
@@ -253,7 +253,7 @@ LLString LLCheckBoxCtrl::getLabel() const
 	return mLabel->getText();
 }
 
-BOOL LLCheckBoxCtrl::setLabelArg( const LLString& key, const LLString& text )
+BOOL LLCheckBoxCtrl::setLabelArg( const LLString& key, const LLStringExplicit& text )
 {
 	BOOL res = mLabel->setTextArg(key, text);
 	reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 37e689173b39b4218cdf1393ada71a7dfe0defc3..513b2930e12948a796617febeacb24cf5133521f 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -94,7 +94,7 @@ public:
 	virtual void		setTentative(BOOL b)	{ mButton->setTentative(b); }
 	virtual BOOL		getTentative() const	{ return mButton->getTentative(); }
 
-	virtual BOOL		setLabelArg( const LLString& key, const LLString& text );
+	virtual BOOL		setLabelArg( const LLString& key, const LLStringExplicit& text );
 
 	virtual void		clear();
 	virtual void		onCommit();
@@ -105,7 +105,7 @@ public:
 	void				setEnabledColor( const LLColor4 &color ) { mTextEnabledColor = color; }
 	void				setDisabledColor( const LLColor4 &color ) { mTextDisabledColor = color; }
 
-	void				setLabel( const LLString& label );
+	void				setLabel( const LLStringExplicit& label );
 	LLString			getLabel() const;
 
 	virtual void		setControlName(const LLString& control_name, LLView* context);
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 7ed3d3efbd85fe7bbb8f5c679f4f3832d0ace86f..5f76cfc94b2f863f2000e31a1a4a7b9375db353c 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -229,12 +229,12 @@ void LLComboBox::clear()
 { 
 	if (mTextEntry)
 	{
-		mTextEntry->setText("");
+		mTextEntry->setText(LLString::null);
 	}
-	mButton->setLabelSelected("");
-	mButton->setLabelUnselected("");
-	mButton->setDisabledLabel("");
-	mButton->setDisabledSelectedLabel("");
+	mButton->setLabelSelected(LLString::null);
+	mButton->setLabelUnselected(LLString::null);
+	mButton->setDisabledLabel(LLString::null);
+	mButton->setDisabledSelectedLabel(LLString::null);
 	mList->deselectAllItems();
 }
 
@@ -309,7 +309,7 @@ void LLComboBox::sortByName()
 
 // Choose an item with a given name in the menu.
 // Returns TRUE if the item was found.
-BOOL LLComboBox::setSimple(const LLString& name)
+BOOL LLComboBox::setSimple(const LLStringExplicit& name)
 {
 	BOOL found = mList->selectSimpleItem(name, FALSE);
 
@@ -371,7 +371,7 @@ LLSD LLComboBox::getValue() const
 	}
 }
 
-void LLComboBox::setLabel(const LLString& name)
+void LLComboBox::setLabel(const LLStringExplicit& name)
 {
 	if ( mAllowTextEntry )
 	{
@@ -803,7 +803,7 @@ void LLComboBox::setAllowTextEntry(BOOL allow, S32 max_chars, BOOL set_tentative
 
 		// clear label on button
 		LLString cur_label = mButton->getLabelSelected();
-		setLabel("");
+		setLabel(LLString::null);
 		if (!mTextEntry)
 		{
 			LLRect text_entry_rect(0, mRect.getHeight(), mRect.getWidth(), 0);
@@ -852,7 +852,7 @@ void LLComboBox::setAllowTextEntry(BOOL allow, S32 max_chars, BOOL set_tentative
 	mTextEntryTentative = set_tentative;	
 }
 
-void LLComboBox::setTextEntry(const LLString& text)
+void LLComboBox::setTextEntry(const LLStringExplicit& text)
 {
 	if (mTextEntry)
 	{
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 9b47bfcabb55f2e2ce3682d7ea4877e7d457dd35..ff17d2874f32f22e1b1093a1c04e16eb962eb878 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -105,7 +105,7 @@ public:
 	virtual LLSD	getValue() const;
 
 	void			setAllowTextEntry(BOOL allow, S32 max_chars = 50, BOOL make_tentative = TRUE);
-	void			setTextEntry(const LLString& text);
+	void			setTextEntry(const LLStringExplicit& text);
 
 	void			add(const LLString& name, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE);	// add item "name" to menu
 	void			add(const LLString& name, const LLUUID& id, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE);
@@ -117,7 +117,7 @@ public:
 	void			sortByName(); // Sort the entries in the combobox by name
 
 	// Select current item by name using selectSimpleItem.  Returns FALSE if not found.
-	BOOL			setSimple(const LLString& name);
+	BOOL			setSimple(const LLStringExplicit& name);
 	// Get name of current item. Returns an empty string if not found.
 	const LLString&	getSimple() const;
 	// Get contents of column x of selected row
@@ -125,7 +125,7 @@ public:
 
 	// Sets the label, which doesn't have to exist in the label.
 	// This is probably a UI abuse.
-	void			setLabel(const LLString& name);
+	void			setLabel(const LLStringExplicit& name);
 
 	BOOL			remove(const LLString& name);	// remove item "name", return TRUE if found and removed
 	
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 13947d060558dab4248d3ab1eee25a0fcda102f1..37ee4c46baa7d4c79583a09c45acaf112f89651b 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -320,12 +320,12 @@ void LLLineEditor::setBorderWidth(S32 left, S32 right)
 	mMaxHPixels = mRect.getWidth() - mMinHPixels - mBorderThickness - mBorderRight;
 }
 
-void LLLineEditor::setLabel(const LLString &new_label)
+void LLLineEditor::setLabel(const LLStringExplicit &new_label)
 {
 	mLabel = new_label;
 }
 
-void LLLineEditor::setText(const LLString &new_text)
+void LLLineEditor::setText(const LLStringExplicit &new_text)
 {
 	// If new text is identical, don't copy and don't move insertion point
 	if (mText.getString() == new_text)
@@ -2322,13 +2322,13 @@ LLSD LLLineEditor::getValue() const
 	return ret;
 }
 
-BOOL LLLineEditor::setTextArg( const LLString& key, const LLString& text )
+BOOL LLLineEditor::setTextArg( const LLString& key, const LLStringExplicit& text )
 {
 	mText.setArg(key, text);
 	return TRUE;
 }
 
-BOOL LLLineEditor::setLabelArg( const LLString& key, const LLString& text )
+BOOL LLLineEditor::setLabelArg( const LLString& key, const LLStringExplicit& text )
 {
 	mLabel.setArg(key, text);
 	return TRUE;
@@ -2353,8 +2353,7 @@ LLSearchEditor::LLSearchEditor(const LLString& name,
 			onSearchEdit,
 			NULL,
 			this);
-	// TODO: this should be translatable
-	mSearchEdit->setLabel("Type here to search");
+
 	mSearchEdit->setFollowsAll();
 	mSearchEdit->setSelectAllonFocusReceived(TRUE);
 
@@ -2409,13 +2408,13 @@ LLSD LLSearchEditor::getValue() const
 }
 
 //virtual
-BOOL LLSearchEditor::setTextArg( const LLString& key, const LLString& text )
+BOOL LLSearchEditor::setTextArg( const LLString& key, const LLStringExplicit& text )
 {
 	return mSearchEdit->setTextArg(key, text);
 }
 
 //virtual
-BOOL LLSearchEditor::setLabelArg( const LLString& key, const LLString& text )
+BOOL LLSearchEditor::setLabelArg( const LLString& key, const LLStringExplicit& text )
 {
 	return mSearchEdit->setLabelArg(key, text);
 }
@@ -2437,7 +2436,7 @@ void LLSearchEditor::draw()
 	LLUICtrl::draw();
 }
 
-void LLSearchEditor::setText(const LLString &new_text)
+void LLSearchEditor::setText(const LLStringExplicit &new_text)
 {
 	mSearchEdit->setText(new_text);
 }
@@ -2483,6 +2482,12 @@ LLView* LLSearchEditor::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
 								max_text_length,
 								NULL, NULL);
 
+	LLString label;
+	if(node->getAttributeString("label", label))
+	{
+		search_editor->mSearchEdit->setLabel(label);
+	}
+	
 	search_editor->setText(text);
 
 	search_editor->initFromXML(node, parent);
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 0d1ec08ab2857f7c6f871fca5d049e1b7f83e4a4..2cd2ebf9fe76402b08d8d0fb84d5877a85540e6c 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -136,11 +136,11 @@ public:
 	// assumes UTF8 text
 	virtual void	setValue(const LLSD& value );
 	virtual LLSD	getValue() const;
-	virtual BOOL	setTextArg( const LLString& key, const LLString& text );
-	virtual BOOL	setLabelArg( const LLString& key, const LLString& text );
+	virtual BOOL	setTextArg( const LLString& key, const LLStringExplicit& text );
+	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );
 
-	void			setLabel(const LLString &new_label);
-	void			setText(const LLString &new_text);
+	void			setLabel(const LLStringExplicit &new_label);
+	void			setText(const LLStringExplicit &new_text);
 
 	const LLString& getText() const		{ return mText.getString(); }
 	const LLWString& getWText() const	{ return mText.getWString(); }
@@ -312,15 +312,15 @@ public:
 	virtual LLString getWidgetTag() const;
 	static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory);
 
-	void setText(const LLString &new_text);
+	void setText(const LLStringExplicit &new_text);
 
 	void setSearchCallback(void (*search_callback)(const LLString& search_string, void* user_data), void* data) { mSearchCallback = search_callback; mCallbackUserData = data; }
 
 	// LLUICtrl interface
 	virtual void	setValue(const LLSD& value );
 	virtual LLSD	getValue() const;
-	virtual BOOL	setTextArg( const LLString& key, const LLString& text );
-	virtual BOOL	setLabelArg( const LLString& key, const LLString& text );
+	virtual BOOL	setTextArg( const LLString& key, const LLStringExplicit& text );
+	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );
 	virtual void	clear();
 
 
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index b8cdd52deb560d0af2a95cc4e9d57fd86a7a45fc..9b4a2a168cf4aefb0ea4e22d0ce4f3e343326961 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -373,7 +373,7 @@ void LLMenuItemGL::setHighlightFGColor( const LLColor4& color )
 
 
 // change the label
-void LLMenuItemGL::setLabel( const LLString& label )
+void LLMenuItemGL::setLabel( const LLStringExplicit& label )
 {
 	mLabel = label;
 }
@@ -598,7 +598,7 @@ void LLMenuItemGL::draw( void )
 	mGotHover = FALSE;
 }
 
-BOOL LLMenuItemGL::setLabelArg( const LLString& key, const LLString& text )
+BOOL LLMenuItemGL::setLabelArg( const LLString& key, const LLStringExplicit& text )
 {
 	mLabel.setArg(key, text);
 	return TRUE;
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 6e5ac7482ec31297c61b8af2d1359a91eef13348..6dc9282ba6c6874e7a47b9a21c49c9ad3487b43e 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -127,8 +127,8 @@ public:
 	LLString getLabel( void ) const { return mLabel.getString(); }
 
 	// change the label
-	void setLabel( const LLString& label );
-	virtual BOOL setLabelArg( const LLString& key, const LLString& text );
+	void setLabel( const LLStringExplicit& label );
+	virtual BOOL setLabelArg( const LLString& key, const LLStringExplicit& text );
 
 	// Get the parent menu for this item
 	virtual LLMenuGL*	getMenu();
@@ -443,7 +443,7 @@ public:
 
 	// return the name label
 	const LLString& getLabel( void ) const { return mLabel.getString(); }
-	void setLabel(const LLString& label) { mLabel = label; }
+	void setLabel(const LLStringExplicit& label) { mLabel = label; }
 
 	static void setDefaultBackgroundColor( const LLColor4& color );
 	void setBackgroundColor( const LLColor4& color );
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 8ff047efa795657db341c1661c7bc4f5566ac2b3..3a0ee9b013912790776c509515f2f29a1914ccea 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -962,7 +962,7 @@ LLSD LLPanel::childGetValue(const LLString& id) const
 	return LLSD();
 }
 
-BOOL LLPanel::childSetTextArg(const LLString& id, const LLString& key, const LLString& text)
+BOOL LLPanel::childSetTextArg(const LLString& id, const LLString& key, const LLStringExplicit& text)
 {
 	LLUICtrl* child = (LLUICtrl*)getChildByName(id, true);
 	if (child)
@@ -972,7 +972,7 @@ BOOL LLPanel::childSetTextArg(const LLString& id, const LLString& key, const LLS
 	return FALSE;
 }
 
-BOOL LLPanel::childSetLabelArg(const LLString& id, const LLString& key, const LLString& text)
+BOOL LLPanel::childSetLabelArg(const LLString& id, const LLString& key, const LLStringExplicit& text)
 {
 	LLView* child = getChildByName(id, true);
 	if (child)
@@ -1033,7 +1033,7 @@ void LLPanel::childSetTabChangeCallback(const LLString& id, const LLString& tabn
 	}
 }
 
-void LLPanel::childSetText(const LLString& id, const LLString& text)
+void LLPanel::childSetText(const LLString& id, const LLStringExplicit& text)
 {
 	childSetValue(id, LLSD(text));
 }
@@ -1106,7 +1106,7 @@ void LLPanel::childSetControlName(const LLString& id, const LLString& control_na
 LLView* LLPanel::getChildByName(const LLString& name, BOOL recurse) const
 {
 	LLView* view = LLUICtrl::getChildByName(name, recurse);
-	if (!view)
+	if (!view && !recurse)
 	{
 		childNotFound(name);
 	}
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 318c278be080a7cb2db4866b5db7325d12f8d0f4..dfd7a5152971cb832912be9fe1ecc9153e8bbf34 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -119,7 +119,7 @@ public:
 	void			setBackgroundOpaque(BOOL b)		{ mBgOpaque = b; }
 	void			setDefaultBtn(LLButton* btn = NULL);
 	void			setDefaultBtn(const LLString& id);
-	void			setLabel(LLString label) { mLabel = label; }
+	void			setLabel(const LLStringExplicit& label) { mLabel = label; }
 	LLString		getLabel() const { return mLabel; }
 	
 	void            setRectControl(const LLString& rect_control) { mRectControl.assign(rect_control); }
@@ -192,8 +192,8 @@ public:
 
 	// For setting text / label replacement params, e.g. "Hello [NAME]"
 	// Not implemented for all types, defaults to noop, returns FALSE if not applicaple
-	BOOL childSetTextArg(const LLString& id, const LLString& key, const LLString& text);
-	BOOL childSetLabelArg(const LLString& id, const LLString& key, const LLString& text);
+	BOOL childSetTextArg(const LLString& id, const LLString& key, const LLStringExplicit& text);
+	BOOL childSetLabelArg(const LLString& id, const LLString& key, const LLStringExplicit& text);
 	
 	// LLSlider / LLSpinCtrl
 	void childSetMinValue(const LLString& id, LLSD min_value);
@@ -208,7 +208,7 @@ public:
 	void childSetWrappedText(const LLString& id, const LLString& text, bool visible = true);
 
 	// LLTextBox/LLTextEditor/LLLineEditor
-	void childSetText(const LLString& id, const LLString& text);
+	void childSetText(const LLString& id, const LLStringExplicit& text);
 	LLString childGetText(const LLString& id);
 
 	// LLLineEditor
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 048cfa7e9d4dfaa05717b503ec4567db2e8bf93e..f5eef29dcb257d426de631a124dbf7af4a92e1dc 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -232,7 +232,7 @@ void LLScrollListText::setColor(const LLColor4& color)
 	*mColor = color;
 }
 
-void LLScrollListText::setText(const LLString& text)
+void LLScrollListText::setText(const LLStringExplicit& text)
 {
 	mText = text;
 }
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 78f34a2ed232d9039019db17e641bdedb46dc8cb..5ceee2e1f65114616c4cd434cd13213dc5cc096f 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -101,7 +101,7 @@ public:
 	virtual const LLString&		getText() const		{ return mText.getString(); }
 	virtual BOOL	getVisible() const  { return mVisible; }
 	virtual void	highlightText(S32 offset, S32 num_chars) {mHighlightOffset = offset; mHighlightCount = num_chars;}
-	void			setText(const LLString& text);
+	void			setText(const LLStringExplicit& text);
 	virtual void	setColor(const LLColor4&);
 	virtual BOOL	isText() { return TRUE; }
 
@@ -169,10 +169,10 @@ class LLScrollListColumn
 public:
 	// Default constructor
 	LLScrollListColumn() : 
-		mName(""), 
-		mSortingColumn(""), 
-        	mSortAscending(TRUE), 
-		mLabel(""), 
+		mName(), 
+		mSortingColumn(), 
+		mSortAscending(TRUE), 
+		mLabel(), 
 		mWidth(-1), 
 		mRelWidth(-1.0), 
 		mDynamicWidth(FALSE), 
diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index c46ec2252f10c89008b7f4931db71d99e8db3de3..dd4a9941c59133c395130539baa372c7198f9047 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -170,7 +170,7 @@ void LLSliderCtrl::setValue(F32 v, BOOL from_event)
 	updateText();
 }
 
-BOOL LLSliderCtrl::setLabelArg( const LLString& key, const LLString& text )
+BOOL LLSliderCtrl::setLabelArg( const LLString& key, const LLStringExplicit& text )
 {
 	BOOL res = FALSE;
 	if (mLabelBox)
@@ -200,11 +200,11 @@ void LLSliderCtrl::clear()
 	setValue(0.0f);
 	if( mEditor )
 	{
-		mEditor->setText( "" );
+		mEditor->setText( LLString::null );
 	}
 	if( mTextBox )
 	{
-		mTextBox->setText( "" );
+		mTextBox->setText( LLString::null );
 	}
 
 }
diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h
index d5485e6a63d53e919ec3c9e9d43835ff7c7ba27e..fa6c0bccaefb83adf9ba9ef74558f728cf8fbb19 100644
--- a/indra/llui/llsliderctrl.h
+++ b/indra/llui/llsliderctrl.h
@@ -80,7 +80,7 @@ public:
 
 	virtual void	setValue(const LLSD& value )	{ setValue((F32)value.asReal(), TRUE); }
 	virtual LLSD	getValue() const		{ return LLSD(getValueF32()); }
-	virtual BOOL	setLabelArg( const LLString& key, const LLString& text );
+	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );
 
 	virtual void	setMinValue(LLSD min_value)	{ setMinValue((F32)min_value.asReal()); }
 	virtual void	setMaxValue(LLSD max_value)	{ setMaxValue((F32)max_value.asReal());  }
@@ -97,7 +97,7 @@ public:
 	F32				getMinValue() { return mSlider->getMinValue(); }
 	F32				getMaxValue() { return mSlider->getMaxValue(); }
 
-	void			setLabel(const LLString& label)				{ if (mLabelBox) mLabelBox->setText(label); }
+	void			setLabel(const LLStringExplicit& label)				{ if (mLabelBox) mLabelBox->setText(label); }
 	void			setLabelColor(const LLColor4& c)			{ mTextEnabledColor = c; }
 	void			setDisabledLabelColor(const LLColor4& c)	{ mTextDisabledColor = c; }
 
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index 4e7218e141c2f2bf677fbc4e80fdb06b6061d289..2be28140809a1032f375f322cf8c839bd9dd4dc1 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -385,7 +385,7 @@ void LLSpinCtrl::setPrecision(S32 precision)
 	updateEditor();
 }
 
-void LLSpinCtrl::setLabel(const LLString& label)
+void LLSpinCtrl::setLabel(const LLStringExplicit& label)
 {
 	if (mLabelBox)
 	{
diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h
index 7795e26719c9692b6582bdc4b0a29af35b8f6eac..f2c7b40cfe5a25e59b18afc082802b75ebf44583 100644
--- a/indra/llui/llspinctrl.h
+++ b/indra/llui/llspinctrl.h
@@ -96,7 +96,7 @@ public:
 	virtual void	setMaxValue(F32 max)			{ mMaxValue = max; }
 	virtual void	setIncrement(F32 inc)			{ mIncrement = inc; }
 
-	void			setLabel(const LLString& label);
+	void			setLabel(const LLStringExplicit& label);
 	void			setLabelColor(const LLColor4& c)			{ mTextEnabledColor = c; }
 	void			setDisabledLabelColor(const LLColor4& c)	{ mTextDisabledColor = c; }
 
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 4251f81322f2265ff4484308e51d7e4657eccddc..c0b0788c0b3d88e2ebfa08b07fc9b98adc0c3503 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -161,7 +161,7 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask)
 	return handled;
 }
 
-void LLTextBox::setText(const LLString& text)
+void LLTextBox::setText(const LLStringExplicit& text)
 {
 	mText.assign(text);
 	setLineLengths();
@@ -194,7 +194,7 @@ void LLTextBox::setLineLengths()
 	}
 }
 
-void LLTextBox::setWrappedText(const LLString& in_text, F32 max_width)
+void LLTextBox::setWrappedText(const LLStringExplicit& in_text, F32 max_width)
 {
 	if (max_width < 0.0)
 	{
@@ -286,7 +286,7 @@ LLSD LLTextBox::getValue() const
 	return LLSD(getText());
 }
 
-BOOL LLTextBox::setTextArg( const LLString& key, const LLString& text )
+BOOL LLTextBox::setTextArg( const LLString& key, const LLStringExplicit& text )
 {
 	mText.setArg(key, text);
 	setLineLengths();
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index 24ad4d7aae8c2ca916913ea47be42617c29d655e..7e7018ac52e27e0f16b5af40143367274271fded 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -71,8 +71,8 @@ public:
 	void			setDisabledColor( const LLColor4& c)	{ mDisabledColor = c; }
 	void			setBackgroundColor( const LLColor4& c)	{ mBackgroundColor = c; }	
 	void			setBorderColor( const LLColor4& c)		{ mBorderColor = c; }	
-	void			setText( const LLString& text );
-	void			setWrappedText(const LLString& text, F32 max_width = -1.0);
+	void			setText( const LLStringExplicit& text );
+	void			setWrappedText(const LLStringExplicit& text, F32 max_width = -1.0);
 						// default width means use existing control width
 	
 	void			setBackgroundVisible(BOOL visible)		{ mBackgroundVisible = visible; }
@@ -97,7 +97,7 @@ public:
 
 	virtual void	setValue(const LLSD& value );
 	virtual LLSD	getValue() const;
-	virtual BOOL	setTextArg( const LLString& key, const LLString& text );
+	virtual BOOL	setTextArg( const LLString& key, const LLStringExplicit& text );
 
 protected:
 	void			setLineLengths();
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index cede015016951d6369807030ca63cb2f98d69ac6..12ad33988636b1d96be4b686f909a1596d900d52 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -520,7 +520,7 @@ void LLTextEditor::truncate()
 	}
 }
 
-void LLTextEditor::setText(const LLString &utf8str)
+void LLTextEditor::setText(const LLStringExplicit &utf8str)
 {
 	// LLString::removeCRLF(utf8str);
 	mUTF8Text = utf8str_removeCRLF(utf8str);
@@ -3068,7 +3068,7 @@ void LLTextEditor::onTabInto()
 
 void LLTextEditor::clear()
 {
-	setText("");
+	setText(LLString::null);
 }
 
 // Start or stop the editor from accepting text-editing keystrokes
@@ -3949,7 +3949,7 @@ BOOL LLTextEditor::importBuffer(const LLString& buffer )
 	if( success )
 	{
 		// Actually set the text
-		setText( text );
+		setText( LLStringExplicit(text) );
 	}
 
 	delete[] text;
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index f3d03ab1d60c5952431d383badbb70211a315d1a..55aba575517cac8d7404a9a628f1037f9d5cd5dd 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -231,7 +231,7 @@ public:
  	const LLString&	getText() const;
 	
 	// Non-undoable
-	void			setText(const LLString &utf8str);
+	void			setText(const LLStringExplicit &utf8str);
 	void			setWText(const LLWString &wtext);
 	
 	S32				getMaxLength() const 			{ return mMaxTextLength; }
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index ea1b53502e0539d6a19b96be1f2efb305f0ae028..7d354753d3cffcdea770ae0aeb95bcc8dee37ae4 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -99,13 +99,13 @@ void LLUICtrl::onCommit()
 }
 
 // virtual
-BOOL LLUICtrl::setTextArg( const LLString& key, const LLString& text ) 
+BOOL LLUICtrl::setTextArg( const LLString& key, const LLStringExplicit& text ) 
 { 
 	return FALSE; 
 }
 
 // virtual
-BOOL LLUICtrl::setLabelArg( const LLString& key, const LLString& text ) 
+BOOL LLUICtrl::setLabelArg( const LLString& key, const LLStringExplicit& text ) 
 { 
 	return FALSE; 
 }
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 0227157636074fa34e9e5c2c3904d1ebe7815943..00f78748a75dbd38cb6a30e9c30f3082fee9d17a 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -72,10 +72,10 @@ public:
 	virtual LLSD	getValue() const { return LLSD(); }
 
 	// Defaults to no-op
-	virtual BOOL	setTextArg( const LLString& key, const LLString& text );
+	virtual BOOL	setTextArg( const LLString& key, const LLStringExplicit& text );
 
 	// Defaults to no-op
-	virtual BOOL	setLabelArg( const LLString& key, const LLString& text );
+	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );
 
 	// Defaults to return NULL
 	virtual LLCtrlSelectionInterface* getSelectionInterface();
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 503b83bca2bf1494c9ab0fa250c08702d92b3e1d..4b4c4636d56b73bd6d67bed3655ffc70fe3e7314 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -473,7 +473,7 @@ LLPieMenu *LLUICtrlFactory::buildPieMenu(const LLString &filename, LLView* paren
 	// root must be called panel
 	if( !root->hasName( LL_PIE_MENU_TAG ))
 	{
-		llwarns << "Root node should be named " LL_PIE_MENU_TAG " in : " << filename << llendl;
+		llwarns << "Root node should be named " << LL_PIE_MENU_TAG << " in : " << filename << llendl;
 		return NULL;
 	}
 
@@ -808,3 +808,4 @@ void LLUICtrlFactory::registerCreator(LLString ctrlname, creator_function_t func
 	mCreatorFunctions[ctrlname] = function;
 }
 
+
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 192ba1f1ab6869d4dc518792f9e346fea2b005e3..ef91d9c85e6188009e9859c5263e71cf3770b2ce 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -786,7 +786,7 @@ void LLView::setHidden(BOOL hidden)
 }
 
 // virtual
-BOOL LLView::setLabelArg(const LLString& key, const LLString& text)
+BOOL LLView::setLabelArg(const LLString& key, const LLStringExplicit& text)
 {
 	return FALSE;
 }
@@ -1712,7 +1712,8 @@ BOOL LLView::hasChild(const LLString& childname, BOOL recurse) const
 //-----------------------------------------------------------------------------
 LLView* LLView::getChildByName(const LLString& name, BOOL recurse) const
 {
-	if(name.empty()) return NULL;
+	if(name.empty())
+		return NULL;
 	child_list_const_iter_t child_it;
 	// Look for direct children *first*
 	for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
@@ -1725,7 +1726,7 @@ LLView* LLView::getChildByName(const LLString& name, BOOL recurse) const
 	}
 	if (recurse)
 	{
-		// Look inside the child as well.
+		// Look inside each child as well.
 		for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
 		{
 			LLView* childp = *child_it;
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 91351612db6207503a75a7757a59daf30c4ff253..63c1efc2969d0cb03550058e134f2b7e9c87d3a8 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -290,7 +290,7 @@ public:
 	virtual void	setHidden(BOOL hidden);		// Never show (replacement text)
 
 	// by default, does nothing and returns false
-	virtual BOOL	setLabelArg( const LLString& key, const LLString& text );
+	virtual BOOL	setLabelArg( const LLString& key, const LLStringExplicit& text );
 
 	virtual void	onVisibilityChange ( BOOL curVisibilityIn );
 
diff --git a/indra/llxml/llxmlnode.h b/indra/llxml/llxmlnode.h
index 51837ebf143193f752efe553149687c98c458d91..7c221574ac87c9c233c2181bee740bcb6f5366b5 100644
--- a/indra/llxml/llxmlnode.h
+++ b/indra/llxml/llxmlnode.h
@@ -132,8 +132,8 @@ public:
 	LLXMLNodePtr& node,
 	LLXMLNodePtr& update_node);
 	static void writeHeaderToFile(FILE *fOut);
-    void writeToFile(FILE *fOut, LLString indent = "");
-    void writeToOstream(std::ostream& output_stream, const LLString& indent = "");
+    void writeToFile(FILE *fOut, LLString indent = LLString());
+    void writeToOstream(std::ostream& output_stream, const LLString& indent = LLString());
 
     // Utility
     void findName(const LLString& name, LLXMLNodeList &results);
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 1a20d8da2082956836ed228f67686f9e49c91c68..d825704bfc0163edc1cf28d45c2760bfad5655f8 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2038,7 +2038,8 @@ void LLAgent::setAFK()
 		gAwayTimer.start();
 		if (gAFKMenu)
 		{
-			gAFKMenu->setLabel("Set Not Away");
+			//*TODO:Translate
+			gAFKMenu->setLabel(LLString("Set Not Away"));
 		}
 	}
 }
@@ -2061,7 +2062,8 @@ void LLAgent::clearAFK()
 		clearControlFlags(AGENT_CONTROL_AWAY);
 		if (gAFKMenu)
 		{
-			gAFKMenu->setLabel("Set Away");
+			//*TODO:Translate
+			gAFKMenu->setLabel(LLString("Set Away"));
 		}
 	}
 }
@@ -2083,7 +2085,8 @@ void LLAgent::setBusy()
 	mIsBusy = TRUE;
 	if (gBusyMenu)
 	{
-		gBusyMenu->setLabel("Set Not Busy");
+		//*TODO:Translate
+		gBusyMenu->setLabel(LLString("Set Not Busy"));
 	}
 	if (gFloaterMute)
 	{
@@ -2100,7 +2103,8 @@ void LLAgent::clearBusy()
 	sendAnimationRequest(ANIM_AGENT_BUSY, ANIM_REQUEST_STOP);
 	if (gBusyMenu)
 	{
-		gBusyMenu->setLabel("Set Busy");
+		//*TODO:Translate
+		gBusyMenu->setLabel(LLString("Set Busy"));
 	}
 	if (gFloaterMute)
 	{
@@ -4888,7 +4892,7 @@ void LLAgent::buildLocationString(std::string& str)
 
 	// create a defult name and description for the landmark
 	std::string buffer;
-	if( !strcmp("", gParcelMgr->getAgentParcelName()) )
+	if( gParcelMgr->getAgentParcelName().empty() )
 	{
 		// the parcel doesn't have a name
 		buffer = llformat("%.32s (%d, %d, %d)",
@@ -4899,7 +4903,7 @@ void LLAgent::buildLocationString(std::string& str)
 	{
 		// the parcel has a name, so include it in the landmark name
 		buffer = llformat("%.32s, %.32s (%d, %d, %d)",
-						  gParcelMgr->getAgentParcelName(),
+						  gParcelMgr->getAgentParcelName().c_str(),
 						  getRegion()->getName().c_str(),
 						  pos_x, pos_y, pos_z);
 	}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 991a55b79606fcf8c6a443f26e3ddce150523ba4..5b6c3c0a1dc3def92a9890cc604cbbf095acf60f 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -422,7 +422,7 @@ public:
 
 	void			propagate(const F32 dt);									// BUG: should roll into updateAgentPosition
 
-	void			startAutoPilotGlobal(const LLVector3d &pos_global, const std::string& behavior_name = "", const LLQuaternion *target_rotation = NULL, 
+	void			startAutoPilotGlobal(const LLVector3d &pos_global, const std::string& behavior_name = std::string(), const LLQuaternion *target_rotation = NULL, 
 									void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL, F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f);
 
 	void 			startFollowPilot(const LLUUID &leader_id);
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index c876a24aa830e6f771c28f5ca9727d147fc807c7..b80c2bb5e3affc4e6e6356411e8f7280fca5b54b 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -681,7 +681,6 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
 	}
 }
 
-// XUI:translate
 void LLAvatarTracker::formFriendship(const LLUUID& id)
 {
 	if(id.notNull())
@@ -849,3 +848,4 @@ bool LLCollectAllBuddies::operator()(const LLUUID& buddy_id, LLRelationship* bud
 	return true;
 }
 
+
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index 33109ad5cee50c700e95d0422ee941cb7f000d4c..cebd51d4daefb7a526ef3149b243192017e34533 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -59,13 +59,11 @@
 #include "llviewerstats.h"
 #include "llvieweruictrlfactory.h"
 
-// XUI:translate
-
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
 ///----------------------------------------------------------------------------
 
-// XUI:translate
+// *TODO:Translate
 const char* COMPILE_QUEUE_TITLE = "Recompilation Progress";
 const char* COMPILE_START_STRING = "recompile";
 const char* RESET_QUEUE_TITLE = "Reset Progress";
diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp
index 6f649acb295ab9ab39eb64415f648232f7d61912..1e97df0b8b9cb07b51d82cf779fef5a899c31fff 100644
--- a/indra/newview/llcurrencyuimanager.cpp
+++ b/indra/newview/llcurrencyuimanager.cpp
@@ -380,7 +380,7 @@ void LLCurrencyUIManager::Impl::updateUI()
 		{
 			if (!mZeroMessage.empty() && mUserCurrencyBuy == 0)
 			{
-				lindenAmount->setText("");
+				lindenAmount->setText(LLString::null);
 			}
 			else
 			{
@@ -459,20 +459,20 @@ bool LLCurrencyUIManager::process()
 	return changed;
 }
 
-void LLCurrencyUIManager::buy()
+void LLCurrencyUIManager::buy(const LLString& buy_msg)
 {
 	if (!canBuy())
 	{
 		return;
 	}
 
-	// XUI:translate
+	LLUIString msg = buy_msg;
+	msg.setArg("[LINDENS]", llformat("%d", impl.mUserCurrencyBuy));
+	msg.setArg("[USD]", llformat("%#.2f", impl.mSiteCurrencyEstimatedCost / 100.0));
 	LLConfirmationManager::confirm(impl.mSiteConfirm,
-		llformat("Buy L$ %d for approx. US$ %#.2f\n",
-			impl.mUserCurrencyBuy,
-			impl.mSiteCurrencyEstimatedCost / 100.0),
-		impl,
-		&LLCurrencyUIManager::Impl::startCurrencyBuy);
+								   msg,
+								   impl,
+								   &LLCurrencyUIManager::Impl::startCurrencyBuy);
 }
 
 
@@ -518,3 +518,4 @@ std::string LLCurrencyUIManager::errorURI()
 	return impl.mErrorURI;
 }
 
+
diff --git a/indra/newview/llcurrencyuimanager.h b/indra/newview/llcurrencyuimanager.h
index 7a3a8b70603864398d476b9a2131b906e5de93ea..bb135d01898afa306c569e543fbbb945b9e8d1e6 100644
--- a/indra/newview/llcurrencyuimanager.h
+++ b/indra/newview/llcurrencyuimanager.h
@@ -71,7 +71,7 @@ public:
 		// call periodically, for example, from draw()
 		// returns true if the UI needs to be updated
 	
-	void buy();
+	void buy(const LLString& buy_msg);
 		// call to initiate the purchase
 	
 	bool inProcess();	// is a transaction in process
@@ -93,3 +93,4 @@ private:
 
 #endif 
 
+
diff --git a/indra/newview/lldebugmessagebox.cpp b/indra/newview/lldebugmessagebox.cpp
index a66aef86fd50b8066ccefd34aee66fb3a8281ca0..de185e280d8b55995b4f63ac5ed8b5f0b924a092 100644
--- a/indra/newview/lldebugmessagebox.cpp
+++ b/indra/newview/lldebugmessagebox.cpp
@@ -218,22 +218,22 @@ void LLDebugVarMessageBox::onClose(bool app_quitting)
 
 void LLDebugVarMessageBox::draw()
 {
-	char text[128];	 /*Flawfinder: ignore*/
+	LLString text;
 	switch(mVarType)
 	{
-	case VAR_TYPE_F32:
-		snprintf(text, sizeof(text), "%.3f", *((F32*)mVarData));		 	/* Flawfinder: ignore */
+	  case VAR_TYPE_F32:
+		text = llformat("%.3f", *((F32*)mVarData));
 		break;
-	case VAR_TYPE_S32:
-		snprintf(text, sizeof(text), "%d", *((S32*)mVarData)); 		 	/* Flawfinder: ignore */
+	  case VAR_TYPE_S32:
+		text = llformat("%d", *((S32*)mVarData));
 		break;
-	case VAR_TYPE_VEC3:
-	{
-		LLVector3* vec_p = (LLVector3*)mVarData;
-		snprintf(text, sizeof(text), "%.3f %.3f %.3f", vec_p->mV[VX], vec_p->mV[VY], vec_p->mV[VZ]);	 	/* Flawfinder: ignore */
-		break;
-	}
-	default:
+	  case VAR_TYPE_VEC3:
+	  {
+		  LLVector3* vec_p = (LLVector3*)mVarData;
+		  text= llformat("%.3f %.3f %.3f", vec_p->mV[VX], vec_p->mV[VY], vec_p->mV[VZ]);
+		  break;
+	  }
+	  default:
 		llwarns << "Unhandled var type " << mVarType << llendl;
 		break;
 	}
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index 45b554905f6d8470702c144cddde355f90c35e8e..15d84639fe05a5fe60c2ef7e46c53aa6c9351aac 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -90,7 +90,7 @@ enum EBumpEffect
 class LLStandardBumpmap
 {
 public: 
-	LLStandardBumpmap() : mLabel("") {} 
+	LLStandardBumpmap() : mLabel() {} 
 	LLStandardBumpmap( const char* label ) : mLabel(label) {}
 	
 	LLString	mLabel;
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index d6f00f8110f84e3fc4721a471d39dfdec901b8f0..460b719094096d17bc42c1f0c9a32ed0883c7050 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -96,10 +96,10 @@ LLFloaterAbout::LLFloaterAbout()
 	LLViewerRegion* region = gAgent.getRegion();
 	if (region)
 	{
-		//XUI:translate
 		const LLVector3d &pos = gAgent.getPositionGlobal();
-		LLString pos_text = llformat("You are at %.1f, %.1f, %.1f ", 
-			pos.mdV[VX], pos.mdV[VY], pos.mdV[VZ]);
+		LLUIString pos_text = childGetText("you_are_at");
+		pos_text.setArg("[POSITION]",
+						llformat("%.1f, %.1f, %.1f ", pos.mdV[VX], pos.mdV[VY], pos.mdV[VZ]));
 		support.append(pos_text);
 
 		LLString region_text = llformat("in %s located at ",
@@ -117,6 +117,10 @@ LLFloaterAbout::LLFloaterAbout()
 		support.append("\n\n");
 	}
 
+	//*NOTE: Do not translate text like GPU, Graphics Card, etc -
+	//  Most PC users that know what these mean will be used to the english versions,
+	//  and this info sometimes gets sent to support
+	
 	// CPU
 	support.append("CPU: ");
 	support.append( gSysCPU.getCPUString() );
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 1d89a07c434feaf08db98fe70d088c84606e95cb..71c221775e89ffdc512eb85e1342f0e2fe67f4a2 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -294,8 +294,7 @@ BOOL LLFloaterAnimPreview::postBuild()
 			delete mAnimPreview;
 			mAnimPreview = NULL;
 			mMotionID.setNull();
-			// XUI:translate
-			childSetValue("bad_animation_text", LLSD("Failed to initialize motion."));
+			childSetValue("bad_animation_text", childGetText("failed_to_initialize"));
 			mEnabled = FALSE;
 		}
 	}
@@ -305,18 +304,16 @@ BOOL LLFloaterAnimPreview::postBuild()
 		{
 			if (loaderp->getDuration() > MAX_ANIM_DURATION)
 			{
-				char output_str[256];	/*Flawfinder: ignore*/
-
-				snprintf(output_str, sizeof(output_str), "Animation file is %.1f seconds in length.\n\nMaximum animation length is %.1f seconds.\n",	/* Flawfinder: ignore */
-					loaderp->getDuration(), MAX_ANIM_DURATION);
-				childSetValue("bad_animation_text", LLSD(output_str));
+				LLUIString out_str = childGetText("anim_too_long");
+				out_str.setArg("[LENGTH]", llformat("%.1f", loaderp->getDuration()));
+				out_str.setArg("[MAX_LENGTH]", llformat("%.1f", MAX_ANIM_DURATION));
+				childSetValue("bad_animation_text", out_str.getString());
 			}
 			else
 			{
-				char* status = loaderp->getStatus();
-				LLString error_string("Unable to read animation file.\n\n");
-				error_string += LLString(status);
-				childSetValue("bad_animation_text", LLSD(error_string));
+				LLUIString out_str = childGetText("failed_file_read");
+				out_str.setArg("[STATUS]", loaderp->getStatus()); // *TODO:Translate
+				childSetValue("bad_animation_text", out_str.getString());
 			}
 		}
 
@@ -1158,3 +1155,4 @@ void LLPreviewAnimation::pan(F32 right, F32 up)
 	mCameraOffset.mV[VZ] = llclamp(mCameraOffset.mV[VZ] + up * mCameraDistance / mCameraZoom, -1.f, 1.f);
 }
 
+
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index 44ebe0c98b45825be44da5e9d61ba2fbc69e5449..bc00565a28dad30072c1a3ed4cba4e2366f218d0 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -126,7 +126,7 @@ void LLFloaterAuction::initialize()
 		}
 		else
 		{
-			childSetText("parcel_text", "");
+			childSetText("parcel_text", LLString::null);
 		}
 		mParcelID = -1;
 		childSetEnabled("snapshot_btn", false);
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index 7767a37ccbb688ad493e0b9662034c4dc0684dee..707ec0e8525793f1f4b12883a478c9d8508453c6 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -113,21 +113,23 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)
 	sInstance->center();
 
 	LLSelectNode* node = selection->getFirstRootNode();
-	if (!node) return;
+	if (!node)
+		return;
 
 	// Set title based on sale type
-	std::ostringstream title;
+	LLUIString title;
 	switch (sale_info.getSaleType())
 	{
-	case LLSaleInfo::FS_ORIGINAL:
-		title << "Buy " << node->mName; // XUI:translate
+	  case LLSaleInfo::FS_ORIGINAL:
+		title = sInstance->childGetText("title_buy_text");
 		break;
-	case LLSaleInfo::FS_COPY:
-	default:
-		title << "Buy Copy of " << node->mName; // XUI:translate
+	  case LLSaleInfo::FS_COPY:
+	  default:
+		title = sInstance->childGetText("title_buy_copy_text");
 		break;
 	}
-	sInstance->setTitle(title.str());
+	title.setArg("[NAME]", node->mName);
+	sInstance->setTitle(title);
 
 	LLUUID owner_id;
 	LLString owner_name;
@@ -163,15 +165,15 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)
 	LLString text = node->mName;
 	if (!(next_owner_mask & PERM_COPY))
 	{
-		text.append(" (no copy)");	// XUI:translate
+		text.append(sInstance->childGetText("no_copy_text"));
 	}
 	if (!(next_owner_mask & PERM_MODIFY))
 	{
-		text.append(" (no modify)");	// XUI:translate
+		text.append(sInstance->childGetText("no_modify_text"));
 	}
 	if (!(next_owner_mask & PERM_TRANSFER))
 	{
-		text.append(" (no transfer)");	// XUI:translate
+		text.append(sInstance->childGetText("no_transfer_text"));
 	}
 
 	row["columns"][1]["column"] = "text";
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index b99b2bac1e62a29f1f9719d6179157eb948611dd..38266797cf00a2146aad3aed7f472e0d6194574d 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -238,20 +238,19 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
 		U32 next_owner_mask = inv_item->getPermissions().getMaskNextOwner();
 		LLString text = (*it)->getName();
 
-		// *TODO: Move into shared library function.
 		if (!(next_owner_mask & PERM_COPY))
 		{
-			text.append(" (no copy)");	// XUI:translate
+			text.append(childGetText("no_copy_text"));
 		}
 		if (!(next_owner_mask & PERM_MODIFY))
 		{
-			text.append(" (no modify)");	// XUI:translate
+			text.append(childGetText("no_modify_text"));
 		}
 		if (!(next_owner_mask & PERM_TRANSFER))
 		{
-			text.append(" (no transfer)");	// XUI:translate
+			text.append(childGetText("no_transfer_text"));
 		}
-
+		
 		row["columns"][1]["column"] = "text";
 		row["columns"][1]["value"] = text;
 		row["columns"][1]["font"] = "SANSSERIF";
diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp
index 2da9c95a1999b25d760cf71a1778a01d4f97fd59..a7233c310ad355c27f5052648dda8de5cc98dc77 100644
--- a/indra/newview/llfloaterbuycurrency.cpp
+++ b/indra/newview/llfloaterbuycurrency.cpp
@@ -316,7 +316,7 @@ void LLFloaterBuyCurrencyUI::onClickBuy(void* data)
 	LLFloaterBuyCurrencyUI* self = LLFloaterBuyCurrencyUI::soleInstance(false);
 	if (self)
 	{
-		self->mManager.buy();
+		self->mManager.buy(self->childGetText("buy_currency"));
 		self->updateUI();
 		// JC: updateUI() doesn't get called again until progress is made
 		// with transaction processing, so the "Purchase" button would be
@@ -377,3 +377,4 @@ void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price)
 	ui->open();
 }
 
+
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index c6bb53aed7c31c510754fb6b7bb48c0f724cf92b..9ae634c76fc6cf462a098e6f92504171387aa28e 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -1022,9 +1022,9 @@ void LLFloaterBuyLandUI::refreshUI()
 		}
 		else
 		{
-			childSetText("info_parcel", "(no parcel selected)");
-			childSetText("info_size", "");
-			childSetText("info_price", "");
+			childSetText("info_parcel", childGetText("no_parcel_selected"));
+			childSetText("info_size", LLString::null);
+			childSetText("info_price", LLString::null);
 		}
 		
 		childSetText("info_action",
@@ -1127,7 +1127,7 @@ void LLFloaterBuyLandUI::refreshUI()
 		
 		if (mIsForGroup)
 		{
-			childSetTextArg("insufficient_land_credits", "[GROUP]", gAgent.mGroupName);
+			childSetTextArg("insufficient_land_credits", "[GROUP]", LLString(gAgent.mGroupName));
 
 
 			message += childGetText("insufficient_land_credits");
@@ -1306,7 +1306,7 @@ void LLFloaterBuyLandUI::startBuyPreConfirm()
 	}
 
 	childSetTextArg("pay_to_for_land", "[AMOUNT]", llformat("%d", mParcelPrice));
-	childSetTextArg("pay_to_for_land", "[SELLER]", mParcelSellerName.c_str());
+	childSetTextArg("pay_to_for_land", "[SELLER]", mParcelSellerName);
 
 	action += childGetText("pay_to_for_land");
 		
@@ -1349,3 +1349,4 @@ void LLFloaterBuyLandUI::onClickErrorWeb(void* data)
 	self->close();
 }
 
+
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index bdb927cac7a1896da4b7496f63f2047d38272a62..03e3a2e967ce92a51a3d8337decc94a41a1bcc7a 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -83,6 +83,7 @@ LLFloaterColorPicker (LLColorSwatchCtrl* swatch, BOOL show_apply_immediate )
 	  mMouseDownInLumRegion	( FALSE ),
 	  mMouseDownInHueRegion	( FALSE ),
 	  mMouseDownInSwatch	( FALSE ),
+	  // *TODO: Specify this in XML
 	  mRGBViewerImageLeft	( 140 ),
 	  mRGBViewerImageTop	( 356 ),
 	  mRGBViewerImageWidth	( 256 ),
@@ -92,17 +93,19 @@ LLFloaterColorPicker (LLColorSwatchCtrl* swatch, BOOL show_apply_immediate )
 	  mLumRegionWidth		( 16 ),
 	  mLumRegionHeight		( mRGBViewerImageHeight ),
 	  mLumMarkerSize		( 6 ),
+	  // *TODO: Specify this in XML
 	  mSwatchRegionLeft		( 12 ),
-	  mSwatchRegionTop		( 160 + 16 - 4 ),	// get help text baseline to line up with bottom of RGB viewer
-	  mSwatchRegionWidth	( 110 ),
+	  mSwatchRegionTop		( 190 ),
+	  mSwatchRegionWidth	( 116 ),
 	  mSwatchRegionHeight	( 60 ),
 	  mSwatchView			( NULL ),
+	  // *TODO: Specify this in XML
 	  numPaletteColumns		( 16 ),
 	  numPaletteRows		( 2 ),
 	  highlightEntry		( -1 ),
-	  mPaletteRegionLeft	( mSwatchRegionLeft - 1 ),
+	  mPaletteRegionLeft	( 11 ),
 	  mPaletteRegionTop		( 100 - 8 ),
-	  mPaletteRegionWidth	( mLumRegionLeft + mLumRegionWidth - mSwatchRegionLeft + 2 ),
+	  mPaletteRegionWidth	( mLumRegionLeft + mLumRegionWidth - 10 ),
 	  mPaletteRegionHeight	( 40 ),
 	  mSwatch				( swatch ),
 	  mActive				( TRUE ),
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index 4a614ca8e152f97c896e33826f2cf8091dc999fa..6f792e062f4111aac4664a984d53bf95fb56f6a3 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -422,7 +422,7 @@ void LLPanelFriends::refreshUI()
 		single_selected = TRUE;
 		if(num_selected > 1)
 		{
-			childSetText("friend_name_label", "Multiple friends...");
+			childSetText("friend_name_label", childGetText("Multiple"));
 			multiple_selected = TRUE;		
 		}
 		else
@@ -432,7 +432,7 @@ void LLPanelFriends::refreshUI()
 	}
 	else
 	{
-		childSetText("friend_name_label", "");
+		childSetText("friend_name_label", LLString::null);
 	}
 
 
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index 6a56052e12f2a0584545996f7b99ddd6f5679772..27d427115bbf423ed640d1763b5be8e4c296d201 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -1260,8 +1260,8 @@ void LLPanelObjectTools::onClickSetBySelection(void* data)
 	LLPanelObjectTools* panelp = (LLPanelObjectTools*) data;
 	if (!panelp) return;
 
-	LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
-	if (!node) node = gSelectMgr->getSelection()->getFirstNode();
+	const BOOL non_root_ok = TRUE; 
+	LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(NULL, non_root_ok);
 	if (!node) return;
 
 	LLString owner_name;
diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h
index f817a7bda1b4c1f6e8bbd04e1051286eef5356dc..53e250f67eb432c9758e26313210ef99d1816faa 100644
--- a/indra/newview/llfloatergodtools.h
+++ b/indra/newview/llfloatergodtools.h
@@ -109,8 +109,6 @@ protected:
 	LLFloaterGodTools();
 	~LLFloaterGodTools();
 
-	void setStatusText(const std::string& text);
-
 	// When the floater is going away, reset any options that need to be 
 	// cleared.
 	void resetToolState();
diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp
index 0f9f60a49ab4988d7975c894e81bdb4c214b8f05..0ce91ef7405624c838793b9bbb7d9268569073af 100644
--- a/indra/newview/llfloaterinspect.cpp
+++ b/indra/newview/llfloaterinspect.cpp
@@ -97,27 +97,28 @@ void LLFloaterInspect::show(void* ignored)
 
 void LLFloaterInspect::onClickCreatorProfile(void* ctrl)
 {
-	if(sInstance->mObjectList->getAllSelected().size() == 0) return;
+	if(sInstance->mObjectList->getAllSelected().size() == 0)
+	{
+		return;
+	}
 	LLScrollListItem* first_selected =
 		sInstance->mObjectList->getFirstSelected();
 
 	if (first_selected)
 	{
-		LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode();
-		LLUUID obj_id, creator_id;
-		obj_id = first_selected->getUUID();
-		while(obj)
+		struct f : public LLSelectedNodeFunctor
 		{
-			if(obj_id == obj->getObject()->getID())
+			LLUUID obj_id;
+			f(const LLUUID& id) : obj_id(id) {}
+			virtual bool apply(LLSelectNode* node)
 			{
-				creator_id = obj->mPermissions->getCreator();
-				break;
+				return (obj_id == node->getObject()->getID());
 			}
-			obj = sInstance->mObjectSelection->getNextNode();
-		}
-		if(obj)
+		} func(first_selected->getUUID());
+		LLSelectNode* node = sInstance->mObjectSelection->getFirstNode(&func);
+		if(node)
 		{
-			LLFloaterAvatarInfo::showFromDirectory(creator_id);
+			LLFloaterAvatarInfo::showFromDirectory(node->mPermissions->getCreator());
 		}
 	}
 }
@@ -130,20 +131,20 @@ void LLFloaterInspect::onClickOwnerProfile(void* ctrl)
 
 	if (first_selected)
 	{
-		LLSelectNode* obj= sInstance->mObjectSelection->getFirstNode();
-		LLUUID obj_id, owner_id;
-		obj_id = first_selected->getUUID();
-		while(obj)
+		LLUUID selected_id = first_selected->getUUID();
+		struct f : public LLSelectedNodeFunctor
 		{
-			if(obj_id == obj->getObject()->getID())
+			LLUUID obj_id;
+			f(const LLUUID& id) : obj_id(id) {}
+			virtual bool apply(LLSelectNode* node)
 			{
-				owner_id = obj->mPermissions->getOwner();
-				break;
+				return (obj_id == node->getObject()->getID());
 			}
-			obj = sInstance->mObjectSelection->getNextNode();
-		}
-		if(obj)
+		} func(selected_id);
+		LLSelectNode* node = sInstance->mObjectSelection->getFirstNode(&func);
+		if(node)
 		{
+			const LLUUID& owner_id = node->mPermissions->getOwner();
 			LLFloaterAvatarInfo::showFromDirectory(owner_id);
 		}
 	}
@@ -204,10 +205,12 @@ void LLFloaterInspect::refresh()
 	}
 	mObjectList->operateOnAll(LLScrollListCtrl::OP_DELETE);
 	//List all transient objects, then all linked objects
-	LLSelectNode* obj = mObjectSelection->getFirstNode();
-	LLSD row;
-	while(obj)
+
+	for (LLObjectSelection::iterator iter = mObjectSelection->begin();
+		 iter != mObjectSelection->end(); iter++)
 	{
+		LLSelectNode* obj = *iter;
+		LLSD row;
 		char owner_first_name[MAX_STRING], owner_last_name[MAX_STRING];
 		char creator_first_name[MAX_STRING], creator_last_name[MAX_STRING];
 		char time[MAX_STRING];
@@ -243,7 +246,6 @@ void LLFloaterInspect::refresh()
 		row["columns"][3]["type"] = "text";
 		row["columns"][3]["value"] = time;
 		mObjectList->addElement(row, ADD_TOP);
-		obj = mObjectSelection->getNextNode();
 	}
 	if(selected_index > -1 && mObjectList->getItemIndex(selected_uuid) == selected_index)
 	{
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 65b93e704a54024aa046b58d3ed00c73f526a615..43c39aa3ea357907f488de7e99e9b917a80c8f54 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -72,43 +72,10 @@
 #include "llviewercontrol.h"
 #include "roles_constants.h"
 
-static const S32 EDIT_HEIGHT = 16;
-static const S32 LEFT = HPAD;
-static const S32 BOTTOM = VPAD;
-static const S32 RULER0  = LEFT;
-static const S32 RULER05 = RULER0 + 24;
-static const S32 RULER1  = RULER05 + 16;
-static const S32 RULER15 = RULER1 + 20;
-static const S32 RULER2  = RULER1 + 32;
-static const S32 RULER205= RULER2 + 32;
-static const S32 RULER20 = RULER2 + 64;
-static const S32 RULER21 = RULER20 + 16;
-static const S32 RULER22 = RULER21 + 32;
-static const S32 RULER225 = RULER20 + 64;
-static const S32 RULER23 = RULER22 + 64;
-static const S32 RULER24 = RULER23 + 26;
-static const S32 RULER3  = RULER2 + 102;
-static const S32 RULER4  = RULER3 + 8;
-static const S32 RULER5  = RULER4 + 50;
-static const S32 RULER6  = RULER5 + 52;
-static const S32 RULER7  = RULER6 + 24;
-static const S32 RIGHT  = LEFT + 278;
-static const S32 FAR_RIGHT  = LEFT + 324 + 40;
-
-static const char PRICE[] = "Price:";
-static const char NO_PRICE[] = "";
-static const char AREA[] = "Area:";
-
 static const char OWNER_ONLINE[] 	= "0";
 static const char OWNER_OFFLINE[]	= "1";
 static const char OWNER_GROUP[] 	= "2";
 
-static const char NEED_TIER_TO_MODIFY_STRING[] = "You must approve your purchase to modify this land.";
-
-static const char WEB_PAGE[] = "Web page";
-static const char QUICKTIME_MOVIE[] = "QuickTime movie";
-static const char RAW_HTML[] = "Raw HTML";
-
 // constants used in callbacks below - syntactic sugar.
 static const BOOL BUY_GROUP_LAND = TRUE;
 static const BOOL BUY_PERSONAL_LAND = FALSE;
@@ -508,12 +475,12 @@ void LLPanelLandGeneral::refresh()
 	{
 		// nothing selected, disable panel
 		mEditName->setEnabled(FALSE);
-		mEditName->setText("");
+		mEditName->setText(LLString::null);
 
 		mEditDesc->setEnabled(FALSE);
-		mEditDesc->setText("");
+		mEditDesc->setText(LLString::null);
 
-		mTextSalePending->setText("");
+		mTextSalePending->setText(LLString::null);
 		mTextSalePending->setEnabled(FALSE);
 
 		mBtnDeedToGroup->setEnabled(FALSE);
@@ -525,14 +492,13 @@ void LLPanelLandGeneral::refresh()
 		mCheckContributeWithDeed->set(FALSE);
 		mCheckContributeWithDeed->setEnabled(FALSE);
 
-		mTextOwner->setText("");
-		mBtnProfile->setLabelSelected("Profile...");
-		mBtnProfile->setLabelUnselected("Profile...");
+		mTextOwner->setText(LLString::null);
+		mBtnProfile->setLabel(childGetText("profile_text"));
 		mBtnProfile->setEnabled(FALSE);
 
-		mTextClaimDate->setText("");
-		mTextGroup->setText("");
-		mTextPrice->setText("");
+		mTextClaimDate->setText(LLString::null);
+		mTextGroup->setText(LLString::null);
+		mTextPrice->setText(LLString::null);
 
 		mSaleInfoForSale1->setVisible(FALSE);
 		mSaleInfoForSale2->setVisible(FALSE);
@@ -542,8 +508,8 @@ void LLPanelLandGeneral::refresh()
 		mBtnSellLand->setVisible(FALSE);
 		mBtnStopSellLand->setVisible(FALSE);
 
-		mTextPriceLabel->setText(NO_PRICE);
-		mTextDwell->setText("");
+		mTextPriceLabel->setText(LLString::null);
+		mTextDwell->setText(LLString::null);
 
 		mBtnBuyLand->setEnabled(FALSE);
 		mBtnBuyGroupLand->setEnabled(FALSE);
@@ -579,14 +545,14 @@ void LLPanelLandGeneral::refresh()
 		// Is it owned?
 		if (is_public)
 		{
-			mTextSalePending->setText("");
+			mTextSalePending->setText(LLString::null);
 			mTextSalePending->setEnabled(FALSE);
-			mTextOwner->setText("(public)");
+			mTextOwner->setText(childGetText("public_text"));
 			mTextOwner->setEnabled(FALSE);
 			mBtnProfile->setEnabled(FALSE);
-			mTextClaimDate->setText("");
+			mTextClaimDate->setText(LLString::null);
 			mTextClaimDate->setEnabled(FALSE);
-			mTextGroup->setText("(none)");
+			mTextGroup->setText(childGetText("none_text"));
 			mTextGroup->setEnabled(FALSE);
 			mBtnStartAuction->setEnabled(FALSE);
 		}
@@ -594,20 +560,19 @@ void LLPanelLandGeneral::refresh()
 		{
 			if(!is_leased && (owner_id == gAgent.getID()))
 			{
-				mTextSalePending->setText(NEED_TIER_TO_MODIFY_STRING);
+				mTextSalePending->setText(childGetText("need_tier_to_modify"));
 				mTextSalePending->setEnabled(TRUE);
 			}
 			else if(parcel->getAuctionID())
 			{
-				char auction_str[MAX_STRING];		/*Flawfinder: ignore*/
-				snprintf(auction_str, sizeof(auction_str), "Auction ID: %u", parcel->getAuctionID());		/* Flawfinder: ignore */
-				mTextSalePending->setText(auction_str);
+				mTextSalePending->setText(childGetText("auction_id_text"));
+				mTextSalePending->setTextArg("[ID]", llformat("%u", parcel->getAuctionID()));
 				mTextSalePending->setEnabled(TRUE);
 			}
 			else
 			{
 				// not the owner, or it is leased
-				mTextSalePending->setText("");
+				mTextSalePending->setText(LLString::null);
 				mTextSalePending->setEnabled(FALSE);
 			}
 			//refreshNames();
@@ -619,26 +584,25 @@ void LLPanelLandGeneral::refresh()
 			if (parcel->getGroupID().isNull())
 			{
 				// Not group owned, so "Profile"
-				mBtnProfile->setLabelSelected("Profile...");
-				mBtnProfile->setLabelUnselected("Profile...");
+				mBtnProfile->setLabel(childGetText("profile_text"));
 
-				mTextGroup->setText("(none)");
+				mTextGroup->setText(childGetText("none_text"));
 				mTextGroup->setEnabled(FALSE);
 			}
 			else
 			{
 				// Group owned, so "Info"
-				mBtnProfile->setLabelSelected("Info...");
-				mBtnProfile->setLabelUnselected("Info...");
+				mBtnProfile->setLabel(childGetText("info_text"));
 
 				//mTextGroup->setText("HIPPOS!");//parcel->getGroupName());
 				mTextGroup->setEnabled(TRUE);
 			}
 
 			// Display claim date
+			// *TODO:Localize (Time format may need Translating)
 			time_t claim_date = parcel->getClaimDate();
 			char time_buf[TIME_STR_LENGTH];		/*Flawfinder: ignore*/
-			mTextClaimDate->setText(formatted_time(claim_date, time_buf));
+			mTextClaimDate->setText(LLString(formatted_time(claim_date, time_buf)));
 			mTextClaimDate->setEnabled(is_leased);
 
 			BOOL enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON)
@@ -727,8 +691,6 @@ void LLPanelLandGeneral::refresh()
 			gParcelMgr->canAgentBuyParcel(parcel, true));
 
 		// show pricing information
-		char price[64];		/*Flawfinder: ignore*/
-		const char* label = NULL;
 		S32 area;
 		S32 claim_price;
 		S32 rent_price;
@@ -740,14 +702,12 @@ void LLPanelLandGeneral::refresh()
 								   &dwell);
 
 		// Area
-		snprintf(price, sizeof(price), "%d sq. m.", area);			/* Flawfinder: ignore */
-		label = AREA;
-		
-		mTextPriceLabel->setText(label);
-		mTextPrice->setText(price);
+		LLUIString price = childGetText("area_size_text");
+		price.setArg("[AREA]", llformat("%d",area));	
+		mTextPriceLabel->setText(childGetText("area_text"));
+		mTextPrice->setText(price.getString());
 		
-		snprintf(price, sizeof(price), "%.0f", dwell); 			/* Flawfinder: ignore */
-		mTextDwell->setText(price);
+		mTextDwell->setText(llformat("%.0f", dwell));
 
 		if(region_owner)
 		{
@@ -775,15 +735,14 @@ void LLPanelLandGeneral::refreshNames()
 	LLParcel *parcel = mParcel->getParcel();
 	if (!parcel)
 	{
-		mTextOwner->setText("");
+		mTextOwner->setText(LLString::null);
 		return;
 	}
 
-	char buffer[MAX_STRING];		/*Flawfinder: ignore*/
+	LLString owner;
 	if (parcel->getIsGroupOwned())
 	{
-		buffer[0] = '\0';
-		strcat(buffer, "(Group Owned)");	/*Flawfinder: ignore*/
+		owner = childGetText("group_owned_text");
 	}
 	else
 	{
@@ -791,24 +750,23 @@ void LLPanelLandGeneral::refreshNames()
 		char owner_first[MAX_STRING];	/*Flawfinder: ignore*/
 		char owner_last[MAX_STRING];	/*Flawfinder: ignore*/
 		gCacheName->getName(parcel->getOwnerID(), owner_first, owner_last);
-		snprintf(buffer, sizeof(buffer), "%s %s", owner_first, owner_last); 		/* Flawfinder: ignore */
+		owner = llformat("%s %s", owner_first, owner_last);
 	}
 
 	if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
 	{
-		strcat(buffer, " (Sale Pending)");	/*Flawfinder: ignore*/
+		owner += childGetText("sale_pending_text");
 	}
-	mTextOwner->setText(buffer);
+	mTextOwner->setText(owner);
 
+	LLString group;
 	if(!parcel->getGroupID().isNull())
 	{
+		char buffer[MAX_STRING];	/*Flawfinder: ignore*/
 		gCacheName->getGroupName(parcel->getGroupID(), buffer);
+		group = buffer;
 	}
-	else
-	{
-		buffer[0] = '\0';
-	}
-	mTextGroup->setText(buffer);
+	mTextGroup->setText(group);
 
 	const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
 	if(auth_buyer_id.notNull())
@@ -955,7 +913,7 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)
 	if (!parcel) return;
 
 	S32 pass_price = parcel->getPassPrice();
-	const char* parcel_name = parcel->getName();
+	LLString parcel_name = parcel->getName();
 	F32 pass_hours = parcel->getPassHours();
 
 	char cost[256], time[256];		/*Flawfinder: ignore*/
@@ -1071,8 +1029,8 @@ BOOL LLPanelLandObjects::postBuild()
 {
 	
 	mFirstReply = TRUE;
-	mParcelObjectBonus = LLUICtrlFactory::getTextBoxByName(this, "Simulator Primitive Bonus Factor: 1.00");
-	mSWTotalObjects = LLUICtrlFactory::getTextBoxByName(this, "0 out of 0 available");
+	mParcelObjectBonus = LLUICtrlFactory::getTextBoxByName(this, "parcel_object_bonus");
+	mSWTotalObjects = LLUICtrlFactory::getTextBoxByName(this, "objects_available");
 	mObjectContribution = LLUICtrlFactory::getTextBoxByName(this, "object_contrib_text");
 	mTotalObjects = LLUICtrlFactory::getTextBoxByName(this, "total_objects_text");
 	mOwnerObjects = LLUICtrlFactory::getTextBoxByName(this, "owner_objects_text");
@@ -1221,17 +1179,18 @@ void LLPanelLandObjects::refresh()
 
 	if (!parcel)
 	{
-		mSWTotalObjects->setText("0 out of 0 available");
-		mObjectContribution->setText("0");
-		mTotalObjects->setText("0");
-		mOwnerObjects->setText("0");
-		mGroupObjects->setText("0");
-		mOtherObjects->setText("0");
-		mSelectedObjects->setText("0");
+		mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", 0));
+		mSWTotalObjects->setTextArg("[TOTAL]", llformat("%d", 0));
+		mSWTotalObjects->setTextArg("[AVAILABLE]", llformat("%d", 0));
+		mObjectContribution->setTextArg("[COUNT]", llformat("%d", 0));
+		mTotalObjects->setTextArg("[COUNT]", llformat("%d", 0));
+		mOwnerObjects->setTextArg("[COUNT]", llformat("%d", 0));
+		mGroupObjects->setTextArg("[COUNT]", llformat("%d", 0));
+		mOtherObjects->setTextArg("[COUNT]", llformat("%d", 0));
+		mSelectedObjects->setTextArg("[COUNT]", llformat("%d", 0));
 	}
 	else
 	{
-		char count[MAX_STRING];		/*Flawfinder: ignore*/
 		S32 sw_max = 0;
 		S32 sw_total = 0;
 		S32 max = 0;
@@ -1258,47 +1217,34 @@ void LLPanelLandObjects::refresh()
 
 		if (parcel_object_bonus != 1.0f)
 		{
-			snprintf(count, sizeof(count), "Region Object Bonus Factor: %.2f", 			/* Flawfinder: ignore */
-					parcel_object_bonus);
-			mParcelObjectBonus->setText(count);
+			mParcelObjectBonus->setVisible(TRUE);
+			mParcelObjectBonus->setTextArg("[BONUS]", llformat("%.2f", parcel_object_bonus));
 		}
 		else
 		{
-			mParcelObjectBonus->setText("");
+			mParcelObjectBonus->setVisible(FALSE);
 		}
 
 		if (sw_total > sw_max)
 		{
-			snprintf(count, sizeof(count), "%d out of %d (%d will be deleted)", 			/* Flawfinder: ignore */
-					sw_total, sw_max, sw_total - sw_max);
+			mSWTotalObjects->setText(childGetText("objects_deleted_text"));
+			mSWTotalObjects->setTextArg("[DELETED]", llformat("%d", sw_total - sw_max));
 		}
 		else
 		{
-			snprintf(count, sizeof(count), "%d out of %d (%d available)",  				/* Flawfinder: ignore */
-					sw_total, sw_max, sw_max - sw_total);
+			mSWTotalObjects->setText(childGetText("objects_available_text"));
+			mSWTotalObjects->setTextArg("[AVAILABLE]", llformat("%d", sw_max - sw_total));
 		}
-		mSWTotalObjects->setText(count);
-
-		snprintf(count, sizeof(count),  "%d", max);	/* Flawfinder: ignore */
-		mObjectContribution->setText(count);
+		mSWTotalObjects->setTextArg("[COUNT]", llformat("%d", sw_total));
+		mSWTotalObjects->setTextArg("[MAX]", llformat("%d", sw_max));
 
-		snprintf(count, sizeof(count), "%d", total);			/* Flawfinder: ignore */
-		mTotalObjects->setText(count);
-
-		snprintf(count, sizeof(count), "%d", owned);		/* Flawfinder: ignore */
-		mOwnerObjects->setText(count);
-
-		snprintf(count, sizeof(count), "%d", group);			/* Flawfinder: ignore */
-		mGroupObjects->setText(count);
-
-		snprintf(count, sizeof(count), "%d", other);			/* Flawfinder: ignore */
-		mOtherObjects->setText(count);
-
-		snprintf(count, sizeof(count), "%d", selected);		/* Flawfinder: ignore */
-		mSelectedObjects->setText(count);
-
-		snprintf(count, sizeof(count), "%d", mOtherTime);	/* Flawfinder: ignore */
-		mCleanOtherObjectsTime->setText(count);
+		mObjectContribution->setTextArg("[COUNT]", llformat("%d", max));
+		mTotalObjects->setTextArg("[COUNT]", llformat("%d", total));
+		mOwnerObjects->setTextArg("[COUNT]", llformat("%d", owned));
+		mGroupObjects->setTextArg("[COUNT]", llformat("%d", group));
+		mOtherObjects->setTextArg("[COUNT]", llformat("%d", other));
+		mSelectedObjects->setTextArg("[COUNT]", llformat("%d", selected));
+		mCleanOtherObjectsTime->setText(llformat("%d", mOtherTime));
 
 		BOOL can_return_owned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_GROUP_OWNED);
 		BOOL can_return_group_set = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_RETURN_GROUP_SET);
@@ -1488,7 +1434,6 @@ void LLPanelLandObjects::callbackReturnOwnerList(S32 option, void* userdata)
 				}
 				else
 				{
-					// XUI:translate NAME -> FIRST LAST
 					args["[NAME]"] = self->mSelectedName;
 					LLNotifyBox::showXml("OtherObjectsReturned2", args);
 				}
@@ -1633,7 +1578,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
 			row->addColumn(OWNER_OFFLINE, FONT, self->mColWidth[1]);
 		}
 		// Placeholder for name.
-		row->addColumn("", FONT, self->mColWidth[2]);
+		row->addColumn(LLString::null, FONT, self->mColWidth[2]);
 
 		snprintf(object_count_str, sizeof(object_count_str), "%d", object_count); 		/* Flawfinder: ignore */
 		row->addColumn(object_count_str, FONT, self->mColWidth[3]);
@@ -2032,7 +1977,7 @@ BOOL LLPanelLandOptions::postBuild()
 	}
 
 
-	mLocationText = LLUICtrlFactory::getTextBoxByName(this, "Landing Point: (none)");
+	mLocationText = LLUICtrlFactory::getTextBoxByName(this, "landing_point");
 
 	mSetBtn = LLUICtrlFactory::getButtonByName(this, "Set");
 	mSetBtn->setClickedCallback(onClickSet, this);
@@ -2097,8 +2042,9 @@ void LLPanelLandOptions::refresh()
 		mPushRestrictionCtrl->set(FALSE);
 		mPushRestrictionCtrl->setEnabled(FALSE);
 
+		// *TODO:Translate
 		const char* none_string = LLParcel::getCategoryUIString(LLParcel::C_NONE);
-		mCategoryCombo->setSimple(none_string);
+		mCategoryCombo->setSimple(LLString(none_string));
 		mCategoryCombo->setEnabled(FALSE);
 
 		mLandingTypeCombo->setCurrentByIndex(0);
@@ -2107,7 +2053,7 @@ void LLPanelLandOptions::refresh()
 		mSnapshotCtrl->setImageAssetID(LLUUID::null);
 		mSnapshotCtrl->setEnabled(FALSE);
 
-		mLocationText->setText("Landing Point: (none)");
+		mLocationText->setTextArg("[LANDING]", childGetText("landing_point_none"));
 		mSetBtn->setEnabled(FALSE);
 		mClearBtn->setEnabled(FALSE);
 
@@ -2154,24 +2100,23 @@ void LLPanelLandOptions::refresh()
 		mPushRestrictionCtrl->set( parcel->getRestrictPushObject() );
 		if(parcel->getRegionPushOverride())
 		{
-			mPushRestrictionCtrl->setLabel("Restrict Pushing (Region Override)");
+			mPushRestrictionCtrl->setLabel(childGetText("push_restrict_region_text"));
 			mPushRestrictionCtrl->setEnabled(false);
 			mPushRestrictionCtrl->set(TRUE);
 		}
 		else
 		{
-			mPushRestrictionCtrl->setLabel("Restrict Pushing");
+			mPushRestrictionCtrl->setLabel(childGetText("push_restrict_text"));
 			mPushRestrictionCtrl->setEnabled(can_change_options);
 		}
 
 		BOOL can_change_identity = 
 			LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_IDENTITY);
-
-		// Set by string in case the order in UI doesn't match the order
-		// by index.
+		// Set by string in case the order in UI doesn't match the order by index.
+		// *TODO:Translate
 		LLParcel::ECategory cat = parcel->getCategory();
 		const char* category_string = LLParcel::getCategoryUIString(cat);
-		mCategoryCombo->setSimple(category_string);
+		mCategoryCombo->setSimple(LLString(category_string));
 		mCategoryCombo->setEnabled( can_change_identity );
 
 		BOOL can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, 
@@ -2185,16 +2130,14 @@ void LLPanelLandOptions::refresh()
 		LLVector3 pos = parcel->getUserLocation();
 		if (pos.isExactlyZero())
 		{
-			mLocationText->setText("Landing Point: (none)");
+			mLocationText->setTextArg("[LANDING]", childGetText("landing_point_none"));
 		}
 		else
 		{
-			char buffer[256];	/*Flawfinder: ignore*/
-			snprintf(buffer, sizeof(buffer), "Landing Point: %d, %d, %d",		/* Flawfinder: ignore */
-					llround(pos.mV[VX]),
-					llround(pos.mV[VY]),
-					llround(pos.mV[VZ]));
-			mLocationText->setText(buffer);
+			mLocationText->setTextArg("[LANDING]",llformat("%d, %d, %d",
+														   llround(pos.mV[VX]),
+														   llround(pos.mV[VY]),
+														   llround(pos.mV[VZ])));
 		}
 
 		mSetBtn->setEnabled( can_change_landing_point );
@@ -2445,10 +2388,10 @@ void LLPanelLandMedia::refresh()
 		mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatEstate);
 		mRadioVoiceChat->setEnabled(FALSE);
 
-		mMusicURLEdit->setText("");
+		mMusicURLEdit->setText(LLString::null);
 		mMusicURLEdit->setEnabled(FALSE);
 
-		mMediaURLEdit->setText("");
+		mMediaURLEdit->setText(LLString::null);
 		mMediaURLEdit->setEnabled(FALSE);
 
 		mMediaAutoScaleCheck->set ( FALSE );
@@ -2664,24 +2607,20 @@ void LLPanelLandAccess::refresh()
 
 	if (parcel)
 	{
-		char label[256];	/*Flawfinder: ignore*/
-
 		// Display options
 		BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP);
 		mCheckGroup->set( use_group );
 
 		char group_name[MAX_STRING];	/*Flawfinder: ignore*/
 		gCacheName->getGroupName(parcel->getGroupID(), group_name);
-		snprintf(label, sizeof(label), "Group: %s", group_name);		/* Flawfinder: ignore */
-		mCheckGroup->setLabel( label );
+		mCheckGroup->setLabelArg( "[GROUP]", LLString(group_name) );
 
 		S32 count = parcel->mAccessList.size();
 
 		BOOL use_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST);
 		mCheckAccess->set( use_list );
-		snprintf(label, sizeof(label), "Avatars: (%d listed, %d max)",		/* Flawfinder: ignore */
-				count, PARCEL_MAX_ACCESS_LIST);
-		mCheckAccess->setLabel( label );
+		mCheckAccess->setLabelArg( "[LISTED]", llformat("%d",count));
+		mCheckAccess->setLabelArg( "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
 
 		access_map_const_iterator cit = parcel->mAccessList.begin();
 		access_map_const_iterator end = parcel->mAccessList.end();
@@ -2749,9 +2688,9 @@ void LLPanelLandAccess::refresh()
 	else
 	{
 		mCheckGroup->set(FALSE);
-		mCheckGroup->setLabel("Group:");
+		mCheckGroup->setLabelArg( "[GROUP]", LLString::null );
 		mCheckAccess->set(FALSE);
-		mCheckAccess->setLabel("Avatars:");
+		mCheckAccess->setLabelArg( "[LISTED]", llformat("%d",0));
 		mBtnAddAccess->setEnabled(FALSE);
 		mBtnRemoveAccess->setEnabled(FALSE);
 		mSpinPrice->set((F32)PARCEL_PASS_PRICE_DEFAULT);
@@ -2773,9 +2712,7 @@ void LLPanelLandAccess::refreshNames()
 	{
 		gCacheName->getGroupName(parcel->getGroupID(), group_name);
 	}
-	char label[MAX_STRING];		/*Flawfinder: ignore*/
-	snprintf(label, sizeof(label), "Group: %s", group_name);		/* Flawfinder: ignore */
-	mCheckGroup->setLabel(label);
+	mCheckGroup->setLabelArg("[GROUP]", LLString(group_name));
 }
 
 
@@ -2941,18 +2878,14 @@ void LLPanelLandBan::refresh()
 
 	if (parcel)
 	{
-		char label[256];	/*Flawfinder: ignore*/
-
 		// Display options
 
 		S32 count = parcel->mBanList.size();
 
 		BOOL use_ban = parcel->getParcelFlag(PF_USE_BAN_LIST);
 		mCheck->set( use_ban );
-
-		snprintf(label, sizeof(label), "Ban these avatars: (%d listed, %d max)",		/* Flawfinder: ignore */
-				count, PARCEL_MAX_ACCESS_LIST);
-		mCheck->setLabel( label );
+		mCheck->setLabelArg( "[LISTED]", llformat("%d",count));
+		mCheck->setLabelArg( "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
 
 		access_map_const_iterator cit = parcel->mBanList.begin();
 		access_map_const_iterator end = parcel->mBanList.end();
@@ -3031,7 +2964,7 @@ void LLPanelLandBan::refresh()
 	else
 	{
 		mCheck->set(FALSE);
-		mCheck->setLabel("Ban these avatars:");
+		mCheck->setLabelArg( "[LISTED]", llformat("%d",0));
 		mCheck->setEnabled(FALSE);
 		mBtnAdd->setEnabled(FALSE);
 		mBtnRemove->setEnabled(FALSE);
@@ -3124,82 +3057,6 @@ void LLPanelLandBan::onClickRemove(void* data)
 	self->refresh();
 }
 
-//---------------------------------------------------------------------------
-// LLPanelLandRenters
-//---------------------------------------------------------------------------
-LLPanelLandRenters::LLPanelLandRenters(LLParcelSelectionHandle& parcel)
-:	LLPanel("landrenters", LLRect(0,500,500,0)), mParcel(parcel)
-{
-	const S32 BTN_WIDTH = 64;
-
-	S32 x = LEFT;
-	S32 y = mRect.getHeight() - VPAD;
-
-	LLCheckBoxCtrl* check = NULL;
-	LLButton* btn = NULL;
-	LLNameListCtrl* list = NULL;
-
-	check = new LLCheckBoxCtrl("RentersCheck",
-							LLRect(RULER0, y, RIGHT, y-LINE),
-							"Rent space to these avatars:");
-	addChild(check);
-	mCheckRenters = check;
-
-	y -= VPAD + LINE;
-
-	const S32 ITEMS = 5;
-	const BOOL NO_MULTIPLE_SELECT = FALSE;
-
-	list = new LLNameListCtrl("RentersList",
-							LLRect(RULER05, y, RIGHT, y-LINE*ITEMS),
-							NULL, NULL,
-							NO_MULTIPLE_SELECT);
-	list->addSimpleItem("foo tester");
-	list->addSimpleItem("bar tester");
-	list->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
-	addChild(list);
-	mListRenters = list;
-
-	y -= VPAD + LINE*ITEMS;
-
-	x = RULER05;
-	btn = new LLButton("Add...",
-						LLRect(x, y, x+BTN_WIDTH, y-LINE),
-						"",
-						onClickAdd, this);
-	btn->setFont( LLFontGL::sSansSerifSmall );
-	btn->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
-	addChild(btn);
-	mBtnAddRenter = btn;
-
-	x += HPAD + BTN_WIDTH;
-
-	btn = new LLButton("Remove",
-						LLRect(x, y, x+BTN_WIDTH, y-LINE),
-						"",
-						onClickRemove, this);
-	btn->setFont( LLFontGL::sSansSerifSmall );
-	btn->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
-	addChild(btn);
-	mBtnRemoveRenter = btn;
-}
-
-LLPanelLandRenters::~LLPanelLandRenters()
-{ }
-
-void LLPanelLandRenters::refresh()
-{ }
-
-// static
-void LLPanelLandRenters::onClickAdd(void*)
-{
-}
-
-// static
-void LLPanelLandRenters::onClickRemove(void*)
-{
-}
-
 //---------------------------------------------------------------------------
 // LLPanelLandCovenant
 //---------------------------------------------------------------------------
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index f3ad542be9cced7ace87b469236e3cabb7524667..9eb9172b608a9b6148f7e4a2f505a53028c985a1 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -113,7 +113,6 @@ protected:
 	LLPanelLandAccess*		mPanelAccess;
 	LLPanelLandBan*			mPanelBan;
 	LLPanelLandCovenant*	mPanelCovenant;
-	LLPanelLandRenters*		mPanelRenters;
 
 	LLHandle<LLParcelSelection>	mParcel;
 
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index 8aaf1089a5fad9a2e45c57fbee2e70a0469ddd11..0b79c85963442072223fa24eeb5613984792fd3d 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -67,7 +67,7 @@ LLFloaterOpenObject::LLFloaterOpenObject()
 
 	childSetAction("copy_to_inventory_button", onClickMoveToInventory, this);
 	childSetAction("copy_and_wear_button", onClickMoveAndWear, this);
-	childSetTextArg("object_name", "[DESC]", "Object");
+	childSetTextArg("object_name", "[DESC]", LLString("Object") ); // *Note: probably do not want to translate this
 }
 
 LLFloaterOpenObject::~LLFloaterOpenObject()
diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp
index 821e5190ce0e133bedaf6a23bafdda90e56a5d05..8dcdb99a6949c1e05dea9ff05d2afcde0915f8b0 100644
--- a/indra/newview/llfloaterpostcard.cpp
+++ b/indra/newview/llfloaterpostcard.cpp
@@ -357,7 +357,7 @@ void LLFloaterPostcard::onMsgFormFocusRecieved(LLUICtrl* receiver, void* data)
 		if(msgForm && msgForm == receiver && msgForm->hasFocus() && !(self->mHasFirstMsgFocus))
 		{
 			self->mHasFirstMsgFocus = true;
-			msgForm->setText(LLString(""));
+			msgForm->setText(LLString::null);
 		}
 	}
 }
@@ -380,7 +380,6 @@ void LLFloaterPostcard::missingSubjMsgAlertCallback(S32 option, void* data)
 			{
 				// The user never switched focus to the messagee window. 
 				// Using the default string.
-				// XUI: translate
 				self->childSetValue("msg_form", self->childGetText("default_message"));
 			}
 
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index 4df3ab04c7ee00d12494ebd383879b35d1a13203..af2a717ff72b6fdaf07d3a144cd2d6b4906806de 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -59,14 +59,6 @@
 #include "llvieweruictrlfactory.h"
 
 
-///----------------------------------------------------------------------------
-/// Local function declarations, constants, enums, and typedefs
-///----------------------------------------------------------------------------
-
-const char* YOU_CAN = "You can:";
-const char* OWNER_CAN = "Owner can: ";
-
-
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLPropertiesObserver
 //
@@ -302,22 +294,11 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 
 	childSetEnabled("LabelItemNameTitle",TRUE);
 	childSetEnabled("LabelItemName",is_modifiable);
-	const char EMPTY_STRING[1] = "";		/* Flawfinder: ignore */
-	const char* txt = EMPTY_STRING;
-	if(!item->getName().empty())
-	{
-		txt = item->getName().c_str();
-	}
-	childSetText("LabelItemName",txt);
+	childSetText("LabelItemName",item->getName());
 	childSetEnabled("LabelItemDescTitle",TRUE);
 	childSetEnabled("LabelItemDesc",is_modifiable);
 	childSetVisible("IconLocked",!is_modifiable);
-	txt = EMPTY_STRING;
-	if(!item->getDescription().empty())
-	{
-		txt = item->getDescription().c_str();
-	}
-	childSetText("LabelItemDesc",txt);
+	childSetText("LabelItemDesc",item->getDescription());
 
 	//////////////////
 	// CREATOR NAME //
@@ -344,7 +325,7 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 		childSetEnabled("BtnCreator",FALSE);
 		childSetEnabled("LabelCreatorTitle",FALSE);
 		childSetEnabled("LabelCreatorName",FALSE);
-		childSetText("LabelCreatorName","(unknown)"); // XUI:translate
+		childSetText("LabelCreatorName",childGetText("unknown"));
 	}
 
 	////////////////
@@ -376,20 +357,22 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 		childSetEnabled("BtnOwner",FALSE);
 		childSetEnabled("LabelOwnerTitle",FALSE);
 		childSetEnabled("LabelOwnerName",FALSE);
-		childSetText("LabelOwnerName","(public)"); // XUI:translate
+		childSetText("LabelOwnerName",childGetText("public"));
 	}
 	
 	//////////////////
 	// ACQUIRE DATE //
 	//////////////////
+
+	// *TODO: Localize / translate this
 	time_t time_utc = (time_t)item->getCreationDate();
 	if (0 == time_utc)
 	{
-		childSetText("LabelAcquiredDate","(unknown)");
+		childSetText("LabelAcquiredDate",childGetText("unknown"));
 	}
 	else
 	{
-		childSetText("LabelAcquiredDate", ctime(&time_utc) );
+		childSetText("LabelAcquiredDate", LLString(ctime(&time_utc)) );
 	}
 
 	///////////////////////
@@ -397,11 +380,11 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 	///////////////////////
 	if(can_agent_manipulate)
 	{
-		childSetText("OwnerLabel",YOU_CAN);
+		childSetText("OwnerLabel",childGetText("you_can"));
 	}
 	else
 	{
-		childSetText("OwnerLabel",OWNER_CAN);
+		childSetText("OwnerLabel",childGetText("owner_can"));
 	}
 
 	U32 base_mask		= perm.getMaskBase();
@@ -436,30 +419,33 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 			overwrite_group		= flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
 		}
 		
-		char perm_string[11];		/* Flawfinder: ignore */
+		std::string perm_string;
 
-		snprintf(perm_string, sizeof(perm_string), "B: ");			/* Flawfinder: ignore */
-		mask_to_string(base_mask, perm_string+3);
+		perm_string = "B: ";
+		perm_string += mask_to_string(base_mask);
 		childSetText("BaseMaskDebug",perm_string);
 		childSetVisible("BaseMaskDebug",TRUE);
 		
-		snprintf(perm_string, sizeof(perm_string), "O: ");			/* Flawfinder: ignore */
-		mask_to_string(owner_mask, perm_string+3);
+		perm_string = "O: ";
+		perm_string += mask_to_string(owner_mask);
 		childSetText("OwnerMaskDebug",perm_string);
 		childSetVisible("OwnerMaskDebug",TRUE);
 		
-		snprintf(perm_string, sizeof(perm_string), "G%s: ", overwrite_group ? "*" : "");			/* Flawfinder: ignore */
-		mask_to_string(group_mask, perm_string + (overwrite_group ? 4 : 3));
+		perm_string = "G";
+		perm_string += overwrite_group ? "*: " : ": ";
+		perm_string += perm_string += mask_to_string(group_mask);
 		childSetText("GroupMaskDebug",perm_string);
 		childSetVisible("GroupMaskDebug",TRUE);
 		
-		snprintf(perm_string, sizeof(perm_string), "E%s: ", overwrite_everyone ? "*" : "");			/* Flawfinder: ignore */
-		mask_to_string(everyone_mask, perm_string + (overwrite_everyone ? 4 : 3));
+		perm_string = "E";
+		perm_string += overwrite_everyone ? "*: " : ": ";
+		perm_string += mask_to_string(everyone_mask);
 		childSetText("EveryoneMaskDebug",perm_string);
 		childSetVisible("EveryoneMaskDebug",TRUE);
 		
-		snprintf(perm_string, sizeof(perm_string), "N%s: ", slam_perm ? "*" : "");			/* Flawfinder: ignore */
-		mask_to_string(next_owner_mask, perm_string + (slam_perm ? 4 : 3));
+		perm_string = "N";
+		perm_string += slam_perm ? "*: " : ": ";
+		perm_string += mask_to_string(next_owner_mask);
 		childSetText("NextMaskDebug",perm_string);
 		childSetVisible("NextMaskDebug",TRUE);
 	}
@@ -571,14 +557,14 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
 	if (is_for_sale)
 	{
 		radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1);
-		char numerical_price[MAX_STRING];		/* Flawfinder: ignore */
-		snprintf(numerical_price, MAX_STRING, "%d", sale_info.getSalePrice());			/* Flawfinder: ignore */
+		std::string numerical_price;
+		numerical_price = sale_info.getSalePrice();
 		childSetText("EditPrice",numerical_price);
 	}
 	else
 	{
 		radioSaleType->setSelectedIndex(-1);
-		childSetText("EditPrice","");
+		childSetText("EditPrice",LLString::null);
 	}
 }
 
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 0d62b93ed571e177b5420cba3d40460fafc7e134..a7cd2114e015426e678a4373f9826a938237fa10 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -177,8 +177,8 @@ LLFloaterReporter::LLFloaterReporter(
 	setVisible(TRUE);
 
 	// Default text to be blank
-	childSetText("object_name", "");
-	childSetText("owner_name", "");
+	childSetText("object_name", LLString::null);
+	childSetText("owner_name", LLString::null);
 
 	childSetFocus("summary_edit");
 
@@ -461,8 +461,8 @@ void LLFloaterReporter::onClickObjPicker(void *userdata)
 	gToolObjPicker->setExitCallback(LLFloaterReporter::closePickTool, self);
 	gToolMgr->setTransientTool(gToolObjPicker);
 	self->mPicking = TRUE;
-	self->childSetText("object_name", "");
-	self->childSetText("owner_name", "");
+	self->childSetText("object_name", LLString::null);
+	self->childSetText("owner_name", LLString::null);
 	LLButton* pick_btn = LLUICtrlFactory::getButtonByName(self, "pick_btn");
 	if (pick_btn) pick_btn->setToggleState(TRUE);
 }
@@ -581,7 +581,7 @@ LLFloaterReporter* LLFloaterReporter::createNewBugReporter()
 	
 
 
-void LLFloaterReporter::setPickedObjectProperties(const char *object_name, const char *owner_name, const LLUUID owner_id)
+void LLFloaterReporter::setPickedObjectProperties(const LLString& object_name, const LLString& owner_name, const LLUUID owner_id)
 {
 	childSetText("object_name", object_name);
 	childSetText("owner_name", owner_name);
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index a824135efe9f21333eb5168c3aabdacb61412104..771a6a385d7847472dea3cf1a9cd6e7d4d1507c6 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -109,7 +109,7 @@ public:
 	// static
 	static void processRegionInfo(LLMessageSystem* msg);
 	
-	void setPickedObjectProperties(const char *object_name, const char *owner_name, const LLUUID owner_id);
+	void setPickedObjectProperties(const LLString& object_name, const LLString& owner_name, const LLUUID owner_id);
 
 private:
 	void takeScreenshot();
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 96d53ffd1fbeb6c3631c9b55f3993d531042b9a0..d0a21d2da662d7baf82c3e7ce2408c19fc3cb6f6 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -1348,16 +1348,15 @@ void LLFloaterSnapshot::draw()
 				childSetEnabled("send_btn", previewp->getSnapshotUpToDate());
 			}
 			
-			//XUI:translate
 			if (previewp->getSnapshotUpToDate())
 			{
 				LLString bytes_string;
 				gResMgr->getIntegerString(bytes_string, previewp->getDataSize());
-				childSetTextArg("file_size_label", "[SIZE]", llformat("%s bytes", bytes_string.c_str()));
+				childSetTextArg("file_size_label", "[SIZE]", bytes_string);
 			}
 			else
 			{
-				childSetTextArg("file_size_label", "[SIZE]", "unknown");
+				childSetTextArg("file_size_label", "[SIZE]", childGetText("unknwon"));
 				childSetColor("file_size_label", gColors.getColor( "LabelTextColor" ));
 			}
 			childSetEnabled("upload_btn", previewp->getSnapshotUpToDate());
@@ -1366,7 +1365,7 @@ void LLFloaterSnapshot::draw()
 		}
 		else
 		{
-			childSetTextArg("file_size_label", "[SIZE]", "unknown");
+			childSetTextArg("file_size_label", "[SIZE]", LLString("???"));
 			childSetEnabled("upload_btn", FALSE);
 			childSetEnabled("send_btn", FALSE);
 			childSetEnabled("save_btn", FALSE);
diff --git a/indra/newview/llfloatertelehub.cpp b/indra/newview/llfloatertelehub.cpp
index b0158aaaff1941a5556102848ef6cc2a7a0bdf4a..95a47bb2acc9dae89f07e6029c9b1bd4bb97580a 100644
--- a/indra/newview/llfloatertelehub.cpp
+++ b/indra/newview/llfloatertelehub.cpp
@@ -129,11 +129,8 @@ void LLFloaterTelehub::draw()
 // Per-frame updates, because we don't have a selection manager observer.
 void LLFloaterTelehub::refresh()
 {
-	LLViewerObject* object = mObjectSelection->getFirstRootObject();
-	if(!object)
-	{
-		object = mObjectSelection->getFirstObject();
-	}
+	const BOOL children_ok = TRUE;
+	LLViewerObject* object = mObjectSelection->getFirstRootObject(children_ok);
 	
 	BOOL have_selection = (object != NULL);
 	BOOL all_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME );
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 2c0cb4164da7848c17d7cf8d7c75fafb03d047c7..4f8ed08a690992a1cebc251837461250e4f42e42 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -317,6 +317,16 @@ BOOL	LLFloaterTools::postBuild()
 		mTab->setBorderVisible(FALSE);
 		mTab->selectFirstTab();
 	}
+
+	mStatusText["rotate"] = childGetText("status_rotate");
+	mStatusText["scale"] = childGetText("status_scale");
+	mStatusText["move"] = childGetText("status_move");
+	mStatusText["modifyland"] = childGetText("status_modifyland");
+	mStatusText["camera"] = childGetText("status_camera");
+	mStatusText["grab"] = childGetText("status_grab");
+	mStatusText["place"] = childGetText("status_place");
+	mStatusText["selectland"] = childGetText("status_selectland");
+	
 	return TRUE;
 }
 
@@ -418,9 +428,17 @@ LLFloaterTools::~LLFloaterTools()
 	// children automatically deleted
 }
 
-void LLFloaterTools::setStatusText(const LLString& text)
+void LLFloaterTools::setStatusText(const std::string& text)
 {
-	mTextStatus->setText(text);
+	std::map<std::string, std::string>::iterator iter = mStatusText.find(text);
+	if (iter != mStatusText.end())
+	{
+		mTextStatus->setText(iter->second);
+	}
+	else
+	{
+		mTextStatus->setText(text);
+	}
 }
 
 void LLFloaterTools::refresh()
@@ -587,27 +605,27 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
 
 	if (mComboGridMode) 
 	{
-		mComboGridMode		->setVisible( edit_visible );
+		mComboGridMode->setVisible( edit_visible );
 		S32 index = mComboGridMode->getCurrentIndex();
 		mComboGridMode->removeall();
 
 		switch (mObjectSelection->getSelectType())
 		{
 		case SELECT_TYPE_HUD:
-			mComboGridMode->add("Screen");
-			mComboGridMode->add("Local");
-			//mComboGridMode->add("Reference");
-			break;
+		  mComboGridMode->add(childGetText("grid_screen_text"));
+		  mComboGridMode->add(childGetText("grid_local_text"));
+		  //mComboGridMode->add(childGetText("grid_reference_text"));
+		  break;
 		case SELECT_TYPE_WORLD:
-			mComboGridMode->add("World");
-			mComboGridMode->add("Local");
-			mComboGridMode->add("Reference");
-			break;
+		  mComboGridMode->add(childGetText("grid_world_text"));
+		  mComboGridMode->add(childGetText("grid_local_text"));
+		  mComboGridMode->add(childGetText("grid_reference_text"));
+		  break;
 		case SELECT_TYPE_ATTACHMENT:
-			mComboGridMode->add("Attachment");
-			mComboGridMode->add("Local");
-			mComboGridMode->add("Reference");
-			break;
+		  mComboGridMode->add(childGetText("grid_attachment_text"));
+		  mComboGridMode->add(childGetText("grid_local_text"));
+		  mComboGridMode->add(childGetText("grid_reference_text"));
+		  break;
 		}
 
 		mComboGridMode->setCurrentByIndex(index);
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index e710947992d7351532411766e05cf4c4fdc270e6..f56cdbecb5e27f160445a25d1f14cc4fa889ec32 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -97,7 +97,7 @@ public:
 	void showMore(BOOL show_more);
 	void showPanel(EInfoPanel panel);
 
-	void setStatusText(const LLString& text);
+	void setStatusText(const std::string& text);
 	virtual void onFocusReceived();
 	static void setEditTool(void* data);
 	void saveLastTool();
@@ -191,6 +191,8 @@ private:
 	BOOL					mDirty;
 	S32						mSmallHeight;
 	S32						mLargeHeight;
+
+	std::map<std::string, std::string> mStatusText;
 };
 
 extern LLFloaterTools *gFloaterTools;
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index ac63fddff1bb6b2eec3467e40edf36bd844a019c..23d01a963bf6ba79bef93c9dd5eae5e86e022611 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -262,7 +262,7 @@ BOOL LLFloaterWorldMap::postBuild()
 	mCurZoomVal = log(gMapScale)/log(2.f);
 	childSetValue("zoom slider", gMapScale);
 
-	setDefaultBtn("");
+	setDefaultBtn(NULL);
 
 	if ( gAgent.mAccess <= SIM_ACCESS_PG )
 	{
@@ -1226,7 +1226,7 @@ void LLFloaterWorldMap::updateSearchEnabled( LLUICtrl* ctrl, void* userdata )
 	}
 	else
 	{
-		self->setDefaultBtn("");
+		self->setDefaultBtn(NULL);
 	}
 }
 
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index cc8e80bee6edce2c2133ecf99157cc91cd9738ed..38f224932966725792246a0ea34378d1a62a00f5 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -3193,18 +3193,18 @@ void LLFolderView::draw()
 
 	if (hasVisibleChildren() || getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS)
 	{
-		setStatusText("");
+		mStatusText.clear();
 	}
 	else
 	{
 		if (gInventory.backgroundFetchActive() || mCompletedFilterGeneration < mFilter.getMinRequiredGeneration())
 		{
-			setStatusText("Searching...");
+			mStatusText = "Searching..."; // *TODO:translate
 			sFont->renderUTF8(mStatusText, 0, 2, 1, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, S32_MAX, S32_MAX, NULL, FALSE );
 		}
 		else
 		{
-			setStatusText("No matching items found in inventory.");
+			mStatusText = "No matching items found in inventory."; // *TODO:translate
 			sFont->renderUTF8(mStatusText, 0, 2, 1, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, S32_MAX, S32_MAX, NULL, FALSE );
 		}
 	}
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 602b19328f361fb9182e38033f82350d4ebb5159..dd0dd21705ba4175af5a02e1b9aed45aa996a98d 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -484,8 +484,6 @@ public:
 	BOOL			isDescendantOf( const LLFolderViewFolder* potential_ancestor );
 	S32				getIndentation() { return mIndentation; }
 
-	virtual void setStatusText(const LLString& text) { mStatusText = text; }
-
 	virtual BOOL	potentiallyVisible(); // do we know for a fact that this item has been filtered out?
 
 	virtual BOOL	getFiltered();
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index ca387ac3c83a448b69357a9147059a6489bbb4c3..da3f7aad46fb472df8b0353d76a44f6aa4164db1 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -251,35 +251,35 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
 
 	if (shrink_selection)
 	{
-		LLObjectSelectionHandle highlighted_objects = gSelectMgr->getHighlightedObjects();
-
-		for (LLViewerObject* vobjp = highlighted_objects->getFirstObject();
-			vobjp;
-			vobjp = highlighted_objects->getNextObject())
+		struct f : public LLSelectedObjectFunctor
+		{
+			virtual bool apply(LLViewerObject* vobjp)
 			{
 				LLDrawable* drawable = vobjp->mDrawable;
 				if (!drawable || vobjp->getPCode() != LL_PCODE_VOLUME || vobjp->isAttachment())
 				{
-					continue;
+					return true;
 				}
-
 				S32 result = gCamera->sphereInFrustum(drawable->getPositionAgent(), drawable->getRadius());
 				switch (result)
 				{
-				case 0:
+				  case 0:
 					gSelectMgr->unhighlightObjectOnly(vobjp);
 					break;
-				case 1:
+				  case 1:
 					// check vertices
 					if (!gCamera->areVertsVisible(vobjp, LLSelectMgr::sRectSelectInclusive))
 					{
 						gSelectMgr->unhighlightObjectOnly(vobjp);
 					}
 					break;
-				default:
+				  default:
 					break;
 				}
+				return true;
 			}
+		} func;
+		gSelectMgr->getHighlightedObjects()->applyToObjects(&func);
 	}
 
 	if (grow_selection)
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 016c4920cc880a4244749ee69fa5c2db4a83c6aa..7d7a5b9a3a01fc07fa9baabc32b644be0dce25b2 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -1277,7 +1277,7 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)
 	}
 	else
 	{
-		// XUI:translate
+		// *TODO:translate
 		LLString::format_map_t args;
 		args["[MESSAGE]"] = message;
 		gViewerWindow->alertXml("UnableToCreateGroup", args);
@@ -1853,3 +1853,4 @@ void LLGroupMgr::debugClearAllGroups(void*)
 	LLGroupMgr::parseRoleActions("role_actions.xml");
 }
 
+
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index a18bf793d8f8fa74d209f2e004ba4f2ad511bde2..3a947bcbff14d93349ac206cc5e9380f53af04bb 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -1637,7 +1637,7 @@ void LLFloaterIMPanel::sendMsg()
 
 		gViewerStats->incStat(LLViewerStats::ST_IM_COUNT);
 	}
-	mInputEditor->setText("");
+	mInputEditor->setText(LLString::null);
 
 	// Don't need to actually send the typing stop message, the other
 	// client will infer it from receiving the message.
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 47ab36959d6be09152be006fa0b5e8f7b84dd638..dee1ed2bfdb8eee42f9918c41eaa7faebcdb1451 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -167,7 +167,8 @@ BOOL LLFloaterIM::postBuild()
 	sErrorStringsMap["no_user_911"] =
 		getFormattedUIString("user_no_help");
 
-	sEventStringsMap["add"] = childGetText("add_session_event");
+	sEventStringsMap["add"] =
+		getFormattedUIString("add_session_event");
 	sEventStringsMap["message"] =
 		getFormattedUIString("message_session_event");
 
@@ -388,7 +389,7 @@ void LLIMMgr::addMessage(
 		// when answering questions.
 		if(gAgent.isGodlike())
 		{
-			// XUI:translate
+			// *TODO:translate (low priority, god ability)
 			std::ostringstream bonus_info;
 			bonus_info << "*** parent estate: "
 				<< parent_estate_id
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 204ec57f46f2bc8a834f7ae63cefba937a4f31b3..4e9c399f3ea963b96f93b4a634dea104c4389041 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -112,13 +112,6 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, void* userdata);
 void move_task_inventory_callback(S32 option, void* user_data);
 void confirm_replace_attachment_rez(S32 option, void* user_data);
 
-// TomY XUI: translate
-const char* FIND_HINT = "Start typing to select an item by name";
-const char* NAME_SEARCH_DESC = "Find items whose name contains (leave blank for all):";
-const char* NEW_LSL_NAME = "New Script";
-const char* NEW_NOTECARD_NAME = "New Note";
-const char* NEW_GESTURE_NAME = "New Gesture";
-
 const char* ICON_NAME[ICON_NAME_COUNT] =
 {
 	"inv_item_texture.tga",
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index 14f86d12e33015787b68fcabc51e4d6a8f814bb9..953befcd30cb5f936f992df253d203f0dd03764b 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -94,9 +94,10 @@ void LLManip::rebuild(LLViewerObject* vobj)
 LLManip::LLManip( const LLString& name, LLToolComposite* composite )
 	:
 	LLTool( name, composite ),
-	mInSnapRegime(FALSE)
-{}
-
+	mInSnapRegime(FALSE),
+	mHighlightedPart(LL_NO_PART)
+{
+}
 
 void LLManip::getManipNormal(LLViewerObject* object, EManipPart manip, LLVector3 &normal)
 {
@@ -360,14 +361,11 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
 	LLVector3 grid_scale;
 	gSelectMgr->getGrid(grid_origin, grid_rot, grid_scale);
 
-	LLViewerObject* object = mObjectSelection->getFirstRootObject();
+	const BOOL children_ok = TRUE;
+	LLViewerObject* object = mObjectSelection->getFirstRootObject(children_ok);
 	if (!object)
 	{
-		object = mObjectSelection->getFirstObject();
-		if (!object)
-		{
-			return;
-		}
+		return;
 	}
 
 	//LLVector3  center_agent  = gSelectMgr->getBBoxOfSelection().getCenterAgent();
diff --git a/indra/newview/llmanip.h b/indra/newview/llmanip.h
index aaae5e8f253822037a93854d7f87e9024ce56882..8c51746d1c0da700326b8ca69951236950682994 100644
--- a/indra/newview/llmanip.h
+++ b/indra/newview/llmanip.h
@@ -128,11 +128,13 @@ public:
 
     /*virtual*/ BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
     /*virtual*/ BOOL	handleHover(S32 x, S32 y, MASK mask);
-	virtual EManipPart	getHighlightedPart() { return LL_NO_PART; }
-	virtual void		highlightManipulators(S32 x, S32 y) {};
+	virtual void		highlightManipulators(S32 x, S32 y) = 0;
 	virtual void		handleSelect();
 	virtual void		handleDeselect();
+	virtual BOOL		canAffectSelection() = 0;
 
+	EManipPart			getHighlightedPart() { return mHighlightedPart; }
+	
 	LLHandle<LLObjectSelection> getSelection();
 
 protected:
@@ -152,6 +154,7 @@ protected:
 	LLFrameTimer		mHelpTextTimer;
 	BOOL				mInSnapRegime;
 	LLHandle<LLObjectSelection> mObjectSelection;
+	EManipPart			mHighlightedPart;
 
 	static F32			sHelpTextVisibleTime;
 	static F32			sHelpTextFadeTime;
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 093b3a24eec886e8747bda260a4ef5e94758b000..15559bc1dba8b0b0071f1c4a597b4085c46740b7 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -110,7 +110,7 @@ void LLManipRotate::handleSelect()
 {
 	// *FIX: put this in mouseDown?
 	gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
-	gFloaterTools->setStatusText("Drag colored bands to rotate object");
+	gFloaterTools->setStatusText("rotate");
 	LLManip::handleSelect();
 }
 
@@ -118,8 +118,6 @@ void LLManipRotate::handleDeselect()
 {
 	mHighlightedPart = LL_NO_PART;
 	mManipPart = LL_NO_PART;
-
-	gFloaterTools->setStatusText("");
 	LLManip::handleDeselect();
 }
 
@@ -379,14 +377,7 @@ BOOL LLManipRotate::handleMouseDown(S32 x, S32 y, MASK mask)
 // Assumes that one of the parts of the manipulator was hit.
 BOOL LLManipRotate::handleMouseDownOnPart( S32 x, S32 y, MASK mask )
 {
-	BOOL can_rotate = mObjectSelection->getObjectCount() != 0;
-	for (LLViewerObject* objectp = mObjectSelection->getFirstObject();
-		objectp;
-		objectp = mObjectSelection->getNextObject())
-	{
-		can_rotate = can_rotate && objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
-	}
-
+	BOOL can_rotate = canAffectSelection();
 	if (!can_rotate)
 	{
 		return FALSE;
@@ -541,12 +532,11 @@ void LLManipRotate::drag( S32 x, S32 y )
 	BOOL damped = mSmoothRotate;
 	mSmoothRotate = FALSE;
 
-	LLViewerObject* object;
-	LLSelectNode* selectNode;
-
-	for( selectNode = mObjectSelection->getFirstNode(); selectNode != NULL; selectNode = mObjectSelection->getNextNode() )
+	for (LLObjectSelection::iterator iter = mObjectSelection->begin();
+		 iter != mObjectSelection->end(); iter++)
 	{
-		object = selectNode->getObject();
+		LLSelectNode* selectNode = *iter;
+		LLViewerObject* object = selectNode->getObject();
 
 		// have permission to move and object is root of selection or individually selected
 		if (object->permMove() && (object->isRootEdit() || selectNode->mIndividualSelection))
@@ -610,10 +600,12 @@ void LLManipRotate::drag( S32 x, S32 y )
 	}
 
 	// update positions
-	for( selectNode = mObjectSelection->getFirstNode(); selectNode != NULL; selectNode = mObjectSelection->getNextNode() )
+	for (LLObjectSelection::iterator iter = mObjectSelection->begin();
+		 iter != mObjectSelection->end(); iter++)
 	{
-		object = selectNode->getObject();
-		
+		LLSelectNode* selectNode = *iter;
+		LLViewerObject* object = selectNode->getObject();
+
 		// to avoid cumulative position changes we calculate the objects new position using its saved position
 		if (object && object->permMove())
 		{
@@ -711,10 +703,10 @@ void LLManipRotate::drag( S32 x, S32 y )
 	}
 
 	// store changes to override updates
-	for (LLSelectNode* selectNode = gSelectMgr->getSelection()->getFirstNode();
-		 selectNode != NULL;
-		 selectNode = gSelectMgr->getSelection()->getNextNode())
+	for (LLObjectSelection::iterator iter = gSelectMgr->getSelection()->begin();
+		 iter != gSelectMgr->getSelection()->end(); iter++)
 	{
+		LLSelectNode* selectNode = *iter;
 		LLViewerObject*cur = selectNode->getObject();
 		if( cur->permModify() && cur->permMove() && !cur->isAvatar())
 		{
@@ -1869,3 +1861,22 @@ S32 LLManipRotate::getObjectAxisClosestToMouse(LLVector3& object_axis)
 
 	return axis_index;
 }
+
+//virtual
+BOOL LLManipRotate::canAffectSelection()
+{
+	BOOL can_rotate = mObjectSelection->getObjectCount() != 0;
+	if (can_rotate)
+	{
+		struct f : public LLSelectedObjectFunctor
+		{
+			virtual bool apply(LLViewerObject* objectp)
+			{
+				return objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
+			}
+		} func;
+		can_rotate = mObjectSelection->applyToObjects(&func);
+	}
+	return can_rotate;
+}
+
diff --git a/indra/newview/llmaniprotate.h b/indra/newview/llmaniprotate.h
index 62eddb312004859696f07fad2393b3f3a9e3818a..460bd3fcbab580905fbb134a1b97f5b369eed92c 100644
--- a/indra/newview/llmaniprotate.h
+++ b/indra/newview/llmaniprotate.h
@@ -66,9 +66,10 @@ public:
 	virtual void	handleSelect();
 	virtual void	handleDeselect();
 
-	BOOL			handleMouseDownOnPart(S32 x, S32 y, MASK mask);
+	virtual BOOL	handleMouseDownOnPart(S32 x, S32 y, MASK mask);
 	virtual void	highlightManipulators(S32 x, S32 y);
-	EManipPart		getHighlightedPart() { return mHighlightedPart; }
+	virtual BOOL	canAffectSelection();
+	
 private:
 	void			updateHoverView();
 
@@ -111,7 +112,6 @@ private:
 	EManipPart			mManipPart;
 
 	BOOL				mSendUpdateOnMouseUp;
-	EManipPart			mHighlightedPart;
 
 	BOOL				mSmoothRotate;
 	BOOL				mCamEdgeOn;
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 9ff802770b1313727c52a27d90c3c357f21ad484..7df5311aa4e745581c1a607e56b01959464f45ad 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -162,7 +162,7 @@ void LLManipScale::handleSelect()
 	LLBBox bbox = gSelectMgr->getBBoxOfSelection();
 	updateSnapGuides(bbox);
 	gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
-	gFloaterTools->setStatusText("Click and drag to stretch selected side");
+	gFloaterTools->setStatusText("scale");
 	LLManip::handleSelect();
 }
 
@@ -170,7 +170,6 @@ void LLManipScale::handleDeselect()
 {
 	mHighlightedPart = LL_NO_PART;
 	mManipPart = LL_NO_PART;
-	gFloaterTools->setStatusText("");
 	LLManip::handleDeselect();
 }
 
@@ -185,7 +184,6 @@ LLManipScale::LLManipScale( LLToolComposite* composite )
 	mBoxHandleSize( 1.f ),
 	mScaledBoxHandleSize( 1.f ),
 	mManipPart( LL_NO_PART ),
-	mHighlightedPart( LL_NO_PART ),
 	mLastMouseX( -1 ),
 	mLastMouseY( -1 ),
 	mSendUpdateOnMouseUp( FALSE ),
@@ -217,7 +215,7 @@ void LLManipScale::render()
 	LLGLEnable gl_blend(GL_BLEND);
 	LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
 	
-	if( isSelectionScalable() )
+	if( canAffectSelection() )
 	{
 		glMatrixMode(GL_MODELVIEW);
 		glPushMatrix();
@@ -336,14 +334,7 @@ BOOL LLManipScale::handleMouseDown(S32 x, S32 y, MASK mask)
 // Assumes that one of the arrows on an object was hit.
 BOOL LLManipScale::handleMouseDownOnPart( S32 x, S32 y, MASK mask )
 {
-	BOOL can_scale = mObjectSelection->getObjectCount() != 0;
-	for (LLViewerObject* objectp = mObjectSelection->getFirstObject();
-		objectp;
-		objectp = mObjectSelection->getNextObject())
-	{
-		can_scale = can_scale && objectp->permModify() && objectp->permMove() && !objectp->isSeat();
-	}
-
+	BOOL can_scale = canAffectSelection();
 	if (!can_scale)
 	{
 		return FALSE;
@@ -447,7 +438,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
 	// Don't do this with nothing selected, as it kills the framerate.
 	LLBBox bbox = gSelectMgr->getBBoxOfSelection();
 
-	if( isSelectionScalable() )
+	if( canAffectSelection() )
 	{
 		LLMatrix4 transform;
 		if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
@@ -827,10 +818,10 @@ void LLManipScale::drag( S32 x, S32 y )
 	}
 	
 	// store changes to override updates
-	for (LLSelectNode* selectNode = gSelectMgr->getSelection()->getFirstNode();
-		 selectNode != NULL;
-		 selectNode = gSelectMgr->getSelection()->getNextNode())
+	for (LLObjectSelection::iterator iter = gSelectMgr->getSelection()->begin();
+		 iter != gSelectMgr->getSelection()->end(); iter++)
 	{
+		LLSelectNode* selectNode = *iter;
 		LLViewerObject*cur = selectNode->getObject();
 		if( cur->permModify() && cur->permMove() && !cur->isAvatar())
 		{
@@ -974,9 +965,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )
 	F32 min_scale_factor = MIN_OBJECT_SCALE / MAX_OBJECT_SCALE;
 
 	// find max and min scale factors that will make biggest object hit max absolute scale and smallest object hit min absolute scale
-	LLSelectNode* selectNode;
-	for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() )
+	for (LLObjectSelection::iterator iter = mObjectSelection->begin();
+		 iter != mObjectSelection->end(); iter++)
 	{
+		LLSelectNode* selectNode = *iter;
 		LLViewerObject* cur = selectNode->getObject();
 		if(  cur->permModify() && cur->permMove() && !cur->isAvatar() )
 		{
@@ -995,8 +987,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )
 	LLVector3d drag_global = uniform ? mDragStartCenterGlobal : mDragFarHitGlobal;
 
 	// do the root objects i.e. (TRUE == cur->isRootEdit())
-	for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() )
+	for (LLObjectSelection::iterator iter = mObjectSelection->begin();
+		 iter != mObjectSelection->end(); iter++)
 	{
+		LLSelectNode* selectNode = *iter;
 		LLViewerObject* cur = selectNode->getObject();
 		if( cur->permModify() && cur->permMove() && !cur->isAvatar() && cur->isRootEdit() )
 		{
@@ -1039,8 +1033,10 @@ void LLManipScale::dragCorner( S32 x, S32 y )
 		}
 	}
 	// do the child objects i.e. (FALSE == cur->isRootEdit())
-	for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() )
+	for (LLObjectSelection::iterator iter = mObjectSelection->begin();
+		 iter != mObjectSelection->end(); iter++)
 	{
+		LLSelectNode* selectNode = *iter;
 		LLViewerObject*cur = selectNode->getObject();
 		if( cur->permModify() && cur->permMove() && !cur->isAvatar() && !cur->isRootEdit() )
 		{
@@ -1245,9 +1241,10 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto
 {
 	LLVector3 drag_start_center_agent = gAgent.getPosAgentFromGlobal(mDragStartCenterGlobal);
 
-	LLSelectNode *selectNode;
-	for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() )
+	for (LLObjectSelection::iterator iter = mObjectSelection->begin();
+		 iter != mObjectSelection->end(); iter++)
 	{
+		LLSelectNode* selectNode = *iter;
 		LLViewerObject*cur = selectNode->getObject();
 		if( cur->permModify() && cur->permMove() && !cur->isAvatar() )
 		{
@@ -2040,23 +2037,22 @@ LLVector3 LLManipScale::nearestAxis( const LLVector3& v ) const
 	return LLVector3( coords[greatest_index] );
 }
 
-//FIXME: make this const once we switch to iterator interface 
-//(making object traversal a const-able operation)
-BOOL LLManipScale::isSelectionScalable()
+// virtual
+BOOL LLManipScale::canAffectSelection()
 {
 	// An selection is scalable if you are allowed to both edit and move 
 	// everything in it, and it does not have any sitting agents
-	BOOL scalable = mObjectSelection->getFirstObject() ? TRUE : FALSE;
-	for(LLViewerObject* cur = mObjectSelection->getFirstObject(); 
-		cur; 
-		cur = mObjectSelection->getNextObject() )
+	BOOL can_scale = mObjectSelection->getObjectCount() != 0;
+	if (can_scale)
 	{
-		if( !(cur->permModify() && cur->permMove())
-			|| cur->isSeat())
+		struct f : public LLSelectedObjectFunctor
 		{
-			scalable = FALSE;
-			break;
-		}
-	}	
-	return scalable;
+			virtual bool apply(LLViewerObject* objectp)
+			{
+				return objectp->permModify() && objectp->permMove() && !objectp->isSeat();
+			}
+		} func;
+		can_scale = mObjectSelection->applyToObjects(&func);
+	}
+	return can_scale;
 }
diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h
index 13686fa38d42c029f72579467a27696ec4ceb3e2..3ea5ee7d7aba5925c1e15e7f6d3f0ebfb991d04b 100644
--- a/indra/newview/llmanipscale.h
+++ b/indra/newview/llmanipscale.h
@@ -78,9 +78,9 @@ public:
 	virtual void	handleSelect();
 	virtual void	handleDeselect();
 
-	BOOL			handleMouseDownOnPart(S32 x, S32 y, MASK mask);
-	EManipPart		getHighlightedPart() { return mHighlightedPart; }
+	virtual BOOL	handleMouseDownOnPart(S32 x, S32 y, MASK mask);
 	virtual void	highlightManipulators(S32 x, S32 y);	// decided which manipulator, if any, should be highlighted by mouse hover
+	virtual BOOL	canAffectSelection();
 
 	static void		setUniform( BOOL b );
 	static BOOL		getUniform();
@@ -117,8 +117,6 @@ private:
 	F32				partToMinScale( S32 part, const LLBBox& bbox ) const;
 	LLVector3		nearestAxis( const LLVector3& v ) const;
 
-	BOOL			isSelectionScalable();
-
 	void			stretchFace( const LLVector3& drag_start_agent, const LLVector3& drag_delta_agent);
 
 	void			adjustTextureRepeats();		// Adjusts texture coords based on mSavedScale and current scale, only works for boxes
@@ -133,7 +131,6 @@ private:
 	LLVector3d		mDragStartCenterGlobal;	// The center of the bounding box of all selected objects at time of drag start
 	LLVector3d		mDragPointGlobal;
 	LLVector3d 		mDragFarHitGlobal;
-	EManipPart		mHighlightedPart;
 	S32				mLastMouseX;
 	S32				mLastMouseY;
 	BOOL			mSendUpdateOnMouseUp;
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index c43ef73090c72d57b6e1b1dfa2625cb468487341..1f52f30c883f113ecb12693b707f51f57c391472 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -261,7 +261,7 @@ LLManipTranslate::~LLManipTranslate()
 void LLManipTranslate::handleSelect()
 {
 	gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
-	gFloaterTools->setStatusText("Drag to move, shift-drag to copy");
+	gFloaterTools->setStatusText("move");
 	LLManip::handleSelect();
 }
 
@@ -269,7 +269,6 @@ void LLManipTranslate::handleDeselect()
 {
 	mHighlightedPart = LL_NO_PART;
 	mManipPart = LL_NO_PART;
-	gFloaterTools->setStatusText("");
 	LLManip::handleDeselect();
 }
 
@@ -296,14 +295,7 @@ BOOL LLManipTranslate::handleMouseDown(S32 x, S32 y, MASK mask)
 // Assumes that one of the arrows on an object was hit.
 BOOL LLManipTranslate::handleMouseDownOnPart( S32 x, S32 y, MASK mask )
 {
-	BOOL can_move = mObjectSelection->getObjectCount() != 0;
-	for (LLViewerObject* objectp = mObjectSelection->getFirstObject();
-		objectp;
-		objectp = mObjectSelection->getNextObject())
-	{
-		can_move = can_move && objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
-	}
-
+	BOOL can_move = canAffectSelection();
 	if (!can_move)
 	{
 		return FALSE;
@@ -431,8 +423,6 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
 		}
 	}
 
-	LLViewerObject	*object;
-
 	// Suppress processing if mouse hasn't actually moved.
 	// This may cause problems if the camera moves outside of the
 	// rotation above.
@@ -491,7 +481,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
 		return TRUE;
 	}
 
-	object = selectNode->getObject();
+	LLViewerObject* object = selectNode->getObject();
 	if (!object)
 	{
 		// somehow we lost the object!
@@ -654,11 +644,11 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
 	LLVector3d clamped_relative_move = axis_magnitude * axis_d;	// scalar multiply
 	LLVector3 clamped_relative_move_f = (F32)axis_magnitude * axis_f; // scalar multiply
 	
-	for(selectNode = mObjectSelection->getFirstNode(); 
-		selectNode; 
-		selectNode = mObjectSelection->getNextNode() )
+	for (LLObjectSelection::iterator iter = mObjectSelection->begin();
+		 iter != mObjectSelection->end(); iter++)
 	{
-		object = selectNode->getObject();
+		LLSelectNode* selectNode = *iter;
+		LLViewerObject* object = selectNode->getObject();
 		
 		// Only apply motion to root objects and objects selected
 		// as "individual".
@@ -1739,12 +1729,8 @@ void LLManipTranslate::renderText()
 	}
 	else
 	{
-		LLViewerObject* objectp = mObjectSelection->getFirstRootObject();
-		if(!objectp)
-		{
-			objectp = mObjectSelection->getFirstObject();
-		}
-
+		const BOOL children_ok = TRUE;
+		LLViewerObject* objectp = mObjectSelection->getFirstRootObject(children_ok);
 		if (objectp)
 		{
 			renderXYZ(objectp->getPositionEdit());
@@ -2264,3 +2250,21 @@ void LLManipTranslate::renderGridVert(F32 x_trans, F32 y_trans, F32 r, F32 g, F3
 	}
 
 }
+
+// virtual
+BOOL LLManipTranslate::canAffectSelection()
+{
+	BOOL can_move = mObjectSelection->getObjectCount() != 0;
+	if (can_move)
+	{
+		struct f : public LLSelectedObjectFunctor
+		{
+			virtual bool apply(LLViewerObject* objectp)
+			{
+				return objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
+			}
+		} func;
+		can_move = mObjectSelection->applyToObjects(&func);
+	}
+	return can_move;
+}
diff --git a/indra/newview/llmaniptranslate.h b/indra/newview/llmaniptranslate.h
index b1f211d355da46c034519d6be7875183bfde107e..8821b64c90e75652c20295979bf92068ec92378c 100644
--- a/indra/newview/llmaniptranslate.h
+++ b/indra/newview/llmaniptranslate.h
@@ -64,9 +64,9 @@ public:
 	virtual void	handleSelect();
 	virtual void	handleDeselect();
 
-	EManipPart		getHighlightedPart() { return mHighlightedPart; }
 	virtual void	highlightManipulators(S32 x, S32 y);
-	/*virtual*/ BOOL	handleMouseDownOnPart(S32 x, S32 y, MASK mask);
+	virtual BOOL	handleMouseDownOnPart(S32 x, S32 y, MASK mask);
+	virtual BOOL	canAffectSelection();
 
 protected:
 	enum EHandleType {
@@ -107,7 +107,6 @@ private:
 	LLTimer		mUpdateTimer;
 	LLLinkedList<ManipulatorHandle>		mProjectedManipulators;
 	LLVector4	mManipulatorVertices[18];
-	EManipPart	mHighlightedPart;
 	F32			mSnapOffsetMeters;
 	LLVector3	mSnapOffsetAxis;
 	LLQuaternion mGridRotation;
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index ed675ec1b41a85d1dcc92b80bf9dcd7a7c19902b..23e0620ade2f93b53950b07e1eceba047541998d 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -60,7 +60,7 @@ public:
 		flagAll				= 0x0000000F		// Mask of all currently defined flags
 	};
 	
-	LLMute(const LLUUID& id, const LLString& name = "", EType type = BY_NAME, U32 flags = 0) 
+	LLMute(const LLUUID& id, const LLString& name = LLString(), EType type = BY_NAME, U32 flags = 0) 
 	: mID(id), mName(name), mType(type),mFlags(flags) { }
 
 	// Returns name + suffix based on type
diff --git a/indra/newview/llnamebox.cpp b/indra/newview/llnamebox.cpp
index f5a9045f2bbd07ae1ba93974bd54831f15fc6595..b5021eff9c7434a4ed04ef7d8756b624949128ad 100644
--- a/indra/newview/llnamebox.cpp
+++ b/indra/newview/llnamebox.cpp
@@ -57,7 +57,7 @@ LLNameBox::LLNameBox(const std::string& name, const LLRect& rect, const LLUUID&
 	}
 	else
 	{
-		setText("");
+		setText(LLString::null);
 	}
 }
 
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 8f66035f2e9f3fecaaff07f5d0d9ae90540f3944..adcc141bb1e1a722463755f548d52ed3bbfb19f7 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -157,7 +157,7 @@ void LLNameListCtrl::addGroupNameItem(LLScrollListItem* item, EAddPosition pos)
 	gCacheName->getGroupName(item->getUUID(), group_name);
 
 	LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex);
-	((LLScrollListText*)cell)->setText( group_name );
+	((LLScrollListText*)cell)->setText( LLString(group_name) );
 
 	addItem(item, pos);
 }
@@ -461,3 +461,4 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
 }
 
 
+
diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp
index c941ce3bb5302d778ad6a3878dfba2207f119571..d8131c27d751f6f9ef26234bb1d2a0c18e3c16fa 100644
--- a/indra/newview/lloverlaybar.cpp
+++ b/indra/newview/lloverlaybar.cpp
@@ -360,8 +360,7 @@ void LLOverlayBar::refresh()
 	{
 		LLParcel* parcel = gParcelMgr->getAgentParcel();
 		if (!parcel 
-			|| !parcel->getMusicURL()
-			|| !parcel->getMusicURL()[0]
+			|| parcel->getMusicURL().empty()
 			|| !gSavedSettings.getBOOL("AudioStreamingMusic"))
 		{
 			mMusicRemote->setVisible(FALSE);
@@ -509,7 +508,7 @@ void LLOverlayBar::musicPlay(void*)
 			// stream is stopped, it doesn't return the right thing - commenting out for now.
 // 			if ( gAudiop->isInternetStreamPlaying() == 0 )
 			{
-				gAudiop->startInternetStream(parcel->getMusicURL());
+				gAudiop->startInternetStream(parcel->getMusicURL().c_str());
 			}
 		}
 	}
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 4fbdeb46f64cf75bf7cbbc56a65018a7516b51e8..dc2f14fcef61f412de4d160eccfe7054476cd608 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -87,36 +87,6 @@
 std::list<LLPanelAvatar*> LLPanelAvatar::sAllPanels;
 BOOL LLPanelAvatar::sAllowFirstLife = FALSE;
 
-//-----------------------------------------------------------------------------
-// Constants
-//-----------------------------------------------------------------------------
-
-// RN: move these to lldbstrings.h
-static const S32 DB_USER_FAVORITES_STR_LEN = 254;
-
-const char LOADING_MSG[] = "Loading...";
-static const char IM_DISABLED_TOOLTIP[] = "Instant Message (IM).\nDisabled because you do not have their card.";
-static const char IM_ENABLED_TOOLTIP[] = "Instant Message (IM)";
-static const S32 LEFT = HPAD;
-
-static const S32 RULER0 = 65;
-static const S32 RULER1 = RULER0 + 5;
-static const S32 RULER2 = RULER1 + 90;
-static const S32 RULER3 = RULER2 + 90;
-static const S32 RULER4 = RULER3 + 10;
-
-static const S32 PICT_WIDTH  = 180;
-static const S32 PICT_HEIGHT = 135;
-
-static const S32 RULER5  = RULER4 + 140;
-static const S32 WIDTH = RULER5 + 16;
-
-static const S32 MAX_CHARS = 254;
-
-static const LLColor4 WHITE(1,1,1,1);
-static const LLColor4 BLACK(0,0,0,1);
-static const LLColor4 CLEAR(0,0,0,0);
-
 extern void handle_lure(const LLUUID& invitee);
 extern void handle_pay_by_id(const LLUUID& payee);
 
@@ -317,8 +287,8 @@ void LLPanelAvatarSecondLife::updatePartnerName()
 		BOOL found = gCacheName->getName(mPartnerID, first, last);
 		if (found)
 		{
-			childSetTextArg("partner_edit", "[FIRST]", first);
-			childSetTextArg("partner_edit", "[LAST]", last);
+			childSetTextArg("partner_edit", "[FIRST]", LLString(first));
+			childSetTextArg("partner_edit", "[LAST]", LLString(last));
 		}
 	}
 }
@@ -339,8 +309,8 @@ void LLPanelAvatarSecondLife::clearControls()
 	childSetValue("born", "");
 	childSetValue("acct", "");
 
-	childSetTextArg("partner_edit", "[FIRST]", "");
-	childSetTextArg("partner_edit", "[LAST]", "");
+	childSetTextArg("partner_edit", "[FIRST]", LLString::null);
+	childSetTextArg("partner_edit", "[LAST]", LLString::null);
 
 	mPartnerID = LLUUID::null;
 	
@@ -376,7 +346,7 @@ void LLPanelAvatarSecondLife::enableControls(BOOL self)
 		// appears to reset the read only background color when
 		// setEnable is called, for some reason
 		LLTextEditor* about = LLUICtrlFactory::getTextEditorByName(this,"about");
-		if (about) about->setReadOnlyBgColor(CLEAR);
+		if (about) about->setReadOnlyBgColor(LLColor4::transparent);
 	}
 }
 
@@ -756,10 +726,10 @@ void LLPanelAvatarAdvanced::enableControls(BOOL self)
 		// This is because the LLTextEditor
 		// appears to reset the read only background color when
 		// setEnable is called, for some reason
-		if (mWantToEdit) mWantToEdit->setReadOnlyBgColor(CLEAR);
-		if (mSkillsEdit) mSkillsEdit->setReadOnlyBgColor(CLEAR);
+		if (mWantToEdit) mWantToEdit->setReadOnlyBgColor(LLColor4::transparent);
+		if (mSkillsEdit) mSkillsEdit->setReadOnlyBgColor(LLColor4::transparent);
 		LLLineEditor* languages_edit = (LLLineEditor*)getChildByName("languages_edit");
-		languages_edit->setReadOnlyBgColor(CLEAR);
+		languages_edit->setReadOnlyBgColor(LLColor4::transparent);
 	}
 }
 
@@ -834,7 +804,7 @@ void LLPanelAvatarNotes::refresh()
 
 void LLPanelAvatarNotes::clearControls()
 {
-	childSetText("notes edit", LOADING_MSG);
+	childSetText("notes edit", childGetText("Loading"));
 	childSetEnabled("notes edit", false);
 }
 
@@ -1515,7 +1485,6 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const LLString &name,
 
 			childSetVisible("Instant Message...",TRUE);
 			childSetEnabled("Instant Message...",FALSE);
-			childSetToolTip("Instant Message...",IM_ENABLED_TOOLTIP);
 			childSetVisible("Mute",TRUE);
 			childSetEnabled("Mute",FALSE);
 
@@ -1778,7 +1747,7 @@ void LLPanelAvatar::sendAvatarNotesUpdate()
 	std::string notes = mPanelNotes->childGetValue("notes edit").asString();
 
 	if (!mHaveNotes
-		&& (notes.empty() || notes == LOADING_MSG))
+		&& (notes.empty() || notes == childGetText("Loading")))
 	{
 		// no notes from server and no user updates
 		return;
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 95d2541fc5c38c32fa2579015dab18ce716200a1..0c3edf12423930c548e88e5b0f9694b7830cee31 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -355,8 +355,7 @@ void LLPanelClassified::initNewClassified()
 	// delay commit until user hits save
 	// sendClassifiedInfoUpdate();
 
-	mUpdateBtn->setLabelSelected("Publish...");
-	mUpdateBtn->setLabelUnselected("Publish...");
+	mUpdateBtn->setLabel(childGetText("publish_txt"));
 }
 
 
@@ -575,8 +574,8 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void **
 		self->mPosGlobal = pos_global;
 
 		// Update UI controls
-        self->mNameEditor->setText(name);
-        self->mDescEditor->setText(desc);
+        self->mNameEditor->setText(LLString(name));
+        self->mDescEditor->setText(LLString(desc));
         self->mSnapshotCtrl->setImageAssetID(snapshot_id);
         self->mLocationEditor->setText(location_text);
 		self->mLocationChanged = false;
@@ -596,8 +595,7 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void **
 		// If we got data from the database, we know the listing is paid for.
 		self->mPaidFor = TRUE;
 
-		self->mUpdateBtn->setLabelSelected("Update");
-		self->mUpdateBtn->setLabelUnselected("Update");
+		self->mUpdateBtn->setLabel(self->childGetText("update_txt"));
     }
 }
 
diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp
index ec966d2fc51be8e05848ebf513a9226f5d458a8d..50ff7bd9eb9e08c26b6f81f9d00cf682f49eb2cc 100644
--- a/indra/newview/llpanelcontents.cpp
+++ b/indra/newview/llpanelcontents.cpp
@@ -138,11 +138,8 @@ void LLPanelContents::getState(LLViewerObject *objectp )
 
 void LLPanelContents::refresh()
 {
-	LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject();
-	if(!object)
-	{
-		object = gSelectMgr->getSelection()->getFirstObject();
-	}
+	const BOOL children_ok = TRUE;
+	LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject(children_ok);
 
 	getState(object);
 	if (mPanelInventory)
@@ -160,11 +157,8 @@ void LLPanelContents::refresh()
 // static
 void LLPanelContents::onClickNewScript(void *userdata)
 {
-	LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject();
-	if(!object)
-	{
-		object = gSelectMgr->getSelection()->getFirstObject();
-	}
+	const BOOL children_ok = TRUE;
+	LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject(children_ok);
 	if(object)
 	{
 		LLPermissions perm;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 57d1a57a70feb8b51720a04f03a7e5d97ffccd45..63e25d9f2d7512202b6c619095b312a9e44e5b81 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -255,35 +255,32 @@ void LLPanelFace::sendAlpha()
 }
 
 
-
-void LLPanelFace::sendTextureInfo()
+struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
 {
-	S32 te;
-	LLViewerObject* object;
-	LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-	for ( selection->getFirstTE(&object, &te); object; selection->getNextTE(&object, &te) )
+	LLPanelFaceSetTEFunctor(LLPanelFace* panel) : mPanel(panel) {}
+	virtual bool apply(LLViewerObject* object, S32 te)
 	{
 		BOOL valid;
 		F32 value;
-		LLSpinCtrl*	mCtrlTexScaleS = LLViewerUICtrlFactory::getSpinnerByName(this,"TexScaleU");
-		LLSpinCtrl*	mCtrlTexScaleT = LLViewerUICtrlFactory::getSpinnerByName(this,"TexScaleV");
-		LLSpinCtrl*	mCtrlTexOffsetS = LLViewerUICtrlFactory::getSpinnerByName(this,"TexOffsetU");
-		LLSpinCtrl*	mCtrlTexOffsetT = LLViewerUICtrlFactory::getSpinnerByName(this,"TexOffsetV");
-		LLSpinCtrl*	mCtrlTexRotation = LLViewerUICtrlFactory::getSpinnerByName(this,"TexRot");
-		LLCheckBoxCtrl*	mCheckFlipScaleS = LLViewerUICtrlFactory::getCheckBoxByName(this,"checkbox flip s");
-		LLCheckBoxCtrl*	mCheckFlipScaleT = LLViewerUICtrlFactory::getCheckBoxByName(this,"checkbox flip t");
-		LLComboBox*		mComboTexGen = LLViewerUICtrlFactory::getComboBoxByName(this,"combobox texgen");
-		if (mCtrlTexScaleS)
+		LLSpinCtrl*	ctrlTexScaleS = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexScaleU");
+		LLSpinCtrl*	ctrlTexScaleT = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexScaleV");
+		LLSpinCtrl*	ctrlTexOffsetS = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexOffsetU");
+		LLSpinCtrl*	ctrlTexOffsetT = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexOffsetV");
+		LLSpinCtrl*	ctrlTexRotation = LLViewerUICtrlFactory::getSpinnerByName(mPanel,"TexRot");
+		LLCheckBoxCtrl*	checkFlipScaleS = LLViewerUICtrlFactory::getCheckBoxByName(mPanel,"checkbox flip s");
+		LLCheckBoxCtrl*	checkFlipScaleT = LLViewerUICtrlFactory::getCheckBoxByName(mPanel,"checkbox flip t");
+		LLComboBox*		comboTexGen = LLViewerUICtrlFactory::getComboBoxByName(mPanel,"combobox texgen");
+		if (ctrlTexScaleS)
 		{
-			valid = !mCtrlTexScaleS->getTentative() || !mCheckFlipScaleS->getTentative();
+			valid = !ctrlTexScaleS->getTentative() || !checkFlipScaleS->getTentative();
 			if (valid)
 			{
-				value = mCtrlTexScaleS->get();
-				if( mCheckFlipScaleS->get() )
+				value = ctrlTexScaleS->get();
+				if( checkFlipScaleS->get() )
 				{
 					value = -value;
 				}
-				if (mComboTexGen->getCurrentIndex() == 1)
+				if (comboTexGen->getCurrentIndex() == 1)
 				{
 					value *= 0.5f;
 				}
@@ -291,17 +288,17 @@ void LLPanelFace::sendTextureInfo()
 			}
 		}
 
-		if (mCtrlTexScaleT)
+		if (ctrlTexScaleT)
 		{
-			valid = !mCtrlTexScaleT->getTentative() || !mCheckFlipScaleT->getTentative();
+			valid = !ctrlTexScaleT->getTentative() || !checkFlipScaleT->getTentative();
 			if (valid)
 			{
-				value = mCtrlTexScaleT->get();
-				if( mCheckFlipScaleT->get() )
+				value = ctrlTexScaleT->get();
+				if( checkFlipScaleT->get() )
 				{
 					value = -value;
 				}
-				if (mComboTexGen->getCurrentIndex() == 1)
+				if (comboTexGen->getCurrentIndex() == 1)
 				{
 					value *= 0.5f;
 				}
@@ -309,41 +306,57 @@ void LLPanelFace::sendTextureInfo()
 			}
 		}
 
-		if (mCtrlTexOffsetS)
+		if (ctrlTexOffsetS)
 		{
-			valid = !mCtrlTexOffsetS->getTentative();
+			valid = !ctrlTexOffsetS->getTentative();
 			if (valid)
 			{
-				value = mCtrlTexOffsetS->get();
+				value = ctrlTexOffsetS->get();
 				object->setTEOffsetS( te, value );
 			}
 		}
 
-		if (mCtrlTexOffsetT)
+		if (ctrlTexOffsetT)
 		{
-			valid = !mCtrlTexOffsetT->getTentative();
+			valid = !ctrlTexOffsetT->getTentative();
 			if (valid)
 			{
-				value = mCtrlTexOffsetT->get();
+				value = ctrlTexOffsetT->get();
 				object->setTEOffsetT( te, value );
 			}
 		}
 
-		if (mCtrlTexRotation)
+		if (ctrlTexRotation)
 		{
-			valid = !mCtrlTexRotation->getTentative();
+			valid = !ctrlTexRotation->getTentative();
 			if (valid)
 			{
-				value = mCtrlTexRotation->get() * DEG_TO_RAD;
+				value = ctrlTexRotation->get() * DEG_TO_RAD;
 				object->setTERotation( te, value );
 			}
 		}
+		return true;
 	}
+private:
+	LLPanelFace* mPanel;
+};
 
-	for ( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() )
+struct LLPanelFaceSendFunctor : public LLSelectedObjectFunctor
+{
+	virtual bool apply(LLViewerObject* object)
 	{
 		object->sendTEUpdate();
+		return true;
 	}
+};
+
+void LLPanelFace::sendTextureInfo()
+{
+	LLPanelFaceSetTEFunctor setfunc(this);
+	gSelectMgr->getSelection()->applyToTEs(&setfunc);
+
+	LLPanelFaceSendFunctor sendfunc;
+	gSelectMgr->getSelection()->applyToObjects(&sendfunc);
 }
 
 void LLPanelFace::getState()
@@ -371,43 +384,58 @@ void LLPanelFace::getState()
 			}
 		childSetEnabled("button apply",editable);
 
+		bool identical;
+		LLTextureCtrl*	texture_ctrl = LLViewerUICtrlFactory::getTexturePickerByName(this,"texture control");
+		
 		// Texture
-		LLUUID id;
-		BOOL identical = gSelectMgr->selectionGetTexUUID(id);
-		LLTextureCtrl*	mTextureCtrl = LLViewerUICtrlFactory::getTexturePickerByName(this,"texture control");
-		if (identical)
 		{
-			// All selected have the same texture
-			if(mTextureCtrl){
-				mTextureCtrl->setTentative( FALSE );
-				mTextureCtrl->setEnabled( editable );
-				mTextureCtrl->setImageAssetID( id );
-			}
-		}
-		else
-		{
-			if(mTextureCtrl){
-				if( id.isNull() )
+			LLUUID id;
+			struct f1 : public LLSelectedTEGetFunctor<LLUUID>
+			{
+				LLUUID get(LLViewerObject* object, S32 te)
+				{
+					LLViewerImage* image = object->getTEImage(te);
+					return image ? image->getID() : LLUUID::null;
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, id );
+			
+			if (identical)
+			{
+				// All selected have the same texture
+				if(texture_ctrl)
 				{
-					// None selected
-					mTextureCtrl->setTentative( FALSE );
-					mTextureCtrl->setEnabled( FALSE );
-					mTextureCtrl->setImageAssetID( LLUUID::null );
+					texture_ctrl->setTentative( FALSE );
+					texture_ctrl->setEnabled( editable );
+					texture_ctrl->setImageAssetID( id );
 				}
-				else
+			}
+			else
+			{
+				if(texture_ctrl)
 				{
-					// Tentative: multiple selected with different textures
-					mTextureCtrl->setTentative( TRUE );
-					mTextureCtrl->setEnabled( editable );
-					mTextureCtrl->setImageAssetID( id );
+					if( id.isNull() )
+					{
+						// None selected
+						texture_ctrl->setTentative( FALSE );
+						texture_ctrl->setEnabled( FALSE );
+						texture_ctrl->setImageAssetID( LLUUID::null );
+					}
+					else
+					{
+						// Tentative: multiple selected with different textures
+						texture_ctrl->setTentative( TRUE );
+						texture_ctrl->setEnabled( editable );
+						texture_ctrl->setImageAssetID( id );
+					}
 				}
 			}
 		}
-
+		
 		LLAggregatePermissions texture_perms;
-		if(mTextureCtrl)
+		if(texture_ctrl)
 		{
-// 			mTextureCtrl->setValid( editable );
+// 			texture_ctrl->setValid( editable );
 		
 			if (gSelectMgr->selectGetAggregateTexturePermissions(texture_perms))
 			{
@@ -417,11 +445,11 @@ void LLPanelFace::getState()
 				BOOL can_transfer = 
 					texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY || 
 					texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL;
-				mTextureCtrl->setCanApplyImmediately(can_copy && can_transfer);
+				texture_ctrl->setCanApplyImmediately(can_copy && can_transfer);
 			}
 			else
 			{
-				mTextureCtrl->setCanApplyImmediately(FALSE);
+				texture_ctrl->setCanApplyImmediately(FALSE);
 			}
 		}
 
@@ -430,7 +458,14 @@ void LLPanelFace::getState()
 			childSetEnabled("tex scale",editable);
 			//mLabelTexScale->setEnabled( editable );
 			F32 scale_s = 1.f;
-			identical = allFacesSameValue( &LLPanelFace::valueScaleS, &scale_s );
+			struct f2 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					return object->getTE(face)->mScaleS;
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, scale_s );
 			childSetValue("TexScaleU",editable ? llabs(scale_s) : 0);
 			childSetTentative("TexScaleU",LLSD((BOOL)(!identical)));
 			childSetEnabled("TexScaleU",editable);
@@ -441,7 +476,14 @@ void LLPanelFace::getState()
 
 		{
 			F32 scale_t = 1.f;
-			identical = allFacesSameValue( &LLPanelFace::valueScaleT, &scale_t );
+			struct f3 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					return object->getTE(face)->mScaleS;
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, scale_t );
 
 			childSetValue("TexScaleV",llabs(editable ? llabs(scale_t) : 0));
 			childSetTentative("TexScaleV",LLSD((BOOL)(!identical)));
@@ -455,7 +497,14 @@ void LLPanelFace::getState()
 		{
 			childSetEnabled("tex offset",editable);
 			F32 offset_s = 0.f;
-			identical = allFacesSameValue( &LLPanelFace::valueOffsetS, &offset_s );
+			struct f4 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					return object->getTE(face)->mOffsetS;
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, offset_s );
 			childSetValue("TexOffsetU", editable ? offset_s : 0);
 			childSetTentative("TexOffsetU",!identical);
 			childSetEnabled("TexOffsetU",editable);
@@ -463,7 +512,14 @@ void LLPanelFace::getState()
 
 		{
 			F32 offset_t = 0.f;
-			identical = allFacesSameValue( &LLPanelFace::valueOffsetT, &offset_t );
+			struct f5 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					return object->getTE(face)->mOffsetT;
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, offset_t );
 			childSetValue("TexOffsetV", editable ? offset_t : 0);
 			childSetTentative("TexOffsetV",!identical);
 			childSetEnabled("TexOffsetV",editable);
@@ -473,7 +529,14 @@ void LLPanelFace::getState()
 		{
 			childSetEnabled("tex rotate",editable);
 			F32 rotation = 0.f;
-			identical = allFacesSameValue( &LLPanelFace::valueTexRotation, &rotation );
+			struct f6 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					return object->getTE(face)->mRotation;
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, rotation );
 			childSetValue("TexRot", editable ? rotation * RAD_TO_DEG : 0);
 			childSetTentative("TexRot",!identical);
 			childSetEnabled("TexRot",editable);
@@ -484,7 +547,15 @@ void LLPanelFace::getState()
 		LLColor4 color = LLColor4::white;
 		if(mColorSwatch)
 		{
-			identical = gSelectMgr->selectionGetColor(color);
+			struct f7 : public LLSelectedTEGetFunctor<LLColor4>
+			{
+				LLColor4 get(LLViewerObject* object, S32 face)
+				{
+					return object->getTE(face)->getColor();
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, color );
+			
 			mColorSwatch->setOriginal(color);
 			mColorSwatch->set(color, TRUE);
 
@@ -506,7 +577,14 @@ void LLPanelFace::getState()
 		// Bump
 		{
 			F32 shinyf = 0.f;
-			identical = allFacesSameValue( &LLPanelFace::valueShiny, &shinyf );
+			struct f8 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					return (F32)(object->getTE(face)->getShiny());
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, shinyf );
 			LLCtrlSelectionInterface* combobox_shininess =
 			      childGetSelectionInterface("combobox shininess");
 			if (combobox_shininess)
@@ -524,7 +602,14 @@ void LLPanelFace::getState()
 
 		{
 			F32 bumpf = 0.f;
-			identical = allFacesSameValue( &LLPanelFace::valueBump, &bumpf );
+			struct f9 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					return (F32)(object->getTE(face)->getBumpmap());
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, bumpf );
 			LLCtrlSelectionInterface* combobox_bumpiness =
 			      childGetSelectionInterface("combobox bumpiness");
 			if (combobox_bumpiness)
@@ -542,7 +627,14 @@ void LLPanelFace::getState()
 
 		{
 			F32 genf = 0.f;
-			identical = allFacesSameValue( &LLPanelFace::valueTexGen, &genf);
+			struct f10 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					return (F32)(object->getTE(face)->getTexGen());
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, genf );
 			S32 selected_texgen = ((S32) genf) >> TEM_TEX_GEN_SHIFT;
 			LLCtrlSelectionInterface* combobox_texgen =
 			      childGetSelectionInterface("combobox texgen");
@@ -573,7 +665,14 @@ void LLPanelFace::getState()
 
 		{
 			F32 fullbrightf = 0.f;
-			identical = allFacesSameValue( &LLPanelFace::valueFullbright, &fullbrightf );
+			struct f11 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					return (F32)(object->getTE(face)->getFullbright());
+				}
+			} func;
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, fullbrightf );
 
 			childSetValue("checkbox fullbright",(S32)fullbrightf);
 			childSetEnabled("checkbox fullbright",editable);
@@ -586,9 +685,22 @@ void LLPanelFace::getState()
 		}
 
 		// Repeats per meter
-		F32 repeats = 1.f;
-		identical = allFacesSameValue( &LLPanelFace::valueRepeatsPerMeter, &repeats );
 		{
+			F32 repeats = 1.f;
+			struct f12 : public LLSelectedTEGetFunctor<F32>
+			{
+				F32 get(LLViewerObject* object, S32 face)
+				{
+					U32 s_axis = VX;
+					U32 t_axis = VY;
+					// BUG: Only repeats along S axis
+					// BUG: Only works for boxes.
+					LLPrimitive::getTESTAxes(face, &s_axis, &t_axis);
+					return object->getTE(face)->mScaleS / object->getScale().mV[s_axis];
+				}
+			} func;			
+			identical = gSelectMgr->getSelection()->getSelectedTEValue( &func, repeats );
+			
 			childSetValue("rptctrl", editable ? repeats : 0);
 			childSetTentative("rptctrl",!identical);
 			LLComboBox*	mComboTexGen = LLViewerUICtrlFactory::getComboBoxByName(this,"combobox texgen");
@@ -606,12 +718,12 @@ void LLPanelFace::getState()
 		clearCtrls();
 
 		// Disable non-UICtrls
-		LLTextureCtrl*	mTextureCtrl = LLUICtrlFactory::getTexturePickerByName(this,"texture control"); 
-		if(mTextureCtrl)
+		LLTextureCtrl*	texture_ctrl = LLUICtrlFactory::getTexturePickerByName(this,"texture control"); 
+		if(texture_ctrl)
 		{
-			mTextureCtrl->setImageAssetID( LLUUID::null );
-			mTextureCtrl->setEnabled( FALSE );  // this is a LLUICtrl, but we don't want it to have keyboard focus so we add it as a child, not a ctrl.
-// 			mTextureCtrl->setValid(FALSE);
+			texture_ctrl->setImageAssetID( LLUUID::null );
+			texture_ctrl->setEnabled( FALSE );  // this is a LLUICtrl, but we don't want it to have keyboard focus so we add it as a child, not a ctrl.
+// 			texture_ctrl->setValid(FALSE);
 		}
 		LLColorSwatchCtrl* mColorSwatch = LLUICtrlFactory::getColorSwatchByName(this,"colorswatch");
 		if(mColorSwatch)
@@ -641,115 +753,10 @@ void LLPanelFace::refresh()
 	getState();
 }
 
-
-BOOL LLPanelFace::allFacesSameValue( F32 (get_face_value(LLViewerObject*, S32)), F32 *value)
-{
-	LLViewerObject* object;
-	S32 te;
-
-	// Get the value from the primary selected TE
-	F32 first_value = *value;
-	BOOL got_first = FALSE;
-	gSelectMgr->getSelection()->getPrimaryTE(&object, &te);
-	if (object)
-	{
-		first_value = get_face_value(object, te);
-		got_first = true;
-	}
-
-	// Now iterate through all TEs to test for sameness
-	BOOL identical = TRUE;
-	LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-	for ( selection->getFirstTE(&object, &te); object; selection->getNextTE(&object, &te) )
-	{
-		if (!got_first)
-		{
-			first_value = get_face_value(object, te);
-			got_first = true;
-		}
-		if ( get_face_value(object, te) != first_value )
-		{
-			identical = FALSE;
-			break;
-		}
-	}
-
-	*value = first_value;
-	return identical;
-}
-
-
 //
 // Static functions
 //
 
-// static
-F32 LLPanelFace::valueRepeatsPerMeter(LLViewerObject* object, S32 face)
-{
-	U32 s_axis = VX;
-	U32 t_axis = VY;
-
-	// BUG: Only repeats along S axis
-	// BUG: Only works for boxes.
-	gSelectMgr->getTESTAxes(object, face, &s_axis, &t_axis);
-	return object->getTE(face)->mScaleS / object->getScale().mV[s_axis];
-}
-
-// static
-F32 LLPanelFace::valueScaleS(LLViewerObject* object, S32 face)
-{
-	return object->getTE(face)->mScaleS;
-}
-
-
-// static
-F32 LLPanelFace::valueScaleT(LLViewerObject* object, S32 face)
-{
-	return object->getTE(face)->mScaleT;
-}
-
-// static
-F32 LLPanelFace::valueOffsetS(LLViewerObject* object, S32 face)
-{
-	return object->getTE(face)->mOffsetS;
-}
-
-// static
-F32 LLPanelFace::valueOffsetT(LLViewerObject* object, S32 face)
-{
-	return object->getTE(face)->mOffsetT;
-}
-
-// static
-F32 LLPanelFace::valueTexRotation(LLViewerObject* object, S32 face)
-{
-	return object->getTE(face)->mRotation;
-}
-
-// static
-F32 LLPanelFace::valueBump(LLViewerObject* object, S32 face)
-{
-	return (F32)(object->getTE(face)->getBumpmap());
-}
-
-// static
-F32 LLPanelFace::valueTexGen(LLViewerObject* object, S32 face)
-{
-	return (F32)(object->getTE(face)->getTexGen());
-}
-
-// static
-F32 LLPanelFace::valueShiny(LLViewerObject* object, S32 face)
-{
-	return (F32)(object->getTE(face)->getShiny());
-}
-
-// static
-F32 LLPanelFace::valueFullbright(LLViewerObject* object, S32 face)
-{
-	return (F32)(object->getTE(face)->getFullbright());
-}
-
 
 // static
 void LLPanelFace::onCommitColor(LLUICtrl* ctrl, void* userdata)
@@ -811,13 +818,16 @@ void LLPanelFace::onCommitFullbright(LLUICtrl* ctrl, void* userdata)
 BOOL LLPanelFace::onDragTexture(LLUICtrl*, LLInventoryItem* item, void*)
 {
 	BOOL accept = TRUE;
-	LLViewerObject* obj = gSelectMgr->getSelection()->getFirstRootObject();
-	while(accept && obj)
+	for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
+		 iter != gSelectMgr->getSelection()->root_end(); iter++)
 	{
+		LLSelectNode* node = *iter;
+		LLViewerObject* obj = node->getObject();
 		if(!LLToolDragAndDrop::isInventoryDropAcceptable(obj, item))
+		{
 			accept = FALSE;
-		else
-			obj = gSelectMgr->getSelection()->getNextRootObject();
+			break;
+		}
 	}
 	return accept;
 }
@@ -868,14 +878,10 @@ void LLPanelFace::onClickApply(void* userdata)
 }
 
 // commit the fit media texture to prim button
-void LLPanelFace::onClickAutoFix(void* userdata)
-{
-	S32 te;
-	LLViewerObject* object;
 
-	// for all selected objects
-	LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-	for ( selection->getFirstTE(&object, &te); object; selection->getNextTE(&object, &te) )
+struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor
+{
+	virtual bool apply(LLViewerObject* object, S32 te)
 	{
 		// only do this if it's a media texture
 		if ( object->getTE ( te )->getID() ==  LLMediaEngine::getInstance()->getImageUUID () )
@@ -895,13 +901,17 @@ void LLPanelFace::onClickAutoFix(void* userdata)
 				object->setTEScaleT( te, scaleT );	// don't need to flip Y anymore since QT does this for us now.
 				object->setTEOffsetS( te, -( 1.0f - scaleS ) / 2.0f );
 				object->setTEOffsetT( te, -( 1.0f - scaleT ) / 2.0f );
-			};
-		};
-	};
+			}
+		}
+		return true;
+	}
+};
 
-	// not clear why this is in a separate loop but i followed the patter from further up this file just in case.
-	for ( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() )
-	{
-		object->sendTEUpdate();
-	};
+void LLPanelFace::onClickAutoFix(void* userdata)
+{
+	LLPanelFaceSetMediaFunctor setfunc;
+	gSelectMgr->getSelection()->applyToTEs(&setfunc);
+
+	LLPanelFaceSendFunctor sendfunc;
+	gSelectMgr->getSelection()->applyToObjects(&sendfunc);
 }
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index ff6ca24599a213d405f62066df8edf50293a6f2e..d6801299899a2e7216faf1e23921d655eb2d7d41 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -57,11 +57,6 @@ public:
 	void			refresh();
 
 protected:
-	// Given a callback function that returns an F32, figures out
-	// if that F32 is the same for all selected faces.  "value"
-	// contains the identical value, or the first object's value.
-	BOOL			allFacesSameValue( F32 (get_face_value(LLViewerObject*, S32)), F32 *value);
-
 	void			getState();
 
 	void			sendTexture();			// applies and sends texture
@@ -91,17 +86,6 @@ protected:
 
 	static void		onClickApply(void*);
 	static void		onClickAutoFix(void*);
-
-	static F32		valueScaleS(LLViewerObject* object, S32 face);
-	static F32		valueScaleT(LLViewerObject* object, S32 face);
-	static F32		valueOffsetS(LLViewerObject* object, S32 face);
-	static F32		valueOffsetT(LLViewerObject* object, S32 face);
-	static F32		valueTexRotation(LLViewerObject* object, S32 face);
-	static F32		valueRepeatsPerMeter(LLViewerObject* object, S32 face);
-	static F32		valueBump(LLViewerObject* object, S32 face);
-	static F32		valueTexGen(LLViewerObject* object, S32 face);
-	static F32		valueShiny(LLViewerObject* object, S32 face);
-	static F32		valueFullbright(LLViewerObject* object, S32 face);
 };
 
 #endif
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 982b8cc3b70c12a8e783461068b13a5e513a70c1..19f43ecb8864a34723e13a1d0466dfc6837f39fb 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -60,7 +60,7 @@ public:
 	LLPanelGroup(const std::string& filename,
 				 const std::string& name,
 				 const LLUUID& group_id,
-				 const std::string& initial_tab_selected = "");
+				 const std::string& initial_tab_selected = std::string());
 	virtual ~LLPanelGroup();
 
 	virtual BOOL postBuild();
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 14ca3c2bff5b07d9a627f61cb2c1c4abb1f7b4cf..9bab774a46ae7a81dd3cc8b181d10fd2973e7413 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -69,6 +69,7 @@ public:
 public:
 	LLUUID mGroupID;
 
+	LLString		mLoadingText;
 	LLNameListCtrl	*mInvitees;
 	LLComboBox      *mRoleNames;
 	LLButton		*mOKButton;
@@ -395,14 +396,14 @@ void LLPanelGroupInvite::update()
 	mPendingUpdate = FALSE;
 	if (mImplementation->mGroupName) 
 	{
-		mImplementation->mGroupName->setText("(loading...)");
+		mImplementation->mGroupName->setText(mImplementation->mLoadingText);
 	}
 	if ( mImplementation->mRoleNames ) 
 	{
 		mStoreSelected = mImplementation->mRoleNames->getCurrentID();
 		mImplementation->mRoleNames->clear();
 		mImplementation->mRoleNames->removeall();
-		mImplementation->mRoleNames->add("(loading...)", LLUUID::null, ADD_BOTTOM);
+		mImplementation->mRoleNames->add(mImplementation->mLoadingText, LLUUID::null, ADD_BOTTOM);
 		mImplementation->mRoleNames->setCurrentByID(LLUUID::null);
 	}
 
@@ -473,6 +474,7 @@ BOOL LLPanelGroupInvite::postBuild()
 {
 	BOOL recurse = TRUE;
 
+	mImplementation->mLoadingText = childGetText("loading");
 	mImplementation->mRoleNames = (LLComboBox*) getChildByName("role_name",
 															   recurse);
 	mImplementation->mGroupName = (LLTextBox*) getChildByName("group_name_text", recurse);
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index dd5966f8239f65e78fbbc43f8f11963a1d574c07..a6ffe4f922713f74b5b6f65e7076c6a3408e99ff 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -52,12 +52,93 @@
 #include "llfloaterworldmap.h"
 #include "llviewermessage.h"
 
-const char LOADING_STRING[]  = "Computing...";
+////////////////////////////////////////////////////////////////////////////
+
+class LLGroupMoneyTabEventHandler
+{
+public:
+	LLGroupMoneyTabEventHandler(LLButton* earlier_button,
+								LLButton* later_button,
+								LLTextEditor* text_editor,
+								LLTabContainerCommon* tab_containerp,
+								LLPanel* panelp,
+								const LLString& loading_text,
+								const LLUUID& group_id,
+								S32 interval_length_days,
+								S32 max_interval_days);
+	virtual ~LLGroupMoneyTabEventHandler();
+
+	virtual void requestData(LLMessageSystem* msg);
+	virtual void processReply(LLMessageSystem* msg, void** data);
+
+	virtual void onClickEarlier();
+	virtual void onClickLater();
+	virtual void onClickTab();
+
+	static void clickEarlierCallback(void* data);
+	static void clickLaterCallback(void* data);
+	static void clickTabCallback(void* user_data, bool from_click);
+
+	static LLMap<LLUUID, LLGroupMoneyTabEventHandler*> sInstanceIDs;
+	static std::map<LLPanel*, LLGroupMoneyTabEventHandler*> sTabsToHandlers;
+protected:
+	class impl;
+	impl* mImplementationp;
+};
+
+class LLGroupMoneyDetailsTabEventHandler : public LLGroupMoneyTabEventHandler
+{
+public:
+	LLGroupMoneyDetailsTabEventHandler(LLButton* earlier_buttonp,
+									   LLButton* later_buttonp,
+									   LLTextEditor* text_editorp,
+									   LLTabContainerCommon* tab_containerp,
+									   LLPanel* panelp,
+									   const LLString& loading_text,
+									   const LLUUID& group_id);
+	virtual ~LLGroupMoneyDetailsTabEventHandler();
+
+	virtual void requestData(LLMessageSystem* msg);
+	virtual void processReply(LLMessageSystem* msg, void** data);
+};
+
+
+class LLGroupMoneySalesTabEventHandler : public LLGroupMoneyTabEventHandler
+{
+public:
+	LLGroupMoneySalesTabEventHandler(LLButton* earlier_buttonp,
+									 LLButton* later_buttonp,
+									 LLTextEditor* text_editorp,
+									 LLTabContainerCommon* tab_containerp,
+									 LLPanel* panelp,
+									 const LLString& loading_text,
+									 const LLUUID& group_id);
+	virtual ~LLGroupMoneySalesTabEventHandler();
+
+	virtual void requestData(LLMessageSystem* msg);
+	virtual void processReply(LLMessageSystem* msg, void** data);
+};
+
+class LLGroupMoneyPlanningTabEventHandler : public LLGroupMoneyTabEventHandler
+{
+public:
+	LLGroupMoneyPlanningTabEventHandler(LLTextEditor* text_editor,
+										LLTabContainerCommon* tab_containerp,
+										LLPanel* panelp,
+										const LLString& loading_text,
+										const LLUUID& group_id);
+	virtual ~LLGroupMoneyPlanningTabEventHandler();
+
+	virtual void requestData(LLMessageSystem* msg);
+	virtual void processReply(LLMessageSystem* msg, void** data);
+};
+
+////////////////////////////////////////////////////////////////////////////
 
 class LLPanelGroupLandMoney::impl
 {
 public:
-	impl(const LLUUID& group_id); //constructor
+	impl(LLPanelGroupLandMoney& panel, const LLUUID& group_id); //constructor
 	virtual ~impl();
 
 	void requestGroupLandInfo();
@@ -76,12 +157,10 @@ public:
 
 //member variables
 public:
-	LLTextBox *mTotalContributedLandp;
-	LLTextBox *mTotalLandInUsep;
-	LLTextBox *mLandAvailablep;
+	LLPanelGroupLandMoney& mPanel;
+	
 	LLTextBox* mGroupOverLimitTextp;
 	LLIconCtrl* mGroupOverLimitIconp;
-	LLTextBox* mYourContributionMaxTextp;
 
 	LLLineEditor* mYourContributionEditorp;
 
@@ -107,22 +186,19 @@ public:
 //*******************************************
 //** LLPanelGroupLandMoney::impl Functions **
 //*******************************************
-LLPanelGroupLandMoney::impl::impl(const LLUUID& group_id)
+LLPanelGroupLandMoney::impl::impl(LLPanelGroupLandMoney& panel, const LLUUID& group_id)
+	: mPanel(panel),
+	  mGroupID(group_id)
 {
-	mGroupID = group_id;
 	mTransID = LLUUID::null;
 
 	mBeenActivated = false;
 	mNeedsSendGroupLandRequest = true;
 	mNeedsApply = false;
 
-	mTotalLandInUsep = NULL;
-	mTotalContributedLandp = NULL;
-	mLandAvailablep = NULL;
 	mYourContributionEditorp = NULL;
 	mMapButtonp = NULL;
 	mGroupParcelsp = NULL;
-	mYourContributionMaxTextp = NULL;
 	mGroupOverLimitTextp = NULL;
 	mGroupOverLimitIconp = NULL;
 
@@ -230,9 +306,7 @@ int LLPanelGroupLandMoney::impl::getStoredContribution()
 // Fills in the text field with the contribution, contrib
 void LLPanelGroupLandMoney::impl::setYourContributionTextField(int contrib)
 {
-	char buffer[MAX_STRING];	/* Flawfinder: ignore*/
-	buffer[0] = '\0';
-	snprintf(buffer, sizeof(buffer), "%d", contrib);	/* Flawfinder: ignore*/
+	LLString buffer = llformat("%d", contrib);
 
 	if ( mYourContributionEditorp )
 	{
@@ -243,14 +317,7 @@ void LLPanelGroupLandMoney::impl::setYourContributionTextField(int contrib)
 
 void LLPanelGroupLandMoney::impl::setYourMaxContributionTextBox(int max)
 {
-	char buffer[MAX_STRING];		/*Flawfinder: ignore*/
-	buffer[0] = '\0';
-
-	snprintf(buffer, sizeof(buffer), "(%d max)", max);			/* Flawfinder: ignore */
-	if ( mYourContributionMaxTextp )
-	{
-		mYourContributionMaxTextp->setText(buffer);
-	}
+	mPanel.childSetTextArg("your_contribution_max_value", "[AMOUNT]", llformat("%d", max));
 }
 
 //static
@@ -309,19 +376,18 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
 		{
 			// special block which has total contribution
 			++first_block;
+			
 			S32 total_contribution;
 			msg->getS32("QueryData", "ActualArea", total_contribution, 0);
-			char buffer[MAX_STRING];		/*Flawfinder: ignore*/
-			snprintf(buffer, sizeof(buffer), "%d sq. meters", total_contribution);			/* Flawfinder: ignore */
-			mTotalContributedLandp->setText(buffer);
+			mPanel.childSetTextArg("total_contributed_land_value", "[AREA]", llformat("%d", total_contribution));
+
 			S32 committed;
 			msg->getS32("QueryData", "BillableArea", committed, 0);
-			snprintf(buffer, sizeof(buffer), "%d sq. meters", committed);			/* Flawfinder: ignore */
-			mTotalLandInUsep->setText(buffer);
+			mPanel.childSetTextArg("total_land_in_use_value", "[AREA]", llformat("%d", committed));
+			
 			S32 available = total_contribution - committed;
-			snprintf(buffer, sizeof(buffer), "%d sq. meters", available);			/* Flawfinder: ignore */
-			mLandAvailablep->setText(buffer);
-			buffer[0] = '\0';
+			mPanel.childSetTextArg("land_available_value", "[AREA]", llformat("%d", available));
+
 			if ( mGroupOverLimitTextp && mGroupOverLimitIconp )
 			{
 				mGroupOverLimitIconp->setVisible(available < 0);
@@ -416,7 +482,7 @@ LLPanelGroupLandMoney::LLPanelGroupLandMoney(const std::string& name,
 											 const LLUUID& group_id) :
 	LLPanelGroupTab(name, group_id) 
 {
-	mImplementationp = new impl(group_id);
+	mImplementationp = new impl(*this, group_id);
 
 	//problem what if someone has both the group floater open and the finder
 	//open to the same group?  Some maps that map group ids to panels
@@ -538,18 +604,10 @@ BOOL LLPanelGroupLandMoney::postBuild()
 	
 	bool can_view = gAgent.isInGroup(mGroupID);
 
-	mImplementationp->mTotalLandInUsep = 
-		(LLTextBox*) getChildByName("total_land_in_use_value");
-	mImplementationp->mTotalContributedLandp = 
-		(LLTextBox*) getChildByName("total_contributed_land_value");
-	mImplementationp->mLandAvailablep = 
-		(LLTextBox*) getChildByName("land_available_value");
 	mImplementationp->mGroupOverLimitIconp = 
 		(LLIconCtrl*) getChildByName("group_over_limit_icon");
 	mImplementationp->mGroupOverLimitTextp = 
 		(LLTextBox*) getChildByName("group_over_limit_text");
-	mImplementationp->mYourContributionMaxTextp = 
-		(LLTextBox*) getChildByName("your_contribution_max_value");
 
 	mImplementationp->mYourContributionEditorp 
 		= (LLLineEditor*) getChildByName("your_contribution_line_editor");
@@ -636,7 +694,8 @@ BOOL LLPanelGroupLandMoney::postBuild()
 		}
 	}
 
-
+	LLString loading_text = childGetText("loading_txt");
+	
 	//pull out the widgets for the L$ details tab
 	earlierp = (LLButton*) getChildByName("earlier_details_button", true);
 	laterp = (LLButton*) getChildByName("later_details_button", true);
@@ -655,6 +714,7 @@ BOOL LLPanelGroupLandMoney::postBuild()
 												   textp,
 												   tabcp,
 												   panelp,
+												   loading_text,
 												   mGroupID);
 	}
 
@@ -671,6 +731,7 @@ BOOL LLPanelGroupLandMoney::postBuild()
 			new LLGroupMoneyPlanningTabEventHandler(textp,
 													tabcp,
 													panelp,
+													loading_text,
 													mGroupID);
 	}
 
@@ -692,6 +753,7 @@ BOOL LLPanelGroupLandMoney::postBuild()
 												 textp,
 												 tabcp,
 												 panelp,
+												 loading_text,
 												 mGroupID);
 	}
 
@@ -729,7 +791,8 @@ public:
 	impl(LLButton* earlier_buttonp,
 		 LLButton* later_buttonp,
 		 LLTextEditor* text_editorp,
-		 LLPanel* panelp,
+		 LLPanel* tabpanelp,
+		 const LLString& loading_text,
 		 const LLUUID& group_id,
 		 S32 interval_length_days,
 		 S32 max_interval_days);
@@ -745,7 +808,7 @@ public:
 	LLUUID mGroupID;
 	LLUUID mPanelID;
 
-	LLPanel* mPanelp;
+	LLPanel* mTabPanelp;
 
 	int mIntervalLength;
 	int mMaxInterval;
@@ -754,12 +817,15 @@ public:
 	LLTextEditor* mTextEditorp;
 	LLButton*     mEarlierButtonp;
 	LLButton*     mLaterButtonp;
+
+	LLString mLoadingText;
 };
 
 LLGroupMoneyTabEventHandler::impl::impl(LLButton* earlier_buttonp,
 										LLButton* later_buttonp,
 										LLTextEditor* text_editorp,
-										LLPanel* panelp,
+										LLPanel* tabpanelp,
+										const LLString& loading_text,
 										const LLUUID& group_id,
 										S32 interval_length_days,
 										S32 max_interval_days)
@@ -774,7 +840,9 @@ LLGroupMoneyTabEventHandler::impl::impl(LLButton* earlier_buttonp,
 	mTextEditorp = text_editorp;
 	mEarlierButtonp = earlier_buttonp;
 	mLaterButtonp = later_buttonp;
-	mPanelp = panelp;
+	mTabPanelp = tabpanelp;
+
+	mLoadingText = loading_text;
 }
 
 LLGroupMoneyTabEventHandler::impl::~impl()
@@ -806,6 +874,7 @@ void LLGroupMoneyTabEventHandler::impl::updateButtons()
 //*******************************************
 //** LLGroupMoneyTabEventHandler Functions **
 //*******************************************
+
 LLMap<LLUUID, LLGroupMoneyTabEventHandler*> LLGroupMoneyTabEventHandler::sInstanceIDs;
 std::map<LLPanel*, LLGroupMoneyTabEventHandler*> LLGroupMoneyTabEventHandler::sTabsToHandlers;
 
@@ -814,6 +883,7 @@ LLGroupMoneyTabEventHandler::LLGroupMoneyTabEventHandler(LLButton* earlier_butto
 														 LLTextEditor* text_editorp,
 														 LLTabContainerCommon* tab_containerp,
 														 LLPanel* panelp,
+														 const LLString& loading_text,
 														 const LLUUID& group_id,
 														 S32 interval_length_days,
 														 S32 max_interval_days)
@@ -822,28 +892,26 @@ LLGroupMoneyTabEventHandler::LLGroupMoneyTabEventHandler(LLButton* earlier_butto
 								later_buttonp,
 								text_editorp,
 								panelp,
+								loading_text,
 								group_id,
 								interval_length_days,
 								max_interval_days);
 
 	if ( earlier_buttonp )
 	{
-		earlier_buttonp->setClickedCallback(LLGroupMoneyTabEventHandler::clickEarlierCallback,
-											this);
+		earlier_buttonp->setClickedCallback(clickEarlierCallback, this);
 	}
 
 	if ( later_buttonp )
 	{
-		later_buttonp->setClickedCallback(LLGroupMoneyTabEventHandler::clickLaterCallback,
-										  this);
+		later_buttonp->setClickedCallback(clickLaterCallback, this);
 	}
 
 	mImplementationp->updateButtons();
 
 	if ( tab_containerp && panelp )
 	{
-		tab_containerp->setTabChangeCallback(panelp, 
-											LLGroupMoneyTabEventHandler::clickTabCallback);
+		tab_containerp->setTabChangeCallback(panelp, clickTabCallback);
 		tab_containerp->setTabUserData(panelp, this);
 	}
 
@@ -854,7 +922,7 @@ LLGroupMoneyTabEventHandler::LLGroupMoneyTabEventHandler(LLButton* earlier_butto
 LLGroupMoneyTabEventHandler::~LLGroupMoneyTabEventHandler()
 {
 	sInstanceIDs.removeData(mImplementationp->mPanelID);
-	sTabsToHandlers.erase(mImplementationp->mPanelp);
+	sTabsToHandlers.erase(mImplementationp->mTabPanelp);
 
 	delete mImplementationp;
 }
@@ -879,7 +947,7 @@ void LLGroupMoneyTabEventHandler::onClickEarlier()
 {
 	if ( mImplementationp->mTextEditorp) 
 	{
-		mImplementationp->mTextEditorp->setText(LOADING_STRING);
+		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);
 	}
 	mImplementationp->mCurrentInterval++;
 
@@ -892,7 +960,7 @@ void LLGroupMoneyTabEventHandler::onClickLater()
 {
 	if ( mImplementationp->mTextEditorp )
 	{
-		mImplementationp->mTextEditorp->setText(LOADING_STRING);
+		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);
 	}
 	mImplementationp->mCurrentInterval--;
 
@@ -932,12 +1000,14 @@ LLGroupMoneyDetailsTabEventHandler::LLGroupMoneyDetailsTabEventHandler(LLButton*
 																	   LLTextEditor* text_editorp,
 																	   LLTabContainerCommon* tab_containerp,
 																	   LLPanel* panelp,
+																	   const LLString& loading_text,
 																	   const LLUUID& group_id)
 	: LLGroupMoneyTabEventHandler(earlier_buttonp,
 								  later_buttonp,
 								  text_editorp,
 								  tab_containerp,
 								  panelp,
+								  loading_text,
 								  group_id,
 								  SUMMARY_INTERVAL,
 								  SUMMARY_MAX)
@@ -964,7 +1034,7 @@ void LLGroupMoneyDetailsTabEventHandler::requestData(LLMessageSystem* msg)
 
 	if ( mImplementationp->mTextEditorp )
 	{
-		mImplementationp->mTextEditorp->setText(LOADING_STRING);
+		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);
 	}
 
 	LLGroupMoneyTabEventHandler::requestData(msg);
@@ -1038,8 +1108,8 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,
 }
 
 //static
-void LLGroupMoneyDetailsTabEventHandler::processGroupAccountDetailsReply(LLMessageSystem* msg, 
-																		 void** data)
+void LLPanelGroupLandMoney::processGroupAccountDetailsReply(LLMessageSystem* msg, 
+															void** data)
 {
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
@@ -1071,12 +1141,14 @@ LLGroupMoneySalesTabEventHandler::LLGroupMoneySalesTabEventHandler(LLButton* ear
 																   LLTextEditor* text_editorp,
 																   LLTabContainerCommon* tab_containerp,
 																   LLPanel* panelp,
+																   const LLString& loading_text,
 																   const LLUUID& group_id)
 	: LLGroupMoneyTabEventHandler(earlier_buttonp,
 								  later_buttonp,
 								  text_editorp,
 								  tab_containerp,
 								  panelp,
+								  loading_text,
 								  group_id,
 								  SUMMARY_INTERVAL,
 								  SUMMARY_MAX)
@@ -1103,7 +1175,7 @@ void LLGroupMoneySalesTabEventHandler::requestData(LLMessageSystem* msg)
 
 	if ( mImplementationp->mTextEditorp )
 	{
-		mImplementationp->mTextEditorp->setText(LOADING_STRING);
+		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);
 	}
 
 	LLGroupMoneyTabEventHandler::requestData(msg);
@@ -1141,7 +1213,7 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,
 
 	// If this is the first packet, clear the text, don't append.
 	// Start with the date.
-	if (text == LOADING_STRING)
+	if (text == mImplementationp->mLoadingText)
 	{
 		text.clear();
 
@@ -1213,8 +1285,8 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,
 }
 
 //static
-void LLGroupMoneySalesTabEventHandler::processGroupAccountTransactionsReply(LLMessageSystem* msg, 
-																			void** data)
+void LLPanelGroupLandMoney::processGroupAccountTransactionsReply(LLMessageSystem* msg, 
+																 void** data)
 {
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
@@ -1247,12 +1319,14 @@ void LLGroupMoneySalesTabEventHandler::processGroupAccountTransactionsReply(LLMe
 LLGroupMoneyPlanningTabEventHandler::LLGroupMoneyPlanningTabEventHandler(LLTextEditor* text_editorp,
 																		 LLTabContainerCommon* tab_containerp,
 																		 LLPanel* panelp,
+																		 const LLString& loading_text,
 																		 const LLUUID& group_id)
 	: LLGroupMoneyTabEventHandler(NULL,
 								  NULL,
 								  text_editorp,
 								  tab_containerp,
 								  panelp,
+								  loading_text,
 								  group_id,
 								  SUMMARY_INTERVAL,
 								  SUMMARY_MAX)
@@ -1279,7 +1353,7 @@ void LLGroupMoneyPlanningTabEventHandler::requestData(LLMessageSystem* msg)
 
 	if ( mImplementationp->mTextEditorp )
 	{
-		mImplementationp->mTextEditorp->setText(LOADING_STRING);
+		mImplementationp->mTextEditorp->setText(mImplementationp->mLoadingText);
 	}
 
 	LLGroupMoneyTabEventHandler::requestData(msg);
@@ -1382,8 +1456,8 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,
 }
 
 //static
-void LLGroupMoneyPlanningTabEventHandler::processGroupAccountSummaryReply(LLMessageSystem* msg, 
-																		  void** data)
+void LLPanelGroupLandMoney::processGroupAccountSummaryReply(LLMessageSystem* msg, 
+															void** data)
 {
 	LLUUID agent_id;
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
diff --git a/indra/newview/llpanelgrouplandmoney.h b/indra/newview/llpanelgrouplandmoney.h
index 319d13a54fb3354fed6d984c936add7a53ed0e8f..83126f9906aa53b0a1085e9b11018ed7dd197724 100644
--- a/indra/newview/llpanelgrouplandmoney.h
+++ b/indra/newview/llpanelgrouplandmoney.h
@@ -59,92 +59,14 @@ public:
 	static void processPlacesReply(LLMessageSystem* msg, void**);
 
 	static LLMap<LLUUID, LLPanelGroupLandMoney*> sGroupIDs;
-protected:
-	class impl;
-	impl* mImplementationp;
-};
-
-class LLGroupMoneyTabEventHandler
-{
-public:
-	LLGroupMoneyTabEventHandler(LLButton* earlier_button,
-								LLButton* later_button,
-								LLTextEditor* text_editor,
-								LLTabContainerCommon* tab_containerp,
-								LLPanel* panelp,
-								const LLUUID& group_id,
-								S32 interval_length_days,
-								S32 max_interval_days);
-	virtual ~LLGroupMoneyTabEventHandler();
 
-	virtual void requestData(LLMessageSystem* msg);
-	virtual void processReply(LLMessageSystem* msg, void** data);
-
-	virtual void onClickEarlier();
-	virtual void onClickLater();
-	virtual void onClickTab();
-
-	static void clickEarlierCallback(void* data);
-	static void clickLaterCallback(void* data);
-	static void clickTabCallback(void* user_data, bool from_click);
-
-	static LLMap<LLUUID, LLGroupMoneyTabEventHandler*> sInstanceIDs;
-	static std::map<LLPanel*, LLGroupMoneyTabEventHandler*> sTabsToHandlers;
+	static void processGroupAccountDetailsReply(LLMessageSystem* msg,  void** data);
+	static void processGroupAccountTransactionsReply(LLMessageSystem* msg, void** data);
+	static void processGroupAccountSummaryReply(LLMessageSystem* msg, void** data);
+	
 protected:
 	class impl;
 	impl* mImplementationp;
 };
 
-class LLGroupMoneyDetailsTabEventHandler : public LLGroupMoneyTabEventHandler
-{
-public:
-	LLGroupMoneyDetailsTabEventHandler(LLButton* earlier_buttonp,
-									   LLButton* later_buttonp,
-									   LLTextEditor* text_editorp,
-									   LLTabContainerCommon* tab_containerp,
-									   LLPanel* panelp,
-									   const LLUUID& group_id);
-	virtual ~LLGroupMoneyDetailsTabEventHandler();
-
-	virtual void requestData(LLMessageSystem* msg);
-	virtual void processReply(LLMessageSystem* msg, void** data);
-
-	static void processGroupAccountDetailsReply(LLMessageSystem* msg, 
-												void** data);
-};
-
-class LLGroupMoneySalesTabEventHandler : public LLGroupMoneyTabEventHandler
-{
-public:
-	LLGroupMoneySalesTabEventHandler(LLButton* earlier_buttonp,
-									 LLButton* later_buttonp,
-									 LLTextEditor* text_editorp,
-									 LLTabContainerCommon* tab_containerp,
-									 LLPanel* panelp,
-									 const LLUUID& group_id);
-	virtual ~LLGroupMoneySalesTabEventHandler();
-
-	virtual void requestData(LLMessageSystem* msg);
-	virtual void processReply(LLMessageSystem* msg, void** data);
-
-	static void processGroupAccountTransactionsReply(LLMessageSystem* msg, 
-													 void** data);
-};
-
-class LLGroupMoneyPlanningTabEventHandler : public LLGroupMoneyTabEventHandler
-{
-public:
-	LLGroupMoneyPlanningTabEventHandler(LLTextEditor* text_editor,
-										LLTabContainerCommon* tab_containerp,
-										LLPanel* panelp,
-										const LLUUID& group_id);
-	virtual ~LLGroupMoneyPlanningTabEventHandler();
-
-	virtual void requestData(LLMessageSystem* msg);
-	virtual void processReply(LLMessageSystem* msg, void** data);
-
-	static void processGroupAccountSummaryReply(LLMessageSystem* msg,
-												void** data);
-};
-
 #endif // LL_PANEL_GROUP_LAND_MONEY_H
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 15aa1ede5c98862625ada80a54fe2cff23b9442f..c7c7912bf2d0f74080320472b4afdb2978a987c6 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -545,8 +545,8 @@ void LLPanelGroupNotices::showNotice(const char* subject,
 {
 	arrangeNoticeView(VIEW_PAST_NOTICE);
 
-	if(mViewSubject) mViewSubject->setText(subject);
-	if(mViewMessage) mViewMessage->setText(message);
+	if(mViewSubject) mViewSubject->setText(LLString(subject));
+	if(mViewMessage) mViewMessage->setText(LLString(message));
 	
 	if (mInventoryOffer)
 	{
diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp
index a5fc9665ec7327943278862e26e61098a1580804..d86f81d21d4f06f2bec1b702c6f5daa963908242 100644
--- a/indra/newview/llpanelland.cpp
+++ b/indra/newview/llpanelland.cpp
@@ -120,8 +120,8 @@ void LLPanelLandInfo::refresh()
 		childSetVisible("label_area_price",false);
 		childSetVisible("label_area",false);
 
-		//mTextPrice->setText("");
-		childSetText("textbox price","");
+		//mTextPrice->setText(LLString::null);
+		childSetText("textbox price",LLString::null);
 
 		childSetEnabled("button buy land",FALSE);
 		childSetEnabled("button abandon land",FALSE);
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index dda8efd1269d7e00b94adc7d810489bd54882b69..292f5c36f8284481fc393964130127d728cf27dc 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -132,8 +132,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	mHtmlAvailable( TRUE )
 {
 	mIsFocusRoot = TRUE;
-	mMungedPassword[0] = '\0';
-	mIncomingPassword[0] = '\0';
 
 	setBackgroundVisible(FALSE);
 	setBackgroundOpaque(TRUE);
@@ -346,7 +344,9 @@ void LLPanelLogin::mungePassword(LLUICtrl* caller, void* user_data)
 	if (password != self->mIncomingPassword)
 	{
 		LLMD5 pass((unsigned char *)password.c_str());
-		pass.hex_digest(self->mMungedPassword);
+		char munged_password[MD5HEX_STR_SIZE];
+		pass.hex_digest(munged_password);
+		self->mMungedPassword = munged_password;
 	}
 }
 
@@ -559,19 +559,20 @@ void LLPanelLogin::setFields(const std::string& firstname, const std::string& la
 		// We don't actually use the password input field, 
 		// fill it with MAX_PASSWORD characters so we get a 
 		// nice row of asterixes.
-		const char* filler = "123456789!123456";
+		const std::string filler("123456789!123456");
 		sInstance->childSetText("password_edit", filler);
-		strcpy(sInstance->mIncomingPassword, filler); 		/*Flawfinder: ignore*/
-		strcpy(sInstance->mMungedPassword, password.c_str());	/*Flawfinder: ignore*/
+		sInstance->mIncomingPassword = filler;
+		sInstance->mMungedPassword = password;
 	}
 	else
 	{
 		// this is a normal text password
 		sInstance->childSetText("password_edit", password);
-		strncpy(sInstance->mIncomingPassword, password.c_str(), sizeof(sInstance->mIncomingPassword) -1);    /*Flawfinder: ignore*/
-                sInstance->mIncomingPassword[sizeof(sInstance->mIncomingPassword) -1] = '\0';
+		sInstance->mIncomingPassword = password;
 		LLMD5 pass((unsigned char *)password.c_str());
-		pass.hex_digest(sInstance->mMungedPassword);
+		char munged_password[MD5HEX_STR_SIZE];
+		pass.hex_digest(munged_password);
+		sInstance->mMungedPassword = munged_password;
 	}
 
 	sInstance->childSetValue("remember_check", remember);
@@ -611,7 +612,7 @@ void LLPanelLogin::getFields(LLString &firstname, LLString &lastname, LLString &
 	lastname = sInstance->childGetText("last_name_edit");
 	LLString::trim(lastname);
 
-	password.assign(  sInstance->mMungedPassword );
+	password = sInstance->mMungedPassword;
 	remember = sInstance->childGetValue("remember_check");
 }
 
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 4d1908df4c06fa9386f6f7d61926862d889f95ac..94e746eb69f5093c80e93e212c683b12bac634df 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -96,8 +96,8 @@ private:
 	void			(*mCallback)(S32 option, void *userdata);
 	void*			mCallbackData;
 
-	char mIncomingPassword[DB_USER_PASSWORD_BUF_SIZE];		/*Flawfinder: ignore*/
-	char mMungedPassword[MD5HEX_STR_SIZE];		/*Flawfinder: ignore*/
+	std::string mIncomingPassword;
+	std::string mMungedPassword;
 
 	static LLPanelLogin* sInstance;
 	static BOOL		sCapslockDidNotification;
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 412ca3b53de7956245c31824de25e573f16689aa..cf507098f7a941cd6bbe1b303d0ae4a2747748d9 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -98,7 +98,7 @@ enum {
 	MI_HOLE_COUNT
 };
 
-//XUI:translate (depricated, so very low priority)
+//*TODO:translate (depricated, so very low priority)
 static const LLString LEGACY_FULLBRIGHT_DESC("Fullbright (Legacy)");
 
 BOOL	LLPanelObject::postBuild()
@@ -163,7 +163,7 @@ BOOL	LLPanelObject::postBuild()
 	mComboMaterial = gUICtrlFactory->getComboBoxByName(this,"material");
 	childSetCommitCallback("material",onCommitMaterial,this);
 	mComboMaterial->removeall();
-	// XUI:translate
+	// *TODO:translate
 	LLMaterialInfo *minfop;
 	for (minfop = LLMaterialTable::basic.mMaterialInfoList.getFirstData(); 
 		 minfop != NULL; 
@@ -509,8 +509,17 @@ void LLPanelObject::getState( )
 #endif
 	
 	// Update material part
-	U8 material_code;
-	BOOL material_same = gSelectMgr->selectionGetMaterial(&material_code);
+	// slightly inefficient - materials are unique per object, not per TE
+	U8 material_code = 0;
+	struct f : public LLSelectedTEGetFunctor<U8>
+	{
+		U8 get(LLViewerObject* object, S32 te)
+		{
+			return object->getMaterial();
+		}
+	} func;
+	bool material_same = gSelectMgr->getSelection()->getSelectedTEValue( &func, material_code );
+	
 	if (editable && single_volume && material_same)
 	{
 		mComboMaterial->setEnabled( TRUE );
@@ -529,7 +538,8 @@ void LLPanelObject::getState( )
 			{
 				mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
 			}
-			mComboMaterial->setSimple(LLMaterialTable::basic.getName(material_code));
+			// *TODO:Translate
+			mComboMaterial->setSimple(LLString(LLMaterialTable::basic.getName(material_code)));
 		}
 	}
 	else
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 5fd80ce80a962951a813e4be778dbb6b94576453..3d5723ed7d779fcf0cca92e58e0f23043af307c3 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -165,33 +165,33 @@ void LLPanelPermissions::refresh()
 	{
 		// ...nothing selected
 		childSetEnabled("perm_modify",false);
-		childSetText("perm_modify","");
+		childSetText("perm_modify",LLString::null);
 
 		childSetEnabled("Creator:",false);
-		childSetText("Creator Name","");
+		childSetText("Creator Name",LLString::null);
 		childSetEnabled("Creator Name",false);
 		childSetEnabled("button creator profile",false);
 
 		childSetEnabled("Owner:",false);
-		childSetText("Owner Name","");
+		childSetText("Owner Name",LLString::null);
 		childSetEnabled("Owner Name",false);
 		childSetEnabled("button owner profile",false);
 
 		childSetEnabled("Group:",false);
-		childSetText("Group Name","");
+		childSetText("Group Name",LLString::null);
 		childSetEnabled("Group Name",false);
 		childSetEnabled("button set group",false);
 
-		childSetText("Object Name","");
+		childSetText("Object Name",LLString::null);
 		childSetEnabled("Object Name",false);
 		childSetEnabled("Name:",false);
-		childSetText("Group Name","");
+		childSetText("Group Name",LLString::null);
 		childSetEnabled("Group Name",false);
 		childSetEnabled("Description:",false);
-		childSetText("Object Description","");
+		childSetText("Object Description",LLString::null);
 		childSetEnabled("Object Description",false);
  
-		childSetText("prim info","");
+		childSetText("prim info",LLString::null);
 		childSetEnabled("prim info",false);
 
 		childSetEnabled("Permissions:",false);
@@ -230,7 +230,7 @@ void LLPanelPermissions::refresh()
 		}
 		
 		childSetEnabled("Price:  L$",false);
-		childSetText("EdCost",false);
+		childSetText("EdCost",LLString::null);
 		childSetEnabled("EdCost",false);
 		
 		childSetEnabled("label click action",false);
@@ -421,7 +421,7 @@ void LLPanelPermissions::refresh()
 	if(!owners_identical)
 	{
 		childSetEnabled("Price:  L$",false);
-		childSetText("EdCost","");
+		childSetText("EdCost",LLString::null);
 		childSetEnabled("EdCost",false);
 	}
 	else if(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE)))
@@ -453,7 +453,7 @@ void LLPanelPermissions::refresh()
 	{
 		// ...public object
 		childSetEnabled("Price:  L$",false);
-		childSetText("EdCost","");
+		childSetText("EdCost",LLString::null);
 		childSetEnabled("EdCost",false);
 	}
 
@@ -501,36 +501,35 @@ void LLPanelPermissions::refresh()
 	
 	if( gSavedSettings.getBOOL("DebugPermissions") )
 	{
-		char perm_string[10];		/*Flawfinder: ignore*/
+		std::string perm_string;
 		if (valid_base_perms)
 		{
-
-			strcpy(perm_string, "B: ");	/*Flawfinder: ignore*/
-			mask_to_string(base_mask_on, perm_string+3);
+			perm_string = "B: ";
+			perm_string += mask_to_string(base_mask_on);
 			childSetText("B:",perm_string);
 			childSetVisible("B:",true);
 			
-			strcpy(perm_string, "O: ");	/*Flawfinder: ignore*/
-			mask_to_string(owner_mask_on, perm_string+3);
+			perm_string = "O: ";
+			perm_string += mask_to_string(owner_mask_on);
 			childSetText("O:",perm_string);
 			childSetVisible("O:",true);
 			
-			strcpy(perm_string, "G: ");	/*Flawfinder: ignore*/
-			mask_to_string(group_mask_on, perm_string+3);
+			perm_string = "G: ";
+			perm_string += mask_to_string(group_mask_on);
 			childSetText("G:",perm_string);
 			childSetVisible("G:",true);
 			
-			strcpy(perm_string, "E: ");	/*Flawfinder: ignore*/
-			mask_to_string(everyone_mask_on, perm_string+3);
+			perm_string = "E: ";
+			perm_string += mask_to_string(everyone_mask_on);
 			childSetText("E:",perm_string);
 			childSetVisible("E:",true);
 			
-			strcpy(perm_string, "N: ");	/*Flawfinder: ignore*/
-			mask_to_string(next_owner_mask_on, perm_string+3);
+			perm_string = "N: ";
+			perm_string += mask_to_string(next_owner_mask_on);
 			childSetText("N:",perm_string);
 			childSetVisible("N:",true);
 		}
-		strcpy(perm_string, "F: ");	/*Flawfinder: ignore*/
+		perm_string = "F: ";
 		U32 flag_mask = 0x0;
 		if (objectp->permMove())
 			flag_mask |= PERM_MOVE;
@@ -540,7 +539,7 @@ void LLPanelPermissions::refresh()
 			flag_mask |= PERM_COPY;
 		if (objectp->permTransfer())
 			flag_mask |= PERM_TRANSFER;
-		mask_to_string(flag_mask, perm_string+3);
+		perm_string += mask_to_string(flag_mask);
 		childSetText("F:",perm_string);
 		childSetVisible("F:",true);
 	}
@@ -572,9 +571,8 @@ void LLPanelPermissions::refresh()
 
 	if (!has_change_perm_ability && !has_change_sale_ability && !root_selected)
 	{
-		// XUI:translate
 		// ...must select root to choose permissions
-		childSetValue("perm_modify", "Must select entire object to set permissions.");
+		childSetValue("perm_modify", childGetText("text modify warning"));
 	}
 
 	if (has_change_perm_ability)
@@ -1027,9 +1025,8 @@ void LLPanelPermissions::setAllSaleInfo()
 	}
 }
 
-class LLSelectionPayable : public LLSelectedObjectFunctor
+struct LLSelectionPayable : public LLSelectedObjectFunctor
 {
-public:
 	virtual bool apply(LLViewerObject* obj)
 	{
 		// can pay if you or your parent has money() event in script
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index 982056c381ae582796344420477a33fec6653808..cd251314d39a6a0a2d59ccbd8deff0e2fa67bb82 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -327,8 +327,7 @@ void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **)
     S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS;
 	S32 region_z = llround((F32)pos_global.mdV[VZ]);
    
-    snprintf(buffer, sizeof(buffer), "%s (%d, %d, %d)", sim_name, region_x, region_y, region_z);			/* Flawfinder: ignore */
-    location_text.append(buffer);
+    location_text.append(llformat("%s (%d, %d, %d)", sim_name, region_x, region_y, region_z));
 
 	S32 sort_order;
     msg->getS32("Data", "SortOrder", sort_order);
@@ -356,14 +355,13 @@ void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **)
 		self->mPosGlobal = pos_global;
 
 		// Update UI controls
-        self->mNameEditor->setText(name);
-        self->mDescEditor->setText(desc);
+        self->mNameEditor->setText(LLString(name));
+        self->mDescEditor->setText(LLString(desc));
         self->mSnapshotCtrl->setImageAssetID(snapshot_id);
         self->mLocationEditor->setText(location_text);
         self->mEnabledCheck->set(enabled);
 
-		snprintf(buffer, sizeof(buffer), "%d", sort_order);			/* Flawfinder: ignore */
-		self->mSortOrderEditor->setText(buffer);
+		self->mSortOrderEditor->setText(llformat("%d", sort_order));
     }
 }
 
diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp
index 696fbe9a4c437b84ebe3fde734214f4994ce4a08..2176fdc7c9883511c6433f0ff1e4c5dc56a742ab 100644
--- a/indra/newview/llpanelplace.cpp
+++ b/indra/newview/llpanelplace.cpp
@@ -156,7 +156,6 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)
 	F32		dwell;
 	S32		sale_price;
 	S32		auction_id;
-	char	buffer[256];		/*Flawfinder: ignore*/
 
 	msg->getUUID("AgentData", "AgentID", agent_id );
 	msg->getUUID("Data", "ParcelID", parcel_id);
@@ -191,29 +190,35 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)
 
 		self->mSnapshotCtrl->setImageAssetID(snapshot_id);
 
-		self->mNameEditor->setText(name);
+		self->mNameEditor->setText(LLString(name));
 
-		self->mDescEditor->setText(desc);
+		self->mDescEditor->setText(LLString(desc));
 
-		LLString info;
-		snprintf(buffer, sizeof(buffer), "Traffic: %.0f, Area: %d sq. m.", dwell, actual_area);			/* Flawfinder: ignore */
-		info.append(buffer);
+		LLString info_text;
+		LLUIString traffic = self->childGetText("traffic_text");
+		traffic.setArg("[TRAFFIC]", llformat("%.0f", dwell));
+		info_text = traffic;
+		LLUIString area = self->childGetText("area_text");
+		traffic.setArg("[AREA]", llformat("%d", actual_area));
+		info_text += area;
 		if (flags & DFQ_FOR_SALE)
 		{
-			snprintf(buffer, sizeof(buffer), ", For Sale for L$%d", sale_price);			/* Flawfinder: ignore */
-			info.append(buffer);
+			LLUIString forsale = self->childGetText("forsale_text");
+			traffic.setArg("[PRICE]", llformat("%d", sale_price));
+			info_text += forsale;
 		}
 		if (auction_id != 0)
 		{
-			snprintf(buffer, sizeof(buffer), ", Auction ID %010d", auction_id);			/* Flawfinder: ignore */
-			info.append(buffer);
+			LLUIString auction = self->childGetText("auction_text");
+			auction.setArg("[ID]", llformat("%010d", auction_id));
+			info_text += auction;
 		}
-		self->mInfoEditor->setText(info);
+		self->mInfoEditor->setText(info_text);
 
 		S32 region_x = llround(global_x) % REGION_WIDTH_UNITS;
 		S32 region_y = llround(global_y) % REGION_WIDTH_UNITS;
 		S32 region_z = llround(global_z);
-		
+
 		// HACK: Flag 0x1 == mature region, otherwise assume PG
 		const char* rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);
 		if (flags & 0x1)
@@ -221,9 +226,9 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)
 			rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);
 		}
 
-		snprintf(buffer, sizeof(buffer), "%s %d, %d, %d (%s)", 			/* Flawfinder: ignore */
-			sim_name, region_x, region_y, region_z, rating);
-		self->mLocationEditor->setText(buffer);
+		LLString location = llformat("%s %d, %d, %d (%s)", 
+									 sim_name, region_x, region_y, region_z, rating);
+		self->mLocationEditor->setText(location);
 
 		BOOL show_auction = (auction_id > 0);
 		self->mAuctionBtn->setVisible(show_auction);
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 1f6d62c85cf4c8ab6b2d52745d3ccfe06e110d08..a9205998e63a8ac3d6d2811e3e9572353c192237 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -69,6 +69,7 @@
 
 #include "llresmgr.h"
 
+// *TODO: Translate?
 const char NONE_LABEL[] = "---";
 const char SHIFT_LABEL[] = "Shift";
 const char CTRL_LABEL[] = "Ctrl";
@@ -761,17 +762,20 @@ void LLPreviewGesture::refresh()
 	mWaitTimeCheck->setVisible(FALSE);
 	mWaitTimeEditor->setVisible(FALSE);
 
+	LLString optionstext;
+	
 	if (have_step)
 	{
 		// figure out the type, show proper options, update text
 		LLGestureStep* step = (LLGestureStep*)step_item->getUserdata();
 		EStepType type = step->getType();
+
 		switch(type)
 		{
 		case STEP_ANIMATION:
 			{
 				LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step;
-				mOptionsText->setText("Animation to play:");
+				optionstext = childGetText("step_anim");
 				mAnimationCombo->setVisible(TRUE);
 				mAnimationRadio->setVisible(TRUE);
 				mAnimationRadio->setSelectedIndex((anim_step->mFlags & ANIM_FLAG_STOP) ? 1 : 0);
@@ -781,7 +785,7 @@ void LLPreviewGesture::refresh()
 		case STEP_SOUND:
 			{
 				LLGestureStepSound* sound_step = (LLGestureStepSound*)step;
-				mOptionsText->setText("Sound to play:");
+				optionstext = childGetText("step_sound");
 				mSoundCombo->setVisible(TRUE);
 				mSoundCombo->setCurrentByID(sound_step->mSoundAssetID);
 				break;
@@ -789,7 +793,7 @@ void LLPreviewGesture::refresh()
 		case STEP_CHAT:
 			{
 				LLGestureStepChat* chat_step = (LLGestureStepChat*)step;
-				mOptionsText->setText("Chat to say:");
+				optionstext = childGetText("step_chat");
 				mChatEditor->setVisible(TRUE);
 				mChatEditor->setText(chat_step->mChatText);
 				break;
@@ -797,14 +801,13 @@ void LLPreviewGesture::refresh()
 		case STEP_WAIT:
 			{
 				LLGestureStepWait* wait_step = (LLGestureStepWait*)step;
-				mOptionsText->setText("Wait:");
+				optionstext = childGetText("step_wait");
 				mWaitAnimCheck->setVisible(TRUE);
 				mWaitAnimCheck->set(wait_step->mFlags & WAIT_FLAG_ALL_ANIM);
 				mWaitTimeCheck->setVisible(TRUE);
 				mWaitTimeCheck->set(wait_step->mFlags & WAIT_FLAG_TIME);
 				mWaitTimeEditor->setVisible(TRUE);
-				char buffer[16];		/*Flawfinder: ignore*/
-				snprintf(buffer, sizeof(buffer),  "%.1f", (double)wait_step->mWaitSeconds);			/* Flawfinder: ignore */
+				std::string buffer = llformat("%.1f", (double)wait_step->mWaitSeconds);
 				mWaitTimeEditor->setText(buffer);
 				break;
 			}
@@ -812,11 +815,8 @@ void LLPreviewGesture::refresh()
 			break;
 		}
 	}
-	else
-	{
-		// no gesture
-		mOptionsText->setText("");
-	}
+	
+	mOptionsText->setText(optionstext);
 
 	BOOL active = gGestureManager.isGestureActive(mItemUUID);
 	mActiveCheck->set(active);
@@ -984,14 +984,14 @@ void LLPreviewGesture::loadUIFromGesture(LLMultiGesture* gesture)
 	switch (gesture->mMask)
 	{
 	default:
-	case MASK_NONE:
-		mModifierCombo->setSimple( NONE_LABEL );
+	  case MASK_NONE:
+		mModifierCombo->setSimple( LLString(NONE_LABEL) );
 		break;
-	case MASK_SHIFT:
-		mModifierCombo->setSimple( SHIFT_LABEL );
+	  case MASK_SHIFT:
+		mModifierCombo->setSimple( LLString(SHIFT_LABEL) );
 		break;
-	case MASK_CONTROL:
-		mModifierCombo->setSimple( CTRL_LABEL );
+	  case MASK_CONTROL:
+		mModifierCombo->setSimple( LLString(CTRL_LABEL) );
 		break;
 	}
 
@@ -1734,8 +1734,7 @@ void LLPreviewGesture::onClickPreview(void* data)
 		self->mPreviewGesture->mCallbackData = self;
 
 		// set the button title
-		self->mPreviewBtn->setLabelSelected("Stop");
-		self->mPreviewBtn->setLabelUnselected("Stop");
+		self->mPreviewBtn->setLabel(self->childGetText("stop_txt"));
 
 		// play it, and delete when done
 		gGestureManager.playGesture(self->mPreviewGesture);
@@ -1757,8 +1756,7 @@ void LLPreviewGesture::onDonePreview(LLMultiGesture* gesture, void* data)
 {
 	LLPreviewGesture* self = (LLPreviewGesture*)data;
 
-	self->mPreviewBtn->setLabelSelected("Preview");
-	self->mPreviewBtn->setLabelUnselected("Preview");
+	self->mPreviewBtn->setLabel(self->childGetText("preview_txt"));
 
 	delete self->mPreviewGesture;
 	self->mPreviewGesture = NULL;
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index ccd975addc6b5370e69c918d3df26ddd2a3c607f..620be8f8c65f6ed547bfbebf8e9e8a8176470bd2 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -281,7 +281,7 @@ void LLPreviewNotecard::loadAsset()
 			mAssetID = item->getAssetUUID();
 			if(mAssetID.isNull())
 			{
-				editor->setText("");
+				editor->setText(LLString::null);
 				editor->makePristine();
 				editor->setEnabled(TRUE);
 				mAssetStatus = PREVIEW_ASSET_LOADED;
@@ -302,7 +302,7 @@ void LLPreviewNotecard::loadAsset()
 						// The object that we're trying to look at disappeared, bail.
 						llwarns << "Can't find object " << mObjectUUID << " associated with notecard." << llendl;
 						mAssetID.setNull();
-						editor->setText("Unable to find object containing this note.");
+						editor->setText(childGetText("no_object"));
 						editor->makePristine();
 						editor->setEnabled(FALSE);
 						mAssetStatus = PREVIEW_ASSET_LOADED;
@@ -327,7 +327,7 @@ void LLPreviewNotecard::loadAsset()
 		else
 		{
 			mAssetID.setNull();
-			editor->setText("You are not allowed to view this note.");
+			editor->setText(childGetText("not_allowed"));
 			editor->makePristine();
 			editor->setEnabled(FALSE);
 			mAssetStatus = PREVIEW_ASSET_LOADED;
@@ -341,7 +341,7 @@ void LLPreviewNotecard::loadAsset()
 	}
 	else
 	{
-		editor->setText("");
+		editor->setText(LLString::null);
 		editor->makePristine();
 		editor->setEnabled(TRUE);
 		mAssetStatus = PREVIEW_ASSET_LOADED;
@@ -384,7 +384,7 @@ void LLPreviewNotecard::onLoadComplete(LLVFS *vfs,
 			else
 			{
 				// Version 0 (just text, doesn't include version number)
-				previewEditor->setText(buffer);
+				previewEditor->setText(LLStringExplicit(buffer));
 			}
 
 			previewEditor->makePristine();
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index acaa666efa3b9c4381964ad6db4c1c71533584f5..7eac589640c6d7892d81cf829ab3ef0fb32a977a 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -103,11 +103,8 @@ const char HELLO_LSL[] =
 	"}\n";
 const char HELP_LSL[] = "lsl_guide.html";
 
-const char DEFAULT_SCRIPT_NAME[] = "New Script";
-const char DEFAULT_SCRIPT_DESC[] = "(No Description)";
-
-const char ENABLED_RUNNING_CHECKBOX_LABEL[] = "Running";
-const char DISABLED_RUNNING_CHECKBOX_LABEL[] = "Public Objects cannot run scripts";
+const char DEFAULT_SCRIPT_NAME[] = "New Script"; // *TODO:Translate?
+const char DEFAULT_SCRIPT_DESC[] = "(No Description)"; // *TODO:Translate?
 
 // Description and header information
 
@@ -321,7 +318,6 @@ LLScriptEdCore::LLScriptEdCore(
 	mFunctions = LLUICtrlFactory::getComboBoxByName(this, "Insert...");
 	
 	childSetCommitCallback("Insert...", &LLScriptEdCore::onBtnInsertFunction, this);
-	mFunctions->setLabel("Insert...");
 
 	mEditor = LLViewerUICtrlFactory::getViewerTextEditorByName(this, "Script Editor");
 	mEditor->setReadOnlyBgColor(gColors.getColor( "ScriptBgReadOnlyColor" ) );
@@ -456,13 +452,13 @@ void LLScriptEdCore::draw()
 		S32 line = 0;
 		S32 column = 0;
 		mEditor->getCurrentLineAndColumn( &line, &column, FALSE );  // don't include wordwrap
-		char cursor_pos[STD_STRING_BUF_SIZE];		/*Flawfinder: ignore*/
-		snprintf( cursor_pos, STD_STRING_BUF_SIZE, "Line %d, Column %d", line, column );			/* Flawfinder: ignore */
+		std::string cursor_pos;
+		cursor_pos = llformat("Line %d, Column %d", line, column );
 		childSetText("line_col", cursor_pos);
 	}
 	else
 	{
-		childSetText("line_col", "");
+		childSetText("line_col", LLString::null);
 	}
 
 	updateDynamicHelp();
@@ -985,7 +981,7 @@ void LLScriptEdCore::handleReloadFromServerDialog( S32 option, void* userdata )
 	case 0: // "Yes"
 		if( self->mLoadCallback )
 		{
-			self->mEditor->setText( "Loading..." );
+			self->mEditor->setText( self->childGetText("loading") );
 			self->mLoadCallback( self->mUserdata );
 		}
 		break;
@@ -1199,7 +1195,7 @@ void LLPreviewLSL::loadAsset()
 		}
 		else
 		{
-			mScriptEd->mEditor->setText("You are not allowed to view this script.");
+			mScriptEd->mEditor->setText(mScriptEd->childGetText("can_not_view"));
 			mScriptEd->mEditor->makePristine();
 			mScriptEd->mEditor->setEnabled(FALSE);
 			mScriptEd->mFunctions->setEnabled(FALSE);
@@ -1210,7 +1206,7 @@ void LLPreviewLSL::loadAsset()
 	}
 	else
 	{
-		mScriptEd->mEditor->setText(HELLO_LSL);
+		mScriptEd->mEditor->setText(LLString(HELLO_LSL));
 		mAssetStatus = PREVIEW_ASSET_LOADED;
 	}
 }
@@ -1517,7 +1513,7 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset
 
 			// put a EOS at the end
 			buffer[file_length] = 0;
-			preview->mScriptEd->mEditor->setText(buffer);
+			preview->mScriptEd->mEditor->setText(LLStringExplicit(buffer));
 			preview->mScriptEd->mEditor->makePristine();
 			delete [] buffer;
 			LLInventoryItem* item = gInventory.getItem(*item_uuid);
@@ -1731,7 +1727,7 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new)
 					   || !gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))))
 			{
 				mItem = new LLViewerInventoryItem(item);
-				mScriptEd->mEditor->setText("You are not allowed to view this script.");
+				mScriptEd->mEditor->setText(childGetText("not_allowed"));
 				mScriptEd->mEditor->makePristine();
 				mScriptEd->mEditor->setEnabled(FALSE);
 				mAssetStatus = PREVIEW_ASSET_LOADED;
@@ -1762,7 +1758,7 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new)
 			}
 			else
 			{
-				mScriptEd->mEditor->setText("");
+				mScriptEd->mEditor->setText(LLString::null);
 				mScriptEd->mEditor->makePristine();
 				mAssetStatus = PREVIEW_ASSET_LOADED;
 			}
@@ -1797,7 +1793,7 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new)
 			// This may be better than having a accessible null pointer around,
 			// though this newly allocated object will most likely be replaced.
 			mItem = new LLViewerInventoryItem();
-			mScriptEd->mEditor->setText("");
+			mScriptEd->mEditor->setText(LLString::null);
 			mScriptEd->mEditor->makePristine();
 			mScriptEd->mEditor->setEnabled(FALSE);
 			mAssetStatus = PREVIEW_ASSET_LOADED;
@@ -1805,8 +1801,8 @@ void LLLiveLSLEditor::loadAsset(BOOL is_new)
 	}
 	else
 	{
-		mScriptEd->mEditor->setText(HELLO_LSL);
-		//mScriptEd->mEditor->setText("");
+		mScriptEd->mEditor->setText(LLString(HELLO_LSL));
+		//mScriptEd->mEditor->setText(LLString::null);
 		//mScriptEd->mEditor->makePristine();
 		LLPermissions perm;
 		perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, gAgent.getGroupID());
@@ -1893,7 +1889,7 @@ void LLLiveLSLEditor::loadScriptText(const char* filename)
 		}
 		buffer[nread] = '\0';
 		fclose(file);
-		mScriptEd->mEditor->setText(buffer);
+		mScriptEd->mEditor->setText(LLStringExplicit(buffer));
 		mScriptEd->mEditor->makePristine();
 		delete[] buffer;
 	}
@@ -1918,7 +1914,7 @@ void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType
 
 	buffer[file_length] = '\0';
 
-	mScriptEd->mEditor->setText(buffer);
+	mScriptEd->mEditor->setText(LLStringExplicit(buffer));
 	mScriptEd->mEditor->makePristine();
 	delete[] buffer;
 
@@ -1985,12 +1981,12 @@ void LLLiveLSLEditor::draw()
 		{
 			if(object->permAnyOwner())
 			{
-				runningCheckbox->setLabel(ENABLED_RUNNING_CHECKBOX_LABEL);
+				runningCheckbox->setLabel(childGetText("script_running"));
 				runningCheckbox->setEnabled(TRUE);
 			}
 			else
 			{
-				runningCheckbox->setLabel(DISABLED_RUNNING_CHECKBOX_LABEL);
+				runningCheckbox->setLabel(childGetText("public_objects_can_not_run"));
 				runningCheckbox->setEnabled(FALSE);
 				// *FIX: Set it to false so that the ui is correct for
 				// a box that is released to public. It could be
@@ -2238,7 +2234,7 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename,
 
 	// If we successfully saved it, then we should be able to check/uncheck the running box!
 	LLCheckBoxCtrl* runningCheckbox = LLUICtrlFactory::getCheckBoxByName(this, "running");
-	runningCheckbox->setLabel(ENABLED_RUNNING_CHECKBOX_LABEL);
+	runningCheckbox->setLabel(childGetText("script_running"));
 	runningCheckbox->setEnabled(TRUE);
 }
 
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index b7bde1cc8a8ab9daaae32d441e44d29221b27d94..af16a4d3fa2ca969d9e88968b5e47396ef6b0ead 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -212,6 +212,11 @@ LLSelectMgr::LLSelectMgr()
 // ~LLSelectMgr()
 //-----------------------------------------------------------------------------
 LLSelectMgr::~LLSelectMgr()
+{
+	clearSelections();
+}
+
+void LLSelectMgr::clearSelections()
 {
 	mHoverObjects->deleteAllNodes();
 	mSelectedObjects->deleteAllNodes();
@@ -220,21 +225,27 @@ LLSelectMgr::~LLSelectMgr()
 	mGridObjects.deleteAllNodes();
 }
 
-void LLSelectMgr::updateEffects()
+void LLSelectMgr::update()
 {
+	mSelectedObjects->cleanupNodes();
+}
 
+void LLSelectMgr::updateEffects()
+{
 	//keep reference grid objects active
-	for (LLSelectNode* grid_nodep = mGridObjects.getFirstNode();
-		grid_nodep;
-		grid_nodep = mGridObjects.getNextNode())
+	struct f : public LLSelectedObjectFunctor
 	{
-		LLViewerObject* grid_object = grid_nodep->getObject();
-		LLDrawable* drawable = grid_object->mDrawable;
-		if (drawable)
+		virtual bool apply(LLViewerObject* object)
 		{
-			gPipeline.markMoved(drawable);
+			LLDrawable* drawable = object->mDrawable;
+			if (drawable)
+			{
+				gPipeline.markMoved(drawable);
+			}
+			return true;
 		}
-	}
+	} func;
+	mGridObjects.applyToObjects(&func);
 
 	if (mEffectsTimer.getElapsedTimeF32() > 1.f)
 	{
@@ -246,29 +257,30 @@ void LLSelectMgr::updateEffects()
 void LLSelectMgr::overrideObjectUpdates()
 {
 	//override any position updates from simulator on objects being edited
-	LLSelectNode* selectNode;
-	for (selectNode = gSelectMgr->getSelection()->getFirstNode();
-		 selectNode != NULL;
-		 selectNode = gSelectMgr->getSelection()->getNextNode())
+	struct f : public LLSelectedNodeFunctor
 	{
-		LLViewerObject* object = selectNode->getObject();
-		
-		if (object->permMove())
+		virtual bool apply(LLSelectNode* selectNode)
 		{
-			if (!selectNode->mLastPositionLocal.isExactlyZero())
-			{
-				object->setPosition(selectNode->mLastPositionLocal);
-			}
-			if (selectNode->mLastRotation != LLQuaternion())
-			{
-				object->setRotation(selectNode->mLastRotation);
-			}
-			if (!selectNode->mLastScale.isExactlyZero())
+			LLViewerObject* object = selectNode->getObject();
+			if (object->permMove())
 			{
-				object->setScale(selectNode->mLastScale);
+				if (!selectNode->mLastPositionLocal.isExactlyZero())
+				{
+					object->setPosition(selectNode->mLastPositionLocal);
+				}
+				if (selectNode->mLastRotation != LLQuaternion())
+				{
+					object->setRotation(selectNode->mLastRotation);
+				}
+				if (!selectNode->mLastScale.isExactlyZero())
+				{
+					object->setScale(selectNode->mLastScale);
+				}
 			}
+			return true;
 		}
-	}
+	} func;
+	getSelection()->applyToNodes(&func);
 }
 
 //-----------------------------------------------------------------------------
@@ -417,24 +429,26 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj,
 //-----------------------------------------------------------------------------
 // Select the object, parents and children.
 //-----------------------------------------------------------------------------
-LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list,
-										BOOL send_to_sim)
+LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const std::vector<LLViewerObject*>& object_list,
+														   BOOL send_to_sim)
 {
 	// Collect all of the objects, children included
 	LLDynamicArray<LLViewerObject*> objects;
-	LLViewerObject *object;
-	S32 i;
 
 	//clear primary object (no primary object)
 	mSelectedObjects->mPrimaryObject = NULL;
 
-	if (object_list.count() < 1) return NULL;
-
+	if (object_list.size() < 1)
+	{
+		return NULL;
+	}
+	
 	// NOTE -- we add the objects in REVERSE ORDER 
 	// to preserve the order in the mSelectedObjects list
-	for (i = object_list.count() - 1; i >= 0; i--)
+	for (std::vector<LLViewerObject*>::const_reverse_iterator riter = object_list.rbegin();
+		 riter != object_list.rend(); ++riter)
 	{
-		object = object_list.get(i);
+		LLViewerObject *object = *riter;
 
 		llassert( object );
 
@@ -506,44 +520,30 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)
 	// Iterate through selected objects list and kill the object
 	if( !object_found )
 	{
-		LLViewerObject* prevobjp = NULL;
-		for( LLViewerObject* tobjp = mSelectedObjects->getFirstObject(); tobjp != NULL; tobjp = mSelectedObjects->getNextObject() )
+		for (LLObjectSelection::iterator iter = getSelection()->begin();
+			 iter != getSelection()->end(); )
 		{
-			if (tobjp == prevobjp)
-			{
-				// Somehow we got stuck in an infinite loop... (DaveP)
-				//  this logic is kind of twisted, not sure how this is happening, so...
-				llwarns << "Detected infinite loop #1 in LLSelectMgr::removeObjectFromSelections:|" << llendl;
-				//MikeS. adding warning and comment...
-				//These infinite loops happen because the LLSelectMgr iteration routines are non-reentrant.
-				//deselectObjectAndFamily uses getFirstObject and getNextObject to mess with the array,
-				//resetting the arrays internal iterator state. This needs fixing BAD.
-				continue;
-			}
-			// It's possible the item being removed has an avatar sitting on it
-			// So remove the avatar that is sitting on the object.
-			if (tobjp->mID == id || tobjp->isAvatar())
+			LLObjectSelection::iterator curiter = iter++;
+			LLViewerObject* object = (*curiter)->getObject();
+			if (object->mID == id)
 			{
-				if (!gNoRender)
+				if (tool)
 				{
 					tool->stopEditing();
 				}
 
 				// lose the selection, don't tell simulator, it knows
-				deselectObjectAndFamily(tobjp, FALSE);
-
-				if (tobjp->mID == id)
-				{
-					if(object_found == TRUE){
-						//MikeS. adding warning... This happens when removing a linked attachment while sitting on an object..
-						//I think the selection manager needs to be rewritten. BAD.
-						llwarns << "Detected infinite loop #2 in LLSelectMgr::removeObjectFromSelections:|" << llendl;
-						break;
-					}
-					object_found = TRUE;
-				}
+				deselectObjectAndFamily(object, FALSE);
+				object_found = TRUE;
+				break; // must break here, may have removed multiple objects from list
+			}
+			else if (object->isAvatar())
+			{
+				// It's possible the item being removed has an avatar sitting on it
+				// So remove the avatar that is sitting on the object.
+				deselectObjectAndFamily(object, FALSE);
+				break; // must break here, may have removed multiple objects from list
 			}
-			prevobjp = tobjp;
 		}
 	}
 
@@ -596,7 +596,7 @@ void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_s
 	S32 select_count = 0;
 
 	LLMessageSystem* msg = gMessageSystem;
-	for (S32 i = 0; i < objects.count(); i++)
+	for (U32 i = 0; i < objects.size(); i++)
 	{
 		if (start_new_message)
 		{
@@ -659,15 +659,12 @@ void LLSelectMgr::deselectObjectOnly(LLViewerObject* object, BOOL send_to_sim)
 // addAsFamily
 //-----------------------------------------------------------------------------
 
-void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add_to_end)
+void LLSelectMgr::addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to_end)
 {
-	S32 count = objects.count();
-	LLViewerObject *objectp = NULL;
-
-	LLSelectNode *nodep = NULL;
-	for (S32 i = 0; i < count; i++)
+	for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
+		 iter != objects.end(); ++iter)
 	{
-		objectp = objects.get(i);
+		LLViewerObject* objectp = *iter;
 		
 		// Can't select yourself
 		if (objectp->mID == gAgentID
@@ -678,7 +675,7 @@ void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add
 
 		if (!objectp->isSelected())
 		{
-			nodep = new LLSelectNode(objectp, TRUE);
+			LLSelectNode *nodep = new LLSelectNode(objectp, TRUE);
 			if (add_to_end)
 			{
 				mSelectedObjects->addNodeAtEnd(nodep);
@@ -725,14 +722,14 @@ void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoab
 	{
 		nodep = new LLSelectNode(objectp, TRUE);
 		mSelectedObjects->addNode(nodep);
+		llassert_always(nodep->getObject());
 	}
 	else
 	{
 		// make this a full-fledged selection
 		nodep->setTransient(FALSE);
 		// Move it to the front of the list
-		mSelectedObjects->removeNode(nodep);
-		mSelectedObjects->addNode(nodep);
+		mSelectedObjects->moveNodeToFront(nodep);
 	}
 
 	// Make sure the object is tagged as selected
@@ -793,14 +790,11 @@ LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp)
 	objectp = objectp->getRootEdit();
 	objectp->addThisAndNonJointChildren(objects);
 
-
-	S32 count = objects.count();
-	LLViewerObject* cur_objectp = NULL;
-	LLSelectNode* nodep = NULL;
-	for(S32 i = 0; i < count; i++)
+	for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
+		 iter != objects.end(); ++iter)
 	{
-		cur_objectp = objects[i];
-		nodep = new LLSelectNode(cur_objectp, FALSE);
+		LLViewerObject* cur_objectp = *iter;
+		LLSelectNode* nodep = new LLSelectNode(cur_objectp, FALSE);
 		mHoverObjects->addNodeAtEnd(nodep);
 	}
 
@@ -853,28 +847,30 @@ void LLSelectMgr::highlightObjectAndFamily(LLViewerObject* objectp)
 }
 
 // Note that this ignores the "select owned only" flag
-// It's also more efficient than calling the single-object version over and
-// over.
-void LLSelectMgr::highlightObjectAndFamily(const LLDynamicArray<LLViewerObject*>& list)
+// It's also more efficient than calling the single-object version over and over.
+void LLSelectMgr::highlightObjectAndFamily(const std::vector<LLViewerObject*>& objects)
 {
-	S32 i;
-	S32 count = list.count();
-
-	for (i = 0; i < count; i++)
+	for (std::vector<LLViewerObject*>::const_iterator iter1 = objects.begin();
+		 iter1 != objects.end(); ++iter1)
 	{
-		LLViewerObject* object = list.get(i);
+		LLViewerObject* object = *iter1;
 
-		if (!object) continue;
-		if (object->getPCode() != LL_PCODE_VOLUME) continue;
+		if (!object)
+		{
+			continue;
+		}
+		if (object->getPCode() != LL_PCODE_VOLUME)
+		{
+			continue;
+		}
 
 		LLViewerObject* root = (LLViewerObject*)object->getRoot();
 		mRectSelectedObjects.insert(root);
 
-		S32 j;
-		S32 child_count = root->mChildList.size();
-		for (j = 0; j < child_count; j++)
+		for (LLViewerObject::child_list_t::const_iterator iter2 = root->mChildList.begin();
+			 iter2 != root->mChildList.end(); ++iter2)
 		{
-			LLViewerObject* child = root->mChildList[j];
+			LLViewerObject* child = *iter2;
 			mRectSelectedObjects.insert(child);
 		}
 	}
@@ -901,9 +897,11 @@ void LLSelectMgr::unhighlightObjectAndFamily(LLViewerObject* objectp)
 
 	unhighlightObjectOnly(root_obj);
 
-	for(U32 i = 0; i < root_obj->mChildList.size(); i++)
+	for (LLViewerObject::child_list_t::iterator iter2 = root_obj->mChildList.begin();
+		 iter2 != root_obj->mChildList.end(); ++iter2)
 	{
-		unhighlightObjectOnly(root_obj->mChildList[i]);
+		LLViewerObject* child = *iter2;
+		unhighlightObjectOnly(child);
 	}
 }
 
@@ -924,11 +922,12 @@ LLObjectSelectionHandle LLSelectMgr::selectHighlightedObjects()
 	//clear primary object
 	mSelectedObjects->mPrimaryObject = NULL;
 
-	LLSelectNode *nodep;
-	for (nodep = mHighlightedObjects->getFirstNode();
-		nodep;
-		nodep = mHighlightedObjects->getNextNode())
+	for (LLObjectSelection::iterator iter = getHighlightedObjects()->begin();
+		 iter != getHighlightedObjects()->end(); )
 	{
+		LLObjectSelection::iterator curiter = iter++;
+	
+		LLSelectNode *nodep = *curiter;
 		LLViewerObject* objectp = nodep->getObject();
 
 		if (!canSelectObject(objectp))
@@ -1000,9 +999,12 @@ void LLSelectMgr::addGridObject(LLViewerObject* objectp)
 {
 	LLSelectNode* nodep = new LLSelectNode(objectp, FALSE);
 	mGridObjects.addNodeAtEnd(nodep);
-	for (U32 i = 0; i < objectp->mChildList.size(); i++)
+
+	for (LLViewerObject::child_list_t::iterator iter2 = objectp->mChildList.begin();
+		 iter2 != objectp->mChildList.end(); ++iter2)
 	{
-		nodep = new LLSelectNode(objectp->mChildList[i], FALSE);
+		LLViewerObject* child = *iter2;
+		nodep = new LLSelectNode(child, FALSE);
 		mGridObjects.addNodeAtEnd(nodep);
 	}
 }
@@ -1022,14 +1024,9 @@ void LLSelectMgr::setGridMode(EGridMode mode)
 
 void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &scale)
 {
-	LLSelectNode* grid_node = mGridObjects.getFirstNode();
-	LLViewerObject* grid_object = mGridObjects.getFirstObject();
-	// *TODO: get to work with multiple grid objects
-	if (grid_node && grid_node->getObject()->isDead())
-	{
-		mGridObjects.removeNode(grid_node);
-		grid_object = NULL;
-	}
+	mGridObjects.cleanupNodes();
+	
+	LLViewerObject* first_grid_object = mGridObjects.getFirstObject();
 
 	if (mGridMode == GRID_MODE_LOCAL && mSelectedObjects->getObjectCount())
 	{
@@ -1038,47 +1035,42 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
 		mGridRotation = mSavedSelectionBBox.getRotation();
 		mGridScale = mSavedSelectionBBox.getExtentLocal() * 0.5f;
 	}
-	else if (mGridMode == GRID_MODE_REF_OBJECT && grid_object && grid_object->mDrawable.notNull())
+	else if (mGridMode == GRID_MODE_REF_OBJECT && first_grid_object && first_grid_object->mDrawable.notNull())
 	{
-		mGridRotation = grid_object->getRenderRotation();
-		LLVector3 first_grid_obj_pos = grid_object->getRenderPosition();
+		mGridRotation = first_grid_object->getRenderRotation();
+		LLVector3 first_grid_obj_pos = first_grid_object->getRenderPosition();
 
 		LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX);
-		LLVector3 max_extents(-min_extents);
+		LLVector3 max_extents(-F32_MAX, -F32_MAX, -F32_MAX);
 		BOOL grid_changed = FALSE;
-		LLSelectNode* grid_nodep;
-		for (grid_nodep = mGridObjects.getFirstNode();
-			grid_nodep;
-			grid_nodep = mGridObjects.getNextNode())
+		for (LLObjectSelection::iterator iter = mGridObjects.begin();
+			 iter != mGridObjects.end(); ++iter)
+		{
+			LLViewerObject* object = (*iter)->getObject();
+			LLDrawable* drawable = object->mDrawable;
+			if (drawable)
 			{
-				grid_object = grid_nodep->getObject();
-				LLDrawable* drawable = grid_object->mDrawable;
-				if (drawable)
-				{
-					const LLVector3* ext = drawable->getSpatialExtents();
-					update_min_max(min_extents, max_extents, ext[0]);
-					update_min_max(min_extents, max_extents, ext[1]);
-					grid_changed = TRUE;
-				}
+				const LLVector3* ext = drawable->getSpatialExtents();
+				update_min_max(min_extents, max_extents, ext[0]);
+				update_min_max(min_extents, max_extents, ext[1]);
+				grid_changed = TRUE;
 			}
+		}
 		if (grid_changed)
 		{
 			mGridOrigin = lerp(min_extents, max_extents, 0.5f);
-			LLDrawable* drawable = grid_object->mDrawable;
+			LLDrawable* drawable = first_grid_object->mDrawable;
 			if (drawable && drawable->isActive())
 			{
-				mGridOrigin = mGridOrigin * grid_object->getRenderMatrix();
+				mGridOrigin = mGridOrigin * first_grid_object->getRenderMatrix();
 			}
 			mGridScale = (max_extents - min_extents) * 0.5f;
 		}
 	}
 	else // GRID_MODE_WORLD or just plain default
 	{
-		LLViewerObject* first_object = mSelectedObjects->getFirstRootObject();
-		if (!first_object)
-		{
-			first_object = mSelectedObjects->getFirstObject();
-		}
+		const BOOL non_root_ok = TRUE;
+		LLViewerObject* first_object = mSelectedObjects->getFirstRootObject(non_root_ok);
 
 		mGridOrigin.clearVec();
 		mGridRotation.loadIdentity();
@@ -1118,26 +1110,20 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
 // remove() - an array of objects
 //-----------------------------------------------------------------------------
 
-void LLSelectMgr::remove(LLDynamicArray<LLViewerObject*>& objects)
+void LLSelectMgr::remove(std::vector<LLViewerObject*>& objects)
 {
-	S32 count = objects.count();
-	LLViewerObject *objectp = NULL;
-	LLSelectNode *nodep = NULL;
-	for(S32 i = 0; i < count; i++)
+	for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
+		 iter != objects.end(); ++iter)
 	{
-		objectp = objects.get(i);
-		for(nodep = mSelectedObjects->getFirstNode();
-			nodep != NULL;
-			nodep = mSelectedObjects->getNextNode())
+		LLViewerObject* objectp = *iter;
+		LLSelectNode* nodep = mSelectedObjects->findNode(objectp);
+		if (nodep)
 		{
-			if(nodep->getObject() == objectp)
-			{
-				objectp->setSelected(FALSE);
-				mSelectedObjects->removeNode(nodep);
-				break;
-			}
+			objectp->setSelected(FALSE);
+			mSelectedObjects->removeNode(nodep);
+			nodep = NULL;
 		}
-			}
+	}
 	updateSelectionCenter();
 	dialog_refresh_all();
 }
@@ -1148,26 +1134,19 @@ void LLSelectMgr::remove(LLDynamicArray<LLViewerObject*>& objects)
 //-----------------------------------------------------------------------------
 void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)
 {
-	// check if object already in list
-	// *FIX: can we just check isSelected()?
+	// get object node (and verify it is in the selected list)
 	LLSelectNode *nodep = mSelectedObjects->findNode(objectp);
-
 	if (!nodep)
 	{
 		return;
 	}
 
-
 	// if face = all, remove object from list
-	if (objectp->getNumTEs() <= 0)
-	{
-		// object doesn't have faces, so blow it away
-		mSelectedObjects->removeNode(nodep);
-		objectp->setSelected( FALSE );
-	}
-	else if (te == SELECT_ALL_TES)
+	if ((objectp->getNumTEs() <= 0) || (te == SELECT_ALL_TES))
 	{
+		// Remove all faces (or the object doesn't have faces) so remove the node
 		mSelectedObjects->removeNode(nodep);
+		nodep = NULL;
 		objectp->setSelected( FALSE );
 	}
 	else if (0 <= te && te < SELECT_MAX_TES)
@@ -1194,9 +1173,9 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)
 		if (!found)
 		{
 			mSelectedObjects->removeNode(nodep);
+			nodep = NULL;
 			objectp->setSelected( FALSE );
-
-			// BUG: Doesn't update simulator that object is gone.
+			// *FIXME: Doesn't update simulator that object is no longer selected
 		}
 	}
 	else
@@ -1215,14 +1194,15 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)
 //-----------------------------------------------------------------------------
 void LLSelectMgr::removeAll()
 {
-	LLViewerObject *objectp;
-	for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject() )
+	for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
+		 iter != mSelectedObjects->end(); iter++ )
 	{
+		LLViewerObject *objectp = (*iter)->getObject();
 		objectp->setSelected( FALSE );
 	}
 
 	mSelectedObjects->deleteAllNodes();
-
+	
 	updateSelectionCenter();
 	dialog_refresh_all();
 }
@@ -1236,19 +1216,19 @@ void LLSelectMgr::promoteSelectionToRoot()
 
 	BOOL selection_changed = FALSE;
 
-	LLSelectNode* nodep;
-	LLViewerObject *objectp;
-	for (nodep = mSelectedObjects->getFirstNode(); 
-		 nodep; 
-		 nodep = mSelectedObjects->getNextNode() )
+	for (LLObjectSelection::iterator iter = getSelection()->begin();
+		 iter != getSelection()->end(); )
 	{
+		LLObjectSelection::iterator curiter = iter++;
+		LLSelectNode* nodep = *curiter;
+		LLViewerObject* object = nodep->getObject();
+
 		if (nodep->mIndividualSelection)
 		{
 			selection_changed = TRUE;
 		}
 
-		objectp = nodep->getObject();
-		LLViewerObject* parentp = objectp;
+		LLViewerObject* parentp = object;
 		while(parentp->getParent() && !(parentp->isRootEdit() || parentp->isJointChild()))
 		{
 			parentp = (LLViewerObject*)parentp->getParent();
@@ -1276,19 +1256,21 @@ void LLSelectMgr::demoteSelectionToIndividuals()
 {
 	LLDynamicArray<LLViewerObject*> objects;
 
-	for (LLViewerObject* root_objectp = mSelectedObjects->getFirstRootObject();
-		root_objectp;
-		root_objectp = mSelectedObjects->getNextRootObject())
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++)
 	{
-		root_objectp->addThisAndNonJointChildren(objects);
+		LLViewerObject* object = (*iter)->getObject();
+		object->addThisAndNonJointChildren(objects);
 	}
 
 	if (objects.getLength())
 	{
 		deselectAll();
-		for(S32 i = 0; i < objects.count(); i++)
+		for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
+			 iter != objects.end(); ++iter)
 		{
-			selectObjectOnly(objects[i]);
+			LLViewerObject* objectp = *iter;
+			selectObjectOnly(objectp);
 		}
 	}
 }
@@ -1302,14 +1284,12 @@ void LLSelectMgr::dump()
 
 	llinfos << "TE mode " << mTEMode << llendl;
 
-	S32 i = 0;
-
-	LLViewerObject *objectp;
-	for (objectp = mSelectedObjects->getFirstObject();
-		 objectp;
-		 objectp = mSelectedObjects->getNextObject())
+	S32 count = 0;
+	for (LLObjectSelection::iterator iter = getSelection()->begin();
+		 iter != getSelection()->end(); iter++ )
 	{
-		llinfos << "Object " << i << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl;
+		LLViewerObject* objectp = (*iter)->getObject();
+		llinfos << "Object " << count << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl;
 		llinfos << "  hasLSL " << objectp->flagScripted() << llendl;
 		llinfos << "  hasTouch " << objectp->flagHandleTouch() << llendl;
 		llinfos << "  hasMoney " << objectp->flagTakesMoney() << llendl;
@@ -1320,16 +1300,22 @@ void LLSelectMgr::dump()
 		LLDrawable* drawablep = objectp->mDrawable;
 		llinfos << "  " << (drawablep&& drawablep->isVisible() ? "visible" : "invisible") << llendl;
 		llinfos << "  " << (drawablep&& drawablep->isState(LLDrawable::FORCE_INVISIBLE) ? "force_invisible" : "") << llendl;
-		i++;
+		count++;
 	}
 
 	// Face iterator
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&objectp, &te);
-		 objectp;
-		 mSelectedObjects->getNextTE(&objectp, &te))
+	for (LLObjectSelection::iterator iter = getSelection()->begin();
+		 iter != getSelection()->end(); iter++ )
 	{
-		llinfos << "Object " << objectp << " te " << te << llendl;
+		LLSelectNode* node = *iter;
+		LLViewerObject* objectp = node->getObject();
+		for (S32 te = 0; te < objectp->getNumTEs(); ++te )
+		{
+			if (node->isTESelected(te))
+			{
+				llinfos << "Object " << objectp << " te " << te << llendl;
+			}
+		}
 	}
 
 	llinfos << mHighlightedObjects->getNumNodes() << " objects currently highlighted." << llendl;
@@ -1350,6 +1336,18 @@ void LLSelectMgr::cleanup()
 // Manipulate properties of selected objects
 //---------------------------------------------------------------------------
 
+struct LLSelectMgrSendFunctor : public LLSelectedObjectFunctor
+{
+	virtual bool apply(LLViewerObject* object)
+	{
+		if (object->permModify())
+		{
+			object->sendTEUpdate();
+		}
+		return true;
+	}
+};
+
 //-----------------------------------------------------------------------------
 // selectionSetImage()
 //-----------------------------------------------------------------------------
@@ -1358,7 +1356,6 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
 {
 	// First for (no copy) textures and multiple object selection
 	LLViewerInventoryItem* item = gInventory.getItem(imageid);
-
 	if(item 
 		&& !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())
 		&& (mSelectedObjects->getNumNodes() > 1) )
@@ -1368,54 +1365,63 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
 		return;
 	}
 
-	LLViewerObject* objectp;
-	S32 te;
-
-	for (mSelectedObjects->getFirstTE(&objectp, &te); objectp; mSelectedObjects->getNextTE(&objectp, &te))
+	struct f : public LLSelectedTEFunctor
 	{
-		if (item)
+		LLViewerInventoryItem* mItem;
+		LLUUID mImageID;
+		f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mImageID(id) {}
+		bool apply(LLViewerObject* objectp, S32 te)
 		{
-			if (te == -1) // all faces
+			if (mItem)
 			{
-				LLToolDragAndDrop::dropTextureAllFaces(objectp,
-													   item,
-													   LLToolDragAndDrop::SOURCE_AGENT,
-													   LLUUID::null);
+				if (te == -1) // all faces
+				{
+					LLToolDragAndDrop::dropTextureAllFaces(objectp,
+														   mItem,
+														   LLToolDragAndDrop::SOURCE_AGENT,
+														   LLUUID::null);
+				}
+				else // one face
+				{
+					LLToolDragAndDrop::dropTextureOneFace(objectp,
+														  te,
+														  mItem,
+														  LLToolDragAndDrop::SOURCE_AGENT,
+														  LLUUID::null);
+				}
 			}
-			else // one face
+			else // not an inventory item
 			{
-				LLToolDragAndDrop::dropTextureOneFace(objectp,
-													  te,
-													  item,
-													  LLToolDragAndDrop::SOURCE_AGENT,
-													  LLUUID::null);
+				// Texture picker defaults aren't inventory items
+				// * Don't need to worry about permissions for them
+				// * Can just apply the texture and be done with it.
+				objectp->setTEImage(te, gImageList.getImage(mImageID, TRUE, FALSE));
 			}
+			return true;
 		}
-		
-		else // not an inventory item
-		{
-			// Texture picker defaults aren't inventory items
-			// * Don't need to worry about permissions for them
-			// * Can just apply the texture and be done with it.
-			objectp->setTEImage(te, gImageList.getImage(imageid));
-
-			objectp->sendTEUpdate();
-		}
-	}
-
+	} setfunc(item, imageid);
+	getSelection()->applyToTEs(&setfunc);
 
-	// 1 particle effect per object
-	if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD)
+	struct g : public LLSelectedObjectFunctor
 	{
-		for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject())
+		LLViewerInventoryItem* mItem;
+		g(LLViewerInventoryItem* item) : mItem(item) {}
+		virtual bool apply(LLViewerObject* object)
 		{
-			LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
-			effectp->setSourceObject(gAgent.getAvatarObject());     
-			effectp->setTargetObject(objectp);                      
-			effectp->setDuration(LL_HUD_DUR_SHORT);                 
-			effectp->setColor(LLColor4U(gAgent.getEffectColor()));  
+			if (!mItem)
+			{
+				object->sendTEUpdate();
+				// 1 particle effect per object				
+				LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+				effectp->setSourceObject(gAgent.getAvatarObject());
+				effectp->setTargetObject(object);
+				effectp->setDuration(LL_HUD_DUR_SHORT);
+				effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+			}
+			return true;
 		}
-	}
+	} sendfunc(item);
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 //-----------------------------------------------------------------------------
@@ -1423,24 +1429,23 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
 //-----------------------------------------------------------------------------
 void LLSelectMgr::selectionSetColor(const LLColor4 &color)
 {
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
-	{
-		if (object->permModify())
-		{
-			// update viewer side color in anticipation of update from simulator
-			object->setTEColor(te, color);
-		}
-	}
-
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
+		LLColor4 mColor;
+		f(const LLColor4& c) : mColor(c) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			object->sendTEUpdate();
+			if (object->permModify())
+			{
+				object->setTEColor(te, mColor);
+			}
+			return true;
 		}
-	}
+	} setfunc(color);
+	getSelection()->applyToTEs(&setfunc);
+	
+	LLSelectMgrSendFunctor sendfunc;
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 //-----------------------------------------------------------------------------
@@ -1448,27 +1453,26 @@ void LLSelectMgr::selectionSetColor(const LLColor4 &color)
 //-----------------------------------------------------------------------------
 void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color)
 {
-	LLViewerObject* object;
-	LLColor4 new_color = color;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
-		{
-			LLColor4 prev_color = object->getTE(te)->getColor();
-			new_color.mV[VALPHA] = prev_color.mV[VALPHA];
-			// update viewer side color in anticipation of update from simulator
-			object->setTEColor(te, new_color);
-		}
-	}
-
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
-	{
-		if (object->permModify())
+		LLColor4 mColor;
+		f(const LLColor4& c) : mColor(c) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			object->sendTEUpdate();
+			if (object->permModify())
+			{
+				LLColor4 prev_color = object->getTE(te)->getColor();
+				mColor.mV[VALPHA] = prev_color.mV[VALPHA];
+				// update viewer side color in anticipation of update from simulator
+				object->setTEColor(te, mColor);
+			}
+			return true;
 		}
-	}
+	} setfunc(color);
+	getSelection()->applyToTEs(&setfunc);
+	
+	LLSelectMgrSendFunctor sendfunc;
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 //-----------------------------------------------------------------------------
@@ -1476,227 +1480,246 @@ void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color)
 //-----------------------------------------------------------------------------
 void LLSelectMgr::selectionSetAlphaOnly(const F32 alpha)
 {
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
-	{
-		if (object->permModify())
-		{
-			LLColor4 prev_color = object->getTE(te)->getColor();
-			prev_color.mV[VALPHA] = alpha;
-			// update viewer side color in anticipation of update from simulator
-			object->setTEColor(te, prev_color);
-		}
-	}
-
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
+		F32 mAlpha;
+		f(const F32& a) : mAlpha(a) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			object->sendTEUpdate();
+			if (object->permModify())
+			{
+				LLColor4 prev_color = object->getTE(te)->getColor();
+				prev_color.mV[VALPHA] = mAlpha;
+				// update viewer side color in anticipation of update from simulator
+				object->setTEColor(te, prev_color);
+			}
+			return true;
 		}
-	}
+	} setfunc(alpha);
+	getSelection()->applyToTEs(&setfunc);
+	
+	LLSelectMgrSendFunctor sendfunc;
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 void LLSelectMgr::selectionRevertColors()
 {
-	LLViewerObject* object;
-	S32 te;
-
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
+		LLObjectSelectionHandle mSelectedObjects;
+		f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			LLSelectNode* nodep = mSelectedObjects->findNode(object);
-			if (nodep && te < (S32)nodep->mSavedColors.size())
+			if (object->permModify())
 			{
-				LLColor4 color = nodep->mSavedColors[te];
-				// update viewer side color in anticipation of update from simulator
-				object->setTEColor(te, color);
+				LLSelectNode* nodep = mSelectedObjects->findNode(object);
+				if (nodep && te < (S32)nodep->mSavedColors.size())
+				{
+					LLColor4 color = nodep->mSavedColors[te];
+					// update viewer side color in anticipation of update from simulator
+					object->setTEColor(te, color);
+				}
 			}
+			return true;
 		}
-	}
-
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
-	{
-		if (object->permModify())
-		{
-			object->sendTEUpdate();
-		}
-	}
+	} setfunc(mSelectedObjects);
+	getSelection()->applyToTEs(&setfunc);
+	
+	LLSelectMgrSendFunctor sendfunc;
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 BOOL LLSelectMgr::selectionRevertTextures()
 {
-	LLViewerObject* object;
-	S32 te;
-
-	BOOL revert_successful = TRUE;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
+		LLObjectSelectionHandle mSelectedObjects;
+		f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			LLSelectNode* nodep = mSelectedObjects->findNode(object);
-			if (nodep && te < (S32)nodep->mSavedTextures.size())
+			if (object->permModify())
 			{
-				LLUUID id = nodep->mSavedTextures[te];
-				// update textures on viewer side
-				if (id.isNull())
-				{
-					// this was probably a no-copy texture, leave image as-is
-					revert_successful = FALSE;
-				}
-				else
+				LLSelectNode* nodep = mSelectedObjects->findNode(object);
+				if (nodep && te < (S32)nodep->mSavedTextures.size())
 				{
-					object->setTEImage(te, gImageList.getImage(id));
+					LLUUID id = nodep->mSavedTextures[te];
+					// update textures on viewer side
+					if (id.isNull())
+					{
+						// this was probably a no-copy texture, leave image as-is
+						return FALSE;
+					}
+					else
+					{
+						object->setTEImage(te, gImageList.getImage(id));
+					}
 				}
 			}
+			return true;
 		}
-	}
-
-	// propagate texture changes to server
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
-	{
-		if (object->permModify())
-		{
-			object->sendTEUpdate();
-		}
-	}
+	} setfunc(mSelectedObjects);
+	BOOL revert_successful = getSelection()->applyToTEs(&setfunc);
+	
+	LLSelectMgrSendFunctor sendfunc;
+	getSelection()->applyToObjects(&sendfunc);
 
 	return revert_successful;
 }
 
 void LLSelectMgr::selectionSetBumpmap(U8 bumpmap)
 {
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
-	{
-		if (object->permModify())
-		{
-			// update viewer side color in anticipation of update from simulator
-			object->setTEBumpmap(te, bumpmap);
-		}
-	}
-
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
+		U8 mBump;
+		f(const U8& b) : mBump(b) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			object->sendTEUpdate();
+			if (object->permModify())
+			{
+				// update viewer side color in anticipation of update from simulator
+				object->setTEBumpmap(te, mBump);
+			}
+			return true;
 		}
-	}
+	} setfunc(bumpmap);
+	getSelection()->applyToTEs(&setfunc);
+	
+	LLSelectMgrSendFunctor sendfunc;
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 void LLSelectMgr::selectionSetTexGen(U8 texgen)
 {
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
+		U8 mTexgen;
+		f(const U8& t) : mTexgen(t) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			// update viewer side color in anticipation of update from simulator
-			object->setTETexGen(te, texgen);
+			if (object->permModify())
+			{
+				// update viewer side color in anticipation of update from simulator
+				object->setTETexGen(te, mTexgen);
+			}
+			return true;
 		}
-	}
+	} setfunc(texgen);
+	getSelection()->applyToTEs(&setfunc);
 
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
-	{
-		if (object->permModify())
-		{
-			object->sendTEUpdate();
-		}
-	}
+	LLSelectMgrSendFunctor sendfunc;
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 
 void LLSelectMgr::selectionSetShiny(U8 shiny)
 {
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
+		U8 mShiny;
+		f(const U8& t) : mShiny(t) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			// update viewer side color in anticipation of update from simulator
-			object->setTEShiny(te, shiny);
+			if (object->permModify())
+			{
+				// update viewer side color in anticipation of update from simulator
+				object->setTEShiny(te, mShiny);
+			}
+			return true;
 		}
-	}
+	} setfunc(shiny);
+	getSelection()->applyToTEs(&setfunc);
 
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
-	{
-		if (object->permModify())
-		{
-			object->sendTEUpdate();
-		}
-	}
+	LLSelectMgrSendFunctor sendfunc;
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 void LLSelectMgr::selectionSetFullbright(U8 fullbright)
 {
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
+		U8 mFullbright;
+		f(const U8& t) : mFullbright(t) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			// update viewer side color in anticipation of update from simulator
-			object->setTEFullbright(te, fullbright);
+			if (object->permModify())
+			{
+				// update viewer side color in anticipation of update from simulator
+				object->setTEFullbright(te, mFullbright);
+			}
+			return true;
 		}
-	}
+	} setfunc(fullbright);
+	getSelection()->applyToTEs(&setfunc);
 
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	struct g : public LLSelectedObjectFunctor
 	{
-		if (object->permModify())
+		U8 mFullbright;
+		g(const U8& t) : mFullbright(t) {}
+		virtual bool apply(LLViewerObject* object)
 		{
-			object->sendTEUpdate();
-			if (fullbright)
+			if (object->permModify())
 			{
-				U8 material = object->getMaterial();
-				U8 mcode = material & LL_MCODE_MASK;
-				if (mcode == LL_MCODE_LIGHT)
+				object->sendTEUpdate();
+				if (mFullbright)
 				{
-					mcode = LL_MCODE_GLASS;
-					material = (material & ~LL_MCODE_MASK) | mcode;
-					object->setMaterial(material);
-					object->sendMaterialUpdate();
+					U8 material = object->getMaterial();
+					U8 mcode = material & LL_MCODE_MASK;
+					if (mcode == LL_MCODE_LIGHT)
+					{
+						mcode = LL_MCODE_GLASS;
+						material = (material & ~LL_MCODE_MASK) | mcode;
+						object->setMaterial(material);
+						object->sendMaterialUpdate();
+					}
 				}
 			}
+			return true;
 		}
-	}
+	} sendfunc(fullbright);
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string& media_url)
 {
-	LLViewerObject* object;
-	S32 te;
 	U8 media_flags = LLTextureEntry::MF_NONE;
 	if (media_type == LLViewerObject::MEDIA_TYPE_WEB_PAGE)
 	{
 		media_flags = LLTextureEntry::MF_WEB_PAGE;
 	}
-
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
+	
+	struct f : public LLSelectedTEFunctor
 	{
-		if (object->permModify())
+		U8 mMediaFlags;
+		f(const U8& t) : mMediaFlags(t) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			// update viewer side color in anticipation of update from simulator
-			object->setTEMediaFlags(te, media_flags);
+			if (object->permModify())
+			{
+				// update viewer side color in anticipation of update from simulator
+				object->setTEMediaFlags(te, mMediaFlags);
+			}
+			return true;
 		}
-	}
+	} setfunc(media_flags);
+	getSelection()->applyToTEs(&setfunc);
 
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	struct g : public LLSelectedObjectFunctor
 	{
-		if (object->permModify())
+		U8 media_type;
+		const std::string& media_url ;
+		g(U8 a, const std::string& b) : media_type(a), media_url(b) {}
+		virtual bool apply(LLViewerObject* object)
 		{
-			// JAMESDEBUG TODO set object media type
-			object->setMediaType(media_type);
-			object->setMediaURL(media_url);
-
-			object->sendTEUpdate();
+			if (object->permModify())
+			{
+				object->sendTEUpdate();
+				object->setMediaType(media_type);
+				object->setMediaURL(media_url);
+			}
+			return true;
 		}
-	}
+	} sendfunc(media_type, media_url);
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 
@@ -1706,11 +1729,11 @@ void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string&
 //-----------------------------------------------------------------------------
 LLPermissions* LLSelectMgr::findObjectPermissions(const LLViewerObject* object)
 {
-	LLSelectNode* nodep;
-
-	for (nodep = mSelectedObjects->getFirstNode(); nodep; nodep = mSelectedObjects->getNextNode() )
+	for (LLObjectSelection::valid_iterator iter = getSelection()->valid_begin();
+		 iter != getSelection()->valid_end(); iter++ )
 	{
-		if((nodep->getObject() == object) && nodep->mValid)
+		LLSelectNode* nodep = *iter;
+		if (nodep->getObject() == object)
 		{
 			return nodep->mPermissions;
 		}
@@ -1721,306 +1744,49 @@ LLPermissions* LLSelectMgr::findObjectPermissions(const LLViewerObject* object)
 
 
 //-----------------------------------------------------------------------------
-// selectionGetTexUUID()
+// selectionSetMaterial()
 //-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectionGetTexUUID(LLUUID& id)
+void LLSelectMgr::selectionSetMaterial(U8 material)
 {
-	LLViewerObject* first_objectp;
-	S32 first_te;
-	mSelectedObjects->getPrimaryTE(&first_objectp, &first_te);
-
-	// nothing selected
-	if (!first_objectp)
+	struct f : public LLSelectedObjectFunctor
 	{
-		return FALSE;
-	}
-	
-	LLViewerImage* first_imagep = first_objectp->getTEImage(first_te);
-	
-	if (!first_imagep)
-	{
-		return FALSE;
-	}
-
-	BOOL identical = TRUE;
-	LLViewerObject *objectp;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&objectp, &te); objectp; mSelectedObjects->getNextTE(&objectp, &te) )
-	{
-		if (objectp->getTEImage(te) != first_imagep)
+		U8 mMaterial;
+		f(const U8& t) : mMaterial(t) {}
+		virtual bool apply(LLViewerObject* object)
 		{
-			identical = FALSE;
-			break;
-		}
-	}
-
-	id = first_imagep->getID();
-	return identical;
-}
-
-//-----------------------------------------------------------------------------
-// selectionGetColor()
-//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectionGetColor(LLColor4 &color)
-{
-	LLViewerObject* first_object;
-	S32 first_te;
-	mSelectedObjects->getPrimaryTE(&first_object, &first_te);
-
-	// nothing selected
-	if (!first_object)
-	{
-		return FALSE;
-	}
-
-	LLColor4 first_color;
-	if (!first_object->getTE(first_te))
-	{
-		return FALSE;
-	}
-	else
-	{
-		first_color = first_object->getTE(first_te)->getColor();
-	}
-
-	BOOL identical = TRUE;
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
-	{
-		if (!object->getTE(te) || (object->getTE(te)->getColor() != first_color))
-		{
-			identical = FALSE;
-			break;
-		}
-	}
-
-	color = first_color;
-	return identical;
-}
-
-
-//-----------------------------------------------------------------------------
-// selectionGetBumpmap()
-//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectionGetBumpmap(U8 *bumpmap)
-{
-	LLViewerObject* first_object;
-	S32 first_te;
-	mSelectedObjects->getPrimaryTE(&first_object, &first_te);
-
-	// nothing selected
-	if (!first_object)
-	{
-		return FALSE;
-	}
-
-	U8 first_value;
-	if (!first_object->getTE(first_te))
-	{
-		return FALSE;
-	}
-	else
-	{
-		first_value = first_object->getTE(first_te)->getBumpmap();
-	}
-
-	BOOL identical = TRUE;
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
-	{
-		if (!object->getTE(te) || (object->getTE(te)->getBumpmap() != first_value))
-		{
-			identical = FALSE;
-			break;
-		}
-	}
-
-	*bumpmap = first_value;
-	return identical;
-}
-
-//-----------------------------------------------------------------------------
-// selectionGetShiny()
-//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectionGetShiny(U8 *shiny)
-{
-	LLViewerObject* first_object;
-	S32 first_te;
-	mSelectedObjects->getPrimaryTE(&first_object, &first_te);
-
-	// nothing selected
-	if (!first_object)
-	{
-		return FALSE;
-	}
-
-	U8 first_value;
-	if (!first_object->getTE(first_te))
-	{
-		return FALSE;
-	}
-	else
-	{
-		first_value = first_object->getTE(first_te)->getShiny();
-	}
-
-	BOOL identical = TRUE;
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
-	{
-		if (!object->getTE(te) || (object->getTE(te)->getShiny() != first_value))
-		{
-			identical = FALSE;
-			break;
-		}
-	}
-
-	*shiny = first_value;
-	return identical;
-}
-
-//-----------------------------------------------------------------------------
-// selectionGetFullbright()
-//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectionGetFullbright(U8 *fullbright)
-{
-	LLViewerObject* first_object;
-	S32 first_te;
-	mSelectedObjects->getPrimaryTE(&first_object, &first_te);
-
-	// nothing selected
-	if (!first_object)
-	{
-		return FALSE;
-	}
-
-	U8 first_value;
-	if (!first_object->getTE(first_te))
-	{
-		return FALSE;
-	}
-	else
-	{
-		first_value = first_object->getTE(first_te)->getFullbright();
-	}
-
-	BOOL identical = TRUE;
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
-	{
-		if (!object->getTE(te) || (object->getTE(te)->getFullbright() != first_value))
-		{
-			identical = FALSE;
-			break;
-		}
-	}
-
-	*fullbright = first_value;
-	return identical;
-}
-
-// JAMESDEBUG TODO make this return mediatype off viewer object
-bool LLSelectMgr::selectionGetMediaType(U8 *media_type)
-{
-	LLViewerObject* first_object;
-	S32 first_te;
-	mSelectedObjects->getPrimaryTE(&first_object, &first_te);
-
-	// nothing selected
-	if (!first_object)
-	{
-		return false;
-	}
-
-	U8 first_value;
-	if (!first_object->getTE(first_te))
-	{
-		return false;
-	}
-	else
-	{
-		first_value = first_object->getTE(first_te)->getMediaFlags();
-	}
-
-	bool identical = true;
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
-	{
-		if (!object->getTE(te) || (object->getTE(te)->getMediaFlags() != first_value))
-		{
-			identical = false;
-			break;
-		}
-	}
-
-	*media_type = first_value;
-	return identical;
-}
-
-
-
-//-----------------------------------------------------------------------------
-// selectionSetMaterial()
-//-----------------------------------------------------------------------------
-void LLSelectMgr::selectionSetMaterial(U8 material)
-{
-	LLViewerObject* object;
-	for (object = mSelectedObjects->getFirstObject(); object != NULL; object = mSelectedObjects->getNextObject() )
-	{
-		if (object->permModify())
-		{
-			U8 cur_material = object->getMaterial();
-			material |= (cur_material & ~LL_MCODE_MASK);
-			object->setMaterial(material);
-			object->sendMaterialUpdate();
+			if (object->permModify())
+			{
+				U8 cur_material = object->getMaterial();
+				U8 material = mMaterial | (cur_material & ~LL_MCODE_MASK);
+				object->setMaterial(material);
+				object->sendMaterialUpdate();
+			}
+			return true;
 		}
-	}
+	} sendfunc(material);
+	getSelection()->applyToObjects(&sendfunc);
 }
 
-// True if all selected objects have this PCode
+// TRUE if all selected objects have this PCode
 BOOL LLSelectMgr::selectionAllPCode(LLPCode code)
 {
-	LLViewerObject *object;
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
-	{
-		if (object->getPCode() != code)
-		{
-			return FALSE;
-		}
-	}
-	return TRUE;
-}
-
-//-----------------------------------------------------------------------------
-// selectionGetMaterial()
-//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectionGetMaterial(U8 *out_material)
-{
-	LLViewerObject *object = mSelectedObjects->getFirstObject();
-	if (!object) return FALSE;
-
-	U8 material = object->getMaterial();
-
-	BOOL identical = TRUE;
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	struct f : public LLSelectedObjectFunctor
 	{
-		if ( material != object->getMaterial())
+		LLPCode mCode;
+		f(const LLPCode& t) : mCode(t) {}
+		virtual bool apply(LLViewerObject* object)
 		{
-			identical = FALSE;
-			break;
+			if (object->getPCode() != mCode)
+			{
+				return FALSE;
+			}
+			return true;
 		}
-	}
-
-	*out_material = material;
-	return identical;
+	} func(code);
+	BOOL res = getSelection()->applyToObjects(&func);
+	return res;
 }
 
-
 bool LLSelectMgr::selectionGetIncludeInSearch(bool* include_in_search_out)
 {
 	LLViewerObject *object = mSelectedObjects->getFirstRootObject();
@@ -2029,8 +1795,12 @@ bool LLSelectMgr::selectionGetIncludeInSearch(bool* include_in_search_out)
 	bool include_in_search = object->getIncludeInSearch();
 
 	bool identical = true;
-	for ( object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() )
+
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++)
 	{
+		LLViewerObject* object = (*iter)->getObject();
+
 		if ( include_in_search != object->getIncludeInSearch())
 		{
 			identical = false;
@@ -2045,8 +1815,10 @@ bool LLSelectMgr::selectionGetIncludeInSearch(bool* include_in_search_out)
 void LLSelectMgr::selectionSetIncludeInSearch(bool include_in_search)
 {
 	LLViewerObject* object = NULL;
-	for ( object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() )
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++)
 	{
+		object = (*iter)->getObject();
 		object->setIncludeInSearch(include_in_search);
 	}
 	sendListToRegions(
@@ -2060,37 +1832,50 @@ void LLSelectMgr::selectionSetIncludeInSearch(bool include_in_search)
 BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action)
 {
 	LLViewerObject *object = mSelectedObjects->getFirstObject();
-	if (!object) return FALSE;
-
+	if (!object)
+	{
+		return FALSE;
+	}
+	
 	U8 action = object->getClickAction();
+	*out_action = action;
 
-	BOOL identical = TRUE;
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	struct f : public LLSelectedObjectFunctor
 	{
-		if ( action != object->getClickAction())
+		U8 mAction;
+		f(const U8& t) : mAction(t) {}
+		virtual bool apply(LLViewerObject* object)
 		{
-			identical = FALSE;
-			break;
+			if ( mAction != object->getClickAction())
+			{
+				return false;
+			}
+			return true;
 		}
-	}
-
-	*out_action = action;
-	return identical;
+	} func(action);
+	BOOL res = getSelection()->applyToObjects(&func);
+	return res;
 }
 
 void LLSelectMgr::selectionSetClickAction(U8 action)
 {
-	LLViewerObject* object = NULL;
-	for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	struct f : public LLSelectedObjectFunctor
 	{
-		object->setClickAction(action);
-	}
-	sendListToRegions(
-		"ObjectClickAction",
-		packAgentAndSessionID,
-		packObjectClickAction, 
-		&action,
-		SEND_INDIVIDUALS);
+		U8 mAction;
+		f(const U8& t) : mAction(t) {}
+		virtual bool apply(LLViewerObject* object)
+		{
+			object->setClickAction(mAction);
+			return true;
+		}
+	} func(action);
+	getSelection()->applyToObjects(&func);
+
+	sendListToRegions("ObjectClickAction",
+					  packAgentAndSessionID,
+					  packObjectClickAction, 
+					  &action,
+					  SEND_INDIVIDUALS);
 }
 
 
@@ -2165,34 +1950,42 @@ void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *)
 //-----------------------------------------------------------------------------
 void LLSelectMgr::selectionResetRotation()
 {
-	LLQuaternion identity(0.f, 0.f, 0.f, 1.f);
-
-	LLViewerObject* object;
-	for (object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() )
+	struct f : public LLSelectedObjectFunctor
 	{
-		object->setRotation(identity);
-		if (object->mDrawable.notNull())
+		virtual bool apply(LLViewerObject* object)
 		{
-			gPipeline.markMoved(object->mDrawable, TRUE);
+			LLQuaternion identity(0.f, 0.f, 0.f, 1.f);
+			object->setRotation(identity);
+			if (object->mDrawable.notNull())
+			{
+				gPipeline.markMoved(object->mDrawable, TRUE);
+			}
+			object->sendRotationUpdate();
+			return true;
 		}
-		object->sendRotationUpdate();
-	}
+	} func;
+	getSelection()->applyToRootObjects(&func);
 }
 
 void LLSelectMgr::selectionRotateAroundZ(F32 degrees)
 {
 	LLQuaternion rot( degrees * DEG_TO_RAD, LLVector3(0,0,1) );
-
-	LLViewerObject* object;
-	for (object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() )
+	struct f : public LLSelectedObjectFunctor
 	{
-		object->setRotation( object->getRotationEdit() * rot );
-		if (object->mDrawable.notNull())
+		LLQuaternion mRot;
+		f(const LLQuaternion& rot) : mRot(rot) {}
+		virtual bool apply(LLViewerObject* object)
 		{
-			gPipeline.markMoved(object->mDrawable, TRUE);
+			object->setRotation( object->getRotationEdit() * mRot );
+			if (object->mDrawable.notNull())
+			{
+				gPipeline.markMoved(object->mDrawable, TRUE);
+			}
+			object->sendRotationUpdate();
+			return true;
 		}
-		object->sendRotationUpdate();
-	}
+	} func(rot);
+	getSelection()->applyToRootObjects(&func);	
 }
 
 
@@ -2201,86 +1994,37 @@ void LLSelectMgr::selectionRotateAroundZ(F32 degrees)
 //-----------------------------------------------------------------------------
 void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter)
 {
-	LLViewerObject* object;
-	S32 te;
-	for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
+	struct f : public LLSelectedTEFunctor
 	{
-		if (!object->permModify())
+		F32 mRepeatsPerMeter;
+		f(const F32& t) : mRepeatsPerMeter(t) {}
+		bool apply(LLViewerObject* object, S32 te)
 		{
-			continue;
-		}
+			
+			if (object->permModify())
+			{
+				// Compute S,T to axis mapping
+				U32 s_axis, t_axis;
+				if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis))
+				{
+					return TRUE;
+				}
 
-		if (object->getNumTEs() == 0)
-		{
-			continue;
-		}
+				F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter;
+				F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter;
 
-		// Compute S,T to axis mapping
-		U32 s_axis, t_axis;
-		if (!getTESTAxes(object, te, &s_axis, &t_axis))
-		{
-			continue;
+				object->setTEScale(te, new_s, new_t);
+			}
+			return true;
 		}
+	} setfunc(repeats_per_meter);
+	getSelection()->applyToTEs(&setfunc);
 
-		F32 new_s = object->getScale().mV[s_axis] * repeats_per_meter;
-		F32 new_t = object->getScale().mV[t_axis] * repeats_per_meter;
-
-		object->setTEScale(te, new_s, new_t);
-	}
-
-	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject())
-	{
-		if (object->permModify())
-		{
-			object->sendTEUpdate();
-		}
-	}
+	LLSelectMgrSendFunctor sendfunc;
+	getSelection()->applyToObjects(&sendfunc);
 }
 
 
-// BUG: Only works for boxes.
-// Face numbering for flex boxes as of 1.14.2002
-//-----------------------------------------------------------------------------
-// getFaceSTAxes()
-//-----------------------------------------------------------------------------
-BOOL LLSelectMgr::getTESTAxes(const LLViewerObject* object, const U8 face, U32* s_axis, U32* t_axis)
-{
-	if (face == 0)
-	{
-		*s_axis = VX; *t_axis = VY;
-		return TRUE;
-	}
-	else if (face == 1)
-	{
-		*s_axis = VX; *t_axis = VZ;
-		return TRUE;
-	}
-	else if (face == 2)
-	{
-		*s_axis = VY; *t_axis = VZ;
-		return TRUE;
-	}
-	else if (face == 3)
-	{
-		*s_axis = VX; *t_axis = VZ;
-		return TRUE;
-	}
-	else if (face == 4)
-	{
-		*s_axis = VY; *t_axis = VZ;
-		return TRUE;
-	}
-	else if (face == 5)
-	{
-		*s_axis = VX; *t_axis = VY;
-		return TRUE;
-	}
-	else
-	{
-		// unknown face
-		return FALSE;
-	}
-}
 
 // Called at the end of a scale operation, this adjusts the textures to attempt to
 // maintain a constant repeats per meter.
@@ -2290,14 +2034,12 @@ BOOL LLSelectMgr::getTESTAxes(const LLViewerObject* object, const U8 face, U32*
 //-----------------------------------------------------------------------------
 void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch)
 {
-	LLViewerObject* object;
-	LLSelectNode* selectNode;
-
-	BOOL send = FALSE;
-	
-	for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode())
+	for (LLObjectSelection::iterator iter = getSelection()->begin();
+		 iter != getSelection()->end(); iter++)
 	{
-		object = selectNode->getObject();
+		LLSelectNode* selectNode = *iter;
+		LLViewerObject* object = selectNode->getObject();
+
 		if (!object->permModify())
 		{
 			continue;
@@ -2308,6 +2050,8 @@ void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch)
 			continue;
 		}
 
+		BOOL send = FALSE;
+		
 		for (U8 te_num = 0; te_num < object->getNumTEs(); te_num++)
 		{
 			const LLTextureEntry* tep = object->getTE(te_num);
@@ -2316,95 +2060,51 @@ void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch)
 			if (planar == stretch)
 			{
 				// Figure out how S,T changed with scale operation
-				U32 s_axis, t_axis;
-				if (!getTESTAxes(object, te_num, &s_axis, &t_axis)) continue;
-
-				LLVector3 scale_ratio = selectNode->mTextureScaleRatios[te_num]; 
-				LLVector3 object_scale = object->getScale();
-				
-				// Apply new scale to face
-				if (planar)
-				{
-					object->setTEScale(te_num, 1.f/object_scale.mV[s_axis]*scale_ratio.mV[s_axis],
-										1.f/object_scale.mV[t_axis]*scale_ratio.mV[t_axis]);
-				}
-				else
-				{
-					object->setTEScale(te_num, scale_ratio.mV[s_axis]*object_scale.mV[s_axis],
-											scale_ratio.mV[t_axis]*object_scale.mV[t_axis]);
-				}
-				send = send_to_sim;
-			}
-		}
-
-		if (send)
-		{
-			object->sendTEUpdate();
-		}
-	}
-}
-
-
-//-----------------------------------------------------------------------------
-// selectionResetTexInfo()
-//-----------------------------------------------------------------------------
-void LLSelectMgr::selectionResetTexInfo(S32 selected_face)
-{
-	S32 start_face, end_face;
-
-	LLViewerObject* object;
-	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject())
-	{
-		if (!object->permModify())
-		{
-			continue;
-		}
-		if (object->getNumTEs() == 0)
-		{
-			continue;
-		}
-
-		if (selected_face == -1)
-		{
-			start_face = 0;
-			end_face = object->getNumTEs() - 1;
-		}
-		else
-		{
-			start_face = selected_face;
-			end_face = selected_face;
+				U32 s_axis, t_axis;
+				if (!LLPrimitive::getTESTAxes(te_num, &s_axis, &t_axis))
+				{
+					continue;
+				}
+				
+				LLVector3 scale_ratio = selectNode->mTextureScaleRatios[te_num]; 
+				LLVector3 object_scale = object->getScale();
+				
+				// Apply new scale to face
+				if (planar)
+				{
+					object->setTEScale(te_num, 1.f/object_scale.mV[s_axis]*scale_ratio.mV[s_axis],
+										1.f/object_scale.mV[t_axis]*scale_ratio.mV[t_axis]);
+				}
+				else
+				{
+					object->setTEScale(te_num, scale_ratio.mV[s_axis]*object_scale.mV[s_axis],
+											scale_ratio.mV[t_axis]*object_scale.mV[t_axis]);
+				}
+				send = send_to_sim;
+			}
 		}
 
-		for (S32 face = start_face; face <= end_face; face++)
+		if (send)
 		{
-			// Actually, each object should reset to its appropriate value.
-			object->setTEScale(face, 1.f, 1.f);
-			object->setTEOffset(face, 0.f, 0.f);
-			object->setTERotation(face, 0.f);
+			object->sendTEUpdate();
 		}
-
-		object->sendTEUpdate();
-	}
+	}		
 }
 
 //-----------------------------------------------------------------------------
 // selectGetAllRootsValid()
-// Returns true if the viewer has information on all selected objects
+// Returns TRUE if the viewer has information on all selected objects
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::selectGetAllRootsValid()
 {
-	for( LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() )
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); ++iter )
 	{
-	
+		LLSelectNode* node = *iter;
 		if( !node->mValid )
 		{
 			return FALSE;
 		}
-
-		if( !node->getObject() )
-		{
-			return FALSE;
-		}
 	}
 	return TRUE;
 }
@@ -2412,63 +2112,62 @@ BOOL LLSelectMgr::selectGetAllRootsValid()
 
 //-----------------------------------------------------------------------------
 // selectGetAllValid()
-// Returns true if the viewer has information on all selected objects
+// Returns TRUE if the viewer has information on all selected objects
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::selectGetAllValid()
 {
-	for( LLSelectNode* node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
+	for (LLObjectSelection::iterator iter = getSelection()->begin();
+		 iter != getSelection()->end(); ++iter )
 	{
-	
+		LLSelectNode* node = *iter;
 		if( !node->mValid )
 		{
 			return FALSE;
 		}
-
-		if( !node->getObject() )
-		{
-			return FALSE;
-		}
 	}
 	return TRUE;
 }
 
 
 //-----------------------------------------------------------------------------
-// selectGetModify() - return true if current agent can modify all
+// selectGetModify() - return TRUE if current agent can modify all
 // selected objects.
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::selectGetModify()
 {
-	for( LLSelectNode* node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
+	for (LLObjectSelection::iterator iter = getSelection()->begin();
+		 iter != getSelection()->end(); iter++ )
 	{
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
 		if( !node->mValid )
 		{
 			return FALSE;
 		}
-		LLViewerObject* object = node->getObject();
-		if( !object || !object->permModify() )
+		if( !object->permModify() )
 		{
 			return FALSE;
 		}
 	}
-
 	return TRUE;
 }
 
 //-----------------------------------------------------------------------------
-// selectGetRootsModify() - return true if current agent can modify all
+// selectGetRootsModify() - return TRUE if current agent can modify all
 // selected root objects.
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::selectGetRootsModify()
 {
-	for( LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() )
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
 		if( !node->mValid )
 		{
 			return FALSE;
 		}
-		LLViewerObject* object = node->getObject();
-		if( !object || !object->permModify() )
+		if( !object->permModify() )
 		{
 			return FALSE;
 		}
@@ -2479,19 +2178,21 @@ BOOL LLSelectMgr::selectGetRootsModify()
 
 
 //-----------------------------------------------------------------------------
-// selectGetRootsTransfer() - return true if current agent can transfer all
+// selectGetRootsTransfer() - return TRUE if current agent can transfer all
 // selected root objects.
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::selectGetRootsTransfer()
 {
-	for(LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
-		if(!node->mValid)
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
+		if( !node->mValid )
 		{
 			return FALSE;
 		}
-		LLViewerObject* object = node->getObject();
-		if(!object || !object->permTransfer())
+		if(!object->permTransfer())
 		{
 			return FALSE;
 		}
@@ -2500,19 +2201,21 @@ BOOL LLSelectMgr::selectGetRootsTransfer()
 }
 
 //-----------------------------------------------------------------------------
-// selectGetRootsCopy() - return true if current agent can copy all
+// selectGetRootsCopy() - return TRUE if current agent can copy all
 // selected root objects.
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::selectGetRootsCopy()
 {
-	for(LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
-		if(!node->mValid)
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
+		if( !node->mValid )
 		{
 			return FALSE;
 		}
-		LLViewerObject* object = node->getObject();
-		if(!object || !object->permCopy())
+		if(!object->permCopy())
 		{
 			return FALSE;
 		}
@@ -2524,39 +2227,42 @@ BOOL LLSelectMgr::selectGetRootsCopy()
 // selectGetCreator()
 // Creator information only applies to root objects.
 //-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name)
+BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, LLString& name)
 {
-	LLSelectNode* node = mSelectedObjects->getFirstRootNode();
-	if(!node) node = mSelectedObjects->getFirstNode();
-	if(!node) return FALSE;
-	if(!node->mValid) return FALSE;
-	LLViewerObject* obj = node->getObject();
-	if(!obj) return FALSE;
-	if(!(obj->isRoot() || obj->isJointChild())) return FALSE;
-
-	id = node->mPermissions->getCreator();
-
 	BOOL identical = TRUE;
-	for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
+	BOOL first = TRUE;
+	LLUUID first_id;
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
+		LLSelectNode* node = *iter;	
 		if (!node->mValid)
 		{
-			identical = FALSE;
-			break;
+			return FALSE;
 		}
 
-		if ( !(id == node->mPermissions->getCreator() ) )
+		if (first)
 		{
-			identical = FALSE;
-			break;
+			first_id = node->mPermissions->getCreator();
+			first = FALSE;
+		}
+		else
+		{
+			if ( !(first_id == node->mPermissions->getCreator() ) )
+			{
+				identical = FALSE;
+				break;
+			}
 		}
 	}
 
+	result_id = first_id;
+	
 	if (identical)
 	{
 		char firstname[DB_FIRST_NAME_BUF_SIZE];		/* Flawfinder: ignore */
 		char lastname[DB_LAST_NAME_BUF_SIZE];		/* Flawfinder: ignore */
-		gCacheName->getName(id, firstname, lastname);
+		gCacheName->getName(first_id, firstname, lastname);
 		name.assign( firstname );
 		name.append( " " );
 		name.append( lastname );
@@ -2574,44 +2280,45 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name)
 // selectGetOwner()
 // Owner information only applies to roots.
 //-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name)
+BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, LLString& name)
 {
-	LLSelectNode* node = mSelectedObjects->getFirstRootNode();
-	if(!node) node = mSelectedObjects->getFirstNode();
-	if(!node) return FALSE;
-	if(!node->mValid) return FALSE;
-	LLViewerObject* obj = node->getObject();
-	if(!obj) return FALSE;
-	if(!(obj->isRootEdit() || obj->isRoot() || obj->isJointChild())) return FALSE;
-
-	BOOL group_owner = FALSE;
-	id.setNull();
-	node->mPermissions->getOwnership(id, group_owner);
-
 	BOOL identical = TRUE;
-	for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
+	BOOL first = TRUE;
+	BOOL first_group_owned = FALSE;
+	LLUUID first_id;
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
+		LLSelectNode* node = *iter;	
 		if (!node->mValid)
 		{
-			identical = FALSE;
-			break;
+			return FALSE;
 		}
-
-		LLUUID owner_id;
-		BOOL is_group_owned = FALSE;
-		if (!(node->mPermissions->getOwnership(owner_id, is_group_owned))
-			|| owner_id != id )
+		
+		if (first)
 		{
-			identical = FALSE;
-			break;
+			node->mPermissions->getOwnership(first_id, first_group_owned);
+			first = FALSE;
+		}
+		else
+		{
+			LLUUID owner_id;
+			BOOL is_group_owned = FALSE;
+			if (!(node->mPermissions->getOwnership(owner_id, is_group_owned))
+				|| owner_id != first_id || is_group_owned != first_group_owned)
+			{
+				identical = FALSE;
+				break;
+			}
 		}
 	}
 
-	BOOL public_owner = (id.isNull() && !group_owner);
-
+	result_id = first_id;
+	
 	if (identical)
 	{
-		if (group_owner)
+		BOOL public_owner = (first_id.isNull() && !first_group_owned);
+		if (first_group_owned)
 		{
 			name.assign( "(Group Owned)");
 		}
@@ -2619,7 +2326,7 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name)
 		{
 			char firstname[DB_FIRST_NAME_BUF_SIZE];		/* Flawfinder: ignore */
 			char lastname[DB_LAST_NAME_BUF_SIZE];		/* Flawfinder: ignore */
-			gCacheName->getName(id, firstname, lastname);
+			gCacheName->getName(first_id, firstname, lastname);
 			name.assign( firstname );
 			name.append( " " );
 			name.append( lastname );
@@ -2642,43 +2349,45 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name)
 // selectGetLastOwner()
 // Owner information only applies to roots.
 //-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name)
+BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, LLString& name)
 {
-	LLSelectNode* node = mSelectedObjects->getFirstRootNode();
-	if(!node) node = mSelectedObjects->getFirstNode();
-	if(!node) return FALSE;
-	if(!node->mValid) return FALSE;
-	LLViewerObject* obj = node->getObject();
-	if(!obj) return FALSE;
-	if(!(obj->isRoot() || obj->isJointChild())) return FALSE;
-
-	id = node->mPermissions->getLastOwner();
-
 	BOOL identical = TRUE;
-	for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
+	BOOL first = TRUE;
+	LLUUID first_id;
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
+		LLSelectNode* node = *iter;	
 		if (!node->mValid)
 		{
-			identical = FALSE;
-			break;
+			return FALSE;
 		}
 
-		if ( !(id == node->mPermissions->getLastOwner() ) )
+		if (first)
 		{
-			identical = FALSE;
-			break;
+			first_id = node->mPermissions->getLastOwner();
+			first = FALSE;
+		}
+		else
+		{
+			if ( !(first_id == node->mPermissions->getLastOwner() ) )
+			{
+				identical = FALSE;
+				break;
+			}
 		}
 	}
 
-	BOOL public_owner = (id.isNull());
-
+	result_id = first_id;
+	
 	if (identical)
 	{
+		BOOL public_owner = (first_id.isNull());
 		if(!public_owner)
 		{
 			char firstname[DB_FIRST_NAME_BUF_SIZE];		/* Flawfinder: ignore */
 			char lastname[DB_LAST_NAME_BUF_SIZE];		/* Flawfinder: ignore */
-			gCacheName->getName(id, firstname, lastname);
+			gCacheName->getName(first_id, firstname, lastname);
 			name.assign( firstname );
 			name.append( " " );
 			name.append( lastname );
@@ -2701,33 +2410,36 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name)
 // selectGetGroup()
 // Group information only applies to roots.
 //-----------------------------------------------------------------------------
-BOOL LLSelectMgr::selectGetGroup(LLUUID& id)
+BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id)
 {
-	LLSelectNode* node = mSelectedObjects->getFirstRootNode();
-	if(!node) node = mSelectedObjects->getFirstNode();
-	if(!node) return FALSE;
-	if(!node->mValid) return FALSE;
-	LLViewerObject* obj = node->getObject();
-	if(!obj) return FALSE;
-	if(!(obj->isRoot() || obj->isJointChild())) return FALSE;
-
-	id = node->mPermissions->getGroup();
-
 	BOOL identical = TRUE;
-	for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
+	BOOL first = TRUE;
+	LLUUID first_id;
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
+		LLSelectNode* node = *iter;	
 		if (!node->mValid)
 		{
-			identical = FALSE;
-			break;
+			return FALSE;
 		}
 
-		if ( !(id == node->mPermissions->getGroup() ) )
+		if (first)
 		{
-			identical = FALSE;
-			break;
+			first_id = node->mPermissions->getGroup();
+			first = FALSE;
+		}
+		else
+		{
+			if ( !(first_id == node->mPermissions->getGroup() ) )
+			{
+				identical = FALSE;
+				break;
+			}
 		}
 	}
+	
+	result_id = first_id;
 
 	return identical;
 }
@@ -2739,64 +2451,53 @@ BOOL LLSelectMgr::selectGetGroup(LLUUID& id)
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::selectIsGroupOwned()
 {
-	LLSelectNode* node = mSelectedObjects->getFirstRootNode();
-	if(!node) node = mSelectedObjects->getFirstNode();
-	if(!node) return FALSE;
-	if(!node->mValid) return FALSE;
-	LLViewerObject* obj = node->getObject();
-	if(!obj) return FALSE;
-	if(!(obj->isRoot() || obj->isJointChild())) return FALSE;
-
-	BOOL is_group_owned = node->mPermissions->isGroupOwned();
-
-	if(is_group_owned)
+	BOOL found_one = FALSE;
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
-		for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
+		LLSelectNode* node = *iter;	
+		if (!node->mValid)
 		{
-			if (!node->mValid)
-			{
-				is_group_owned = FALSE;
-				break;
-			}
-
-			if ( !( node->mPermissions->isGroupOwned() ) )
-			{
-				is_group_owned = FALSE;
-				break;
-			}
+			return FALSE;
 		}
-	}
-	return is_group_owned;
+		found_one = TRUE;
+		if (!node->mPermissions->isGroupOwned())
+		{
+			return FALSE;
+		}
+	}	
+	return found_one ? TRUE : FALSE;
 }
 
 //-----------------------------------------------------------------------------
 // selectGetPerm()
 // Only operates on root nodes.
 // Returns TRUE if all have valid data.
-// mask_on has bits set to true where all permissions are true
-// mask_off has bits set to true where all permissions are false
+// mask_on has bits set to TRUE where all permissions are TRUE
+// mask_off has bits set to TRUE where all permissions are FALSE
 // if a bit is off both in mask_on and mask_off, the values differ within
 // the selection.
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off)
 {
-	LLSelectNode* node = mSelectedObjects->getFirstRootNode();
-	if (!node) return FALSE;
-	if (!node->mValid)	return FALSE;
-
 	U32 mask;
 	U32 mask_and	= 0xffffffff;
 	U32 mask_or		= 0x00000000;
-	BOOL all_valid	= TRUE;
+	BOOL all_valid	= FALSE;
 
-	for ( node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() )
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++)
 	{
+		LLSelectNode* node = *iter;
+
 		if (!node->mValid)
 		{
 			all_valid = FALSE;
 			break;
 		}
 
+		all_valid = TRUE;
+		
 		switch( which_perm )
 		{
 		case PERM_BASE:
@@ -2824,10 +2525,10 @@ BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off)
 
 	if (all_valid)
 	{
-		// ...true through all ANDs means all true
+		// ...TRUE through all ANDs means all TRUE
 		*mask_on  = mask_and;
 
-		// ...false through all ORs means all false
+		// ...FALSE through all ORs means all FALSE
 		*mask_off = ~mask_or;
 		return TRUE;
 	}
@@ -2846,23 +2547,33 @@ BOOL LLSelectMgr::selectGetOwnershipCost(S32* out_cost)
 	return mSelectedObjects->getOwnershipCost(*out_cost);
 }
 
-BOOL LLSelectMgr::selectGetPermissions(LLPermissions& perm)
+BOOL LLSelectMgr::selectGetPermissions(LLPermissions& result_perm)
 {
-	LLSelectNode* node = mSelectedObjects->getFirstRootNode();
-	if (!node) return FALSE;
-	if (!node->mValid)	return FALSE;
-	BOOL valid = TRUE;
-	perm = *(node->mPermissions);
-	for(node = mSelectedObjects->getNextRootNode(); node != NULL; node = mSelectedObjects->getNextRootNode())
+	BOOL first = TRUE;
+	LLPermissions perm;
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
-		if(!node->mValid)
+		LLSelectNode* node = *iter;	
+		if (!node->mValid)
 		{
-			valid = FALSE;
-			break;
+			return FALSE;
+		}
+
+		if (first)
+		{
+			perm = *(node->mPermissions);
+			first = FALSE;
+		}
+		else
+		{
+			perm.accumulate(*(node->mPermissions));
 		}
-		perm.accumulate(*(node->mPermissions));
 	}
-	return valid;
+
+	result_perm = perm;
+
+	return TRUE;
 }
 
 
@@ -2873,10 +2584,12 @@ void LLSelectMgr::selectDelete()
 	BOOL locked_but_deleteable_object = FALSE;
 	BOOL no_copy_but_deleteable_object = FALSE;
 	BOOL all_owned_by_you = TRUE;
-	for(LLViewerObject* obj = mSelectedObjects->getFirstObject();
-		obj != NULL;
-		obj = mSelectedObjects->getNextObject())
+
+	for (LLObjectSelection::iterator iter = getSelection()->begin();
+		 iter != getSelection()->end(); iter++)
 	{
+		LLViewerObject* obj = (*iter)->getObject();
+
 		if( obj->isAttachment() )
 		{
 			continue;
@@ -2998,10 +2711,10 @@ void LLSelectMgr::confirmDelete(S32 option, void* data)
 			// attempt to derez into the trash.
 			LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id);
 			gSelectMgr->sendListToRegions("DeRezObject",
-									packDeRezHeader,
-									packObjectLocalID,
-									(void*)info,
-									SEND_ONLY_ROOTS);
+										  packDeRezHeader,
+										  packObjectLocalID,
+										  (void*)info,
+										  SEND_ONLY_ROOTS);
 			// VEFFECT: Delete Object - one effect for all deletes
 			if (gSelectMgr->mSelectedObjects->mSelectType != SELECT_TYPE_HUD)
 			{
@@ -3046,9 +2759,10 @@ BOOL LLSelectMgr::selectIsForSale(S32& price)
 	BOOL any_for_sale = FALSE;
 	price = 0;
 
-	LLSelectNode *node;
-	for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() )
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++)
 	{
+		LLSelectNode* node = *iter;
 		if (node->mSaleInfo.isForSale())
 		{
 			price += node->mSaleInfo.getSalePrice();
@@ -3062,61 +2776,92 @@ BOOL LLSelectMgr::selectIsForSale(S32& price)
 
 // returns TRUE if all nodes are valid. method also stores an
 // accumulated sale info.
-BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& sale_info)
+BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& result_sale_info)
 {
-	LLSelectNode* node = mSelectedObjects->getFirstRootNode();
-	if (!node) return FALSE;
-	if (!node->mValid)	return FALSE;
-	BOOL valid = TRUE;
-	sale_info = node->mSaleInfo;
-	for(node = mSelectedObjects->getNextRootNode(); node != NULL; node = mSelectedObjects->getNextRootNode())
+	BOOL first = TRUE;
+	LLSaleInfo sale_info;
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
-		if(!node->mValid)
+		LLSelectNode* node = *iter;	
+		if (!node->mValid)
 		{
-			valid = FALSE;
-			break;
+			return FALSE;
+		}
+
+		if (first)
+		{
+			sale_info = node->mSaleInfo;
+			first = FALSE;
+		}
+		else
+		{
+			sale_info.accumulate(node->mSaleInfo);
 		}
-		sale_info.accumulate(node->mSaleInfo);
 	}
-	return valid;
+
+	result_sale_info = sale_info;
+
+	return TRUE;
 }
 
-BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& ag_perm)
+BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& result_perm)
 {
-	LLSelectNode* node = mSelectedObjects->getFirstNode();
-	if (!node) return FALSE;
-	if (!node->mValid)	return FALSE;
-	BOOL valid = TRUE;
-	ag_perm = node->mAggregatePerm;
-	for(node = mSelectedObjects->getNextNode(); node != NULL; node = mSelectedObjects->getNextNode())
+	BOOL first = TRUE;
+	LLAggregatePermissions perm;
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
-		if(!node->mValid)
+		LLSelectNode* node = *iter;	
+		if (!node->mValid)
 		{
-			valid = FALSE;
-			break;
+			return FALSE;
+		}
+
+		if (first)
+		{
+			perm = node->mAggregatePerm;
+			first = FALSE;
+		}
+		else
+		{
+			perm.aggregate(node->mAggregatePerm);
 		}
-		ag_perm.aggregate(node->mAggregatePerm);
 	}
-	return valid;
+
+	result_perm = perm;
+
+	return TRUE;
 }
 
-BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& ag_perm)
+BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& result_perm)
 {
-	LLSelectNode* node = mSelectedObjects->getFirstNode();
-	if (!node) return FALSE;
-	if (!node->mValid)	return FALSE;
-	BOOL valid = TRUE;
-	ag_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm;
-	for(node = mSelectedObjects->getNextNode(); node != NULL; node = mSelectedObjects->getNextNode())
+	BOOL first = TRUE;
+	LLAggregatePermissions perm;
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
-		if(!node->mValid)
+		LLSelectNode* node = *iter;	
+		if (!node->mValid)
 		{
-			valid = FALSE;
-			break;
+			return FALSE;
+		}
+
+		LLAggregatePermissions t_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm;
+		if (first)
+		{
+			perm = t_perm;
+			first = FALSE;
+		}
+		else
+		{
+			perm.aggregate(t_perm);
 		}
-		ag_perm.aggregate(node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm);
 	}
-	return valid;
+
+	result_perm = perm;
+
+	return TRUE;
 }
 
 
@@ -3155,8 +2900,10 @@ void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy)
 	}
 	else
 	{
-		for (LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
+		for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+			 iter != getSelection()->root_end(); iter++ )
 		{
+			LLSelectNode* node = *iter;
 			node->mDuplicated = TRUE;
 			node->mDuplicatePos = node->getObject()->getPositionGlobal();
 			node->mDuplicateRot = node->getObject()->getRotation();
@@ -3173,21 +2920,24 @@ void LLSelectMgr::repeatDuplicate()
 		return;
 	}
 
-	LLSelectNode* node;
-	LLDynamicArray<LLViewerObject*> non_duplicated_objects;
+	std::vector<LLViewerObject*> non_duplicated_objects;
 
-	for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
+		LLSelectNode* node = *iter;	
 		if (!node->mDuplicated)
 		{
-			non_duplicated_objects.put(node->getObject());
+			non_duplicated_objects.push_back(node->getObject());
 		}
 	}
 
 	// make sure only previously duplicated objects are selected
-	for (S32 i = 0; i < non_duplicated_objects.count(); i++)
+	for (std::vector<LLViewerObject*>::iterator iter = non_duplicated_objects.begin();
+		 iter != non_duplicated_objects.end(); ++iter)
 	{
-		deselectObjectAndFamily(non_duplicated_objects[i]);
+		LLViewerObject* objectp = *iter;
+		deselectObjectAndFamily(objectp);
 	}
 	
 	// duplicate objects in place
@@ -3199,8 +2949,10 @@ void LLSelectMgr::repeatDuplicate()
 	sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS);
 
 	// move current selection based on delta from duplication position and update duplication position
-	for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
+	for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
+		 iter != getSelection()->root_end(); iter++ )
 	{
+		LLSelectNode* node = *iter;	
 		if (node->mDuplicated)
 		{
 			LLQuaternion cur_rot = node->getObject()->getRotation();
@@ -3420,7 +3172,7 @@ void LLSelectMgr::sendGroup(const LLUUID& group_id)
 
 struct LLBuyData
 {
-	LLDynamicArray<LLViewerObject*> mObjectsSent;
+	std::vector<LLViewerObject*> mObjectsSent;
 	LLUUID mCategoryID;
 	LLSaleInfo mSaleInfo;
 };
@@ -3443,9 +3195,9 @@ void LLSelectMgr::packBuyObjectIDs(LLSelectNode* node, void* data)
 	LLBuyData* buy = (LLBuyData*)data;
 
 	LLViewerObject* object = node->getObject();
-	if(buy->mObjectsSent.find(object) == LLDynamicArray<LLViewerObject*>::FAIL)
+	if (std::find(buy->mObjectsSent.begin(), buy->mObjectsSent.end(), object) == buy->mObjectsSent.end())
 	{
-		buy->mObjectsSent.put(object);
+		buy->mObjectsSent.push_back(object);
 		gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
 		gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() );
 		gMessageSystem->addU8Fast(_PREHASH_SaleType, buy->mSaleInfo.getSaleType());
@@ -3534,7 +3286,6 @@ void LLSelectMgr::deselectUnused()
 
 void LLSelectMgr::convertTransient()
 {
-	// use STL-style iteration to avoid recursive iteration problems
 	LLObjectSelection::iterator node_it;
 	for (node_it = mSelectedObjects->begin(); node_it != mSelectedObjects->end(); ++node_it)
 	{
@@ -3812,32 +3563,42 @@ void LLSelectMgr::packHingeHead(void *user_data)
 
 void LLSelectMgr::selectionDump()
 {
-	LLViewerObject *object;
-
-	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	struct f : public LLSelectedObjectFunctor
 	{
-		object->dump();
-	}
+		virtual bool apply(LLViewerObject* object)
+		{
+			object->dump();
+			return true;
+		}
+	} func;
+	getSelection()->applyToObjects(&func);	
 }
 
 void LLSelectMgr::saveSelectedObjectColors()
 {
-	LLSelectNode* selectNode;
-	for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() )
+	struct f : public LLSelectedNodeFunctor
 	{
-		selectNode->saveColors();
-	}
+		virtual bool apply(LLSelectNode* node)
+		{
+			node->saveColors();
+			return true;
+		}
+	} func;
+	getSelection()->applyToNodes(&func);	
 }
 
 void LLSelectMgr::saveSelectedObjectTextures()
 {
-	LLSelectNode*		selectNode;
-
 	// invalidate current selection so we update saved textures
-	for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() )
+	struct f : public LLSelectedNodeFunctor
 	{
-		selectNode->mValid = FALSE;
-	}
+		virtual bool apply(LLSelectNode* node)
+		{
+			node->mValid = FALSE;
+			return true;
+		}
+	} func;
+	getSelection()->applyToNodes(&func);	
 
 	// request object properties message to get updated permissions data
 	sendSelect();
@@ -3848,113 +3609,95 @@ void LLSelectMgr::saveSelectedObjectTextures()
 // also need to know to which simulator to send update message
 void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type)
 {
-	LLSelectNode*		selectNode;
-
 	if (mSelectedObjects->isEmpty())
 	{
 		// nothing selected, so nothing to save
 		return;
 	}
 
-	for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() )
+	struct f : public LLSelectedNodeFunctor
 	{
-		LLViewerObject*		object;
-		object = selectNode->getObject();
-		selectNode->mSavedPositionLocal = object->getPosition();
-		if (object->isAttachment())
+		EActionType mActionType;
+		f(EActionType a) : mActionType(a) {}
+		virtual bool apply(LLSelectNode* selectNode)
 		{
-			if (object->isRootEdit())
+			LLViewerObject*	object = selectNode->getObject();
+			selectNode->mSavedPositionLocal = object->getPosition();
+			if (object->isAttachment())
 			{
-				LLXform* parent_xform = object->mDrawable->getXform()->getParent();
-				if (parent_xform)
+				if (object->isRootEdit())
+				{
+					LLXform* parent_xform = object->mDrawable->getXform()->getParent();
+					if (parent_xform)
+					{
+						selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition());
+					}
+				}
+				else
 				{
-					selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition());
+					LLViewerObject* attachment_root = (LLViewerObject*)object->getParent();
+					LLXform* parent_xform = attachment_root->mDrawable->getXform()->getParent();
+					LLVector3 root_pos = (attachment_root->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
+					LLQuaternion root_rot = (attachment_root->getRotation() * parent_xform->getWorldRotation());
+					selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * root_rot) + root_pos);
 				}
+				selectNode->mSavedRotation = object->getRenderRotation();
 			}
 			else
 			{
-				LLViewerObject* attachment_root = (LLViewerObject*)object->getParent();
-				LLXform* parent_xform = attachment_root->mDrawable->getXform()->getParent();
-				LLVector3 root_pos = (attachment_root->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
-				LLQuaternion root_rot = (attachment_root->getRotation() * parent_xform->getWorldRotation());
-				selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * root_rot) + root_pos);
+				selectNode->mSavedPositionGlobal = object->getPositionGlobal();
+				selectNode->mSavedRotation = object->getRotationRegion();
 			}
-			selectNode->mSavedRotation = object->getRenderRotation();
-		}
-		else
-		{
-			selectNode->mSavedPositionGlobal = object->getPositionGlobal();
-			selectNode->mSavedRotation = object->getRotationRegion();
-		}
 		
-		selectNode->mSavedScale = object->getScale();
-		selectNode->saveTextureScaleRatios();
-
-	}
+			selectNode->mSavedScale = object->getScale();
+			selectNode->saveTextureScaleRatios();
+			return true;
+		}
+	} func(action_type);
+	getSelection()->applyToNodes(&func);	
+	
 	mSavedSelectionBBox = getBBoxOfSelection();
 }
 
-void LLSelectMgr::selectionUpdatePhysics(BOOL physics)
+struct LLSelectMgrApplyFlags : public LLSelectedObjectFunctor
 {
-	LLViewerObject *object;
-
-	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+	LLSelectMgrApplyFlags(U32 flags, BOOL state) : mFlags(flags), mState(state) {}
+	U32 mFlags;
+	BOOL mState;
+	virtual bool apply(LLViewerObject* object)
 	{
-		if (   !object->permModify()  		// preemptive permissions check
-			|| !(object->isRoot()			// don't send for child objects
-			|| object->isJointChild()))
+		if ( object->permModify() &&	// preemptive permissions check
+			 object->isRoot() &&		// don't send for child objects
+			 !object->isJointChild())
 		{
-			continue;
+			object->setFlags( mFlags, mState);
 		}
-		object->setFlags( FLAGS_USE_PHYSICS, physics);
+		return true;
 	}
+};
+
+void LLSelectMgr::selectionUpdatePhysics(BOOL physics)
+{
+	LLSelectMgrApplyFlags func(	FLAGS_USE_PHYSICS, physics);
+	getSelection()->applyToObjects(&func);	
 }
 
 void LLSelectMgr::selectionUpdateTemporary(BOOL is_temporary)
 {
-	LLViewerObject *object;
-
-	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
-	{
-		if (   !object->permModify()  		// preemptive permissions check
-			|| !(object->isRoot()			// don't send for child objects
-			|| object->isJointChild()))
-		{
-			continue;
-		}
-		object->setFlags( FLAGS_TEMPORARY_ON_REZ, is_temporary);
-	}
+	LLSelectMgrApplyFlags func(	FLAGS_TEMPORARY_ON_REZ, is_temporary);
+	getSelection()->applyToObjects(&func);	
 }
 
 void LLSelectMgr::selectionUpdatePhantom(BOOL is_phantom)
 {
-	LLViewerObject *object;
-
-	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
-	{
-		if (   !object->permModify()  		// preemptive permissions check
-			|| !(object->isRoot()			// don't send for child objects
-			|| object->isJointChild()))
-		{
-			continue;
-		}
-		object->setFlags( FLAGS_PHANTOM, is_phantom);
-	}
+	LLSelectMgrApplyFlags func(	FLAGS_PHANTOM, is_phantom);
+	getSelection()->applyToObjects(&func);	
 }
 
 void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows)
 {
-	LLViewerObject *object;
-
-	for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
-	{
-		if (   !object->permModify()  		// preemptive permissions check
-			|| object->isJointChild())
-		{
-			continue;
-		}
-		object->setFlags( FLAGS_CAST_SHADOWS, cast_shadows);
-	}
+	LLSelectMgrApplyFlags func(	FLAGS_CAST_SHADOWS, cast_shadows);
+	getSelection()->applyToObjects(&func);	
 }
 
 
@@ -4177,85 +3920,87 @@ void LLSelectMgr::sendListToRegions(const LLString& message_name,
 	S32 packets_sent = 0;
 	S32 objects_in_this_packet = 0;
 
-
 	//clear update override data (allow next update through)
-	for (node = mSelectedObjects->getFirstNode();
-		 node;
-		 node = mSelectedObjects->getNextNode())
+	struct f : public LLSelectedNodeFunctor
 	{
-		node->mLastPositionLocal.setVec(0,0,0);
-		node->mLastRotation = LLQuaternion();
-		node->mLastScale.setVec(0,0,0);
-	}
+		virtual bool apply(LLSelectNode* node)
+		{
+			node->mLastPositionLocal.setVec(0,0,0);
+			node->mLastRotation = LLQuaternion();
+			node->mLastScale.setVec(0,0,0);
+			return true;
+		}
+	} func;
+	getSelection()->applyToNodes(&func);	
 
 	std::queue<LLSelectNode*> nodes_to_send;
-	
-	switch(send_type)
-	{
-	case SEND_ONLY_ROOTS:
-		{
-			node = mSelectedObjects->getFirstRootNode();
 
-			while(node)
-			{
-				nodes_to_send.push(node);
-				node = mSelectedObjects->getNextRootNode();
-			}
-		}
-		break;
-	case SEND_INDIVIDUALS:
-		node = mSelectedObjects->getFirstNode();
-		while(node)
+	struct push_all : public LLSelectedNodeFunctor
+	{
+		std::queue<LLSelectNode*>& nodes_to_send;
+		push_all(std::queue<LLSelectNode*>& n) : nodes_to_send(n) {}
+		virtual bool apply(LLSelectNode* node)
 		{
 			nodes_to_send.push(node);
-			node = mSelectedObjects->getNextNode();
+			return true;
 		}
-		break;
-	case SEND_ROOTS_FIRST:
-		// first roots...
-		node = mSelectedObjects->getFirstNode();
-		while(node)
+	};
+	struct push_some : public LLSelectedNodeFunctor
+	{
+		std::queue<LLSelectNode*>& nodes_to_send;
+		bool mRoots;
+		push_some(std::queue<LLSelectNode*>& n, bool roots) : nodes_to_send(n), mRoots(roots) {}
+		virtual bool apply(LLSelectNode* node)
 		{
-			if (node->getObject()->isRootEdit())
+			BOOL is_root = node->getObject()->isRootEdit();
+			if ((mRoots && is_root) || (!mRoots && !is_root))
 			{
 				nodes_to_send.push(node);
 			}
-			node = mSelectedObjects->getNextNode();
+			return true;
 		}
-
-		// then children...
-		node = mSelectedObjects->getFirstNode();
-		while(node)
+	};
+	struct push_editable : public LLSelectedNodeFunctor
+	{
+		std::queue<LLSelectNode*>& nodes_to_send;
+		push_editable(std::queue<LLSelectNode*>& n) : nodes_to_send(n) {}
+		virtual bool apply(LLSelectNode* node)
 		{
-			if (!node->getObject()->isRootEdit())
+			// look and see if this object is actually modifiable by the current agent, because if it's not, then there's little
+			// point in pushing it up to the server to be updated, since we couldn't change it anyway.
+			// That just results in errors on screen when this function gets called by other things, like pulling down a drop down menu
+			LLViewerObject* object = node->getObject();
+			if( object && (object->permModify() || gAgent.allowOperation(PERM_MODIFY, *node->mPermissions) || gAgent.allowOperation(PERM_MOVE, *node->mPermissions)))
 			{
 				nodes_to_send.push(node);
 			}
-			node = mSelectedObjects->getNextNode();
+			return true;
 		}
+	};
+	struct push_all  pushall(nodes_to_send);
+	struct push_some pushroots(nodes_to_send, TRUE);
+	struct push_some pushnonroots(nodes_to_send, FALSE);
+	struct push_editable pusheditable(nodes_to_send);
+	
+	switch(send_type)
+	{
+	  case SEND_ONLY_ROOTS:
+		getSelection()->applyToRootNodes(&pusheditable);
 		break;
-	case SEND_CHILDREN_FIRST:
-		// first children...
-		node = mSelectedObjects->getFirstNode();
-		while(node)
-		{
-			if (!node->getObject()->isRootEdit())
-			{
-				nodes_to_send.push(node);
-			}
-			node = mSelectedObjects->getNextNode();
-		}
-
-		// ...then roots
-		node = mSelectedObjects->getFirstNode();
-		while(node)
-		{
-			if (node->getObject()->isRootEdit())
-			{
-				nodes_to_send.push(node);
-			}
-			node = mSelectedObjects->getNextNode();
-		}
+	  case SEND_INDIVIDUALS:
+		getSelection()->applyToNodes(&pushall);
+		break;
+	  case SEND_ROOTS_FIRST:
+		// first roots...
+		getSelection()->applyToNodes(&pushroots);
+		// then children...
+		getSelection()->applyToNodes(&pushnonroots);
+		break;
+	  case SEND_CHILDREN_FIRST:
+		// first children...
+		getSelection()->applyToNodes(&pushnonroots);
+		// then roots...
+		getSelection()->applyToNodes(&pushroots);
 		break;
 
 	default:
@@ -4263,8 +4008,11 @@ void LLSelectMgr::sendListToRegions(const LLString& message_name,
 	}
 
 	// bail if nothing selected
-	if (nodes_to_send.empty()) return;
-
+	if (nodes_to_send.empty())
+	{
+		return;
+	}
+	
 	node = nodes_to_send.front();
 	nodes_to_send.pop();
 
@@ -4426,27 +4174,24 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
 
 			for (S32 buf_offset = 0; buf_offset < size; buf_offset += UUID_BYTES)
 			{
-				LLUUID id;
-				memcpy(id.mData, packed_buffer + buf_offset, UUID_BYTES);		/* Flawfinder: ignore */
-				texture_ids.push_back(id);
+				LLUUID tid;
+				memcpy(tid.mData, packed_buffer + buf_offset, UUID_BYTES);		/* Flawfinder: ignore */
+				texture_ids.push_back(tid);
 			}
 		}
 
 
 		// Iterate through nodes at end, since it can be on both the regular AND hover list
-		BOOL found = FALSE;
-		LLSelectNode* node;
-		for (node = gSelectMgr->mSelectedObjects->getFirstNode();
-			 node;
-			 node = gSelectMgr->mSelectedObjects->getNextNode())
+		struct f : public LLSelectedNodeFunctor
 		{
-			if (node->getObject()->mID == id)
+			LLUUID mID;
+			f(const LLUUID& id) : mID(id) {}
+			virtual bool apply(LLSelectNode* node)
 			{
-				found = TRUE;
-				break;
+				return (node->getObject()->mID == mID);
 			}
-		}
-
+		} func(id);
+		LLSelectNode* node = gSelectMgr->getSelection()->getFirstNode(&func);
 
 		if (node)
 		{
@@ -4579,23 +4324,21 @@ void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** use
 			LLString fullname(first_name);
 			fullname.append(" ");
 			fullname.append(last_name);
-			reporterp->setPickedObjectProperties(name, fullname.c_str(), owner_id);
+			reporterp->setPickedObjectProperties(name, fullname, owner_id);
 		}
 	}
 
 	// Now look through all of the hovered nodes
-	BOOL found = FALSE;
-	LLSelectNode* node;
-	for (node = gSelectMgr->mHoverObjects->getFirstNode();
-		 node;
-		 node = gSelectMgr->mHoverObjects->getNextNode())
+	struct f : public LLSelectedNodeFunctor
 	{
-		if (node->getObject()->mID == id)
+		LLUUID mID;
+		f(const LLUUID& id) : mID(id) {}
+		virtual bool apply(LLSelectNode* node)
 		{
-			found = TRUE;
-			break;
+			return (node->getObject()->mID == mID);
 		}
-	}
+	} func(id);
+	LLSelectNode* node = gSelectMgr->getHoverObjects()->getFirstNode(&func);
 
 	if (node)
 	{
@@ -4627,7 +4370,7 @@ void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**)
 	LLUUID full_id;
 	S32 local_id;
 	LLViewerObject* object;
-	LLDynamicArray<LLViewerObject*> objects;
+	std::vector<LLViewerObject*> objects;
 	S32 i;
 	S32 block_count = msg->getNumberOfBlocks("Data");
 
@@ -4642,7 +4385,7 @@ void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**)
 		object = gObjectList.findObject(full_id);
 		if (object)
 		{
-			objects.put(object);
+			objects.push_back(object);
 		}
 	}
 
@@ -4655,7 +4398,6 @@ extern LLGLdouble	gGLModelView[16];
 
 void LLSelectMgr::updateSilhouettes()
 {
-	LLSelectNode *node;
 	S32 num_sils_genned = 0;
 
 	LLVector3d	cameraPos = gAgent.getCameraPositionGlobal();
@@ -4668,21 +4410,24 @@ void LLSelectMgr::updateSilhouettes()
 		mSilhouetteImagep = gImageList.getImage(id, TRUE, TRUE);
 	}
 
+	mHighlightedObjects->cleanupNodes();
 
 	if((cameraPos - mLastCameraPos).magVecSquared() > SILHOUETTE_UPDATE_THRESHOLD_SQUARED * currentCameraZoom * currentCameraZoom)
 	{
-		for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
+		struct f : public LLSelectedObjectFunctor
 		{
-			if (node->getObject())
+			virtual bool apply(LLViewerObject* object)
 			{
-				node->getObject()->setChanged(LLXform::SILHOUETTE);
+				object->setChanged(LLXform::SILHOUETTE);
+				return true;
 			}
-		}
+		} func;
+		getSelection()->applyToObjects(&func);	
 		
 		mLastCameraPos = gAgent.getCameraPositionGlobal();
 	}
 	
-	LLDynamicArray<LLViewerObject*> changed_objects;
+	std::vector<LLViewerObject*> changed_objects;
 
 	if (mSelectedObjects->getNumNodes())
 	{
@@ -4693,8 +4438,10 @@ void LLSelectMgr::updateSilhouettes()
 
 		for (S32 pass = 0; pass < 2; pass++)
 		{
-			for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
+			for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
+				 iter != mSelectedObjects->end(); iter++)
 			{
+				LLSelectNode* node = *iter;
 				LLViewerObject* objectp = node->getObject();
 
 				// do roots first, then children so that root flags are cleared ASAP
@@ -4712,7 +4459,7 @@ void LLSelectMgr::updateSilhouettes()
 					if (num_sils_genned++ < MAX_SILS_PER_FRAME)// && objectp->mDrawable->isVisible())
 					{
 						generateSilhouette(node, gCamera->getOrigin());
-						changed_objects.put(objectp);
+						changed_objects.push_back(objectp);
 					}
 					else if (objectp->isAttachment())
 					{
@@ -4761,20 +4508,23 @@ void LLSelectMgr::updateSilhouettes()
 		}
 
 		// remove highlight nodes not in roots list
-		LLDynamicArray<LLSelectNode*> remove_these_nodes;
-		LLDynamicArray<LLViewerObject*> remove_these_roots;
-		for (LLSelectNode* nodep = mHighlightedObjects->getFirstNode(); nodep; nodep = mHighlightedObjects->getNextNode())
+		std::vector<LLSelectNode*> remove_these_nodes;
+		std::vector<LLViewerObject*> remove_these_roots;
+
+		for (LLObjectSelection::iterator iter = mHighlightedObjects->begin();
+			 iter != mHighlightedObjects->end(); iter++)
 		{
-			LLViewerObject* objectp = nodep->getObject();
+			LLSelectNode* node = *iter;
+			LLViewerObject* objectp = node->getObject();
 			if (objectp->isRoot() || !select_linked_set)
 			{
 				if (roots.count(objectp) == 0)
 				{
-					remove_these_nodes.put(nodep);
+					remove_these_nodes.push_back(node);
 				}
 				else
 				{
-					remove_these_roots.put(objectp);
+					remove_these_roots.push_back(objectp);
 				}
 			}
 			else
@@ -4783,22 +4533,25 @@ void LLSelectMgr::updateSilhouettes()
 
 				if (roots.count(rootp) == 0)
 				{
-					remove_these_nodes.put(nodep);
+					remove_these_nodes.push_back(node);
 				}
 			}
 		}
 
 		// remove all highlight nodes no longer in rectangle selection
-		S32 i;
-		for (i = 0; i < remove_these_nodes.count(); i++)
+		for (std::vector<LLSelectNode*>::iterator iter = remove_these_nodes.begin();
+			 iter != remove_these_nodes.end(); ++iter)
 		{
-			mHighlightedObjects->removeNode(remove_these_nodes[i]);
+			LLSelectNode* nodep = *iter;
+			mHighlightedObjects->removeNode(nodep);
 		}
 
 		// remove all root objects already being highlighted
-		for (i = 0; i < remove_these_roots.count(); i++)
+		for (std::vector<LLViewerObject*>::iterator iter = remove_these_roots.begin();
+			 iter != remove_these_roots.end(); ++iter)
 		{
-			roots.erase(remove_these_roots[i]);
+			LLViewerObject* objectp = *iter;
+			roots.erase(objectp);
 		}
 
 		// add all new objects in rectangle selection
@@ -4820,16 +4573,17 @@ void LLSelectMgr::updateSilhouettes()
 			}
 			else
 			{
-				for (U32 i = 0; i < objectp->mChildList.size(); i++)
+				for (LLViewerObject::child_list_t::iterator iter = objectp->mChildList.begin();
+					 iter != objectp->mChildList.end(); ++iter)
 				{
-					LLViewerObject* child_objectp = objectp->mChildList[i];
-
+					LLViewerObject* child_objectp = *iter;
+				
 					if (!canSelectObject(child_objectp))
 					{
 						continue;
 					}
 
-					LLSelectNode* rect_select_node = new LLSelectNode(objectp->mChildList[i], TRUE);
+					LLSelectNode* rect_select_node = new LLSelectNode(child_objectp, TRUE);
 					rect_select_node->selectAllTEs(TRUE);
 					mHighlightedObjects->addNodeAtEnd(rect_select_node);
 				}
@@ -4845,8 +4599,10 @@ void LLSelectMgr::updateSilhouettes()
 		//BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL);
 		for (S32 pass = 0; pass < 2; pass++)
 		{
-			for (node = mHighlightedObjects->getFirstNode(); node; node = mHighlightedObjects->getNextNode() )
+			for (LLObjectSelection::iterator iter = mHighlightedObjects->begin();
+				 iter != mHighlightedObjects->end(); iter++)
 			{
+				LLSelectNode* node = *iter;
 				LLViewerObject* objectp = node->getObject();
 
 				// do roots first, then children so that root flags are cleared ASAP
@@ -4864,7 +4620,7 @@ void LLSelectMgr::updateSilhouettes()
 					if (num_sils_genned++ < MAX_SILS_PER_FRAME)
 					{
 						generateSilhouette(node, gCamera->getOrigin());
-						changed_objects.put(objectp);			
+						changed_objects.push_back(objectp);			
 					}
 					else if (objectp->isAttachment() && objectp->getRootEdit()->mDrawable.notNull())
 					{
@@ -4897,10 +4653,12 @@ void LLSelectMgr::updateSilhouettes()
 		mHighlightedObjects->deleteAllNodes();
 	}
 
-	for (S32 i = 0; i < changed_objects.count(); i++)
+	for (std::vector<LLViewerObject*>::iterator iter = changed_objects.begin();
+		 iter != changed_objects.end(); ++iter)
 	{
 		// clear flags after traversing node list (as child objects need to refer to parent flags, etc)
-		changed_objects[i]->clearChanged(LLXform::MOVED | LLXform::SILHOUETTE);
+		LLViewerObject* objectp = *iter;
+		objectp->clearChanged(LLXform::MOVED | LLXform::SILHOUETTE);
 	}
 	
 	//glAlphaFunc(GL_GREATER, 0.01f);
@@ -4913,8 +4671,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
 		return;
 	}
 
-	LLSelectNode *node;
-	LLViewerImage::bindTexture(gSelectMgr->mSilhouetteImagep);
+	LLViewerImage::bindTexture(mSilhouetteImagep);
 	LLGLSPipelineSelection gls_select;
 	glAlphaFunc(GL_GREATER, 0.0f);
 	LLGLEnable blend(GL_BLEND);
@@ -4946,8 +4703,10 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
 		LLUUID inspect_item_id = LLFloaterInspect::getSelectedUUID();
 		for (S32 pass = 0; pass < 2; pass++)
 		{
-			for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
+			for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
+				 iter != mSelectedObjects->end(); iter++)
 			{
+				LLSelectNode* node = *iter;
 				LLViewerObject* objectp = node->getObject();
 				if (objectp->isHUDAttachment() != for_hud)
 				{
@@ -4982,8 +4741,10 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
 		BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL);
 		for (S32 pass = 0; pass < 2; pass++)
 		{
-			for (node = mHighlightedObjects->getFirstNode(); node; node = mHighlightedObjects->getNextNode() )
+			for (LLObjectSelection::iterator iter = mHighlightedObjects->begin();
+				 iter != mHighlightedObjects->end(); iter++)
 			{
+				LLSelectNode* node = *iter;
 				LLViewerObject* objectp = node->getObject();
 				if (objectp->isHUDAttachment() != for_hud)
 				{
@@ -5013,7 +4774,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
 		stop_glerror();
 	}
 
-	gSelectMgr->mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D);
+	mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D);
 	glAlphaFunc(GL_GREATER, 0.01f);
 }
 
@@ -5142,7 +4903,7 @@ S32 LLSelectNode::getLastSelectedTE()
 	return mLastTESelected;
 }
 
-LLViewerObject *LLSelectNode::getObject()
+LLViewerObject* LLSelectNode::getObject()
 {
 	if (!mObject)
 	{
@@ -5155,6 +4916,11 @@ LLViewerObject *LLSelectNode::getObject()
 	return mObject;
 }
 
+void LLSelectNode::setObject(LLViewerObject* object)
+{
+	mObject = object;
+}
+
 void LLSelectNode::saveColors()
 {
 	if (mObject.notNull())
@@ -5174,8 +4940,8 @@ void LLSelectNode::saveTextures(const std::vector<LLUUID>& textures)
 	{
 		mSavedTextures.clear();
 
-		std::vector<LLUUID>::const_iterator texture_it;
-		for (texture_it = textures.begin(); texture_it != textures.end(); ++texture_it)
+		for (std::vector<LLUUID>::const_iterator texture_it = textures.begin();
+			 texture_it != textures.end(); ++texture_it)
 		{
 			mSavedTextures.push_back(*texture_it);
 		}
@@ -5195,7 +4961,7 @@ void LLSelectNode::saveTextureScaleRatios()
 			U32 s_axis = 0;
 			U32 t_axis = 0;
 
-			gSelectMgr->getTESTAxes(mObject, i, &s_axis, &t_axis);
+			LLPrimitive::getTESTAxes(i, &s_axis, &t_axis);
 
 			LLVector3 v;
 			LLVector3 scale = mObject->getScale();
@@ -5491,9 +5257,10 @@ S32 get_family_count(LLViewerObject *parent)
 		llwarns << "Trying to get_family_count on null parent!" << llendl;
 	}
 	S32 count = 1;	// for this object
-	for (U32 i = 0; i < parent->mChildList.size(); i++)
+	for (LLViewerObject::child_list_t::iterator iter = parent->mChildList.begin();
+		 iter != parent->mChildList.end(); ++iter)
 	{
-		LLViewerObject* child = parent->mChildList[i];
+		LLViewerObject* child = *iter;
 
 		if (!child)
 		{
@@ -5524,7 +5291,7 @@ void LLSelectMgr::updateSelectionCenter()
 
 	//override any object updates received
 	//for selected objects
-	gSelectMgr->overrideObjectUpdates();
+	overrideObjectUpdates();
 
 	LLViewerObject* object = mSelectedObjects->getFirstObject();
 	if (!object)
@@ -5568,10 +5335,13 @@ void LLSelectMgr::updateSelectionCenter()
 		LLVector3d select_center;
 		// keep a list of jointed objects for showing the joint HUDEffects
 
-		LLDynamicArray < LLViewerObject *> jointed_objects;
+		std::vector < LLViewerObject *> jointed_objects;
 
-		for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
+		for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
+			 iter != mSelectedObjects->end(); iter++)
 		{
+			LLSelectNode* node = *iter;
+			LLViewerObject* object = node->getObject();
 			LLViewerObject *myAvatar = gAgent.getAvatarObject();
 			LLViewerObject *root = object->getRootEdit();
 			if (mSelectedObjects->mSelectType == SELECT_TYPE_WORLD && // not an attachment
@@ -5585,9 +5355,9 @@ void LLSelectMgr::updateSelectionCenter()
 
 			if (object->isJointChild())
 			{
-				jointed_objects.put(object);
+				jointed_objects.push_back(object);
 			}
-		} // end for
+		}
 		
 		LLVector3 bbox_center_agent = bbox.getCenterAgent();
 		mSelectionCenterGlobal = gAgent.getPosGlobalFromAgent(bbox_center_agent);
@@ -5717,6 +5487,7 @@ void LLSelectMgr::redo()
 //-----------------------------------------------------------------------------
 BOOL LLSelectMgr::canDoDelete()
 {
+	// Note: Can only delete root objects (see getFirstDeleteableObject() for more info)
 	return mSelectedObjects->getFirstDeleteableObject() != NULL;
 }
 
@@ -5779,469 +5550,141 @@ ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object)
 	}
 }
 
-void LLSelectMgr::validateSelection()
-{
-	LLViewerObject* objectp;
-	for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject())
-	{
-		if (!canSelectObject(objectp))
-		{
-			deselectObjectOnly(objectp);
-		}
-	}
-}
-
-BOOL LLSelectMgr::canSelectObject(LLViewerObject* object)
-{
-	if (mForceSelection)
-	{
-		return TRUE;
-	}
-
-	if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !object->permYouOwner()) ||
-		(gSavedSettings.getBOOL("SelectMovableOnly") && !object->permMove()))
-	{
-		// only select my own objects
-		return FALSE;
-	}
-
-	// Can't select dead objects
-	if (object->isDead()) return FALSE;
-
-	// Can't select orphans
-	if (object->isOrphaned()) return FALSE;
-	
-	// Can't select avatars
-	if (object->isAvatar()) return FALSE;
-
-	// Can't select land
-	if (object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) return FALSE;
-
-	ESelectType selection_type = getSelectTypeForObject(object);
-	if (mSelectedObjects->getObjectCount() > 0 && mSelectedObjects->mSelectType != selection_type) return FALSE;
-
-	return TRUE;
-}
-
-BOOL LLSelectMgr::setForceSelection(BOOL force) 
-{ 
-	std::swap(mForceSelection,force); 
-	return force; 
-}
-
-LLObjectSelection::LLObjectSelection() : 
-	std::list<LLSelectNode*>(), 
-	LLRefCount(),
-	mCurrentNode(end()),
-	mCurrentTE(-1),
-	mSelectType(SELECT_TYPE_WORLD)
-{
-}
-
-LLObjectSelection::~LLObjectSelection()
-{
-	std::for_each(begin(), end(), DeletePointer());
-}
-
-void LLObjectSelection::updateEffects()
-{
-}
-
-S32 LLObjectSelection::getNumNodes()
-{
-	return size();
-}
-
-void LLObjectSelection::addNode(LLSelectNode *nodep)
-{
-	push_front(nodep);
-	mSelectNodeMap[nodep->getObject()] = nodep;
-}
-
-void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep)
-{
-	push_back(nodep);
-	mSelectNodeMap[nodep->getObject()] = nodep;
-}
-
-void LLObjectSelection::removeNode(LLSelectNode *nodep)
-{
-	std::list<LLSelectNode*>::iterator iter = begin();
-	while(iter != end())
-	{
-		if ((*iter) == nodep)
-		{
-			mSelectNodeMap.erase(nodep->getObject());
-			iter = erase(iter);
-		}
-		else
-		{
-			++iter;
-		}
-	}
-}
-
-void LLObjectSelection::deleteAllNodes()
-{
-	std::for_each(begin(), end(), DeletePointer());
-	clear();
-	mSelectNodeMap.clear();
-}
-
-LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp)
-{
-	std::map<LLPointer<LLViewerObject>, LLSelectNode*>::iterator found_it = mSelectNodeMap.find(objectp);
-	if (found_it != mSelectNodeMap.end())
-	{
-		return found_it->second;
-	}
-	return NULL;
-}
-
-//-----------------------------------------------------------------------------
-// getFirstNode()
-//-----------------------------------------------------------------------------
-LLSelectNode *LLObjectSelection::getFirstNode()
-{
-	mCurrentNode = begin();//getFirstData();
-
-	while (mCurrentNode != end() && !(*mCurrentNode)->getObject())
-	{
-		// The object on this was killed at some point, delete it.
-		erase(mCurrentNode++);
-	}
-
-	if (mCurrentNode != end())
-	{
-		return *mCurrentNode;
-	}
-	
-	return NULL;
-}
-
-//-----------------------------------------------------------------------------
-// getCurrentNode()
-//-----------------------------------------------------------------------------
-LLSelectNode *LLObjectSelection::getCurrentNode()
-{
-	while (mCurrentNode != end() && !(*mCurrentNode)->getObject())
-	{
-		// The object on this was killed at some point, delete it.
-		erase(mCurrentNode++);
-	}
-
-	if (mCurrentNode != end())
-	{
-		return *mCurrentNode;
-	}
-	return NULL;
-}
-
-//-----------------------------------------------------------------------------
-// getNextNode()
-//-----------------------------------------------------------------------------
-LLSelectNode *LLObjectSelection::getNextNode()
-{
-	++mCurrentNode;
-
-	while (mCurrentNode != end() && !(*mCurrentNode)->getObject())
-	{
-		// The object on this was killed at some point, delete it.
-		erase(mCurrentNode++);
-	}
-
-	if (mCurrentNode != end())
-	{
-		return *mCurrentNode;
-	}
-	return NULL;
-}
-
-
-
-//-----------------------------------------------------------------------------
-// getFirstObject()
-//-----------------------------------------------------------------------------
-LLViewerObject* LLObjectSelection::getFirstObject()
-{
-	mCurrentNode = begin();
-
-	while (mCurrentNode != end() && !(*mCurrentNode)->getObject())
-	{
-		// The object on this was killed at some point, delete it.
-		erase(mCurrentNode++);
-	}
-
-	if (mCurrentNode != end())
-	{
-		return (*mCurrentNode)->getObject();
-	}
-
-	return NULL;
-}
-
-
-//-----------------------------------------------------------------------------
-// getNextObject()
-//-----------------------------------------------------------------------------
-LLViewerObject* LLObjectSelection::getNextObject()
-{
-	++mCurrentNode;// = getNextData();
-
-	while (mCurrentNode != end() && !(*mCurrentNode)->getObject())
-	{
-		// The object on this was killed at some point, delete it.
-		erase(mCurrentNode++);
-	}
-
-	if (mCurrentNode != end())
-	{
-		return (*mCurrentNode)->getObject();
-	}
-
-	return NULL;
-}
-
-
-
-//-----------------------------------------------------------------------------
-// getPrimaryTE()
-//-----------------------------------------------------------------------------
-void LLObjectSelection::getPrimaryTE(LLViewerObject* *object, S32 *te)
-{
-	// initialize object and te
-	*te = 0;
-	*object = NULL;
-
-	BOOL searching_roots = TRUE;
-
-	// try for root node first, then first child node
-	LLSelectNode *primary_node = getFirstNode(); //getFirstRootNode();
-	if (!primary_node)
-	{
-		primary_node = getFirstNode();
-		searching_roots = FALSE;
-	}
-
-	while (primary_node)
-	{
-		S32 last_selected_te = primary_node->getLastSelectedTE();
-		if (last_selected_te >= 0)
-		{
-			*object = primary_node->getObject();
-			*te = last_selected_te;
-			return;
-		}
-		for(S32 cur_te = 0; cur_te < primary_node->getObject()->getNumTEs(); cur_te++)
-		{
-			// if face selected
-			if (primary_node->isTESelected(cur_te))
-			{
-				// return this object and face
-				*object = primary_node->getObject();
-				*te = cur_te;
-				return;
-			}
-		}
-		if (searching_roots)
-		{
-			primary_node = getNextRootNode();
-			if (!primary_node)
-			{
-				primary_node = getFirstNode();
-				searching_roots = FALSE;
-			}
-		}
-		else
-		{
-			primary_node = getNextNode();
-		}
-	}
-}
-
-//-----------------------------------------------------------------------------
-// getFirstTE()
-//-----------------------------------------------------------------------------
-void LLObjectSelection::getFirstTE(LLViewerObject* *object, S32 *te)
-{
-	// start with first face
-	mCurrentTE = 0;
-
-	LLSelectNode *cur_node = getFirstNode();
-
-	// repeat over all selection nodes
-	while (cur_node)
-	{
-		// skip objects with no faces
-		if (cur_node->getObject()->getNumTEs() == 0)
-		{
-			mCurrentTE = 0;
-			cur_node = getNextNode();
-			continue;
-		}
-
-		// repeat over all faces for this object
-		while (mCurrentTE < cur_node->getObject()->getNumTEs())
-		{
-			// if face selected
-			if (cur_node->isTESelected(mCurrentTE))
-			{
-				// return this object and face
-				*object = cur_node->getObject();
-				*te = mCurrentTE;
-				return;
-			}
-
-			mCurrentTE++;
-		}
-
-		// Couldn't find a selected face.
-		// This can happen if an object's volume parameters are changed in such a way
-		// that texture entries are eliminated.
-		//
-		// TODO: Consider selecting all faces in this case?  Subscribe the selection
-		// list to the volume changing code?
-
-		mCurrentTE = 0;
-		cur_node = getNextNode();
-	}
-
-	// The list doesn't contain any nodes.  Return NULL.
-	*object = NULL;
-	*te = -1;
-	return;
-}
-
-
-//-----------------------------------------------------------------------------
-// getNextFace()
-//-----------------------------------------------------------------------------
-void LLObjectSelection::getNextTE(LLViewerObject* *object, S32 *te)
-{
-	// try next face
-	mCurrentTE++;
-
-	LLSelectNode *cur_node = getCurrentNode();
-	// repeat over remaining selection nodes
-	while ( cur_node )
-	{
-		// skip objects with no faces
-		if (cur_node->getObject()->getNumTEs() == 0)
-		{
-			mCurrentTE = 0;
-			cur_node = getNextNode();
-			continue;
-		}
-
-		// repeat over all faces for this object
-		// CRO: getNumTEs() no longer equals mFaces.count(), so use mFaces.count() instead
-		while ( mCurrentTE < cur_node->getObject()->getNumTEs() )
+void LLSelectMgr::validateSelection()
+{
+	struct f : public LLSelectedObjectFunctor
+	{
+		virtual bool apply(LLViewerObject* object)
 		{
-			// if face selected
-			if (cur_node->isTESelected(mCurrentTE))
+			if (!gSelectMgr->canSelectObject(object))
 			{
-				// return this object and face
-				*object = cur_node->getObject();
-				*te = mCurrentTE;
-				return;
+				gSelectMgr->deselectObjectOnly(object);
 			}
-
-			mCurrentTE++;
+			return true;
 		}
-
-		mCurrentTE = 0;
-		cur_node = getNextNode();
-	}
-
-	// The list doesn't contain any nodes.  Return NULL.
-	*object = NULL;
-	*te = -1;
-	return;
+	} func;
+	getSelection()->applyToObjects(&func);	
 }
 
-void LLObjectSelection::getCurrentTE(LLViewerObject* *object, S32 *te)
+BOOL LLSelectMgr::canSelectObject(LLViewerObject* object)
 {
-	if (mCurrentNode != end())
-	{
-		*object = (*mCurrentNode)->getObject();
-		*te = mCurrentTE;
-	}
-	else
+	if (mForceSelection)
 	{
-		*object = NULL;
-		*te = -1;
+		return TRUE;
 	}
-}
-//-----------------------------------------------------------------------------
-// getFirstRootNode()
-//-----------------------------------------------------------------------------
-LLSelectNode *LLObjectSelection::getFirstRootNode()
-{
-	LLSelectNode *cur_node = getFirstNode();
 
-	// scan through child objects and roots set to ignore
-	while (cur_node && 
-				(!(cur_node->getObject()->isRootEdit() || cur_node->getObject()->isJointChild()) ||
-					cur_node->mIndividualSelection))
+	if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !object->permYouOwner()) ||
+		(gSavedSettings.getBOOL("SelectMovableOnly") && !object->permMove()))
 	{
-		cur_node = getNextNode();
+		// only select my own objects
+		return FALSE;
 	}
 
-	return cur_node;
+	// Can't select dead objects
+	if (object->isDead()) return FALSE;
+
+	// Can't select orphans
+	if (object->isOrphaned()) return FALSE;
+	
+	// Can't select avatars
+	if (object->isAvatar()) return FALSE;
+
+	// Can't select land
+	if (object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) return FALSE;
+
+	ESelectType selection_type = getSelectTypeForObject(object);
+	if (mSelectedObjects->getObjectCount() > 0 && mSelectedObjects->mSelectType != selection_type) return FALSE;
+
+	return TRUE;
 }
 
+BOOL LLSelectMgr::setForceSelection(BOOL force) 
+{ 
+	std::swap(mForceSelection,force); 
+	return force; 
+}
 
-//-----------------------------------------------------------------------------
-// getNextRootNode()
-//-----------------------------------------------------------------------------
-LLSelectNode *LLObjectSelection::getNextRootNode()
+LLObjectSelection::LLObjectSelection() : 
+	LLRefCount(),
+	mSelectType(SELECT_TYPE_WORLD)
+{
+}
+
+LLObjectSelection::~LLObjectSelection()
 {
-	LLSelectNode *cur_node = getNextNode();
+	deleteAllNodes();
+}
 
-	while (cur_node && 
-				(!(cur_node->getObject()->isRootEdit() || cur_node->getObject()->isJointChild()) ||
-					cur_node->mIndividualSelection))
+void LLObjectSelection::cleanupNodes()
+{
+	for (list_t::iterator iter = mList.begin(); iter != mList.end(); )
 	{
-		cur_node = getNextNode();
+		list_t::iterator curiter = iter++;
+		LLSelectNode* node = *curiter;
+		if (node->getObject() == NULL || node->getObject()->isDead())
+		{
+			mList.erase(curiter);
+			delete node;
+		}
 	}
-
-	return cur_node;
 }
 
+void LLObjectSelection::updateEffects()
+{
+}
 
-//-----------------------------------------------------------------------------
-// getFirstRootObject()
-//-----------------------------------------------------------------------------
-LLViewerObject *LLObjectSelection::getFirstRootObject()
+S32 LLObjectSelection::getNumNodes()
 {
-	LLSelectNode *node = getFirstRootNode();
+	return mList.size();
+}
 
-	if (node)
-	{
-		return node->getObject();
-	}
-	else
-	{
-		return NULL;
-	}
+void LLObjectSelection::addNode(LLSelectNode *nodep)
+{
+	llassert_always(nodep->getObject() && !nodep->getObject()->isDead());
+	mList.push_front(nodep);
+	mSelectNodeMap[nodep->getObject()] = nodep;
 }
 
+void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep)
+{
+	llassert_always(nodep->getObject() && !nodep->getObject()->isDead());
+	mList.push_back(nodep);
+	mSelectNodeMap[nodep->getObject()] = nodep;
+}
 
-//-----------------------------------------------------------------------------
-// getNextRootObject()
-//-----------------------------------------------------------------------------
-LLViewerObject *LLObjectSelection::getNextRootObject()
+void LLObjectSelection::moveNodeToFront(LLSelectNode *nodep)
 {
-	LLSelectNode *node = getNextRootNode();
+	mList.remove(nodep);
+	mList.push_front(nodep);
+}
 
-	if (node)
+void LLObjectSelection::removeNode(LLSelectNode *nodep)
+{
+	mSelectNodeMap.erase(nodep->getObject());
+	if (nodep->getObject() == mPrimaryObject)
 	{
-		return node->getObject();
+		mPrimaryObject = NULL;
 	}
-	else
+	nodep->setObject(NULL); // Will get erased in cleanupNodes()
+	mList.remove(nodep);
+}
+
+void LLObjectSelection::deleteAllNodes()
+{
+	std::for_each(mList.begin(), mList.end(), DeletePointer());
+	mList.clear();
+	mSelectNodeMap.clear();
+	mPrimaryObject = NULL;
+}
+
+LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp)
+{
+	std::map<LLPointer<LLViewerObject>, LLSelectNode*>::iterator found_it = mSelectNodeMap.find(objectp);
+	if (found_it != mSelectNodeMap.end())
 	{
-		return NULL;
+		return found_it->second;
 	}
+	return NULL;
 }
 
 //-----------------------------------------------------------------------------
@@ -6249,7 +5692,7 @@ LLViewerObject *LLObjectSelection::getNextRootObject()
 //-----------------------------------------------------------------------------
 BOOL LLObjectSelection::isEmpty()
 {
-	return (size() == 0);
+	return (mList.size() == 0);
 }
 
 //-----------------------------------------------------------------------------
@@ -6257,24 +5700,20 @@ BOOL LLObjectSelection::isEmpty()
 //-----------------------------------------------------------------------------
 BOOL LLObjectSelection::getOwnershipCost(S32 &cost)
 {
-	S32 count = 0;
-	for( LLSelectNode* nodep = getFirstNode(); nodep; nodep = getNextNode() )
-	{
-		count++;
-	}
-
+	S32 count = getObjectCount();
 	cost = count * OWNERSHIP_COST_PER_OBJECT;
-
 	return (count > 0);
 }
 
 
 //-----------------------------------------------------------------------------
-// getObjectCount()
+// getObjectCount() - returns number of non null objects
 //-----------------------------------------------------------------------------
 S32 LLObjectSelection::getObjectCount()
 {
-	return getNumNodes();
+	cleanupNodes();
+	S32 count = mList.size();
+	return count;
 }
 
 
@@ -6284,23 +5723,19 @@ S32 LLObjectSelection::getObjectCount()
 S32 LLObjectSelection::getTECount()
 {
 	S32 count = 0;
-
-	LLSelectNode* nodep;
-	for (nodep = getFirstNode(); nodep; nodep = getNextNode() )
+	for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++)
 	{
-		if (nodep->getObject())
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
+		S32 num_tes = object->getNumTEs();
+		for (S32 te = 0; te < num_tes; te++)
 		{
-			S32 num_tes = nodep->getObject()->getNumTEs();
-			for (S32 te = 0; te < num_tes; te++)
+			if (node->isTESelected(te))
 			{
-				if (nodep->isTESelected(te))
-				{
-					count++;
-				}
+				++count;
 			}
 		}
 	}
-
 	return count;
 }
 
@@ -6309,47 +5744,97 @@ S32 LLObjectSelection::getTECount()
 //-----------------------------------------------------------------------------
 S32 LLObjectSelection::getRootObjectCount()
 {
-	LLSelectNode *nodep;
-
 	S32 count = 0;
-	for(nodep = getFirstRootNode(); nodep; nodep = getNextRootNode())
+	for (LLObjectSelection::root_iterator iter = root_begin(); iter != root_end(); iter++)
 	{
 		++count;
 	}
 	return count;
 }
 
-bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func)
+bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func, bool firstonly)
 {
-	bool result = true;
-	LLViewerObject* object;
-	for (object = getFirstObject(); object != NULL; object = getNextObject())
+	bool result = firstonly ? false : true;
+	for (iterator iter = begin(); iter != end(); )
 	{
-		result = result && func->apply(object);
+		iterator nextiter = iter++;
+		LLViewerObject* object = (*nextiter)->getObject();
+		bool r = func->apply(object);
+		if (firstonly && r)
+			return true;
+		else
+			result = result && r;
 	}
 	return result;
 }
 
-bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func)
+bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly)
 {
-	bool result = true;
-	LLViewerObject* object;
-	for (object = getFirstRootObject(); 
-		 object != NULL; 
-		 object = getNextRootObject())
+	bool result = firstonly ? false : true;
+	for (root_iterator iter = root_begin(); iter != root_end(); )
 	{
-		result = result && func->apply(object);
+		root_iterator nextiter = iter++;
+		LLViewerObject* object = (*nextiter)->getObject();
+		bool r = func->apply(object);
+		if (firstonly && r)
+			return true;
+		else
+			result = result && r;
 	}
 	return result;
 }
 
-bool LLObjectSelection::applyToNodes(LLSelectedNodeFunctor *func)
+bool LLObjectSelection::applyToTEs(LLSelectedTEFunctor* func, bool firstonly)
 {
-	bool result = true;
-	LLSelectNode* node;
-	for (node = getFirstNode(); node != NULL; node = getNextNode())
+	bool result = firstonly ? false : true;
+	for (iterator iter = begin(); iter != end(); )
+	{
+		iterator nextiter = iter++;
+		LLSelectNode* node = *nextiter;
+		LLViewerObject* object = (*nextiter)->getObject();
+		for (S32 te = 0; te < object->getNumTEs(); ++te)
+		{
+			if (node->isTESelected(te))
+			{
+				bool r = func->apply(object, te);
+				if (firstonly && r)
+					return true;
+				else
+					result = result && r;
+			}
+		}
+	}
+	return result;
+}
+
+bool LLObjectSelection::applyToNodes(LLSelectedNodeFunctor *func, bool firstonly)
+{
+	bool result = firstonly ? false : true;
+	for (iterator iter = begin(); iter != end(); )
 	{
-		result = result && func->apply(node);
+		iterator nextiter = iter++;
+		LLSelectNode* node = *nextiter;
+		bool r = func->apply(node);
+		if (firstonly && r)
+			return true;
+		else
+			result = result && r;
+	}
+	return result;
+}
+
+bool LLObjectSelection::applyToRootNodes(LLSelectedNodeFunctor *func, bool firstonly)
+{
+	bool result = firstonly ? false : true;
+	for (root_iterator iter = root_begin(); iter != root_end(); )
+	{
+		root_iterator nextiter = iter++;
+		LLSelectNode* node = *nextiter;
+		bool r = func->apply(node);
+		if (firstonly && r)
+			return true;
+		else
+			result = result && r;
 	}
 	return result;
 }
@@ -6368,12 +5853,13 @@ BOOL LLObjectSelection::contains(LLViewerObject* object)
 //-----------------------------------------------------------------------------
 BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te)
 {
-	LLSelectNode *nodep;
 	if (te == SELECT_ALL_TES)
 	{
 		// ...all faces
-		for (nodep = getFirstNode(); nodep; nodep = getNextNode() )
+		for (LLObjectSelection::iterator iter = begin();
+			 iter != end(); iter++)
 		{
+			LLSelectNode* nodep = *iter;
 			if (nodep->getObject() == object)
 			{
 				BOOL all_selected = TRUE;
@@ -6389,8 +5875,9 @@ BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te)
 	else
 	{
 		// ...one face
-		for (nodep = getFirstNode(); nodep; nodep = getNextNode() )
+		for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++)
 		{
+			LLSelectNode* nodep = *iter;
 			if (nodep->getObject() == object && nodep->isTESelected(te))
 			{
 				return TRUE;
@@ -6407,203 +5894,193 @@ BOOL LLObjectSelection::isAttachment()
 }
 
 //-----------------------------------------------------------------------------
-// getFirstMoveableNode()
+// getSelectedParentObject()
 //-----------------------------------------------------------------------------
-LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root)
+LLViewerObject* getSelectedParentObject(LLViewerObject *object)
 {
-	LLSelectNode* selectNode = NULL;
-
-	if (get_root)
+	LLViewerObject *parent;
+	while (object && (parent = (LLViewerObject*)object->getParent()))
 	{
-		for(selectNode = getFirstRootNode(); selectNode; selectNode = getNextRootNode())
+		if (parent->isSelected())
 		{
-			if( selectNode->getObject()->permMove() )
-			{
-				return selectNode;
-				break;
-			}
+			object = parent;
 		}
-	}
-	for(selectNode = getFirstNode(); selectNode; selectNode = getNextNode())
-	{
-		if( selectNode->getObject()->permMove() )
+		else
 		{
-			return selectNode;
 			break;
 		}
 	}
-	
-	return NULL;
+	return object;
 }
 
 //-----------------------------------------------------------------------------
-// getFirstCopyableObject()
+// getFirstNode
 //-----------------------------------------------------------------------------
-LLViewerObject* LLObjectSelection::getFirstCopyableObject(BOOL get_root)
+LLSelectNode* LLObjectSelection::getFirstNode(LLSelectedNodeFunctor* func)
 {
-	LLViewerObject* object = NULL;
-	for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject())
+	for (iterator iter = begin(); iter != end(); ++iter)
 	{
-		if( cur->permCopy() && !cur->isAttachment())
+		LLSelectNode* node = *iter;
+		if (func == NULL || func->apply(node))
 		{
-			object = cur;
-			break;
+			return node;
 		}
-	}	
+	}
+	return NULL;
+}
 
-	if (get_root && object)
+LLSelectNode* LLObjectSelection::getFirstRootNode(LLSelectedNodeFunctor* func, BOOL non_root_ok)
+{
+	for (root_iterator iter = root_begin(); iter != root_end(); ++iter)
 	{
-		LLViewerObject *parent;
-		while ((parent = (LLViewerObject*)object->getParent()))
+		LLSelectNode* node = *iter;
+		if (func == NULL || func->apply(node))
 		{
-			if (parent->isSelected())
-			{
-				object = parent;
-			}
-			else
-			{
-				break;
-			}
+			return node;
 		}
 	}
+	if (non_root_ok)
+	{
+		// Get non root
+		return getFirstNode(func);
+	}
+	return NULL;
+}
 
-	return object;
+
+//-----------------------------------------------------------------------------
+// getFirstSelectedObject
+//-----------------------------------------------------------------------------
+LLViewerObject* LLObjectSelection::getFirstSelectedObject(LLSelectedNodeFunctor* func, BOOL get_parent)
+{
+	LLSelectNode* res = getFirstNode(func);
+	if (res && get_parent)
+	{
+		return getSelectedParentObject(res->getObject());
+	}
+	else if (res)
+	{
+		return res->getObject();
+	}
+	return NULL;
 }
 
+//-----------------------------------------------------------------------------
+// getFirstObject()
+//-----------------------------------------------------------------------------
+LLViewerObject* LLObjectSelection::getFirstObject()
+{
+	LLSelectNode* res = getFirstNode(NULL);
+	return res ? res->getObject() : NULL;
+}
 
 //-----------------------------------------------------------------------------
-// getFirstDeleteableObject()
+// getFirstRootObject()
 //-----------------------------------------------------------------------------
-LLViewerObject* LLObjectSelection::getFirstDeleteableObject(BOOL get_root)
+LLViewerObject* LLObjectSelection::getFirstRootObject(BOOL non_root_ok)
 {
-	//RN: don't currently support deletion of child objects, as that requires separating them first
-	// then derezzing to trash
-	get_root = TRUE;
+	LLSelectNode* res = getFirstRootNode(NULL, non_root_ok);
+	return res ? res->getObject() : NULL;
+}
 
-	LLViewerObject* object = NULL;
-	if (get_root)
+//-----------------------------------------------------------------------------
+// getFirstMoveableNode()
+//-----------------------------------------------------------------------------
+LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root_first)
+{
+	struct f : public LLSelectedNodeFunctor
 	{
-		for(LLViewerObject* current = getFirstRootObject();
-			current != NULL;
-			current = getNextRootObject())
+		bool apply(LLSelectNode* node)
 		{
-			// you can delete an object if permissions allow it, you are
-			// the owner, you are an officer in the group that owns the
-			// object, or you are not the owner but it is on land you own
-			// or land owned by your group. (whew!)
-			if(   (current->permModify()) 
-			|| (current->permYouOwner())
-			|| (!current->permAnyOwner())			// public
-			|| (current->isOverAgentOwnedLand())
-			|| (current->isOverGroupOwnedLand())
-			)
-			{
+			LLViewerObject* obj = node->getObject();
+			return obj->permMove();
+		}
+	} func;
+	LLSelectNode* res = get_root_first ? getFirstRootNode(&func, TRUE) : getFirstNode(&func);
+	return res;
+}
 
-				if( !current->isAttachment() )
-				{
-					object = current;
-					break;
-				}
-			}
-		}	
-	}
-	else
+//-----------------------------------------------------------------------------
+// getFirstCopyableObject()
+//-----------------------------------------------------------------------------
+LLViewerObject* LLObjectSelection::getFirstCopyableObject(BOOL get_parent)
+{
+	struct f : public LLSelectedNodeFunctor
+	{
+		bool apply(LLSelectNode* node)
+		{
+			LLViewerObject* obj = node->getObject();
+			return obj->permCopy() && !obj->isAttachment();
+		}
+	} func;
+	return getFirstSelectedObject(&func, get_parent);
+}
+
+//-----------------------------------------------------------------------------
+// getFirstDeleteableObject()
+//-----------------------------------------------------------------------------
+LLViewerObject* LLObjectSelection::getFirstDeleteableObject()
+{
+	//RN: don't currently support deletion of child objects, as that requires separating them first
+	// then derezzing to trash
+	
+	struct f : public LLSelectedNodeFunctor
 	{
-		// We've avoided this path for a while.  It may not work.
-		llwarns << "!get_root code path may have bitrotted." << llendl;
-		for(LLViewerObject* current = getFirstObject();
-			current != NULL;
-			current = getNextObject())
+		bool apply(LLSelectNode* node)
 		{
+			LLViewerObject* obj = node->getObject();
 			// you can delete an object if permissions allow it, you are
 			// the owner, you are an officer in the group that owns the
 			// object, or you are not the owner but it is on land you own
 			// or land owned by your group. (whew!)
-			if(   (current->permModify()) 
-			|| (current->permYouOwner())
-			|| (!current->permAnyOwner())			// public
-			|| (current->isOverAgentOwnedLand())
-			|| (current->isOverGroupOwnedLand())
-			)
+			if(    (obj->permModify()) 
+				|| (obj->permYouOwner())
+				|| (!obj->permAnyOwner())			// public
+				|| (obj->isOverAgentOwnedLand())
+				|| (obj->isOverGroupOwnedLand())
+				)
 			{
-				if( !current->isAttachment() )
+				if( !obj->isAttachment() )
 				{
-					object = current;
-					break;
+					return TRUE;
 				}
 			}
-		}	
-	}
-
-	return object;
+			return true;
+		}
+	} func;
+	LLSelectNode* node = getFirstNode(&func);
+	return node ? node->getObject() : NULL;
 }
 
-
 //-----------------------------------------------------------------------------
 // getFirstEditableObject()
 //-----------------------------------------------------------------------------
-LLViewerObject* LLObjectSelection::getFirstEditableObject(BOOL get_root)
+LLViewerObject* LLObjectSelection::getFirstEditableObject(BOOL get_parent)
 {
-	LLViewerObject* object = NULL;
-	for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject())
-	{
-		if( cur->permModify() )
-		{
-			object = cur;
-			break;
-		}
-	}	
-
-	if (get_root && object)
+	struct f : public LLSelectedNodeFunctor
 	{
-		LLViewerObject *parent;
-		while ((parent = (LLViewerObject*)object->getParent()))
+		bool apply(LLSelectNode* node)
 		{
-			if (parent->isSelected())
-			{
-				object = parent;
-			}
-			else
-			{
-				break;
-			}
+			LLViewerObject* obj = node->getObject();
+			return obj->permModify();
 		}
-	}
-
-	return object;
+	} func;
+	return getFirstSelectedObject(&func, get_parent);
 }
 
 //-----------------------------------------------------------------------------
 // getFirstMoveableObject()
 //-----------------------------------------------------------------------------
-LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_root)
+LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_parent)
 {
-	LLViewerObject* object = NULL;
-	for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject())
-	{
-		if( cur->permMove() )
-		{
-			object = cur;
-			break;
-		}
-	}	
-
-	if (get_root && object && !object->isJointChild())
+	struct f : public LLSelectedNodeFunctor
 	{
-		LLViewerObject *parent;
-		while ((parent = (LLViewerObject*)object->getParent()))
+		bool apply(LLSelectNode* node)
 		{
-			if (parent->isSelected())
-			{
-				object = parent;
-			}
-			else
-			{
-				break;
-			}
+			LLViewerObject* obj = node->getObject();
+			return obj->permMove();
 		}
-	}
-
-	return object;
+	} func;
+	return getFirstSelectedObject(&func, get_parent);
 }
 
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index ed59c19e452cf376b7e8c785af79402a168f985c..69bf5850051a25e2e92fa67a6d30d1f2163e0134 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -33,7 +33,6 @@
 #define LL_LLSELECTMGR_H
 
 #include "llcharacter.h"
-#include "lldarray.h"
 #include "lleditmenuhandler.h"
 #include "llstring.h"
 #include "llundo.h"
@@ -47,8 +46,10 @@
 #include "llframetimer.h"
 #include "llbbox.h"
 #include "llpermissions.h"
+#include "llviewerobject.h"
 
 #include <deque>
+#include "boost/iterator/filter_iterator.hpp"
 
 class LLMessageSystem;
 class LLViewerImage;
@@ -61,27 +62,37 @@ const S32 SELECT_ALL_TES = -1;
 const S32 SELECT_MAX_TES = 32;
 
 // Do something to all objects in the selection manager.
-// The bool return value can be used to indicate if all
+// The BOOL return value can be used to indicate if all
 // objects are identical (gathering information) or if
 // the operation was successful.
-class LLSelectedObjectFunctor
+struct LLSelectedObjectFunctor
 {
-public:
 	virtual ~LLSelectedObjectFunctor() {};
 	virtual bool apply(LLViewerObject* object) = 0;
 };
 
 // Do something to all select nodes in the selection manager.
-// The bool return value can be used to indicate if all
+// The BOOL return value can be used to indicate if all
 // objects are identical (gathering information) or if
 // the operation was successful.
-class LLSelectedNodeFunctor
+struct LLSelectedNodeFunctor
 {
-public:
 	virtual ~LLSelectedNodeFunctor() {};
 	virtual bool apply(LLSelectNode* node) = 0;
 };
 
+struct LLSelectedTEFunctor
+{
+	virtual ~LLSelectedTEFunctor() {};
+	virtual bool apply(LLViewerObject* object, S32 face) = 0;
+};
+
+template <typename T> struct LLSelectedTEGetFunctor
+{
+	virtual ~LLSelectedTEGetFunctor() {};
+	virtual T get(LLViewerObject* object, S32 te) = 0;
+};
+
 typedef enum e_send_type
 {
 	SEND_ONLY_ROOTS,
@@ -114,53 +125,165 @@ typedef enum e_selection_type
 	SELECT_TYPE_HUD
 }ESelectType;
 
-class LLObjectSelection : public std::list<LLSelectNode*>, public LLRefCount
+// Contains information about a selected object, particularly which TEs are selected.
+class LLSelectNode
+{
+public:
+	LLSelectNode(LLViewerObject* object, BOOL do_glow);
+	LLSelectNode(const LLSelectNode& nodep);
+	~LLSelectNode();
+
+	void selectAllTEs(BOOL b);
+	void selectTE(S32 te_index, BOOL selected);
+	BOOL isTESelected(S32 te_index);
+	S32 getLastSelectedTE();
+	void renderOneSilhouette(const LLColor4 &color);
+	void setTransient(BOOL transient) { mTransient = transient; }
+	BOOL isTransient() { return mTransient; }
+	LLViewerObject* getObject();
+	void setObject(LLViewerObject* object);
+	// *NOTE: invalidate stored textures and colors when # faces change
+	void saveColors();
+	void saveTextures(const std::vector<LLUUID>& textures);
+	void saveTextureScaleRatios();
+
+	BOOL allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const;
+
+public:
+	BOOL			mIndividualSelection;		// For root objects and objects individually selected
+
+	BOOL			mTransient;
+	BOOL			mValid;				// is extra information valid?
+	LLPermissions*	mPermissions;
+	LLSaleInfo		mSaleInfo;
+	LLAggregatePermissions mAggregatePerm;
+	LLAggregatePermissions mAggregateTexturePerm;
+	LLAggregatePermissions mAggregateTexturePermOwner;
+	LLString		mName;
+	LLString		mDescription;
+	LLCategory		mCategory;
+	S16				mInventorySerial;
+	LLVector3		mSavedPositionLocal;	// for interactively modifying object position
+	LLVector3		mLastPositionLocal;
+	LLVector3d		mSavedPositionGlobal;	// for interactively modifying object position
+	LLVector3		mSavedScale;			// for interactively modifying object scale
+	LLVector3		mLastScale;
+	LLQuaternion	mSavedRotation;			// for interactively modifying object rotation
+	LLQuaternion	mLastRotation;
+	BOOL			mDuplicated;
+	LLVector3d		mDuplicatePos;
+	LLQuaternion	mDuplicateRot;
+	LLUUID			mItemID;
+	LLUUID			mFolderID;
+	LLUUID			mFromTaskID;
+	LLString		mTouchName;
+	LLString		mSitName;
+	U64				mCreationDate;
+	std::vector<LLColor4>	mSavedColors;
+	std::vector<LLUUID>		mSavedTextures;
+	std::vector<LLVector3>  mTextureScaleRatios;
+	std::vector<LLVector3>	mSilhouetteVertices;	// array of vertices to render silhouette of object
+	std::vector<LLVector3>	mSilhouetteNormals;	// array of normals to render silhouette of object
+	std::vector<S32>		mSilhouetteSegments;	// array of normals to render silhouette of object
+	BOOL					mSilhouetteExists;	// need to generate silhouette?
+
+protected:
+	LLPointer<LLViewerObject>	mObject;
+	BOOL			mTESelected[SELECT_MAX_TES];
+	S32				mLastTESelected;
+};
+
+class LLObjectSelection : public LLRefCount
 {
 	friend class LLSelectMgr;
 
 protected:
 	~LLObjectSelection();
 
+	// List
+public:
+	typedef std::list<LLSelectNode*> list_t;
+private:
+	list_t mList;
+
+public:
+	// Iterators
+	struct is_non_null
+	{
+		bool operator()(LLSelectNode* node)
+		{
+			return (node->getObject() != NULL);
+		}
+	};
+	typedef boost::filter_iterator<is_non_null, list_t::iterator > iterator;
+	iterator begin() { return iterator(mList.begin(), mList.end()); }
+	iterator end() { return iterator(mList.end(), mList.end()); }
+
+	struct is_valid
+	{
+		bool operator()(LLSelectNode* node)
+		{
+			return (node->getObject() != NULL) && node->mValid;
+		}
+	};
+	typedef boost::filter_iterator<is_valid, list_t::iterator > valid_iterator;
+	valid_iterator valid_begin() { return valid_iterator(mList.begin(), mList.end()); }
+	valid_iterator valid_end() { return valid_iterator(mList.end(), mList.end()); }
+
+	struct is_root
+	{
+		bool operator()(LLSelectNode* node)
+		{
+			LLViewerObject* object = node->getObject();
+			return (object != NULL) && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild());
+		}
+	};
+	typedef boost::filter_iterator<is_root, list_t::iterator > root_iterator;
+	root_iterator root_begin() { return root_iterator(mList.begin(), mList.end()); }
+	root_iterator root_end() { return root_iterator(mList.end(), mList.end()); }
+	
+	struct is_valid_root
+	{
+		bool operator()(LLSelectNode* node)
+		{
+			LLViewerObject* object = node->getObject();
+			return (object != NULL) && node->mValid && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild());
+		}
+	};
+	typedef boost::filter_iterator<is_root, list_t::iterator > valid_root_iterator;
+	valid_root_iterator valid_root_begin() { return valid_root_iterator(mList.begin(), mList.end()); }
+	valid_root_iterator valid_root_end() { return valid_root_iterator(mList.end(), mList.end()); }
+	
 public:
 	LLObjectSelection();
 
 	void updateEffects();
+	void cleanupNodes();
 
 	BOOL isEmpty();
 
 	S32 getOwnershipCost(S32 &cost);
 
-	LLSelectNode* getFirstNode();
-	LLSelectNode* getCurrentNode(); // Warning!  This is NOT the same as the linked_list getCurrentNode
-	LLSelectNode* getNextNode();
-
-	LLSelectNode *getFirstRootNode();
-	LLSelectNode *getNextRootNode();
-
-	LLSelectNode*	getFirstMoveableNode(BOOL get_root = FALSE);
-
-	// iterate through objects
-	LLViewerObject* getFirstObject();
-	LLViewerObject* getNextObject();
-
-	// iterate through root objects
-	LLViewerObject *getFirstRootObject();
-	LLViewerObject *getNextRootObject();
+	LLSelectNode*	getFirstNode(LLSelectedNodeFunctor* func = NULL);
+	LLSelectNode*	getFirstRootNode(LLSelectedNodeFunctor* func = NULL, BOOL non_root_ok = FALSE);
+	LLViewerObject* getFirstSelectedObject(LLSelectedNodeFunctor* func, BOOL get_parent = FALSE);
+	LLViewerObject*	getFirstObject();
+	LLViewerObject*	getFirstRootObject(BOOL non_root_ok = FALSE);
+	
+	LLSelectNode*	getFirstMoveableNode(BOOL get_root_first = FALSE);
 
-	LLViewerObject*	getFirstEditableObject(BOOL get_root = FALSE);
-	LLViewerObject*	getFirstCopyableObject(BOOL get_root = FALSE);
-	LLViewerObject* getFirstDeleteableObject(BOOL get_root = FALSE);
-	LLViewerObject*	getFirstMoveableObject(BOOL get_root = FALSE);
+	LLViewerObject*	getFirstEditableObject(BOOL get_parent = FALSE);
+	LLViewerObject*	getFirstCopyableObject(BOOL get_parent = FALSE);
+	LLViewerObject* getFirstDeleteableObject();
+	LLViewerObject*	getFirstMoveableObject(BOOL get_parent = FALSE);
 	LLViewerObject* getPrimaryObject() { return mPrimaryObject; }
 
 	// iterate through texture entries
-	void getPrimaryTE(LLViewerObject* *object, S32 *te);
-	void getFirstTE(LLViewerObject* *object, S32 *te);
-	void getNextTE(LLViewerObject* *object, S32 *te);
-	void getCurrentTE(LLViewerObject* *object, S32 *te);
-
+	template <typename T> bool getSelectedTEValue(LLSelectedTEGetFunctor<T>* func, T& res);
+		
 	void addNode(LLSelectNode *nodep);
 	void addNodeAtEnd(LLSelectNode *nodep);
+	void moveNodeToFront(LLSelectNode *nodep);
 	void removeNode(LLSelectNode *nodep);
 	void deleteAllNodes();			// Delete all nodes
 	S32 getNumNodes();
@@ -178,21 +301,22 @@ public:
 	BOOL isAttachment();
 
 	// Apply functors to various subsets of the selected objects
-	// Returns the AND of all apply() calls.
-	bool applyToRootObjects(LLSelectedObjectFunctor* func);
-	bool applyToObjects(LLSelectedObjectFunctor* func);
-	bool applyToNodes(LLSelectedNodeFunctor* func);
+	// If firstonly is FALSE, returns the AND of all apply() calls.
+	// Else returns TRUE immediately if any apply() call succeeds (i.e. OR with early exit)
+	bool applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly = false);
+	bool applyToObjects(LLSelectedObjectFunctor* func, bool firstonly = false);
+	bool applyToTEs(LLSelectedTEFunctor* func, bool firstonly = false);
+	bool applyToRootNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
+	bool applyToNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
 
 	ESelectType getSelectType() { return mSelectType; }
 
 private:
 	const LLObjectSelection &operator=(const LLObjectSelection &);
 
-	LLPointer<LLViewerObject>					mPrimaryObject;
-	std::list<LLSelectNode*>::iterator			mCurrentNode;
-	S32											mCurrentTE;
-	std::map<LLPointer<LLViewerObject>, LLSelectNode*>	mSelectNodeMap;
-	ESelectType									mSelectType;
+	LLPointer<LLViewerObject> mPrimaryObject;
+	std::map<LLPointer<LLViewerObject>, LLSelectNode*> mSelectNodeMap;
+	ESelectType mSelectType;
 };
 
 typedef LLHandle<LLObjectSelection> LLObjectSelectionHandle;
@@ -239,6 +363,8 @@ public:
 	virtual void duplicate();
 	virtual BOOL canDuplicate();
 
+	void clearSelections();
+	void update();
 	void updateEffects(); // Update HUD effects
 	void overrideObjectUpdates();
 
@@ -261,7 +387,7 @@ public:
 	LLObjectSelectionHandle selectObjectAndFamily(LLViewerObject* object, BOOL add_to_end = FALSE);
 
 	// Same as above, but takes a list of objects.  Used by rectangle select.
-	LLObjectSelectionHandle selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list, BOOL send_to_sim = TRUE);
+	LLObjectSelectionHandle selectObjectAndFamily(const std::vector<LLViewerObject*>& object_list, BOOL send_to_sim = TRUE);
 
 	// converts all objects currently highlighted to a selection, and returns it
 	LLObjectSelectionHandle selectHighlightedObjects();
@@ -270,7 +396,7 @@ public:
 
 	void highlightObjectOnly(LLViewerObject *objectp);
 	void highlightObjectAndFamily(LLViewerObject *objectp);
-	void highlightObjectAndFamily(const LLDynamicArray<LLViewerObject*>& list);
+	void highlightObjectAndFamily(const std::vector<LLViewerObject*>& list);
 
 	////////////////////////////////////////////////////////////////
 	// Remove
@@ -317,7 +443,7 @@ public:
 	EGridMode		getGridMode() { return mGridMode; }
 	void			getGrid(LLVector3& origin, LLQuaternion& rotation, LLVector3 &scale);
 
-	BOOL getTEMode()			{ return mTEMode; }
+	BOOL getTEMode()		{ return mTEMode; }
 	void setTEMode(BOOL b)	{ mTEMode = b; }
 
 	BOOL shouldShowSelection()	{ return mShowSelection; }
@@ -346,17 +472,7 @@ public:
 	void selectionDump();
 
 	BOOL selectionAllPCode(LLPCode code);		// all objects have this PCode
-	BOOL selectionGetMaterial(U8 *material);	// all objects have same material
-	BOOL selectionGetTexUUID(LLUUID& id);		// true if all selected tes have same texture
-	BOOL selectionGetColor(LLColor4 &color);	// all tes have same color
-	BOOL selectionGetTexScale(F32 *u, F32 *v);	// true if all selected tes have same scale
-	BOOL selectionGetTexOffset(F32 *u, F32 *v);	// true if all selected tes have same offset
-	BOOL selectionGetTexRotation(F32 *rad);		// true if all selected tes have same rotation
-	BOOL selectionGetBumpmap(U8 *bumpmap);			// true if all selected tes have same
-	BOOL selectionGetShiny(U8 *shiny);			// true if all selected tes have same
-	BOOL selectionGetFullbright(U8 *fullbright);// true if all selected tes have same
-	bool selectionGetMediaType(U8 *media_type);	// true if all selected tes have same
-	BOOL selectionGetClickAction(U8* action);
+	BOOL selectionGetClickAction(U8 *out_action);
 	bool selectionGetIncludeInSearch(bool* include_in_search_out); // true if all selected objects have same
 
 	void selectionSetMaterial(U8 material);
@@ -381,9 +497,7 @@ public:
 	void selectionSetObjectSaleInfo(const LLSaleInfo& sale_info);
 
 	void selectionTexScaleAutofit(F32 repeats_per_meter);
-	void selectionResetTexInfo(S32 te);						// sets S,T to 1
 	void adjustTexturesByScale(BOOL send_to_sim, BOOL stretch);
-	BOOL getTESTAxes(const LLViewerObject* object, const U8 te, U32* s_axis, U32* t_axis);	// Only for flex boxes
 
 	void selectionResetRotation();				// sets rotation quat to identity
 	void selectionRotateAroundZ(F32 degrees);
@@ -396,7 +510,7 @@ public:
 	// returns TRUE if it is possible to select this object
 	BOOL canSelectObject(LLViewerObject* object);
 
-	// Returns true if the viewer has information on all selected objects
+	// Returns TRUE if the viewer has information on all selected objects
 	BOOL selectGetAllRootsValid();
 	BOOL selectGetAllValid();
 
@@ -410,17 +524,17 @@ public:
 	// returns TRUE if selected objects can be copied.
 	BOOL selectGetRootsCopy();
 	
-	BOOL selectGetCreator(LLUUID& id, LLString& name);					// true if all have same creator, returns id
-	BOOL selectGetOwner(LLUUID& id, LLString& name);					// true if all objects have same owner, returns id
-	BOOL selectGetLastOwner(LLUUID& id, LLString& name);				// true if all objects have same owner, returns id
+	BOOL selectGetCreator(LLUUID& id, LLString& name);					// TRUE if all have same creator, returns id
+	BOOL selectGetOwner(LLUUID& id, LLString& name);					// TRUE if all objects have same owner, returns id
+	BOOL selectGetLastOwner(LLUUID& id, LLString& name);				// TRUE if all objects have same owner, returns id
 
 	// returns TRUE if all are the same. id is stuffed with
 	// the value found if available.
 	BOOL selectGetGroup(LLUUID& id); 
-	BOOL selectGetPerm(	U8 which_perm, U32* mask_on, U32* mask_off);	// true if all have data, returns two masks, each indicating which bits are all on and all off
+	BOOL selectGetPerm(	U8 which_perm, U32* mask_on, U32* mask_off);	// TRUE if all have data, returns two masks, each indicating which bits are all on and all off
 	BOOL selectGetOwnershipCost(S32* cost);								// sum of all ownership costs
 
-	BOOL selectIsGroupOwned();											// true if all root objects have valid data and are group owned.
+	BOOL selectIsGroupOwned();											// TRUE if all root objects have valid data and are group owned.
 
 	// returns TRUE if all the nodes are valid. Accumulates
 	// permissions in the parameter.
@@ -491,7 +605,7 @@ public:
 	void			updatePointAt();
 
 	// Internal list maintenance functions. TODO: Make these private!
-	void remove(LLDynamicArray<LLViewerObject*>& objects);
+	void remove(std::vector<LLViewerObject*>& objects);
 	void remove(LLViewerObject* object, S32 te = SELECT_ALL_TES, BOOL undoable = TRUE);
 	void removeAll();
 	void addAsIndividual(LLViewerObject* object, S32 te = SELECT_ALL_TES, BOOL undoable = TRUE);
@@ -501,7 +615,7 @@ public:
 private:
 	void convertTransient(); // converts temporarily selected objects to full-fledged selections
 	ESelectType getSelectTypeForObject(LLViewerObject* object);
-	void addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add_to_end = FALSE);
+	void addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to_end = FALSE);
 	void generateSilhouette(LLSelectNode *nodep, const LLVector3& view_point);
 	// Send one message to each region containing an object on selection list.
 	void sendListToRegions(	const LLString& message_name,
@@ -574,78 +688,71 @@ private:
 	LLAnimPauseRequest		mPauseRequest;
 };
 
-
-// Contains information about a selected object, particularly which
-// tes are selected.
-class LLSelectNode
-{
-public:
-	LLSelectNode(LLViewerObject* object, BOOL do_glow);
-	LLSelectNode(const LLSelectNode& nodep);
-	~LLSelectNode();
-
-	void selectAllTEs(BOOL b);
-	void selectTE(S32 te_index, BOOL selected);
-	BOOL isTESelected(S32 te_index);
-	S32 getLastSelectedTE();
-	void renderOneSilhouette(const LLColor4 &color);
-	void setTransient(BOOL transient) { mTransient = transient; }
-	BOOL isTransient() { return mTransient; }
-	LLViewerObject *getObject();
-	// *NOTE: invalidate stored textures and colors when # faces change
-	void saveColors();
-	void saveTextures(const std::vector<LLUUID>& textures);
-	void saveTextureScaleRatios();
-
-	BOOL allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const;
-
-public:
-	BOOL			mIndividualSelection;		// For root objects and objects individually selected
-
-	BOOL			mTransient;
-	BOOL			mValid;				// is extra information valid?
-	LLPermissions*	mPermissions;
-	LLSaleInfo		mSaleInfo;
-	LLAggregatePermissions mAggregatePerm;
-	LLAggregatePermissions mAggregateTexturePerm;
-	LLAggregatePermissions mAggregateTexturePermOwner;
-	LLString		mName;
-	LLString		mDescription;
-	LLCategory		mCategory;
-	S16				mInventorySerial;
-	LLVector3		mSavedPositionLocal;	// for interactively modifying object position
-	LLVector3		mLastPositionLocal;
-	LLVector3d		mSavedPositionGlobal;	// for interactively modifying object position
-	LLVector3		mSavedScale;			// for interactively modifying object scale
-	LLVector3		mLastScale;
-	LLQuaternion	mSavedRotation;			// for interactively modifying object rotation
-	LLQuaternion	mLastRotation;
-	BOOL			mDuplicated;
-	LLVector3d		mDuplicatePos;
-	LLQuaternion	mDuplicateRot;
-	LLUUID			mItemID;
-	LLUUID			mFolderID;
-	LLUUID			mFromTaskID;
-	LLString		mTouchName;
-	LLString		mSitName;
-	U64				mCreationDate;
-	std::vector<LLColor4>	mSavedColors;
-	std::vector<LLUUID>		mSavedTextures;
-	std::vector<LLVector3>  mTextureScaleRatios;
-	std::vector<LLVector3>	mSilhouetteVertices;	// array of vertices to render silhouette of object
-	std::vector<LLVector3>	mSilhouetteNormals;	// array of normals to render silhouette of object
-	std::vector<S32>		mSilhouetteSegments;	// array of normals to render silhouette of object
-	BOOL					mSilhouetteExists;	// need to generate silhouette?
-
-protected:
-	LLPointer<LLViewerObject>	mObject;
-	BOOL			mTESelected[SELECT_MAX_TES];
-	S32				mLastTESelected;
-};
-
 extern LLSelectMgr* gSelectMgr;
 
 // Utilities
 void dialog_refresh_all();		// Update subscribers to the selection list
 
+// Templates
+//-----------------------------------------------------------------------------
+// getSelectedTEValue
+//-----------------------------------------------------------------------------
+template <typename T> bool LLObjectSelection::getSelectedTEValue(LLSelectedTEGetFunctor<T>* func, T& res)
+{
+	bool have_first = false;
+	bool have_selected = false;
+	T selected_value = T();
+
+	// Now iterate through all TEs to test for sameness
+	bool identical = TRUE;
+	for (iterator iter = begin(); iter != end(); iter++)
+	{
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
+		S32 selected_te = -1;
+		if (object == getPrimaryObject())
+		{
+			selected_te = node->getLastSelectedTE();
+		}
+		for (S32 te = 0; te < object->getNumTEs(); ++te)
+		{
+			if (!node->isTESelected(te))
+			{
+				continue;
+			}
+			T value = func->get(object, te);
+			if (!have_first)
+			{
+				have_first = true;
+				if (!have_selected)
+				{
+					selected_value = value;
+				}
+			}
+			else
+			{
+				if ( value != selected_value )
+				{
+					identical = false;
+				}
+				if (te == selected_te)
+				{
+					selected_value = value;
+					have_selected = true;
+				}
+			}
+		}
+		if (!identical && have_selected)
+		{
+			break;
+		}
+	}
+	if (have_first || have_selected)
+	{
+		res = selected_value;
+	}
+	return identical;
+}
+
+
 #endif
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index fc4754b0aec449edf83e76e912ed456557b15448..4ade8c57ff6cb08dc3e40681c9219b8c1df93537 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -409,7 +409,7 @@ BOOL idle_startup()
 		}
 		if (!xml_ok)
 		{
-			// XUI:translate (maybe - very unlikely error message)
+			// *TODO:translate (maybe - very unlikely error message)
 			// Note: alerts.xml may be invalid - if this gets translated it will need to be in the code
 			LLString bad_xui_msg = "An error occured while updating Second Life. Please download the latest version from www.secondlife.com.";
 			app_early_exit(bad_xui_msg);
@@ -537,7 +537,7 @@ BOOL idle_startup()
 		// LibXUL (Mozilla) initialization
 		//---------------------------------------------------------------------
 		#if LL_LIBXUL_ENABLED
-		set_startup_status(0.48f, "Initializing embedded web browser...", gAgent.mMOTD.c_str());
+		set_startup_status(0.58f, "Initializing embedded web browser...", gAgent.mMOTD.c_str());
 		display_startup();
 		llinfos << "Initializing embedded web browser..." << llendl;
 
@@ -1649,12 +1649,17 @@ BOOL idle_startup()
 			gSky.init(initial_sun_direction);
 		}
 
-		set_startup_status(0.45f, "Decoding UI images...", gAgent.mMOTD.c_str());
-		display_startup();
 		llinfos << "Decoding images..." << llendl;
 		// For all images pre-loaded into viewer cache, decode them.
 		// Need to do this AFTER we init the sky
-		gImageList.decodeAllImages(2.f);
+		const S32 DECODE_TIME_SEC = 2;
+		for (int i = 0; i < DECODE_TIME_SEC; i++)
+		{
+			F32 frac = (F32)i / (F32)DECODE_TIME_SEC;
+			set_startup_status(0.45f + frac*0.1f, "Decoding images...", gAgent.mMOTD.c_str());
+			display_startup();
+			gImageList.decodeAllImages(1.f);
+		}
 		LLStartUp::setStartupState( STATE_QUICKTIME_INIT );
 
 		// JC - Do this as late as possible to increase likelihood Purify
@@ -1704,7 +1709,7 @@ BOOL idle_startup()
 		{
 			// initialize quicktime libraries (fails gracefully if quicktime not installed ($QUICKTIME)
 			llinfos << "Initializing QuickTime...." << llendl;
-			set_startup_status(0.47f, "Initializing QuickTime...", gAgent.mMOTD.c_str());
+			set_startup_status(0.57f, "Initializing QuickTime...", gAgent.mMOTD.c_str());
 			display_startup();
 			#if LL_WINDOWS
 				// Only necessary/available on Windows.
@@ -1713,12 +1718,12 @@ BOOL idle_startup()
 					// quicktime init failed - turn off media engine support
 					LLMediaEngine::getInstance ()->setAvailable ( FALSE );
 					llinfos << "...not found - unable to initialize." << llendl;
-					set_startup_status(0.47f, "QuickTime not found - unable to initialize.", gAgent.mMOTD.c_str());
+					set_startup_status(0.57f, "QuickTime not found - unable to initialize.", gAgent.mMOTD.c_str());
 				}
 				else
 				{
 					llinfos << ".. initialized successfully." << llendl;
-					set_startup_status(0.47f, "QuickTime initialized successfully.", gAgent.mMOTD.c_str());
+					set_startup_status(0.57f, "QuickTime initialized successfully.", gAgent.mMOTD.c_str());
 				};
 			#endif
 			EnterMovies ();
@@ -1736,7 +1741,7 @@ BOOL idle_startup()
 	if(STATE_WORLD_WAIT == LLStartUp::getStartupState())
 	{
 		//llinfos << "Waiting for simulator ack...." << llendl;
-		set_startup_status(0.49f, "Waiting for region handshake...", gAgent.mMOTD.c_str());
+		set_startup_status(0.59f, "Waiting for region handshake...", gAgent.mMOTD.c_str());
 		if(gGotUseCircuitCodeAck)
 		{
 			LLStartUp::setStartupState( STATE_AGENT_SEND );
@@ -1755,7 +1760,7 @@ BOOL idle_startup()
 	if (STATE_AGENT_SEND == LLStartUp::getStartupState())
 	{
 		llinfos << "Connecting to region..." << llendl;
-		set_startup_status(0.50f, "Connecting to region...", gAgent.mMOTD.c_str());
+		set_startup_status(0.60f, "Connecting to region...", gAgent.mMOTD.c_str());
 		// register with the message system so it knows we're
 		// expecting this message
 		LLMessageSystem* msg = gMessageSystem;
@@ -2118,6 +2123,7 @@ BOOL idle_startup()
 		gInitializationComplete = TRUE;
 
 		gRenderStartTime.reset();
+		gForegroundTime.reset();
 
 		// HACK: Inform simulator of window size.
 		// Do this here so it's less likely to race with RegisterNewAgent.
@@ -2198,7 +2204,7 @@ BOOL idle_startup()
 		else
 		{
 			update_texture_fetch();
-			set_startup_status(0.50f + 0.50f * timeout_frac, "Precaching...",
+			set_startup_status(0.60f + 0.40f * timeout_frac, "Precaching...",
 							   gAgent.mMOTD.c_str());
 		}
 
@@ -2325,11 +2331,8 @@ void login_show()
 						bUseDebugLogin,
 						login_callback, NULL );
 
-	llinfos << "Decoding Images" << llendl;
+	// UI textures have been previously loaded in doPreloadImages()
 	
-	// Make sure all the UI textures are present and decoded.
-	gImageList.decodeAllImages(2.f);
-
 	llinfos << "Setting Servers" << llendl;
 	
 	if( USERSERVER_OTHER == gUserServerChoice )
@@ -2567,7 +2570,7 @@ void update_app(BOOL mandatory, const std::string& auth_msg)
 
 	std::ostringstream message;
 
-	//XUI:translate
+	//*TODO:translate
 	std::string msg;
 	if (!auth_msg.empty())
 	{
@@ -2909,11 +2912,11 @@ void register_viewer_callbacks(LLMessageSystem* msg)
 	msg->setHandlerFuncFast(_PREHASH_GrantGodlikePowers, process_grant_godlike_powers);
 
 	msg->setHandlerFuncFast(_PREHASH_GroupAccountSummaryReply,
-							LLGroupMoneyPlanningTabEventHandler::processGroupAccountSummaryReply);
+							LLPanelGroupLandMoney::processGroupAccountSummaryReply);
 	msg->setHandlerFuncFast(_PREHASH_GroupAccountDetailsReply,
-							LLGroupMoneyDetailsTabEventHandler::processGroupAccountDetailsReply);
+							LLPanelGroupLandMoney::processGroupAccountDetailsReply);
 	msg->setHandlerFuncFast(_PREHASH_GroupAccountTransactionsReply,
-							LLGroupMoneySalesTabEventHandler::processGroupAccountTransactionsReply);
+							LLPanelGroupLandMoney::processGroupAccountTransactionsReply);
 
 	msg->setHandlerFuncFast(_PREHASH_UserInfoReply,
 		process_user_info_reply);
@@ -3598,7 +3601,6 @@ void callback_choose_gender(S32 option, void* userdata)
 	gAgent.setGenderChosen(TRUE);
 }
 
-// XUI:translate
 void dialog_choose_gender_first_start()
 {
 	if (!gNoRender
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 9b7d31acb47244e7c31d29a711ba76ca845265cc..9bbb25fd2b53eebf50e90c3ec5dd5af1f27f3103 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -252,6 +252,8 @@ void LLStatusBar::refresh()
 	mSGBandwidth->setThreshold(1, bwtotal);
 	mSGBandwidth->setThreshold(2, bwtotal);
 
+	// *TODO: Localize / translate time
+	
 	// Get current UTC time, adjusted for the user's clock
 	// being off.
 	U32 utc_time;
@@ -285,7 +287,7 @@ void LLStatusBar::refresh()
 	t << std::setfill(' ') << std::setw(2) << hour << ":" 
 	  << std::setfill('0') << std::setw(2) << min 
 	  << " " << am_pm << " " << tz;
-	mTextTime->setText(t.str().c_str());
+	mTextTime->setText(t.str());
 
 	// Year starts at 1900, set the tooltip to have the date
 	std::ostringstream date;
@@ -462,13 +464,13 @@ void LLStatusBar::refresh()
 			pos_y -= pos_y % 2;
 		}
 
-		if (parcel && parcel->getName())
+		if (parcel && !parcel->getName().empty())
 		{
 			location_name = region->getName()
 				+ llformat(" %d, %d, %d (%s) - %s", 
 						   pos_x, pos_y, pos_z,
 						   region->getSimAccessString(),
-						   parcel->getName());
+						   parcel->getName().c_str());
 		}
 		else
 		{
@@ -537,10 +539,8 @@ void LLStatusBar::setBalance(S32 balance)
 
 void LLStatusBar::setHealth(S32 health)
 {
-	char buffer[MAX_STRING];		/* Flawfinder: ignore */
-	snprintf(buffer, MAX_STRING, "%d%%", health);		/* Flawfinder: ignore */
 	//llinfos << "Setting health to: " << buffer << llendl;
-	mTextHealth->setText(buffer);
+	mTextHealth->setText(llformat("%d%%", health));
 
 	if( mHealth > health )
 	{
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 2d013e04fb91cb9b2dbfc0178a8ec7bfee51823a..b9610537993c7a79bc37bf99c9ec9b0b51357b5f 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -344,13 +344,12 @@ void LLFloaterTexturePicker::updateImageStats()
 		//RN: have we received header data for this image?
 		if (mTexturep->getWidth(0) > 0 && mTexturep->getHeight(0) > 0)
 		{
-			std::ostringstream formatted_dims;
-			formatted_dims << llformat("Dimensions: %d x %d", mTexturep->getWidth(0),mTexturep->getHeight(0));
-			mResolutionLabel->setText(formatted_dims.str());
+			LLString formatted_dims = llformat("%d x %d", mTexturep->getWidth(0),mTexturep->getHeight(0));
+			mResolutionLabel->setTextArg("[DIMENSIONS]", formatted_dims);
 		}
 		else
 		{
-			mResolutionLabel->setText("Dimensions: unknown");
+			mResolutionLabel->setTextArg("[DIMENSIONS]", LLString("[? x ?]"));
 		}
 		if (gAgent.isGodlike())
 		{
@@ -1454,3 +1453,4 @@ BOOL LLToolTexEyedropper::handleHover(S32 x, S32 y, MASK mask)
 	return TRUE;
 }
 
+
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 06c014a7e789167e373119e12382889f5419f02d..4df5444d66078da34bc7adcf6a5a192c0e360db4 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -641,16 +641,20 @@ void LLTextureView::draw()
 #if 1
 			if (pri < HIGH_PRIORITY && gSelectMgr)
 			{
-				S32 te;
-				LLViewerObject *objectp;
-				LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-				for (selection->getFirstTE(&objectp, &te); objectp; selection->getNextTE(&objectp, &te))
+				struct f : public LLSelectedTEFunctor
 				{
-					if (imagep == objectp->getTEImage(te))
+					LLViewerImage* mImage;
+					f(LLViewerImage* image) : mImage(image) {}
+					virtual bool apply(LLViewerObject* object, S32 te)
 					{
-						pri += 3*HIGH_PRIORITY;
-						break;
+						return (mImage == object->getTEImage(te));
 					}
+				} func(imagep);
+				const bool firstonly = true;
+				bool match = gSelectMgr->getSelection()->applyToTEs(&func, firstonly);
+				if (match)
+				{
+					pri += 3*HIGH_PRIORITY;
 				}
 			}
 #endif
diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp
index f7b14050742f7a70accdbe815ad8188023635cc4..a56bf42ceefbdd8710faa7721e3eb8b24756447d 100644
--- a/indra/newview/lltoolbrush.cpp
+++ b/indra/newview/lltoolbrush.cpp
@@ -416,7 +416,7 @@ void LLToolBrushLand::handleSelect()
 {
 	gEditMenuHandler = this;
 
-	gFloaterTools->setStatusText("Click and hold to modify land");
+	gFloaterTools->setStatusText("modifyland");
 //	if (!mBrushSelected)
 	{
 		mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners");
@@ -432,7 +432,6 @@ void LLToolBrushLand::handleDeselect()
 	{
 		gEditMenuHandler = NULL;
 	}
-	gFloaterTools->setStatusText("");
 	mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners");
 	gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners);
 	gParcelMgr->setSelectionVisible(TRUE);
diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp
index 65182d366eb3251ddf1ea51eab256a5746c83a84..182ea5602ef31851d2936c891c79e5954ef8840e 100644
--- a/indra/newview/lltoolcomp.cpp
+++ b/indra/newview/lltoolcomp.cpp
@@ -250,11 +250,7 @@ void LLToolCompTranslate::pickCallback(S32 x, S32 y, MASK mask)
 			gEditMenuHandler = gSelectMgr;
 		}
 
-		BOOL can_move = gToolTranslate->mManip->getSelection()->getObjectCount() != 0;
-		for (LLViewerObject* objectp = gToolTranslate->mManip->getSelection()->getFirstObject(); objectp; objectp = gToolTranslate->mManip->getSelection()->getNextObject())
-		{
-			can_move = can_move && objectp->permMove() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
-		}
+		BOOL can_move = gToolTranslate->mManip->canAffectSelection();
 
 		if(	LLManip::LL_NO_PART != gToolTranslate->mManip->getHighlightedPart() && can_move)
 		{
diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp
index c4a8ac307f9da2661ced0f4d0cce520d645236e7..2ac2b339458df748a5fb26a5d4b5ea0056878f74 100644
--- a/indra/newview/lltoolfocus.cpp
+++ b/indra/newview/lltoolfocus.cpp
@@ -94,17 +94,13 @@ void LLToolCamera::handleSelect()
 {
 	if (gFloaterTools)
 	{
-		gFloaterTools->setStatusText("Click and drag to change view");
+		gFloaterTools->setStatusText("camera");
 	}
 }
 
 // virtual
 void LLToolCamera::handleDeselect()
 {
-	if (gFloaterTools)
-	{
-		gFloaterTools->setStatusText("");
-	}
 //	gAgent.setLookingAtAvatar(FALSE);
 }
 
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index e416e25777aadd2605024eecb299c55ca1f6b324..13977ee3ac30cc43c734bdec5f833a165faffd43 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -101,7 +101,7 @@ void LLToolGrab::handleSelect()
 	if(gFloaterTools)
 	{
 		// viewer can crash during startup if we don't check.
-		gFloaterTools->setStatusText("Drag to move objects, Ctrl to lift, Ctrl-Shift to spin");
+		gFloaterTools->setStatusText("grab");
 	}
 	gGrabBtnVertical = FALSE;
 	gGrabBtnSpin = FALSE;
@@ -114,7 +114,6 @@ void LLToolGrab::handleDeselect()
 		setMouseCapture( FALSE );
 	}
 
-	gFloaterTools->setStatusText("");
 }
 
 BOOL LLToolGrab::handleDoubleClick(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/lltoolindividual.cpp b/indra/newview/lltoolindividual.cpp
index 24bac8a7fe7067a71456d2b528a24cb17e6b3d60..3ec6b7d4d3c09a82d44b18eb6cbfdecf33c9ab1b 100644
--- a/indra/newview/lltoolindividual.cpp
+++ b/indra/newview/lltoolindividual.cpp
@@ -108,11 +108,8 @@ BOOL LLToolIndividual::handleDoubleClick(S32 x, S32 y, MASK mask)
 
 void LLToolIndividual::handleSelect()
 {
-	LLViewerObject* obj = gSelectMgr->getSelection()->getFirstRootObject();
-	if(!obj)
-	{
-		obj = gSelectMgr->getSelection()->getFirstObject();
-	}
+	const BOOL children_ok = TRUE;
+	LLViewerObject* obj = gSelectMgr->getSelection()->getFirstRootObject(children_ok);
 	gSelectMgr->deselectAll();
 	if(obj)
 	{
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index 7391a53036747e086ea74adf1d3aeadea50ff5b3..ae74eba026eb34f1e01a51cbacc51e9845d4e94f 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -338,18 +338,21 @@ LLTool* LLToolMgr::getCurrentTool()
 		cur_tool = mOverrideTool ? mOverrideTool : mBaseTool;
 	}
 
+	LLTool* prev_tool = mSelectedTool;
+	// Set the selected tool to avoid infinite recursion
+	mSelectedTool = cur_tool;
+	
 	//update tool selection status
-	if (mSelectedTool != cur_tool)
+	if (prev_tool != cur_tool)
 	{
-		if (mSelectedTool)
+		if (prev_tool)
 		{
-			mSelectedTool->handleDeselect();
+			prev_tool->handleDeselect();
 		}
 		if (cur_tool)
 		{
 			cur_tool->handleSelect();
 		}
-		mSelectedTool = cur_tool;
 	}
 
 	return mSelectedTool;
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index cdf2b25a394a56232fb7bd7aeb0a56ce82ef80aa..55692d19621ee2657c84327f3e8b2b4f9b3234b5 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -310,12 +310,12 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show)
 			LLString name = avatar->getFullname();
 			if (gMuteListp->isMuted(avatar->getID(), name))
 			{
-				gMenuHolder->childSetText("Avatar Mute", "Unmute");
+				gMenuHolder->childSetText("Avatar Mute", LLString("Unmute")); // *TODO:Translate
 				//gMutePieMenu->setLabel("Unmute");
 			}
 			else
 			{
-				gMenuHolder->childSetText("Avatar Mute", "Mute");
+				gMenuHolder->childSetText("Avatar Mute", LLString("Mute")); // *TODO:Translate
 				//gMutePieMenu->setLabel("Mute");
 			}
 
@@ -336,12 +336,12 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show)
 			}
 			if (gMuteListp->isMuted(object->getID(), name))
 			{
-				gMenuHolder->childSetText("Object Mute", "Unmute");
+				gMenuHolder->childSetText("Object Mute", LLString("Unmute")); // *TODO:Translate
 				//gMuteObjectPieMenu->setLabel("Unmute");
 			}
 			else
 			{
-				gMenuHolder->childSetText("Object Mute", "Mute");
+				gMenuHolder->childSetText("Object Mute", LLString("Mute")); // *TODO:Translate
 				//gMuteObjectPieMenu->setLabel("Mute");
 			}
 			
@@ -675,3 +675,4 @@ void LLToolPie::render()
 	return;
 }
 
+
diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp
index f99bb3da22929dec542e6e2458686675b2e47fec..ee5d08f128d347a6ad72f569732f1e04ea1350ce 100644
--- a/indra/newview/lltoolplacer.cpp
+++ b/indra/newview/lltoolplacer.cpp
@@ -148,12 +148,11 @@ BOOL LLToolPlacer::handleHover(S32 x, S32 y, MASK mask)
 
 void LLToolPlacer::handleSelect()
 {
-	gFloaterTools->setStatusText("Click in the world to create, shift-click to select");
+	gFloaterTools->setStatusText("place");
 }
 
 void LLToolPlacer::handleDeselect()
 {
-	gFloaterTools->setStatusText("");
 }
 
 //////////////////////////////////////////////////////
diff --git a/indra/newview/lltoolselectland.cpp b/indra/newview/lltoolselectland.cpp
index f54caff73869803ec2e4c683dd7f6ae652b3df6e..dae82888101e0cc80a6928f4380753b27b940946 100644
--- a/indra/newview/lltoolselectland.cpp
+++ b/indra/newview/lltoolselectland.cpp
@@ -219,7 +219,7 @@ void LLToolSelectLand::render()
 
 void LLToolSelectLand::handleSelect()
 {
-	gFloaterTools->setStatusText("Click and drag to select land");
+	gFloaterTools->setStatusText("selectland");
 	mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners");
 	gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners);
 }
@@ -227,7 +227,6 @@ void LLToolSelectLand::handleSelect()
 
 void LLToolSelectLand::handleDeselect()
 {
-	gFloaterTools->setStatusText("");
 	mSelection = NULL;
 	mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners");
 	//gParcelMgr->deselectLand();
diff --git a/indra/newview/lltoolview.cpp b/indra/newview/lltoolview.cpp
index 1129479480d6acb168f9c326a7b6a3c9b1741bbc..b3f0dc48836e8b8bd9e6be33eb5e0fb76e433e26 100644
--- a/indra/newview/lltoolview.cpp
+++ b/indra/newview/lltoolview.cpp
@@ -75,7 +75,7 @@ LLToolView::~LLToolView()
 	mContainList.deleteAllData();
 }
 
-//XUI: translate
+//*TODO:translate?
 void LLToolView::addTool(const LLString& icon_off, const LLString& icon_on, LLPanel* panel, LLTool* tool, LLView* hoverView, const char* label)
 {
 	llassert(tool);
@@ -195,3 +195,4 @@ void LLToolView::onClickToolButton(void* userdata)
 	gToolMgr->getCurrentToolset()->selectTool( clicked->mTool );
 }
 
+
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 7c69fc6648dbb1d9f7205355402f12ecc6fc08bc..79ec70fb1c9101dc80b5dd0ad0e2161ee44b209f 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -258,7 +258,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 	color_swatch->setVisible(FALSE);
 	childSetVisible("val_text", FALSE);
 	childSetVisible("boolean_combo", FALSE);
-	mComment->setText("");
+	mComment->setText(LLString::null);
 
 	if (controlp)
 	{
@@ -294,7 +294,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 		{
 		  case TYPE_U32:
 			spinner1->setVisible(TRUE);
-			spinner1->setLabel("value");
+			spinner1->setLabel(LLString("value")); // Debug, don't translate
 			if (!spinner1->hasFocus())
 			{
 				spinner1->setValue(sd);
@@ -306,7 +306,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 			break;
 		  case TYPE_S32:
 			spinner1->setVisible(TRUE);
-			spinner1->setLabel("value");
+			spinner1->setLabel(LLString("value")); // Debug, don't translate
 			if (!spinner1->hasFocus())
 			{
 				spinner1->setValue(sd);
@@ -318,7 +318,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 			break;
 		  case TYPE_F32:
 			spinner1->setVisible(TRUE);
-			spinner1->setLabel("value");
+			spinner1->setLabel(LLString("value")); // Debug, don't translate
 			if (!spinner1->hasFocus())
 			{
 				spinner1->setPrecision(3);
@@ -352,11 +352,11 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 			LLVector3 v;
 			v.setValue(sd);
 			spinner1->setVisible(TRUE);
-			spinner1->setLabel("X");
+			spinner1->setLabel(LLString("X"));
 			spinner2->setVisible(TRUE);
-			spinner2->setLabel("Y");
+			spinner2->setLabel(LLString("Y"));
 			spinner3->setVisible(TRUE);
-			spinner3->setLabel("Z");
+			spinner3->setLabel(LLString("Z"));
 			if (!spinner1->hasFocus())
 			{
 				spinner1->setPrecision(3);
@@ -379,11 +379,11 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 			LLVector3d v;
 			v.setValue(sd);
 			spinner1->setVisible(TRUE);
-			spinner1->setLabel("X");
+			spinner1->setLabel(LLString("X"));
 			spinner2->setVisible(TRUE);
-			spinner2->setLabel("Y");
+			spinner2->setLabel(LLString("Y"));
 			spinner3->setVisible(TRUE);
-			spinner3->setLabel("Z");
+			spinner3->setLabel(LLString("Z"));
 			if (!spinner1->hasFocus())
 			{
 				spinner1->setPrecision(3);
@@ -406,13 +406,13 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 			LLRect r;
 			r.setValue(sd);
 			spinner1->setVisible(TRUE);
-			spinner1->setLabel("Left");
+			spinner1->setLabel(LLString("Left"));
 			spinner2->setVisible(TRUE);
-			spinner2->setLabel("Right");
+			spinner2->setLabel(LLString("Right"));
 			spinner3->setVisible(TRUE);
-			spinner3->setLabel("Bottom");
+			spinner3->setLabel(LLString("Bottom"));
 			spinner4->setVisible(TRUE);
-			spinner4->setLabel("Top");
+			spinner4->setLabel(LLString("Top"));
 			if (!spinner1->hasFocus())
 			{
 				spinner1->setPrecision(0);
@@ -462,7 +462,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 				color_swatch->set(LLColor4(sd), TRUE, FALSE);
 			}
 			spinner4->setVisible(TRUE);
-			spinner4->setLabel("Alpha");
+			spinner4->setLabel(LLString("Alpha"));
 			if (!spinner4->hasFocus())
 			{
 				spinner4->setPrecision(3);
@@ -490,7 +490,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 				color_swatch->set(LLColor4(clr), TRUE, FALSE);
 			}
 			spinner4->setVisible(TRUE);
-			spinner4->setLabel("Alpha");
+			spinner4->setLabel(LLString("Alpha"));
 			if(!spinner4->hasFocus())
 			{
 				spinner4->setPrecision(0);
@@ -504,7 +504,7 @@ void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
 			break;
 		  }
 		  default:
-			mComment->setText("unknown");
+			mComment->setText(LLString("unknown"));
 			break;
 		}
 	}
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index c7a892fe704f3b5a0c5e6fc4b856a7e4db24c2ec..b4dc093f6ab01d460ea38e2387064b8102280499 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -242,6 +242,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield)
 	LLVOAvatar::sRenderName = gSavedSettings.getS32("RenderName");
 	gPipeline.mBackfaceCull = TRUE;
 	gFrameCount++;
+	if (gFocusMgr.getAppHasFocus())
+	{
+		gForegroundFrameCount++;
+	}
 
 	//////////////////////////////////////////////////////////
 	//
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c1e2b5e9d367100a8d8a5275cd8b5a1daa1d4a8c..28c504910b40b9d5c2949da9cc7ffe0be6414158 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -636,10 +636,12 @@ void init_menus()
 	// flash when an item is triggered (the flash occurs in the holder)
 	gViewerWindow->getRootView()->addChild(gMenuHolder);
 
-	gMenuHolder->childSetLabelArg("Upload Image", "[COST]", "10");
-	gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", "10");
-	gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", "10");
-	gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", "10");
+	// *TODO:Get the cost info from the server
+	const LLString upload_cost("10");
+	gMenuHolder->childSetLabelArg("Upload Image", "[COST]", upload_cost);
+	gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost);
+	gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", upload_cost);
+	gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
 
 	gAFKMenu = (LLMenuItemCallGL*)gMenuBarView->getChildByName("Set Away", TRUE);
 	gBusyMenu = (LLMenuItemCallGL*)gMenuBarView->getChildByName("Set Busy", TRUE);
@@ -3395,31 +3397,33 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
 	}
 	//gInventoryView->setPanelOpen(TRUE);
 
-	LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-	LLViewerObject* object = NULL;
-	LLSelectNode* node = selection->getFirstRootNode();
-	if(!node) return;
-	object = node->getObject();
-	if(!object) return;
-	LLViewerRegion* region = object->getRegion();
-	char* error = NULL;
-
+	std::string error;
+	LLDynamicArray<LLViewerObject*> derez_objects;
+	
 	// Check conditions that we can't deal with, building a list of
 	// everything that we'll actually be derezzing.
-	LLDynamicArray<LLViewerObject*> derez_objects;
-	BOOL can_derez_current;
-	for( ; node != NULL; node = selection->getNextRootNode())
+	LLViewerRegion* first_region = NULL;
+	for (LLObjectSelection::valid_root_iterator iter = gSelectMgr->getSelection()->valid_root_begin();
+		 iter != gSelectMgr->getSelection()->valid_root_end(); iter++)
 	{
-		object = node->getObject();
-		if(!object || !node->mValid) continue;
-		if(object->getRegion() != region)
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
+		LLViewerRegion* region = object->getRegion();
+		if (!first_region)
 		{
-			// Derez doesn't work at all if the some of the objects
-			// are in regions besides the first object selected.
-
-			// ...crosses region boundaries
-			error = "AcquireErrorObjectSpan";
-			break;
+			first_region = region;
+		}
+		else
+		{
+			if(region != first_region)
+			{
+				// Derez doesn't work at all if the some of the objects
+				// are in regions besides the first object selected.
+				
+				// ...crosses region boundaries
+				error = "AcquireErrorObjectSpan";
+				break;
+			}
 		}
 		if (object->isAvatar())
 		{
@@ -3440,7 +3444,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
 			*/
 			continue;
 		}
-		can_derez_current = FALSE;
+		BOOL can_derez_current = FALSE;
 		switch(dest)
 		{
 		case DRD_TAKE_INTO_AGENT_INVENTORY:
@@ -3484,7 +3488,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
 		error = "AcquireErrorTooManyObjects";
 	}
 
-	if(!error && derez_objects.count() > 0)
+	if(error.empty() && derez_objects.count() > 0)
 	{
 		U8 d = (U8)dest;
 		LLUUID tid;
@@ -3513,7 +3517,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
 				  && (objects_in_packet++ < MAX_ROOTS_PER_PACKET))
 
 			{
-				object = derez_objects.get(object_index++);
+				LLViewerObject* object = derez_objects.get(object_index++);
 				msg->nextBlockFast(_PREHASH_ObjectData);
 				msg->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID());
 				// VEFFECT: DerezObject
@@ -3521,7 +3525,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
 				effectp->setPositionGlobal(object->getPositionGlobal());
 				effectp->setColor(LLColor4U(gAgent.getEffectColor()));
 			}
-			msg->sendReliable(region->getHost());
+			msg->sendReliable(first_region->getHost());
 		}
 		make_ui_sound("UISndObjectRezOut");
 
@@ -3532,7 +3536,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
 			gViewerWindow->getWindow()->incBusyCount();
 		}
 	}
-	else if(error)
+	else if(!error.empty())
 	{
 		gViewerWindow->alertXml(error);
 	}
@@ -3612,20 +3616,17 @@ class LLObjectEnableReturn : public view_listener_t
 				}
 				else
 				{
-					LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-					LLViewerObject* obj = NULL;
-					for(obj = selection->getFirstRootObject();
-						obj;
-						obj = selection->getNextRootObject())
+					struct f : public LLSelectedObjectFunctor
 					{
-						if (obj->isOverAgentOwnedLand()
-							|| obj->isOverGroupOwnedLand()
-							|| obj->permModify())
+						virtual bool apply(LLViewerObject* obj)
 						{
-							new_value = true;
-							break;
+							return (obj->isOverAgentOwnedLand() ||
+									obj->isOverGroupOwnedLand() ||
+									obj->permModify());
 						}
-					}
+					} func;
+					const bool firstonly = true;
+					new_value = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
 				}
 			}
 		}
@@ -3641,373 +3642,25 @@ void force_take_copy(void*)
 	const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
 	derez_objects(DRD_FORCE_TO_GOD_INVENTORY, category_id);
 }
-#ifdef _CORY_TESTING
-
-void force_export_copy(void*)
-{
-	LLViewerObject* object = NULL;
-	LLSelectNode* node = gSelectMgr->getSelection()->getFirstNode();
-	if(!node) return;
-	object = node->getObject();
-	if(!object) return;
-
-
-	LLString proposed_name;
-	proposed_name.append(node->mName);
-	proposed_name.append( ".slg" );
-
-	LLViewerRegion* region = object->getRegion();
-
-	// Check conditions that we can't deal with, building a list of
-	// everything that we'll actually be derezzing.
-	
-	std::vector<LLViewerObject*>		export_objects;
-	std::vector<std::string>			export_names;
-	std::vector<std::string>			export_descriptions;
-
-	S32 object_index = 0;
-
-	for( ; node != NULL; node = gSelectMgr->getSelection()->getNextNode())
-	{
-		object = node->getObject();
-		if(!object || !node->mValid)
-		{
-			// Clicked cancel
-			return;
-		}
-		if(object->getRegion() != region)
-		{
-			// Clicked cancel
-			return;
-		}
-		if (object->isAvatar())
-		{
-			continue;
-		}
-
-		if (object->getNVPair("AssetContainer"))
-		{
-			continue;
-		}
-		export_objects.push_back(node->getObject());
-		export_names.push_back(node->mName);
-		export_descriptions.push_back(node->mDescription);
-	}
-
-	if (export_objects.empty())
-	{
-		return;
-	}
-
-	// pick a save file
-	LLFilePicker& picker = LLFilePicker::instance();
-	if (!picker.getSaveFile(LLFilePicker::FFSAVE_GEOMETRY, proposed_name))
-	{
-		// Clicked cancel
-		return;
-	}
-
-	// Copy the directory + file name
-	char filepath[LL_MAX_PATH];		/* Flawfinder: ignore */
-	strncpy(filepath, picker.getFirstFile(), LL_MAX_PATH -1);		/* Flawfinder: ignore */
-	filepath[LL_MAX_PATH -1] = '\0';
-
-	apr_file_t* fp = ll_apr_file_open(filepath, LL_APR_W);
-
-	if (!fp)
-	{
-		return;
-	}
-
-	object = export_objects[object_index];
-	LLVector3 baseoffset = object->getPositionRegion();
-
-	apr_file_printf(fp, "<?xml version=\"1.0\" encoding=\"US-ASCII\" standalone=\"yes\"?>\n");
-	apr_file_printf(fp, "<LindenGeometry>\n");
-
-	while(object_index < export_objects.size())
-	{
-		apr_file_printf(fp, "<Object\n");
-		apr_file_printf(fp, "\tShape='%s'\n", export_names[object_index].c_str());
-		apr_file_printf(fp, "\tDescription='%s'\n", export_descriptions[object_index].c_str());
-
-		apr_file_printf(fp, "\tPCode='%d'\n", (U32)object->getPCode());
-		apr_file_printf(fp, "\tMaterial='%d'\n", object->getMaterial());
-		apr_file_printf(fp, "\tScale='%5f %5f %5f'\n", object->getScale().mV[VX], object->getScale().mV[VY], object->getScale().mV[VZ]);
-		LLVector3 delta = object->getPositionRegion() - baseoffset;
-		LLQuaternion rot = object->getRotationRegion();
-		apr_file_printf(fp, "\tOffset='%5f %5f %5f'\n", delta.mV[VX], delta.mV[VY], delta.mV[VZ]);
-		apr_file_printf(fp, "\tOrientation='%5f %5f %5f %5f'\n", rot.mQ[VX], rot.mQ[VY], rot.mQ[VZ], rot.mQ[VS]);
-		const LLProfileParams pparams = object->getVolume()->getProfile().mParams;
-		apr_file_printf(fp, "\tShapeProfile='%d %f %f %f'\n", pparams.getCurveType(), pparams.getBegin(), pparams.getEnd(), pparams.getHollow());
-		const LLPathParams paparams = object->getVolume()->getPath().mParams;
-		apr_file_printf(fp, "\tShapePath='%d %f %f %f %f %f %f %f %f %f %f %f %f %f'\n",
-								 paparams.getCurveType(), paparams.getBegin(), paparams.getEnd(), paparams.getTwist(), paparams.getTwistBegin(), paparams.getScaleX(), paparams.getScaleY(),
-								 paparams.getShearX(), paparams.getShearY(), paparams.getRadiusOffset(), paparams.getTaperX(), paparams.getTaperY(),
-								 paparams.getRevolutions(), paparams.getSkew());
-		S32 face, numfaces;
-		numfaces = object->getNumTEs();
-		apr_file_printf(fp, "\tNumberOfFaces='%d'>\n", numfaces);
-		for (face = 0; face < numfaces; face++)
-		{
-			const LLTextureEntry *te = object->getTE(face);
-			LLColor4 color = te->getColor();
-			apr_file_printf(fp, "\t<Face\n\t\tFaceColor='%d %5f %5f %5f %5f'\n", face, color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW]);
-			
-			char texture[UUID_STR_LENGTH];		/* Flawfinder: ignore */
-			LLUUID texid = te->getID();
-			texid.toString(texture);
-			F32 sx, sy, ox, oy;
-			te->getScale(&sx, &sy);
-			te->getOffset(&ox, &oy);
-			
-			apr_file_printf(fp, "\t\tFace='%d %5f %5f %5f %5f %5f %d %s'\n\t/>\n", face, sx, sy, ox, oy, te->getRotation(), te->getBumpShinyFullbright(), texture);
-		}
-		apr_file_printf(fp, "</Object>\n");
-		object = export_objects[++object_index];
-	}
 
-	apr_file_printf(fp, "</LindenGeometry>\n");
-
-	fclose(fp);
-}
-
-void undo_find_local_contact_point(LLVector3 &contact,
-								   const LLVector3& surface_norm, 
-								   const LLQuaternion& rot, 
-								   const LLVector3& scale  )
-{
-	LLVector3 local_norm = surface_norm;
-	local_norm.rotVec( ~rot );
-
-	LLVector3 v[6]; 
-	v[0].mV[VX] = -1.f;
-	v[1].mV[VX] = 1.f;
-	
-	v[2].mV[VY] = -1.f;
-	v[3].mV[VY] = 1.f;
-
-	v[4].mV[VZ] = -1.f;
-	v[5].mV[VZ] = 1.f;
-
-	contact = v[0];
-	F32 cur_val = 0;
-
-	for( S32 i = 0; i < 6; i++ )
-	{
-		F32 val = v[i] * local_norm;
-		if( val < cur_val )
-		{
-			contact = v[i];
-			cur_val = val;
-		}
-	}
-
-	contact.mV[VX] *= 0.5f * scale.mV[VX];
-	contact.mV[VY] *= 0.5f * scale.mV[VY];
-	contact.mV[VZ] *= 0.5f * scale.mV[VZ];
-	contact.rotVec( rot );
-}
-
-
-
-void force_import_geometry(void*)
+void handle_take()
 {
-	LLFilePicker& picker = LLFilePicker::instance();
-	if (!picker.getOpenFile(LLFilePicker::FFLOAD_GEOMETRY))
-	{
-		llinfos << "Couldn't import objects from file" << llendl;
-		return;
-	}
-
-	char directory[LL_MAX_PATH];		/* Flawfinder: ignore */
-	strncpy(directory, picker.getFirstFile(), LL_MAX_PATH -1);		/* Flawfinder: ignore */
-	directory[LL_MAX_PATH -1] = '\0';
-
-	llinfos << "Loading LSG file " << directory << llendl;
-	LLXmlTree *xmlparser = new LLXmlTree();
-	xmlparser->parseFile(directory, TRUE);
-	LLXmlTreeNode	*root = xmlparser->getRoot();
-	if( !root )
-	{
-		return;
-	}
-	// header
-	if( !root->hasName( "LindenGeometry" ) )
+	// we want to use the folder this was derezzed from if it's
+	// available. Otherwise, derez to the normal place.
+	if(gSelectMgr->getSelection()->isEmpty())
 	{
-		llwarns << "Invalid LindenGeometry file header: " << directory << llendl;
 		return;
 	}
-	// objects
-	for (LLXmlTreeNode *child = root->getChildByName( "Object" );
-		 child;
-		 child = root->getNextNamedChild())
-	{
-		// get object data
-		// *NOTE: This buffer size is hard coded into scanf() below.
-		char name[255];		/* Flawfinder: ignore */			// Shape
-		char description[255];		/* Flawfinder: ignore */		// Description
-		U32	 material;			// Material
-		F32  sx, sy, sz;		// Scale
-		LLVector3 scale;
-		F32  ox, oy, oz;		// Offset
-		LLVector3 offset;
-		F32  rx, ry, rz, rs;	// Orientation
-		LLQuaternion rot;
-		U32	 curve;
-		F32  begin;
-		F32  end;
-		F32	 hollow;
-		F32	 twist;
-		F32	 scx, scy;
-		F32  shx, shy;
-		F32  twist_begin;
-		F32	 radius_offset;
-		F32  tx, ty;
-		F32	 revolutions;
-		F32	 skew;
-		S32  faces;
-		U32 pcode;
-		U32 flags = FLAGS_CREATE_SELECTED;
-
-		LLString attribute;
-
-		S32 count = 0;
-
-		child->getAttributeString("PCode", &attribute);
-		pcode = atoi(attribute.c_str());
-		child->getAttributeString("Shape", &attribute);
-		sscanf(	/* Flawfinder: ignore */
-			attribute.c_str(), "%254s", name);
-		child->getAttributeString("Description", &attribute);
-		sscanf(	/* Flawfinder: ignore */
-			attribute.c_str(), "%254s", description);
-		child->getAttributeString("Material", &attribute);
-		material = atoi(attribute.c_str());
-		child->getAttributeString("Scale", &attribute);
-		sscanf(attribute.c_str(), "%f %f %f", &sx, &sy, &sz);
-		scale.setVec(sx, sy, sz);
-		child->getAttributeString("Offset", &attribute);
-		sscanf(attribute.c_str(), "%f %f %f", &ox, &oy, &oz);
-		offset.setVec(ox, oy, oz);
-		child->getAttributeString("Orientation", &attribute);
-		sscanf(attribute.c_str(), "%f %f %f %f", &rx, &ry, &rz, &rs);
-		rot.mQ[VX] = rx;
-		rot.mQ[VY] = ry;
-		rot.mQ[VZ] = rz;
-		rot.mQ[VS] = rs;
-
-		child->getAttributeString("ShapeProfile", &attribute);
-		sscanf(attribute.c_str(), "%d %f %f %f", &curve, &begin, &end, &hollow);
-		LLProfileParams pparams(curve, begin, end, hollow);
-		child->getAttributeString("ShapePath", &attribute);
-		sscanf(attribute.c_str(), "%d %f %f %f %f %f %f %f %f %f %f %f %f %f", 
-			&curve, &begin, &end, &twist, &twist_begin, &scx, &scy, &shx, &shy, &radius_offset, &tx, &ty, &revolutions, &skew);
-		LLPathParams paparams(curve, begin, end, scx, scy, shx, shy, twist, twist_begin, radius_offset, tx, ty, revolutions, skew);
-		child->getAttributeString("NumberOfFaces", &attribute);
-		faces = atoi(attribute.c_str());
-
-
-
-		gMessageSystem->newMessageFast(_PREHASH_ObjectAdd);
-		gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-		gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-		gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-		gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
-
-		gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
-		gMessageSystem->addU8Fast(_PREHASH_PCode,		pcode);
-		gMessageSystem->addU8Fast(_PREHASH_Material,	material);
-		gMessageSystem->addU32Fast(_PREHASH_AddFlags,	flags );
-		pparams.packMessage(gMessageSystem);
-		paparams.packMessage(gMessageSystem);
-
-		LLVector3 forward;
-		forward.setVec(3.f, 0.f, 1.f);
-		forward = forward * gAgent.getQuat();
-
-		LLVector3 start = gAgent.getPositionAgent() + forward;
-
-		start += offset;
-
-		// offset position to make up for error introduced by placement code
-		LLVector3 normal(0.f, 0.f, 1.f);
-		LLVector3 delta;
-
-		undo_find_local_contact_point(delta, normal, rot, scale);
-
-		start += delta;
-
-		gMessageSystem->addVector3Fast(_PREHASH_Scale,			scale );
-		gMessageSystem->addQuatFast(_PREHASH_Rotation,			rot );
-		gMessageSystem->addVector3Fast(_PREHASH_RayStart,		start );
-		gMessageSystem->addVector3Fast(_PREHASH_RayEnd,			start );
-		gMessageSystem->addBOOLFast(_PREHASH_BypassRaycast,		TRUE );
-		gMessageSystem->addBOOLFast(_PREHASH_RayEndIsIntersection,	FALSE );
-
-		U8 state = 0;
-		gMessageSystem->addU8Fast(_PREHASH_State, state);
-	
-		LLUUID ray_target_id;
-		gMessageSystem->addUUIDFast(_PREHASH_RayTargetID,			ray_target_id );
 	
-		/* Setting TE info through ObjectAdd is no longer supported.
-		LLPrimitive     temp_primitive;
-		temp_primitive.setNumTEs(faces);
-		for (LLXmlTreeNode *face = child->getChildByName( "Face" );
-			 face;
-			 face = child->getNextNamedChild())
-		{
-			// read the faces
-			U32 facenumber;
-			LLColor4 color;
-			// *NOTE: This buffer size is hard coded into scanf() below.
-			char texture[UUID_STR_LENGTH];
-			LLUUID texid;
-			texid.toString(texture);
-			F32 sx, sy, ox, oy, rot;
-			U8 bump;
-			LLTextureEntry te;
-
-			face->getAttributeString("FaceColor", &attribute);
-			sscanf(attribute, "%d %f %f %f %f", &facenumber, &color.mV[VX], &color.mV[VY], &color.mV[VZ], &color.mV[VW]);
-			face->getAttributeString("Face", &attribute);
-			sscanf(attribute, "%d %f %f %f %f %f %d %36s", &facenumber, &sx, &sy, &ox, &oy, &rot, &bump, texture);
-			texid.set(texture);
-			te.setColor(color);
-			te.setBumpShinyFullbright(bump);
-			te.setID(texid);
-			te.setRotation(rot);
-			te.setOffset(ox, oy);
-			te.setScale(sx, sy);
-
-			temp_primitive.setTE(facenumber, te);
-		}
-
-		temp_primitive.packTEMessage(gMessageSystem);
-		*/
-		gMessageSystem->sendReliable(gAgent.getRegionHost());
-	}
-
-}
-#endif
-
-void handle_take()
-{
-	// we want to use the folder this was derezzed from if it's
-	// available. Otherwise, derez to the normal place.
-	if(gSelectMgr->getSelection()->isEmpty()) return;
-	LLSelectNode* node = NULL;
-	LLViewerObject* object = NULL;
 	BOOL you_own_everything = TRUE;
-
 	BOOL locked_but_takeable_object = FALSE;
 	LLUUID category_id;
-	for(node = gSelectMgr->getSelection()->getFirstRootNode();
-		node != NULL;
-		node = gSelectMgr->getSelection()->getNextRootNode())
+	
+	for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
+		 iter != gSelectMgr->getSelection()->root_end(); iter++)
 	{
-		object = node->getObject();
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
 		if(object)
 		{
 			if(!object->permYouOwner())
@@ -4016,11 +3669,8 @@ void handle_take()
 			}
 
 			if(!object->permMove())
-
 			{
-
 				locked_but_takeable_object = TRUE;
-
 			}
 		}
 		if(node->mFolderID.notNull())
@@ -4071,7 +3721,6 @@ void handle_take()
 	}
 	LLUUID* cat_id = new LLUUID(category_id);
 	if(locked_but_takeable_object ||
-
 	   !you_own_everything)
 	{
 		if(locked_but_takeable_object && you_own_everything)
@@ -4124,13 +3773,11 @@ BOOL enable_take()
 		return FALSE;
 	}
 
-	LLViewerObject* object = NULL;
-	for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
-		node != NULL;
-		node = gSelectMgr->getSelection()->getNextRootNode())
+	for (LLObjectSelection::valid_root_iterator iter = gSelectMgr->getSelection()->valid_root_begin();
+		 iter != gSelectMgr->getSelection()->valid_root_end(); iter++)
 	{
-		object = node->getObject();
-		if(!object || !node->mValid) continue;
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
 		if (object->isAvatar())
 		{
 			// ...don't acquire avatars
@@ -4240,12 +3887,11 @@ class LLToolsEnableBuyOrTake : public view_listener_t
 //                FALSE if selection is a 'take'
 BOOL is_selection_buy_not_take()
 {
-	LLViewerObject* obj = NULL;
-	for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
-		node != NULL;
-		node = gSelectMgr->getSelection()->getNextRootNode())
+	for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
+		 iter != gSelectMgr->getSelection()->root_end(); iter++)
 	{
-		obj = node->getObject();
+		LLSelectNode* node = *iter;
+		LLViewerObject* obj = node->getObject();
 		if(obj && !(obj->permYouOwner()) && (node->mSaleInfo.isForSale()))
 		{
 			// you do not own the object and it is for sale, thus,
@@ -4258,13 +3904,12 @@ BOOL is_selection_buy_not_take()
 
 S32 selection_price()
 {
-	LLViewerObject* obj = NULL;
 	S32 total_price = 0;
-	for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
-		node != NULL;
-		node = gSelectMgr->getSelection()->getNextRootNode())
+	for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
+		 iter != gSelectMgr->getSelection()->root_end(); iter++)
 	{
-		obj = node->getObject();
+		LLSelectNode* node = *iter;
+		LLViewerObject* obj = node->getObject();
 		if(obj && !(obj->permYouOwner()) && (node->mSaleInfo.isForSale()))
 		{
 			// you do not own the object and it is for sale.
@@ -4404,12 +4049,11 @@ class LLToolsSnapObjectXY : public view_listener_t
 	{
 		F64 snap_size = (F64)gSavedSettings.getF32("GridResolution");
 
-		LLViewerObject* obj;
-		LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-		for (obj = selection->getFirstRootObject();
-			obj != NULL;
-			obj = selection->getNextRootObject())
+		for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
+			 iter != gSelectMgr->getSelection()->root_end(); iter++)
 		{
+			LLSelectNode* node = *iter;
+			LLViewerObject* obj = node->getObject();
 			if (obj->permModify())
 			{
 				LLVector3d pos_global = obj->getPositionGlobal();
@@ -4466,17 +4110,15 @@ class LLToolsEnableLink : public view_listener_t
 		{
 			if(gSelectMgr->selectGetAllRootsValid() && gSelectMgr->getSelection()->getRootObjectCount() >= 2)
 			{
-				LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-				for(LLViewerObject* object = selection->getFirstRootObject();
-					object != NULL;
-					object = selection->getNextRootObject())
+				struct f : public LLSelectedObjectFunctor
 				{
-					if(object->permModify())
+					virtual bool apply(LLViewerObject* object)
 					{
-						new_value = true;
-						break;
+						return object->permModify();
 					}
-				}
+				} func;
+				const bool firstonly = true;
+				new_value = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
 			}
 		}
 		gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
@@ -4914,7 +4556,6 @@ void handle_export_selected( void * )
 		return;
 	}
 	llinfos << "Exporting selected objects:" << llendl;
-	LLViewerObject *object = selection->getFirstRootObject();
 
 	gExporterRequestID.generate();
 	gExportDirectory = "";
@@ -4926,8 +4567,11 @@ void handle_export_selected( void * )
 	msg->addUUIDFast(_PREHASH_RequestID, gExporterRequestID);
 	msg->addS16Fast(_PREHASH_VolumeDetail, 4);
 
-	for (; object != NULL; object = selection->getNextRootObject())
+	for (LLObjectSelection::root_iterator iter = selection->root_begin();
+		 iter != selection->root_end(); iter++)
 	{
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
 		msg->nextBlockFast(_PREHASH_ObjectData);
 		msg->addUUIDFast(_PREHASH_ObjectID, object->getID());
 		llinfos << "Object: " << object->getID() << llendl;
@@ -5321,16 +4965,21 @@ void handle_force_unlock(void*)
 	gSelectMgr->sendOwner(LLUUID::null, LLUUID::null, TRUE);
 
 	// Second, lie to the viewer and mark it editable and unowned
-	LLViewerObject* object;
-	for (object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() )
+
+	struct f : public LLSelectedObjectFunctor
 	{
-		object->mFlags |= FLAGS_OBJECT_MOVE;
-		object->mFlags |= FLAGS_OBJECT_MODIFY;
-		object->mFlags |= FLAGS_OBJECT_COPY;
+		virtual bool apply(LLViewerObject* object)
+		{
+			object->mFlags |= FLAGS_OBJECT_MOVE;
+			object->mFlags |= FLAGS_OBJECT_MODIFY;
+			object->mFlags |= FLAGS_OBJECT_COPY;
 
-		object->mFlags &= ~FLAGS_OBJECT_ANY_OWNER;
-		object->mFlags &= ~FLAGS_OBJECT_YOU_OWNER;
-	}
+			object->mFlags &= ~FLAGS_OBJECT_ANY_OWNER;
+			object->mFlags &= ~FLAGS_OBJECT_YOU_OWNER;
+			return true;
+		}
+	} func;
+	gSelectMgr->getSelection()->applyToObjects(&func);
 }
 
 // Fullscreen debug stuff
@@ -6169,11 +5818,16 @@ class LLAttachmentEnableDetach : public view_listener_t
 BOOL object_selected_and_point_valid(void *user_data)
 {
 	//LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data;
-	if (gSelectMgr == NULL) return FALSE;
-
+	if (gSelectMgr == NULL)
+	{
+		return FALSE;
+	}
 	LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-	for (LLViewerObject *object = selection->getFirstRootObject(); object; object = selection->getNextRootObject())
+	for (LLObjectSelection::root_iterator iter = selection->root_begin();
+		 iter != selection->root_end(); iter++)
 	{
+		LLSelectNode* node = *iter;
+		LLViewerObject* object = node->getObject();
 		for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++ )
 		{
 			if (object->mChildList[child_num]->isAvatar())
@@ -6245,12 +5899,68 @@ BOOL enable_activate(void*)
 	return FALSE;
 }
 
+namespace
+{
+	struct QueueObjects : public LLSelectedObjectFunctor
+	{
+		BOOL scripted;
+		BOOL modifiable;
+		LLFloaterScriptQueue* mQueue;
+		QueueObjects(LLFloaterScriptQueue* q) : mQueue(q), scripted(FALSE), modifiable(FALSE) {}
+		virtual bool apply(LLViewerObject* obj)
+		{
+			scripted = obj->flagScripted();
+			modifiable = obj->permModify();
+
+			if( scripted && modifiable )
+			{
+				mQueue->addObject(obj->getID());
+				return false;
+			}
+			else
+			{
+				return true; // fail: stop applying
+			}
+		}
+	};
+}
+
+void queue_actions(LLFloaterScriptQueue* q, const std::string& noscriptmsg, const std::string& nomodmsg)
+{
+	// Apply until an object fails
+	QueueObjects func(q);
+	const bool firstonly = true;
+	bool fail = gSelectMgr->getSelection()->applyToObjects(&func, firstonly);
+	if(fail)
+	{
+		if ( !func.scripted )
+		{
+			gViewerWindow->alertXml(noscriptmsg);
+		}
+		else if ( !func.modifiable )
+		{
+			gViewerWindow->alertXml(nomodmsg);
+		}
+		else
+		{
+			llerrs << "Bad logic." << llendl;
+		}
+	}
+	else
+	{
+		if (!q->start())
+		{
+			llwarns << "Unexpected script compile failure." << llendl;
+		}
+	}
+}
+
 class LLToolsSelectedScriptAction : public view_listener_t
 {
 	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
 	{
 		LLString action = userdata.asString();
-		LLFloaterScriptQueue *queue = NULL;
+		LLFloaterScriptQueue* queue = NULL;
 		if (action == "compile")
 		{
 			queue = LLFloaterCompileQueue::create();
@@ -6267,35 +5977,13 @@ class LLToolsSelectedScriptAction : public view_listener_t
 		{
 			queue = LLFloaterNotRunQueue::create();
 		}
-		if (!queue) return true;
-
-		BOOL scripted = FALSE;
-		BOOL modifiable = FALSE;
-
-		for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject();
-			obj;
-			obj = gSelectMgr->getSelection()->getNextObject())
+		if (!queue)
 		{
-			scripted = obj->flagScripted();
-			modifiable = obj->permModify();
-
-			if( scripted &&  modifiable )
-				queue->addObject(obj->getID());
-			else
-				break;
+			return true;
 		}
 
-		if(!queue->start())
-		{
-			if ( ! scripted )
-			{
-				gViewerWindow->alertXml("CannotRecompileSelectObjectsNoScripts");
-			}
-			else if ( ! modifiable )
-			{
-				gViewerWindow->alertXml("CannotRecompileSelectObjectsNoPermission");
-			}
-		}
+		queue_actions(queue, "CannotRecompileSelectObjectsNoScripts", "CannotRecompileSelectObjectsNoPermission");
+
 		return true;
 	}
 };
@@ -6303,109 +5991,28 @@ class LLToolsSelectedScriptAction : public view_listener_t
 void handle_reset_selection(void*)
 {
 	LLFloaterResetQueue* queue = LLFloaterResetQueue::create();
-
-	BOOL scripted = FALSE;
-	BOOL modifiable = FALSE;
-
-	for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject();
-		obj;
-		obj = gSelectMgr->getSelection()->getNextObject())
-	{
-		scripted = obj->flagScripted();
-		modifiable = obj->permModify();
-
-		if( scripted &&  modifiable )
-			queue->addObject(obj->getID());
-		else
-			break;
-	}
-
-	if(!queue->start())
-	{
-		if ( ! scripted )
-		{
-			gViewerWindow->alertXml("CannotResetSelectObjectsNoScripts");
-		}
-		else if ( ! modifiable )
-		{
-			gViewerWindow->alertXml("CannotResetSelectObjectsNoPermission");
-		}
-	}
+	queue_actions(queue, "CannotResetSelectObjectsNoScripts", "CannotResetSelectObjectsNoPermission");
 }
 
 void handle_set_run_selection(void*)
 {
 	LLFloaterRunQueue* queue = LLFloaterRunQueue::create();
-
-	BOOL scripted = FALSE;
-	BOOL modifiable = FALSE;
-
-	for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject();
-		obj;
-		obj = gSelectMgr->getSelection()->getNextObject())
-	{
-		scripted = obj->flagScripted();
-		modifiable = obj->permModify();
-
-		if( scripted &&  modifiable )
-			queue->addObject(obj->getID());
-		else
-			break;
-	}
-
-	if(!queue->start())
-	{
-		if ( ! scripted )
-		{
-			gViewerWindow->alertXml("CannotSetRunningSelectObjectsNoScripts");
-		}
-		else if ( ! modifiable )
-		{
-			gViewerWindow->alertXml("CannotSerRunningSelectObjectsNoPermission");
-		}
-	}
+	queue_actions(queue, "CannotSetRunningSelectObjectsNoScripts", "CannotSerRunningSelectObjectsNoPermission");
 }
 
 void handle_set_not_run_selection(void*)
 {
 	LLFloaterNotRunQueue* queue = LLFloaterNotRunQueue::create();
-
-	BOOL scripted = FALSE;
-	BOOL modifiable = FALSE;
-
-	for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject();
-		obj;
-		obj = gSelectMgr->getSelection()->getNextObject())
-	{
-		scripted = obj->flagScripted();
-		modifiable = obj->permModify();
-
-		if( scripted &&  modifiable )
-			queue->addObject(obj->getID());
-		else
-			break;
-	}
-
-	if(!queue->start())
-	{
-		if ( ! scripted )
-		{
-			gViewerWindow->alertXml("CannotSetRunningNotSelectObjectsNoScripts");
-		}
-		else if ( ! modifiable )
-		{
-			gViewerWindow->alertXml("CannotSerRunningNotSelectObjectsNoPermission");
-		}
-	}
+	queue_actions(queue, "CannotSetRunningNotSelectObjectsNoScripts", "CannotSerRunningNotSelectObjectsNoPermission");
 }
 
 void handle_selected_texture_info(void*)
 {
-	LLSelectNode* node = NULL;
-	for (node = gSelectMgr->getSelection()->getFirstNode(); node != NULL; node = gSelectMgr->getSelection()->getNextNode())
+	for (LLObjectSelection::valid_iterator iter = gSelectMgr->getSelection()->valid_begin();
+		 iter != gSelectMgr->getSelection()->valid_end(); iter++)
 	{
-		if (!node->mValid) continue;
-
+		LLSelectNode* node = *iter;
+		
 		std::string msg;
 		msg.assign("Texture info for: ");
 		msg.append(node->mName);
@@ -6625,51 +6232,52 @@ class LLToolsEnableTakeCopy : public view_listener_t
 {
 	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
 	{
-		bool new_value = false;
+		bool all_valid = false;
 		if (gSelectMgr)
 		{
-			new_value = true;
+			all_valid = true;
 #ifndef HACKED_GODLIKE_VIEWER
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
 			if (gInProductionGrid || !gAgent.isGodlike())
 # endif
 			{
-				LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-				LLViewerObject* obj = selection->getFirstRootObject();
-				if(obj)
+				struct f : public LLSelectedObjectFunctor
 				{
-					for( ; obj; obj = selection->getNextRootObject())
+					virtual bool apply(LLViewerObject* obj)
 					{
-						if(!(obj->permCopy()) || obj->isAttachment())
-						{
-							new_value = false;
-						}
+						return (!obj->permCopy() || obj->isAttachment());
 					}
-				}
+				} func;
+				const bool firstonly = true;
+				bool any_invalid = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
+				all_valid = !any_invalid;
 			}
 #endif // HACKED_GODLIKE_VIEWER
 		}
 
-		gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
+		gMenuHolder->findControl(userdata["control"].asString())->setValue(all_valid);
 		return true;
 	}
 };
 
 BOOL enable_selection_you_own_all(void*)
 {
-	LLViewerObject *obj;
 	if (gSelectMgr)
 	{
-		LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-		for (obj = selection->getFirstRootObject(); obj; obj = selection->getNextRootObject())
+		struct f : public LLSelectedObjectFunctor
 		{
-			if (!obj->permYouOwner())
+			virtual bool apply(LLViewerObject* obj)
 			{
-				return FALSE;
+				return (!obj->permYouOwner());
 			}
+		} func;
+		const bool firstonly = true;
+		bool no_perms = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
+		if (no_perms)
+		{
+			return FALSE;
 		}
 	}
-
 	return TRUE;
 }
 
@@ -6677,17 +6285,21 @@ BOOL enable_selection_you_own_one(void*)
 {
 	if (gSelectMgr)
 	{
-		LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-		LLViewerObject *obj;
-		for (obj = selection->getFirstRootObject(); obj; obj = selection->getNextRootObject())
+		struct f : public LLSelectedObjectFunctor
 		{
-			if (obj->permYouOwner())
+			virtual bool apply(LLViewerObject* obj)
 			{
-				return TRUE;
+				return (obj->permYouOwner());
 			}
+		} func;
+		const bool firstonly = true;
+		bool any_perms = gSelectMgr->getSelection()->applyToRootObjects(&func, firstonly);
+		if (!any_perms)
+		{
+			return FALSE;
 		}
 	}
-	return FALSE;
+	return TRUE;
 }
 
 class LLHasAsset : public LLInventoryCollectFunctor
@@ -6718,13 +6330,13 @@ BOOL enable_save_into_inventory(void*)
 {
 	if(gSelectMgr)
 	{
+		// *TODO: clean this up
 		// find the last root
 		LLSelectNode* last_node = NULL;
-		for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode();
-			node != NULL;
-			node = gSelectMgr->getSelection()->getNextRootNode())
+		for (LLObjectSelection::root_iterator iter = gSelectMgr->getSelection()->root_begin();
+			 iter != gSelectMgr->getSelection()->root_end(); iter++)
 		{
-			last_node = node;
+			last_node = *iter;
 		}
 
 #ifdef HACKED_GODLIKE_VIEWER
@@ -7206,13 +6818,15 @@ class LLToolsUseSelectionForGrid : public view_listener_t
 	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
 	{
 		gSelectMgr->clearGridObjects();
-		LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-		for (LLViewerObject* objectp = selection->getFirstRootObject();
-			objectp;
-			objectp = selection->getNextRootObject())
+		struct f : public LLSelectedObjectFunctor
+		{
+			virtual bool apply(LLViewerObject* objectp)
 			{
 				gSelectMgr->addGridObject(objectp);
+				return true;
 			}
+		} func;
+		gSelectMgr->getSelection()->applyToRootObjects(&func);
 		gSelectMgr->setGridMode(GRID_MODE_REF_OBJECT);
 		if (gFloaterTools)
 		{
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 90bda38ec66d49f92611dcf96fc31782c5e763e8..bd959b9dead7dc07824ad6e5da30276a9a8a9660 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -989,7 +989,7 @@ void inventory_offer_callback(S32 button, void* user_data)
 		itemp = (LLViewerInventoryItem*)gInventory.getItem(info->mObjectID);
 	}
 
-	// XUI:translate
+	// *TODO:translate
 	LLString from_string; // Used in the pop-up.
 	LLString chatHistory_string;  // Used in chat history.
 	if (info->mFromObject == TRUE)
@@ -1225,7 +1225,7 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
 	}
 	else
 	{
-		// XUI:translate -> [FIRST] [LAST]
+		// *TODO:translate -> [FIRST] [LAST]
 		args["[NAME]"] = info->mFromName;
 		LLNotifyBox::showXml("UserGiveItem", args,
 							&inventory_offer_callback, (void*)info);
@@ -1329,7 +1329,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	S32 binary_bucket_size;
 	LLChat chat;
 
-	//XUI:translate - need to fix the full name to first/last
+	//*TODO:translate - need to fix the full name to first/last (maybe)
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, from_id);
 	msg->getBOOLFast(_PREHASH_MessageBlock, _PREHASH_FromGroup, from_group);
 	msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ToAgentID, to_id);
@@ -1379,7 +1379,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	case IM_CONSOLE_AND_CHAT_HISTORY:
 		// These are used for system messages, hence don't need the name,
 		// as it is always "Second Life".
-	  	// XUI:translate
+	  	// *TODO:translate
 		args["[MESSAGE]"] = message;
 
 		// Note: don't put the message in the IM history, even though was sent
@@ -1528,7 +1528,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	case IM_MESSAGEBOX:
 		{
 			// This is a block, modeless dialog.
-			//XUI:translate
+			//*TODO:translate
 			args["[MESSAGE]"] = message;
 			LLNotifyBox::showXml("SystemMessage", args);
 		}
@@ -1845,7 +1845,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			}
 			else
 			{
-				// XUI:translate -> [FIRST] [LAST]
+				// *TODO:translate -> [FIRST] [LAST] (maybe)
 				LLLureInfo* info = new LLLureInfo(from_id, session_id, FALSE);
 				args["[NAME]"] = name;
 				args["[MESSAGE]"] = message;
@@ -4026,7 +4026,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
 	{
 		// Make the user confirm the transaction, since they might
 		// have missed something during an event.
-		// XUI:translate
+		// *TODO:translate
 		LLString::format_map_t args;
 		args["[MESSAGE]"] = desc;
 		LLNotifyBox::showXml("SystemMessage", args);
@@ -4082,7 +4082,6 @@ void process_alert_core(const char* buffer, BOOL modal)
 		gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, FALSE);
 	}
 
-	// Translate system messages here.
 	const char ALERT_PREFIX[] = "ALERT: ";
 	const size_t ALERT_PREFIX_LEN = sizeof(ALERT_PREFIX) - 1;
 	if (!strncmp(buffer, ALERT_PREFIX, ALERT_PREFIX_LEN))
@@ -4113,21 +4112,21 @@ void process_alert_core(const char* buffer, BOOL modal)
 		}
 		else
 		{
-			//XUI:translate
+			// *TODO:translate
 			args["[MESSAGE]"] = text;
 			LLNotifyBox::showXml("SystemMessage", args);
 		}
 	}
 	else if (modal)
 	{
-		//XUI:translate
+		// *TODO:translate
 		LLString::format_map_t args;
 		args["[ERROR_MESSAGE]"] = buffer;
 		gViewerWindow->alertXml("ErrorMessage", args);
 	}
 	else
 	{
-		//XUI:translate
+		// *TODO:translate
 		LLString::format_map_t args;
 		args["[MESSAGE]"] = buffer;
 		LLNotifyBox::showXml("SystemMessageTip", args);
@@ -4428,7 +4427,7 @@ void script_question_cb(S32 option, void* user_data)
 
 void process_script_question(LLMessageSystem *msg, void **user_data)
 {
-	// XUI:translate owner name -> [FIRST] [LAST]
+	// *TODO:translate owner name -> [FIRST] [LAST]
 
 	LLHost sender = msg->getSender();
 
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index c860dd9cdd3b0485ec9e23fa7834aef3182a66c4..967f018f0d4fa5a11e077bc42b1ae2c9c35a4a17 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -592,12 +592,15 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
 	}
 
 	// Selected
-	LLObjectSelectionHandle selection = gSelectMgr->getSelection();
-	for (objectp = selection->getFirstRootObject(); objectp; objectp = selection->getNextRootObject())
+	struct f : public LLSelectedObjectFunctor
 	{
-		objectp->boostTexturePriority();
-	}
-
+		virtual bool apply(LLViewerObject* objectp)
+		{
+			objectp->boostTexturePriority();
+			return true;
+		}
+	} func;
+	gSelectMgr->getSelection()->applyToRootObjects(&func);
 
 	// Iterate through some of the objects and lazy update their texture priorities
 	for (i = mCurLazyUpdateIndex; i < max_value; i++)
@@ -1028,7 +1031,7 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
 	for (S32 i = 0; i < mMapObjects.count(); i++)
 	{
 		LLViewerObject* objectp = mMapObjects[i];
-		if (objectp->isOrphaned() || objectp->isAttachment())
+		if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment())
 		{
 			continue;
 		}
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 2a9ad2b4560abaa5b3a22eb28ca540f85a067d1b..f0e8132990ac1987d3e350e0e84a7e19e67e8346 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1252,7 +1252,7 @@ void LLViewerParcelMgr::makeLandmarkAtSelection()
 }
 */
 
-const char* LLViewerParcelMgr::getAgentParcelName() const
+const LLString& LLViewerParcelMgr::getAgentParcelName() const
 {
 	return mAgentParcel->getName();
 }
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index b8238c3dbe130a472092b5f37c9be85dc844fdbc..58a7067da416d79caa56da830c443e875335ef2e 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -280,7 +280,7 @@ public:
 	void sendParcelRelease();
 
 	// accessors for mAgentParcel
-	const char *getAgentParcelName() const;
+	const LLString& getAgentParcelName() const;
 
 	// Create a landmark at the "appropriate" location for the
 	// currently selected parcel.
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index c3e0e56fb100f6f2640ba88c630d631d1997a281..0a8d9a8e1d89bd65a445db4a37cad04ad47da918 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -451,6 +451,7 @@ std::string LLViewerRegion::regionFlagsToString(U32 flags)
 	return result;
 }
 
+// *TODO:Translate
 char* SIM_ACCESS_STR[] = { "Free Trial",
 						   "PG",
 						   "Mature",
@@ -1413,3 +1414,4 @@ void LLViewerRegion::logActiveCapabilities() const
 	llinfos << "Dumped " << count << " entries." << llendl;
 }
 
+
diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h
index f52ffe97958d80beb263620b3d2380a19efa9493..e05a61c3a313af663e0125b934ae5d478769ad41 100644
--- a/indra/newview/llviewertexteditor.h
+++ b/indra/newview/llviewertexteditor.h
@@ -50,7 +50,7 @@ public:
 	LLViewerTextEditor(const LLString& name,
 					   const LLRect& rect,
 					   S32 max_length,
-					   const LLString& default_text = "",
+					   const LLString& default_text = LLString(),
 					   const LLFontGL* glfont = NULL,
 					   BOOL allow_embedded_items = FALSE);
 
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index ae94dcc384537648aad350e114d5c0dcd6c671b3..49abf130acf10acfe4a5510a3dc707b7977bf327 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1218,6 +1218,10 @@ void LLViewerWindow::handleFocus(LLWindow *window)
 	{
 		gKeyboard->resetMaskKeys();
 	}
+
+	// resume foreground running timer
+	// since we artifically limit framerate when not frontmost
+	gForegroundTime.unpause();
 }
 
 // The top-level window has lost focus (e.g. via ALT-TAB)
@@ -1251,6 +1255,9 @@ void LLViewerWindow::handleFocusLost(LLWindow *window)
 	{
 		gKeyboard->resetKeys();
 	}
+
+	// pause timer that tracks total foreground running time
+	gForegroundTime.pause();
 }
 
 
@@ -1328,10 +1335,16 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
 	else
 	{
 		mActive = FALSE;
-		if (gAllowIdleAFK) {
+		if (gAllowIdleAFK)
+		{
 			gAgent.setAFK();
 		}
+		
+		// SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues
+		gAgent.changeCameraToDefault();
+		
 		send_agent_pause();
+		
 		if (mWindow->getFullscreen() && !mIgnoreActivate)
 		{
 			llinfos << "Stopping GL during deactivation" << llendl;
@@ -3099,7 +3112,6 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point)
 //  render_hud_elements:	FALSE, FALSE, FALSE
 void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL for_hud )
 {
-	LLViewerObject* object;
 	LLObjectSelectionHandle selection = gSelectMgr->getSelection();
 
 	if (!for_hud && !for_gl_pick)
@@ -3155,34 +3167,41 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
 				F32 zoom = gAgent.getAvatarObject()->mHUDCurZoom;
 				glScalef(zoom, zoom, zoom);
 			}
-			for( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() )
+
+			struct f : public LLSelectedObjectFunctor
 			{
-				LLDrawable* drawable = object->mDrawable;
-				if (drawable && drawable->isLight())
+				virtual bool apply(LLViewerObject* object)
 				{
-					LLVOVolume* vovolume = drawable->getVOVolume();
-					glPushMatrix();
+					LLDrawable* drawable = object->mDrawable;
+					if (drawable && drawable->isLight())
+					{
+						LLVOVolume* vovolume = drawable->getVOVolume();
+						glPushMatrix();
 
-					LLVector3 center = drawable->getPositionAgent();
-					glTranslatef(center[0], center[1], center[2]);
-					F32 scale = vovolume->getLightRadius();
-					glScalef(scale, scale, scale);
+						LLVector3 center = drawable->getPositionAgent();
+						glTranslatef(center[0], center[1], center[2]);
+						F32 scale = vovolume->getLightRadius();
+						glScalef(scale, scale, scale);
 
-					LLColor4 color(vovolume->getLightColor(), .5f);
-					glColor4fv(color.mV);
+						LLColor4 color(vovolume->getLightColor(), .5f);
+						glColor4fv(color.mV);
 					
-					F32 pixel_area = 100000.f;
-					// Render Outside
-					gSphere.render(pixel_area);
-
-					// Render Inside
-					glCullFace(GL_FRONT);
-					gSphere.render(pixel_area);
-					glCullFace(GL_BACK);
+						F32 pixel_area = 100000.f;
+						// Render Outside
+						gSphere.render(pixel_area);
+
+						// Render Inside
+						glCullFace(GL_FRONT);
+						gSphere.render(pixel_area);
+						glCullFace(GL_BACK);
 					
-					glPopMatrix();
+						glPopMatrix();
+					}
+					return true;
 				}
-			}
+			} func;
+			gSelectMgr->getSelection()->applyToObjects(&func);
+			
 			glPopMatrix();
 		}				
 		
@@ -3205,8 +3224,12 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
 					BOOL all_selected_objects_move = TRUE;
 					BOOL all_selected_objects_modify = TRUE;
 					BOOL selecting_linked_set = !gSavedSettings.getBOOL("EditLinkedParts");
-					for( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() )
+
+					for (LLObjectSelection::iterator iter = gSelectMgr->getSelection()->begin();
+						 iter != gSelectMgr->getSelection()->end(); iter++)
 					{
+						LLSelectNode* nodep = *iter;
+						LLViewerObject* object = nodep->getObject();
 						BOOL this_object_movable = FALSE;
 						if (object->permMove() && (object->permModify() || selecting_linked_set))
 						{
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index f97f36aa4a27355b14abc8b5e82dc59093d8a42d..fcd15974f61892b2aa094efa43a8477dd6d716e3 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -220,7 +220,7 @@ public:
 	BOOL			saveSnapshot(const LLString&  filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR);
 	BOOL			rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, 
 								BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR );
-	BOOL		    saveImageNumbered(LLImageRaw *raw, const LLString& extension = "");
+	BOOL		    saveImageNumbered(LLImageRaw *raw, const LLString& extension = LLString());
 
 	void			playSnapshotAnimAndSound();
 	
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index ee7d18c0c8752461a59b67cc564a9281b1f36f80..ed256b6f8c7877b1696a34695fe8411ee7a28076 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -445,7 +445,7 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient>
 		// It initiates the call to the server that gets the parcel channel.
 		void parcelChanged();
 		
-		void switchChannel(std::string uri = "", bool spatial = true, bool noReconnect = false, std::string hash = "");
+	void switchChannel(std::string uri = std::string(), bool spatial = true, bool noReconnect = false, std::string hash = "");
 		void joinSession(std::string handle, std::string uri);
 		
 		std::string nameFromAvatar(LLVOAvatar *avatar);
@@ -526,3 +526,4 @@ extern LLVoiceClient *gVoiceClient;
 #endif //LL_VOICE_CLIENT_H
 
 
+
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index 07ea638b7f93ddd7aa5b70969f0df736f8070317..cd02843ccf5782ff2de65299053c29a795a3ae43 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -85,11 +85,11 @@ public:
 	EWearableType		getType() const							{ return mType; }
 	void				setType( EWearableType type )			{ mType = type; }
 
-	void				setName( const std::string& name )				{ mName = name; }
-	const std::string&	getName()								{ return mName; }
+	void				setName( const LLString& name )			{ mName = name; }
+	const LLString&		getName()								{ return mName; }
 
-	void				setDescription( const std::string& desc )		{ mDescription = desc; }
-	const std::string&	getDescription()						{ return mDescription; }
+	void				setDescription( const LLString& desc )	{ mDescription = desc; }
+	const LLString&		getDescription()						{ return mDescription; }
 
 	void				setPermissions( const LLPermissions& p ) { mPermissions = p; }
 	const LLPermissions& getPermissions()						{ return mPermissions; }
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index 06ad6bb470ca00b6473894e89de643b425a152a1..39a6046f5946682d8a43093f9cd2b83b9a0c2f2e 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -132,7 +132,7 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID
 			else
 			{
 				LLString::format_map_t args;
-				// XUI:translate
+				// *TODO:translate
 				args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType);
 				if (data->mName.empty())
 				{
@@ -170,7 +170,7 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID
 		  case LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE:
 		  {
 			  LLString::format_map_t args;
-			  // XUI:translate
+			  // *TODO:translate
 			  args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType);
 			  if (data->mName.empty())
 			  {
diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h
index 4866fb5eb7225979a1261a8b6f2f80cedfe2d544..303fcb7bd39a46ec6cab2891d02e36027488d11a 100644
--- a/indra/newview/llwearablelist.h
+++ b/indra/newview/llwearablelist.h
@@ -57,7 +57,7 @@ public:
 	LLWearable*			createLegacyWearableFromAvatar( EWearableType type );
 
 	LLWearable*			createWearableMatchedToInventoryItem( LLWearable* old_wearable, LLViewerInventoryItem* item );
-	LLWearable*			createCopyFromAvatar( LLWearable* old_wearable, const std::string& new_name = "" );
+	LLWearable*			createCopyFromAvatar( LLWearable* old_wearable, const std::string& new_name = std::string() );
 	LLWearable*			createCopy( LLWearable* old_wearable );
 	LLWearable*			createNewWearable( EWearableType type );
 	
diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h
index 72e470e2f0ccfa18be046aea61e107095ec8a696..28ffb421b0a06e4df193d5166ff06ac7646f1d01 100644
--- a/indra/newview/llworldmapview.h
+++ b/indra/newview/llworldmapview.h
@@ -104,7 +104,7 @@ public:
 	// the view area.
 	void			drawTracking( const LLVector3d& pos_global, 
 								  const LLColor4& color,
-								  BOOL draw_arrow = TRUE, LLString label = "", LLString tooltip = "", S32 vert_offset = 0);
+								  BOOL draw_arrow = TRUE, LLString label = LLString(), LLString tooltip = "", S32 vert_offset = 0);
 	static void		drawTrackingArrow(const LLRect& view_rect, S32 x, S32 y, 
 									  const LLColor4& color,
 									  S32 arrow_size = DEFAULT_TRACKING_ARROW_SIZE);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index a9c5e36bf5a52015e0cc926ca3533b2797833344..d336876ee119224d65640a49c645bb3bdf6ce9bc 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1813,15 +1813,18 @@ void LLPipeline::postSort(LLCamera& camera)
 	// Draw face highlights for selected faces.
 	if (gSelectMgr->getTEMode())
 	{
-		LLViewerObject *vobjp;
-		S32             te;
-		gSelectMgr->getSelection()->getFirstTE(&vobjp,&te);
-
-		while (vobjp)
+		struct f : public LLSelectedTEFunctor
 		{
-			mSelectedFaces.push_back(vobjp->mDrawable->getFace(te));
-			gSelectMgr->getSelection()->getNextTE(&vobjp,&te);
-		}
+			virtual bool apply(LLViewerObject* object, S32 te)
+			{
+				if (object->mDrawable)
+				{
+					gPipeline.mSelectedFaces.push_back(object->mDrawable->getFace(te));
+				}
+				return true;
+			}
+		} func;
+		gSelectMgr->getSelection()->applyToTEs(&func);
 	}
 }