diff --git a/indra/cmake/LLKDU.cmake b/indra/cmake/LLKDU.cmake
index f103dcf6649326451010bdbaf228710320ccfacb..6b69388896b0527b49b9b009bc934fea8d2ec69d 100644
--- a/indra/cmake/LLKDU.cmake
+++ b/indra/cmake/LLKDU.cmake
@@ -1,7 +1,7 @@
 # -*- cmake -*-
 include(Prebuilt)
 
-if (NOT STANDALONE AND EXISTS ${LIBS_CLOSED_DIR}/llkdu)
+if (INSTALL_PROPRIETARY AND NOT STANDALONE AND EXISTS ${LIBS_CLOSED_DIR}/llkdu)
   use_prebuilt_binary(kdu)
   if (WINDOWS)
     set(KDU_LIBRARY debug kdu_cored optimized kdu_core)
@@ -15,4 +15,4 @@ if (NOT STANDALONE AND EXISTS ${LIBS_CLOSED_DIR}/llkdu)
   set(LLKDU_STATIC_LIBRARY llkdu_static)
   set(LLKDU_LIBRARIES ${LLKDU_LIBRARY})
   set(LLKDU_STATIC_LIBRARIES ${LLKDU_STATIC_LIBRARY})
-endif (NOT STANDALONE AND EXISTS ${LIBS_CLOSED_DIR}/llkdu)
+endif (INSTALL_PROPRIETARY AND NOT STANDALONE AND EXISTS ${LIBS_CLOSED_DIR}/llkdu)
diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp
index 3631761c93b81419b2f8d9e97c9ab81b87f9682d..abd8f7dbdeca0280ab9cda395dc464a04b34b613 100644
--- a/indra/integration_tests/llui_libtest/llui_libtest.cpp
+++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp
@@ -84,12 +84,12 @@ class LLTexture ;
 class TestImageProvider : public LLImageProviderInterface
 {
 public:
-	/*virtual*/ LLPointer<LLUIImage> getUIImage(const std::string& name)
+	/*virtual*/ LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority)
 	{
 		return makeImage();
 	}
 
-	/*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id)
+	/*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority)
 	{
 		return makeImage();
 	}
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index 20ff7bab34dc9c3451c57f37633547d38854fabe..e68672d46f9a4017bf60fdd3ad8ccdff6f528a4e 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -276,7 +276,7 @@ void LLCharacter::removeAnimationData(std::string name)
 BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL set_by_user)
 {
 	S32 index = which_param->getID();
-	VisualParamIndexMap_t::iterator index_iter = mVisualParamIndexMap.find(index);
+	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
 	if (index_iter != mVisualParamIndexMap.end())
 	{
 		index_iter->second->setWeight(weight, set_by_user);
@@ -293,7 +293,7 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL
 	std::string tname(param_name);
 	LLStringUtil::toLower(tname);
 	char *tableptr = sVisualParamNames.checkString(tname);
-	VisualParamNameMap_t::iterator name_iter = mVisualParamNameMap.find(tableptr);
+	visual_param_name_map_t::iterator name_iter = mVisualParamNameMap.find(tableptr);
 	if (name_iter != mVisualParamNameMap.end())
 	{
 		name_iter->second->setWeight(weight, set_by_user);
@@ -308,7 +308,7 @@ BOOL LLCharacter::setVisualParamWeight(const char* param_name, F32 weight, BOOL
 //-----------------------------------------------------------------------------
 BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user)
 {
-	VisualParamIndexMap_t::iterator index_iter = mVisualParamIndexMap.find(index);
+	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
 	if (index_iter != mVisualParamIndexMap.end())
 	{
 		index_iter->second->setWeight(weight, set_by_user);
@@ -324,7 +324,7 @@ BOOL LLCharacter::setVisualParamWeight(S32 index, F32 weight, BOOL set_by_user)
 F32 LLCharacter::getVisualParamWeight(LLVisualParam *which_param)
 {
 	S32 index = which_param->getID();
-	VisualParamIndexMap_t::iterator index_iter = mVisualParamIndexMap.find(index);
+	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
 	if (index_iter != mVisualParamIndexMap.end())
 	{
 		return index_iter->second->getWeight();
@@ -344,7 +344,7 @@ F32 LLCharacter::getVisualParamWeight(const char* param_name)
 	std::string tname(param_name);
 	LLStringUtil::toLower(tname);
 	char *tableptr = sVisualParamNames.checkString(tname);
-	VisualParamNameMap_t::iterator name_iter = mVisualParamNameMap.find(tableptr);
+	visual_param_name_map_t::iterator name_iter = mVisualParamNameMap.find(tableptr);
 	if (name_iter != mVisualParamNameMap.end())
 	{
 		return name_iter->second->getWeight();
@@ -358,7 +358,7 @@ F32 LLCharacter::getVisualParamWeight(const char* param_name)
 //-----------------------------------------------------------------------------
 F32 LLCharacter::getVisualParamWeight(S32 index)
 {
-	VisualParamIndexMap_t::iterator index_iter = mVisualParamIndexMap.find(index);
+	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
 	if (index_iter != mVisualParamIndexMap.end())
 	{
 		return index_iter->second->getWeight();
@@ -415,7 +415,7 @@ LLVisualParam*	LLCharacter::getVisualParam(const char *param_name)
 	std::string tname(param_name);
 	LLStringUtil::toLower(tname);
 	char *tableptr = sVisualParamNames.checkString(tname);
-	VisualParamNameMap_t::iterator name_iter = mVisualParamNameMap.find(tableptr);
+	visual_param_name_map_t::iterator name_iter = mVisualParamNameMap.find(tableptr);
 	if (name_iter != mVisualParamNameMap.end())
 	{
 		return name_iter->second;
@@ -430,7 +430,7 @@ LLVisualParam*	LLCharacter::getVisualParam(const char *param_name)
 void LLCharacter::addSharedVisualParam(LLVisualParam *param)
 {
 	S32 index = param->getID();
-	VisualParamIndexMap_t::iterator index_iter = mVisualParamIndexMap.find(index);
+	visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
 	LLVisualParam* current_param = 0;
 	if (index_iter != mVisualParamIndexMap.end())
 		current_param = index_iter->second;
@@ -457,13 +457,13 @@ void LLCharacter::addVisualParam(LLVisualParam *param)
 {
 	S32 index = param->getID();
 	// Add Index map
-	std::pair<VisualParamIndexMap_t::iterator, bool> idxres;
-	idxres = mVisualParamIndexMap.insert(VisualParamIndexMap_t::value_type(index, param));
+	std::pair<visual_param_index_map_t::iterator, bool> idxres;
+	idxres = mVisualParamIndexMap.insert(visual_param_index_map_t::value_type(index, param));
 	if (!idxres.second)
 	{
 		llwarns << "Visual parameter " << param->getName() << " already exists with same ID as " << 
 			param->getName() << llendl;
-		VisualParamIndexMap_t::iterator index_iter = idxres.first;
+		visual_param_index_map_t::iterator index_iter = idxres.first;
 		index_iter->second = param;
 	}
 
@@ -473,12 +473,12 @@ void LLCharacter::addVisualParam(LLVisualParam *param)
 		std::string tname(param->getName());
 		LLStringUtil::toLower(tname);
 		char *tableptr = sVisualParamNames.addString(tname);
-		std::pair<VisualParamNameMap_t::iterator, bool> nameres;
-		nameres = mVisualParamNameMap.insert(VisualParamNameMap_t::value_type(tableptr, param));
+		std::pair<visual_param_name_map_t::iterator, bool> nameres;
+		nameres = mVisualParamNameMap.insert(visual_param_name_map_t::value_type(tableptr, param));
 		if (!nameres.second)
 		{
 			// Already exists, copy param
-			VisualParamNameMap_t::iterator name_iter = nameres.first;
+			visual_param_name_map_t::iterator name_iter = nameres.first;
 			name_iter->second = param;
 		}
 	}
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index 1507686f6711be7b81d7b667b0ad797e43308c05..cb44a32e8af07c8dce9ba71946b2c646c8505db1 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -233,12 +233,12 @@ class LLCharacter
 
 	LLVisualParam*	getVisualParam(S32 id) const
 	{
-		VisualParamIndexMap_t::const_iterator iter = mVisualParamIndexMap.find(id);
+		visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.find(id);
 		return (iter == mVisualParamIndexMap.end()) ? 0 : iter->second;
 	}
 	S32 getVisualParamID(LLVisualParam *id)
 	{
-		VisualParamIndexMap_t::iterator iter;
+		visual_param_index_map_t::iterator iter;
 		for (iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++)
 		{
 			if (iter->second == id)
@@ -276,11 +276,12 @@ class LLCharacter
 
 private:
 	// visual parameter stuff
-	typedef std::map<S32, LLVisualParam *>    VisualParamIndexMap_t;
-	VisualParamIndexMap_t mVisualParamIndexMap;
-	VisualParamIndexMap_t::iterator mCurIterator;
-	typedef std::map<char *, LLVisualParam *> VisualParamNameMap_t;
-	VisualParamNameMap_t  mVisualParamNameMap;
+	typedef std::map<S32, LLVisualParam *> 		visual_param_index_map_t;
+	typedef std::map<char *, LLVisualParam *> 	visual_param_name_map_t;
+
+	visual_param_index_map_t::iterator 			mCurIterator;
+	visual_param_index_map_t 					mVisualParamIndexMap;
+	visual_param_name_map_t  					mVisualParamNameMap;
 
 	static LLStringTable sVisualParamNames;	
 };
diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp
index c4763c63316412ac48abf50029949933d159c141..9e4957342c3f09e7cdb036182ed3dfaa7eddb506 100644
--- a/indra/llcharacter/llvisualparam.cpp
+++ b/indra/llcharacter/llvisualparam.cpp
@@ -305,7 +305,7 @@ void LLVisualParam::stopAnimating(BOOL set_by_user)
 }
 
 //virtual
-BOOL LLVisualParam::linkDrivenParams(visual_param_mapper mapper, bool only_cross_params)
+BOOL LLVisualParam::linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params)
 {
 	// nothing to do for non-driver parameters
 	return TRUE;
diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h
index e6503d611dc117806a76a58fd0154f715f08aeb2..0b516b9374f4e042ec1f2f1fb8f605df4dd9a527 100644
--- a/indra/llcharacter/llvisualparam.h
+++ b/indra/llcharacter/llvisualparam.h
@@ -96,10 +96,9 @@ class LLVisualParamInfo
 //-----------------------------------------------------------------------------
 class LLVisualParam
 {
-protected:
-	typedef		boost::function<LLVisualParam*(S32)> visual_param_mapper;
-
 public:
+	typedef	boost::function<LLVisualParam*(S32)> visual_param_mapper;
+
 	LLVisualParam();
 	virtual ~LLVisualParam();
 
@@ -119,7 +118,7 @@ class LLVisualParam
 	virtual void			animate(F32 delta, BOOL set_by_user);
 	virtual void			stopAnimating(BOOL set_by_user);
 
-	virtual BOOL			linkDrivenParams(visual_param_mapper mapper, bool only_cross_params);
+	virtual BOOL			linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params);
 	virtual void			resetDrivenParams();
 
 	// Interface methods
@@ -161,7 +160,6 @@ class LLVisualParam
 
 	S32					mID;				// id for storing weight/morphtarget compares compactly
 	LLVisualParamInfo	*mInfo;
-
 };
 
 #endif // LL_LLVisualParam_H
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index a6421ac69639e0a0d6ed5a5f0955f7a51a157c80..4bdfe5a867be25aa69aab95d0b32d858491894e5 100644
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -126,6 +126,16 @@ void LLEventPumps::flush()
     }
 }
 
+void LLEventPumps::reset()
+{
+    // Reset every known LLEventPump instance. Leave it up to each instance to
+    // decide what to do with the reset() call.
+    for (PumpMap::iterator pmi = mPumpMap.begin(), pmend = mPumpMap.end(); pmi != pmend; ++pmi)
+    {
+        pmi->second->reset();
+    }
+}
+
 std::string LLEventPumps::registerNew(const LLEventPump& pump, const std::string& name, bool tweak)
 {
     std::pair<PumpMap::iterator, bool> inserted =
@@ -242,6 +252,7 @@ LLEventPumps::~LLEventPumps()
 LLEventPump::LLEventPump(const std::string& name, bool tweak):
     // Register every new instance with LLEventPumps
     mName(LLEventPumps::instance().registerNew(*this, name, tweak)),
+    mSignal(new LLStandardSignal()),
     mEnabled(true)
 {}
 
@@ -264,6 +275,13 @@ std::string LLEventPump::inventName(const std::string& pfx)
     return STRINGIZE(pfx << suffix++);
 }
 
+void LLEventPump::reset()
+{
+    mSignal.reset();
+    mConnections.clear();
+    //mDeps.clear();
+}
+
 LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventListener& listener,
                                          const NameList& after,
                                          const NameList& before)
@@ -405,7 +423,7 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL
     }
     // Now that newNode has a value that places it appropriately in mSignal,
     // connect it.
-    LLBoundListener bound = mSignal.connect(newNode, listener);
+    LLBoundListener bound = mSignal->connect(newNode, listener);
     mConnections[name] = bound;
     return bound;
 }
@@ -445,7 +463,7 @@ bool LLEventStream::post(const LLSD& event)
     // Let caller know if any one listener handled the event. This is mostly
     // useful when using LLEventStream as a listener for an upstream
     // LLEventPump.
-    return mSignal(event);
+    return (*mSignal)(event);
 }
 
 /*****************************************************************************
@@ -476,7 +494,7 @@ void LLEventQueue::flush()
     mEventQueue.clear();
     for ( ; ! queue.empty(); queue.pop_front())
     {
-        mSignal(queue.front());
+        (*mSignal)(queue.front());
     }
 }
 
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index b999bfafa7d8298d75e0c61de489554f1ec95373..64e5cb5da7f290134b89f988e806f71dcd16f0b0 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -202,6 +202,12 @@ class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>
      */
     void flush();
 
+    /**
+     * Reset all known LLEventPump instances
+     * workaround for DEV-35406 crash on shutdown
+     */
+    void reset();
+
 private:
     friend class LLEventPump;
     /**
@@ -504,6 +510,8 @@ class LL_COMMON_API LLEventPump: public LLEventTrackable
     /// flush queued events
     virtual void flush() {}
 
+    virtual void reset();
+
 private:
     virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&,
                                         const NameList& after,
@@ -512,7 +520,8 @@ class LL_COMMON_API LLEventPump: public LLEventTrackable
 
 protected:
     /// implement the dispatching
-    LLStandardSignal mSignal;
+    boost::scoped_ptr<LLStandardSignal> mSignal;
+
     /// valve open?
     bool mEnabled;
     /// Map of named listeners. This tracks the listeners that actually exist
diff --git a/indra/llmessage/tests/llhost_test.cpp b/indra/llmessage/tests/llhost_test.cpp
index e0c562dbf410b96b411c310173b0624591bf5c02..7e5c3a117b326e51b0ea9db67ed28ae50b3e7609 100644
--- a/indra/llmessage/tests/llhost_test.cpp
+++ b/indra/llmessage/tests/llhost_test.cpp
@@ -157,8 +157,8 @@ namespace tut
 	template<> template<>
 	void host_object::test<9>()
 	{
-		skip("setHostByName(\"google.com\"); getHostName() -> (e.g.) \"yx-in-f100.1e100.net\"");
-		std::string hostStr = "google.com";		
+//		skip("setHostByName(\"google.com\"); getHostName() -> (e.g.) \"yx-in-f100.1e100.net\"");
+		std::string hostStr = "linux.org";		
 		LLHost host;
 		host.setHostByName(hostStr);	
 
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index fc58b48a7b9357c74dc2522286a4ee2b9818b30c..6556aa33a49ed986e3e03adcf7a1612592ea8827 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -112,6 +112,8 @@ void LLPluginClassMedia::reset()
 	mLowPrioritySizeLimit = LOW_PRIORITY_TEXTURE_SIZE_DEFAULT;
 	mAllowDownsample = false;
 	mPadding = 0;
+	mLastMouseX = 0;
+	mLastMouseY = 0;
 	mStatus = LLPluginClassMediaOwner::MEDIA_NONE;
 	mSleepTime = 1.0f / 100.0f;
 	mCanCut = false;
@@ -412,8 +414,20 @@ std::string LLPluginClassMedia::translateModifiers(MASK modifiers)
 	return result;
 }
 
-void LLPluginClassMedia::mouseEvent(EMouseEventType type, int x, int y, MASK modifiers)
+void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers)
 {
+	if(type == MOUSE_EVENT_MOVE)
+	{
+		if((x == mLastMouseX) && (y == mLastMouseY))
+		{
+			// Don't spam unnecessary mouse move events.
+			return;
+		}
+		
+		mLastMouseX = x;
+		mLastMouseY = y;
+	}
+	
 	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "mouse_event");
 	std::string temp;
 	switch(type)
@@ -425,6 +439,8 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int x, int y, MASK mod
 	}
 	message.setValue("event", temp);
 
+	message.setValueS32("button", button);
+
 	message.setValueS32("x", x);
 	
 	// Incoming coordinates are OpenGL-style ((0,0) = lower left), so flip them here if the plugin has requested it.
@@ -515,11 +531,12 @@ void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)
 	sendMessage(message);
 }
 	
-bool LLPluginClassMedia::textInput(const std::string &text)
+bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers)
 {
 	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event");
 
 	message.setValue("text", text);
+	message.setValue("modifiers", translateModifiers(modifiers));
 	
 	sendMessage(message);
 	
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 697deec353052ad6113dfc4d2244649bc336f02f..603817b7d092024d8828d2d694c7f71087fd5f4f 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -101,7 +101,7 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner
 		MOUSE_EVENT_DOUBLE_CLICK
 	}EMouseEventType;
 	
-	void mouseEvent(EMouseEventType type, int x, int y, MASK modifiers);
+	void mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers);
 
 	typedef enum 
 	{
@@ -115,7 +115,7 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner
 	void scrollEvent(int x, int y, MASK modifiers);
 	
 	// Text may be unicode (utf8 encoded)
-	bool textInput(const std::string &text);
+	bool textInput(const std::string &text, MASK modifiers);
 	
 	void loadURI(const std::string &uri);
 	
@@ -310,6 +310,8 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner
 	std::string translateModifiers(MASK modifiers);
 	
 	std::string mCursorName;
+	int			mLastMouseX;
+	int			mLastMouseY;
 
 	LLPluginClassMediaOwner::EMediaStatus mStatus;
 	
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 4bd5a83e37f6a57d74d84e0ad890cfa4c35faa84..f0b4436df584d87a8760421caa90d9c729f500cc 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -1,230 +1,228 @@
-# -*- cmake -*-
-
-project(llui)
-
-include(00-Common)
-include(LLCommon)
-include(LLImage)
-include(LLMath)
-include(LLMessage)
-include(LLRender)
-include(LLWindow)
-include(LLVFS)
-include(LLXML)
-include(LLXUIXML)
-
-include_directories(
-    ${LLCOMMON_INCLUDE_DIRS}
-    ${LLIMAGE_INCLUDE_DIRS}
-    ${LLMATH_INCLUDE_DIRS}
-    ${LLMESSAGE_INCLUDE_DIRS}
-    ${LLRENDER_INCLUDE_DIRS}
-    ${LLWINDOW_INCLUDE_DIRS}
-    ${LLVFS_INCLUDE_DIRS}
-    ${LLXML_INCLUDE_DIRS}
-    ${LLXUIXML_INCLUDE_DIRS}
-    )
-
-set(llui_SOURCE_FILES
-    llalertdialog.cpp
-    llbutton.cpp
-    llcheckboxctrl.cpp
-    llclipboard.cpp
-    llcombobox.cpp
-    llconsole.cpp
-    llcontainerview.cpp
-    llctrlselectioninterface.cpp
-    lldockablefloater.cpp
-    lldockcontrol.cpp
-    lldraghandle.cpp
-    lleditmenuhandler.cpp
-    llf32uictrl.cpp
-    llfiltereditor.cpp
-    llflatlistview.cpp
-    llfloater.cpp
-    llfloaterreg.cpp
-    llfloaterreglistener.cpp
-    llflyoutbutton.cpp 
-    llfocusmgr.cpp
-    llfunctorregistry.cpp
-    lliconctrl.cpp
-    llkeywords.cpp
-    lllayoutstack.cpp
-    lllineeditor.cpp
-    lllocalcliprect.cpp
-    llmenubutton.cpp
-    llmenugl.cpp
-    llmodaldialog.cpp
-    llmultifloater.cpp 
-    llmultislider.cpp
-    llmultisliderctrl.cpp
-    llnotifications.cpp
-    llnotificationslistener.cpp
-    llpanel.cpp
-    llprogressbar.cpp
-    llradiogroup.cpp
-    llresizebar.cpp
-    llresizehandle.cpp
-    llresmgr.cpp
-    llrngwriter.cpp
-    llscrollbar.cpp
-    llscrollcontainer.cpp
-    llscrollingpanellist.cpp
-    llscrolllistcell.cpp
-    llscrolllistcolumn.cpp
-    llscrolllistctrl.cpp
-    llscrolllistitem.cpp
-    llsdparam.cpp
-    llsearcheditor.cpp
-    llslider.cpp
-    llsliderctrl.cpp
-    llspinctrl.cpp
-    llstatbar.cpp
-    llstatgraph.cpp
-    llstatview.cpp
-    llstyle.cpp
-    lltabcontainer.cpp
-    lltextbase.cpp
-    lltextbox.cpp
-    lltexteditor.cpp
-    lltextparser.cpp
-    lltransientfloatermgr.cpp
-    lltransutil.cpp
-    lltoggleablemenu.cpp
-    lltooltip.cpp
-    llui.cpp
-    lluicolortable.cpp
-    lluictrl.cpp
-    lluictrlfactory.cpp
-    lluiimage.cpp
-    lluistring.cpp
-    llundo.cpp
-    llurlaction.cpp
-    llurlentry.cpp
-    llurlmatch.cpp
-    llurlregistry.cpp
-    llviewborder.cpp
-    llviewmodel.cpp
-    llview.cpp
-    llviewquery.cpp
-    )
-    
-set(llui_HEADER_FILES
-    CMakeLists.txt
-
-    llalertdialog.h
-    llbutton.h
-    llcallbackmap.h
-    llcheckboxctrl.h
-    llclipboard.h
-    llcombobox.h
-    llconsole.h
-    llcontainerview.h
-    llctrlselectioninterface.h
-    lldraghandle.h
-    lldockablefloater.h
-    lldockcontrol.h
-    lleditmenuhandler.h
-    llf32uictrl.h
-    llfiltereditor.h 
-    llflatlistview.h
-    llfloater.h
-    llfloaterreg.h
-    llfloaterreglistener.h
-    llflyoutbutton.h 
-    llfocusmgr.h
-    llfunctorregistry.h
-    llhandle.h
-    llhelp.h
-    lliconctrl.h
-    llkeywords.h
-    lllayoutstack.h
-    lllazyvalue.h
-    lllineeditor.h
-    lllocalcliprect.h
-    llmenubutton.h
-    llmenugl.h
-    llmodaldialog.h
-    llmultifloater.h 
-    llmultisliderctrl.h
-    llmultislider.h
-    llnotifications.h
-    llnotificationslistener.h
-    llpanel.h
-    llprogressbar.h
-    llradiogroup.h
-    llresizebar.h
-    llresizehandle.h
-    llresmgr.h
-    llrngwriter.h
-    llsearcheditor.h 
-    llscrollbar.h
-    llscrollcontainer.h
-    llscrollingpanellist.h
-    llscrolllistcell.h
-    llscrolllistcolumn.h
-    llscrolllistctrl.h
-    llscrolllistitem.h
-    llsdparam.h
-    llsliderctrl.h
-    llslider.h
-    llspinctrl.h
-    llstatbar.h
-    llstatgraph.h
-    llstatview.h
-    llstyle.h
-    lltabcontainer.h
-    lltextbase.h
-    lltextbox.h
-    lltexteditor.h
-    lltextparser.h
-    lltoggleablemenu.h
-    lltooltip.h
-    lltransientfloatermgr.h
-    lltransutil.h
-    lluicolortable.h
-    lluiconstants.h
-    lluictrlfactory.h
-    lluictrl.h
-    lluifwd.h
-    llui.h
-    lluiimage.h
-    lluistring.h
-    llundo.h
-    llurlaction.h
-    llurlentry.h
-    llurlmatch.h
-    llurlregistry.h
-    llviewborder.h
-    llviewmodel.h
-    llview.h
-    llviewquery.h
-    )
-
-set_source_files_properties(${llui_HEADER_FILES}
-                            PROPERTIES HEADER_FILE_ONLY TRUE)
-
-list(APPEND llui_SOURCE_FILES ${llui_HEADER_FILES})
-
-add_library (llui ${llui_SOURCE_FILES})
-# Libraries on which this library depends, needed for Linux builds
-# Sort by high-level to low-level
-target_link_libraries(llui
-    ${LLMESSAGE_LIBRARIES}
-    ${LLRENDER_LIBRARIES}
-    ${LLWINDOW_LIBRARIES}
-    ${LLIMAGE_LIBRARIES}
-    ${LLVFS_LIBRARIES}    # ugh, just for LLDir
-    ${LLXUIXML_LIBRARIES}
-    ${LLXML_LIBRARIES}
-    ${LLMATH_LIBRARIES}
-    ${LLCOMMON_LIBRARIES} # must be after llimage, llwindow, llrender
-    )
-
-# Add tests
-include(LLAddBuildTest)
-SET(llui_TEST_SOURCE_FILES
-    llurlmatch.cpp
-    llurlentry.cpp
-    )
-LL_ADD_PROJECT_UNIT_TESTS(llui "${llui_TEST_SOURCE_FILES}")
+# -*- cmake -*-
+
+project(llui)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLMath)
+include(LLMessage)
+include(LLRender)
+include(LLWindow)
+include(LLVFS)
+include(LLXML)
+include(LLXUIXML)
+
+include_directories(
+    ${LLCOMMON_INCLUDE_DIRS}
+    ${LLIMAGE_INCLUDE_DIRS}
+    ${LLMATH_INCLUDE_DIRS}
+    ${LLMESSAGE_INCLUDE_DIRS}
+    ${LLRENDER_INCLUDE_DIRS}
+    ${LLWINDOW_INCLUDE_DIRS}
+    ${LLVFS_INCLUDE_DIRS}
+    ${LLXML_INCLUDE_DIRS}
+    ${LLXUIXML_INCLUDE_DIRS}
+    )
+
+set(llui_SOURCE_FILES
+    llalertdialog.cpp
+    llbutton.cpp
+    llcheckboxctrl.cpp
+    llclipboard.cpp
+    llcombobox.cpp
+    llconsole.cpp
+    llcontainerview.cpp
+    llctrlselectioninterface.cpp
+    lldockablefloater.cpp
+    lldockcontrol.cpp
+    lldraghandle.cpp
+    lleditmenuhandler.cpp
+    llf32uictrl.cpp
+    llfiltereditor.cpp
+    llflatlistview.cpp
+    llfloater.cpp
+    llfloaterreg.cpp
+    llfloaterreglistener.cpp
+    llflyoutbutton.cpp 
+    llfocusmgr.cpp
+    llfunctorregistry.cpp
+    lliconctrl.cpp
+    llkeywords.cpp
+    lllayoutstack.cpp
+    lllineeditor.cpp
+    lllocalcliprect.cpp
+    llmenubutton.cpp
+    llmenugl.cpp
+    llmodaldialog.cpp
+    llmultifloater.cpp 
+    llmultislider.cpp
+    llmultisliderctrl.cpp
+    llnotifications.cpp
+    llnotificationslistener.cpp
+    llpanel.cpp
+    llprogressbar.cpp
+    llradiogroup.cpp
+    llresizebar.cpp
+    llresizehandle.cpp
+    llresmgr.cpp
+    llrngwriter.cpp
+    llscrollbar.cpp
+    llscrollcontainer.cpp
+    llscrollingpanellist.cpp
+    llscrolllistcell.cpp
+    llscrolllistcolumn.cpp
+    llscrolllistctrl.cpp
+    llscrolllistitem.cpp
+    llsdparam.cpp
+    llsearcheditor.cpp
+    llslider.cpp
+    llsliderctrl.cpp
+    llspinctrl.cpp
+    llstatbar.cpp
+    llstatgraph.cpp
+    llstatview.cpp
+    llstyle.cpp
+    lltabcontainer.cpp
+    lltextbase.cpp
+    lltextbox.cpp
+    lltexteditor.cpp
+    lltextparser.cpp
+    lltransutil.cpp
+    lltoggleablemenu.cpp
+    lltooltip.cpp
+    llui.cpp
+    lluicolortable.cpp
+    lluictrl.cpp
+    lluictrlfactory.cpp
+    lluiimage.cpp
+    lluistring.cpp
+    llundo.cpp
+    llurlaction.cpp
+    llurlentry.cpp
+    llurlmatch.cpp
+    llurlregistry.cpp
+    llviewborder.cpp
+    llviewmodel.cpp
+    llview.cpp
+    llviewquery.cpp
+    )
+    
+set(llui_HEADER_FILES
+    CMakeLists.txt
+
+    llalertdialog.h
+    llbutton.h
+    llcallbackmap.h
+    llcheckboxctrl.h
+    llclipboard.h
+    llcombobox.h
+    llconsole.h
+    llcontainerview.h
+    llctrlselectioninterface.h
+    lldraghandle.h
+    lldockablefloater.h
+    lldockcontrol.h
+    lleditmenuhandler.h
+    llf32uictrl.h
+    llfiltereditor.h 
+    llflatlistview.h
+    llfloater.h
+    llfloaterreg.h
+    llfloaterreglistener.h
+    llflyoutbutton.h 
+    llfocusmgr.h
+    llfunctorregistry.h
+    llhandle.h
+    llhelp.h
+    lliconctrl.h
+    llkeywords.h
+    lllayoutstack.h
+    lllazyvalue.h
+    lllineeditor.h
+    lllocalcliprect.h
+    llmenubutton.h
+    llmenugl.h
+    llmodaldialog.h
+    llmultifloater.h 
+    llmultisliderctrl.h
+    llmultislider.h
+    llnotifications.h
+    llnotificationslistener.h
+    llpanel.h
+    llprogressbar.h
+    llradiogroup.h
+    llresizebar.h
+    llresizehandle.h
+    llresmgr.h
+    llrngwriter.h
+    llsearcheditor.h 
+    llscrollbar.h
+    llscrollcontainer.h
+    llscrollingpanellist.h
+    llscrolllistcell.h
+    llscrolllistcolumn.h
+    llscrolllistctrl.h
+    llscrolllistitem.h
+    llsdparam.h
+    llsliderctrl.h
+    llslider.h
+    llspinctrl.h
+    llstatbar.h
+    llstatgraph.h
+    llstatview.h
+    llstyle.h
+    lltabcontainer.h
+    lltextbase.h
+    lltextbox.h
+    lltexteditor.h
+    lltextparser.h
+    lltoggleablemenu.h
+    lltooltip.h
+    lltransutil.h
+    lluicolortable.h
+    lluiconstants.h
+    lluictrlfactory.h
+    lluictrl.h
+    lluifwd.h
+    llui.h
+    lluiimage.h
+    lluistring.h
+    llundo.h
+    llurlaction.h
+    llurlentry.h
+    llurlmatch.h
+    llurlregistry.h
+    llviewborder.h
+    llviewmodel.h
+    llview.h
+    llviewquery.h
+    )
+
+set_source_files_properties(${llui_HEADER_FILES}
+                            PROPERTIES HEADER_FILE_ONLY TRUE)
+
+list(APPEND llui_SOURCE_FILES ${llui_HEADER_FILES})
+
+add_library (llui ${llui_SOURCE_FILES})
+# Libraries on which this library depends, needed for Linux builds
+# Sort by high-level to low-level
+target_link_libraries(llui
+    ${LLMESSAGE_LIBRARIES}
+    ${LLRENDER_LIBRARIES}
+    ${LLWINDOW_LIBRARIES}
+    ${LLIMAGE_LIBRARIES}
+    ${LLVFS_LIBRARIES}    # ugh, just for LLDir
+    ${LLXUIXML_LIBRARIES}
+    ${LLXML_LIBRARIES}
+    ${LLMATH_LIBRARIES}
+    ${LLCOMMON_LIBRARIES} # must be after llimage, llwindow, llrender
+    )
+
+# Add tests
+include(LLAddBuildTest)
+SET(llui_TEST_SOURCE_FILES
+    llurlmatch.cpp
+    llurlentry.cpp
+    )
+LL_ADD_PROJECT_UNIT_TESTS(llui "${llui_TEST_SOURCE_FILES}")
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index f28fca35c5db1b11834fd91f00c576aada0b5b3c..fd369730d6428854050736f0b750cb856810a551 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -147,7 +147,8 @@ LLButton::LLButton(const LLButton::Params& p)
 	mHoverGlowStrength(p.hover_glow_amount),
 	mCommitOnReturn(p.commit_on_return),
 	mFadeWhenDisabled(FALSE),
-	mForcePressedState(FALSE)
+	mForcePressedState(FALSE),
+	mLastDrawCharsCount(0)
 {
 	static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
 	static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
@@ -814,7 +815,7 @@ void LLButton::draw()
 		// LLFontGL::render expects S32 max_chars variable but process in a separate way -1 value.
 		// Due to U32_MAX is equal to S32 -1 value I have rest this value for non-ellipses mode.
 		// Not sure if it is really needed. Probably S32_MAX should be always passed as max_chars.
-		mGLFont->render(label, 0, (F32)x, (F32)(LLBUTTON_V_PAD + y_offset), 
+		mLastDrawCharsCount = mGLFont->render(label, 0, (F32)x, (F32)(LLBUTTON_V_PAD + y_offset),
 			label_color % alpha,
 			mHAlign, LLFontGL::BOTTOM,
 			LLFontGL::NORMAL,
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 7ca520b935a0604b3548948ce1f22b0ddc3a821a..7fc49971336794b82004d8584e4ec4d2fde60526 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -210,6 +210,9 @@ class LLButton
 	
 	void			setFont(const LLFontGL *font)		
 		{ mGLFont = ( font ? font : LLFontGL::getFontSansSerif()); }
+
+	S32				getLastDrawCharsCount() const { return mLastDrawCharsCount; }
+
 	void			setScaleImage(BOOL scale)			{ mScaleImage = scale; }
 	BOOL			getScaleImage() const				{ return mScaleImage; }
 
@@ -260,6 +263,7 @@ class LLButton
 	S32 						mMouseHeldDownCount; 	// Counter for parameter passed to held-down callback
 	F32							mHeldDownDelay;			// seconds, after which held-down callbacks get called
 	S32							mHeldDownFrameDelay;	// frames, after which held-down callbacks get called
+	S32							mLastDrawCharsCount;
 
 	LLPointer<LLUIImage>		mImageOverlay;
 	LLFontGL::HAlign			mImageOverlayAlignment;
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index 228d0e701f58f8ef696a411e8161ca56ac5deba5..f56cb2eee7248cbd1ac660645d0d52e1d3fff6a3 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -99,7 +99,7 @@ void LLDockableFloater::toggleInstance(const LLSD& sdname)
 	{
 		instance->setMinimized(FALSE);
 		instance->setVisible(TRUE);
-		instance->setFocus(TRUE);
+		gFloaterView->bringToFront(instance);
 	}
 }
 
@@ -136,11 +136,29 @@ void LLDockableFloater::setMinimized(BOOL minimize)
 	{
 		setVisible(FALSE);
 	}
-	setCanDock(!minimize);
+
+	if (minimize)
+	{
+		setCanDock(false);
+	}
+	else if (!minimize && mDockControl.get() != NULL && mDockControl.get()->isDockVisible())
+	{
+		setCanDock(true);
+	}
 
 	LLFloater::setMinimized(minimize);
 }
 
+LLView * LLDockableFloater::getDockWidget()
+{
+	LLView * res = NULL;
+	if (getDockControl() != NULL) {
+		res = getDockControl()->getDock();
+	}
+
+	return res;
+}
+
 void LLDockableFloater::onDockHidden()
 {
 	setCanDock(FALSE);
@@ -148,7 +166,10 @@ void LLDockableFloater::onDockHidden()
 
 void LLDockableFloater::onDockShown()
 {
-	setCanDock(TRUE);
+	if (!isMinimized())
+	{
+		setCanDock(TRUE);
+	}
 }
 
 void LLDockableFloater::setDocked(bool docked, bool pop_on_undock)
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 499ce9ae8dfa4d39e5668848cc2952b26807b374..46491d8a29e9743bca40046254a26f217e7c070d 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -78,6 +78,8 @@ class LLDockableFloater : public LLFloater
 	 */
 	/*virtual*/ void setMinimized(BOOL minimize);
 
+	LLView * getDockWidget();
+
 	virtual void onDockHidden();
 	virtual void onDockShown();
 
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index cdcd823b1c9a98373b73dcc92f9cd2a058b49fa2..35a854267a4d194e7c9e8eb4bf8a68f5d8d69481 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -37,7 +37,7 @@
 
 LLDockControl::LLDockControl(LLView* dockWidget, LLFloater* dockableFloater,
 		const LLUIImagePtr& dockTongue, DocAt dockAt, get_allowed_rect_callback_t get_allowed_rect_callback) :
-		mDockWidget(dockWidget), mDockableFloater(dockableFloater), mDockTongue(dockTongue)		
+		mDockWidget(dockWidget), mDockableFloater(dockableFloater), mDockTongue(dockTongue)
 {
 	mDockAt = dockAt;
 
@@ -63,6 +63,15 @@ LLDockControl::LLDockControl(LLView* dockWidget, LLFloater* dockableFloater,
 	{
 		repositionDockable();
 	}
+
+	if (mDockWidget != NULL)
+	{
+		mDockWidgetVisible = isDockVisible();
+	}
+	else
+	{
+		mDockWidgetVisible = false;
+	}
 }
 
 LLDockControl::~LLDockControl()
@@ -75,6 +84,11 @@ void LLDockControl::setDock(LLView* dockWidget)
 	if (mDockWidget != NULL)
 	{
 		repositionDockable();
+		mDockWidgetVisible = isDockVisible();
+	}
+	else
+	{
+		mDockWidgetVisible = false;
 	}
 }
 
@@ -88,11 +102,10 @@ void LLDockControl::repositionDockable()
 	LLRect dockRect = mDockWidget->calcScreenRect();
 	LLRect rootRect;
 	mGetAllowedRectCallback(rootRect);
-	static BOOL prev_visibility = !mDockWidget->getVisible();
 
 	// recalculate dockable position if dock position changed, dock visibility changed,
 	// root view rect changed or recalculation is forced
-	if (mPrevDockRect != dockRect  || prev_visibility != mDockWidget->getVisible()
+	if (mPrevDockRect != dockRect  || mDockWidgetVisible != isDockVisible()
 			|| mRootRect != rootRect || mRecalculateDocablePosition)
 	{
 		// undock dockable and off() if dock not visible
@@ -125,7 +138,7 @@ void LLDockControl::repositionDockable()
 		mPrevDockRect = dockRect;
 		mRootRect = rootRect;
 		mRecalculateDocablePosition = false;
-		prev_visibility = mDockWidget->getVisible();
+		mDockWidgetVisible = isDockVisible();
 	}
 }
 
@@ -143,6 +156,8 @@ bool LLDockControl::isDockVisible()
 
 			switch (mDockAt)
 			{
+			case LEFT: // to keep compiler happy
+				break;
 			case TOP:
 				// check is dock inside parent rect
 				LLRect dockParentRect =
@@ -170,8 +185,27 @@ void LLDockControl::moveDockable()
 	LLRect dockableRect = mDockableFloater->calcScreenRect();
 	S32 x = 0;
 	S32 y = 0;
+	LLRect dockParentRect;
 	switch (mDockAt)
 	{
+	case LEFT:
+		x = dockRect.mLeft;
+		y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight();
+		// check is dockable inside root view rect
+		if (x < rootRect.mLeft)
+		{
+			x = rootRect.mLeft;
+		}
+		if (x + dockableRect.getWidth() > rootRect.mRight)
+		{
+			x = rootRect.mRight - dockableRect.getWidth();
+		}
+		
+		mDockTongueX = x + dockableRect.getWidth()/2 - mDockTongue->getWidth() / 2;
+		
+		mDockTongueY = dockRect.mTop;
+		break;
+
 	case TOP:
 		x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
 		y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight();
@@ -187,8 +221,7 @@ void LLDockControl::moveDockable()
 
 
 		// calculate dock tongue position
-		LLRect dockParentRect =
-								mDockWidget->getParent()->calcScreenRect();
+		dockParentRect = mDockWidget->getParent()->calcScreenRect();
 		if (dockRect.getCenterX() < dockParentRect.mLeft)
 		{
 			mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h
index e8ffcac0ac95165b08b7333d39af53fcf08b2e17..eaedb4c30766c05e2246e582cb30ae596961360f 100644
--- a/indra/llui/lldockcontrol.h
+++ b/indra/llui/lldockcontrol.h
@@ -48,6 +48,7 @@ class LLDockControl
 	enum DocAt
 	{
 		TOP
+		,LEFT
 	};
 
 public:
@@ -63,6 +64,10 @@ class LLDockControl
 	void on();
 	void off();
 	void setDock(LLView* dockWidget);
+	LLView* getDock()
+	{
+		return mDockWidget;
+	}
 	void repositionDockable();
 	void drawToungue();
 	bool isDockVisible();
@@ -76,6 +81,7 @@ class LLDockControl
 	get_allowed_rect_callback_t mGetAllowedRectCallback;
 	bool mEnabled;
 	bool mRecalculateDocablePosition;
+	bool mDockWidgetVisible;
 	DocAt mDockAt;
 	LLView* mDockWidget;
 	LLRect mPrevDockRect;
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index bba5464b002282a59d6ac2c911e6aad182607b12..19f203b80c91aefc0ca1a1b6a37144204cfba76d 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -92,7 +92,7 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*
 	
 	//_4 is for MASK
 	item->setMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4));
-	item->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4));
+	item->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemRightMouseClick, this, new_pair, _4));
 
 	rearrangeItems();
 	notifyParentItemsRectChanged();
@@ -137,7 +137,7 @@ bool LLFlatListView::insertItemAfter(LLPanel* after_item, LLPanel* item_to_add,
 
 	//_4 is for MASK
 	item_to_add->setMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4));
-	item_to_add->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4));
+	item_to_add->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemRightMouseClick, this, new_pair, _4));
 
 	rearrangeItems();
 	notifyParentItemsRectChanged();
@@ -459,6 +459,20 @@ void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
 	selectItemPair(item_pair, select_item);
 }
 
+void LLFlatListView::onItemRightMouseClick(item_pair_t* item_pair, MASK mask)
+{
+	if (!item_pair)
+		return;
+
+	// Forbid deselecting of items on right mouse button click if mMultipleSelection flag is set on,
+	// because some of derived classes may have context menu and selected items must be kept.
+	if ( !(mask & MASK_CONTROL) && mMultipleSelection && isSelected(item_pair) )
+		return;
+
+	// else got same behavior as at onItemMouseClick
+	onItemMouseClick(item_pair, mask);
+}
+
 LLFlatListView::item_pair_t* LLFlatListView::getItemPair(LLPanel* item) const
 {
 	llassert(item);
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 888258efdc5910a4ef107e6dfe079fd36a6455e7..97772bc677b454962f4feba0977aacf28083ed04 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -304,6 +304,8 @@ class LLFlatListView : public LLScrollContainer
 	/** Manage selection on mouse events */
 	void onItemMouseClick(item_pair_t* item_pair, MASK mask);
 
+	void onItemRightMouseClick(item_pair_t* item_pair, MASK mask);
+
 	/**
 	 *	Updates position of items.
 	 *	It does not take into account invisible items.
diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h
index 10a7fd454420e273081850dc558658747123da53..899f6b9326fed46e88fa2db240bd4ac50819eebc 100644
--- a/indra/llui/llhandle.h
+++ b/indra/llui/llhandle.h
@@ -60,7 +60,7 @@ template <typename T>
 class LLHandle
 {
 public:
-	LLHandle() : mTombStone(sDefaultTombStone) {}
+	LLHandle() : mTombStone(getDefaultTombStone()) {}
 	const LLHandle<T>& operator =(const LLHandle<T>& other)  
 	{ 
 		mTombStone = other.mTombStone;
@@ -74,7 +74,7 @@ class LLHandle
 
 	void markDead() 
 	{ 
-		mTombStone = sDefaultTombStone; 
+		mTombStone = getDefaultTombStone();
 	}
 
 	T* get() const
@@ -104,13 +104,13 @@ class LLHandle
 	LLPointer<LLTombStone<T> > mTombStone;
 
 private:
-	static LLPointer<LLTombStone<T> > sDefaultTombStone;
+	static LLPointer<LLTombStone<T> >& getDefaultTombStone()
+	{
+		static LLPointer<LLTombStone<T> > sDefaultTombStone = new LLTombStone<T>;
+		return sDefaultTombStone;
+	}
 };
 
-// initialize static "empty" tombstone pointer
-template <typename T> LLPointer<LLTombStone<T> > LLHandle<T>::sDefaultTombStone = new LLTombStone<T>();
-
-
 template <typename T>
 class LLRootHandle : public LLHandle<T>
 {
diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp
index 0330a2b374c44498f6d6f253ad4ec482678fde26..66c2ba682fc474b115c511c31c87ed0bd5ede5c5 100644
--- a/indra/llui/lliconctrl.cpp
+++ b/indra/llui/lliconctrl.cpp
@@ -56,7 +56,8 @@ LLIconCtrl::Params::Params()
 LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)
 :	LLUICtrl(p),
 	mColor(p.color()),
-	mImagep(p.image)
+	mImagep(p.image),
+	mPriority(0)
 {
 	if (mImagep.notNull())
 	{
@@ -93,11 +94,11 @@ void LLIconCtrl::setValue(const LLSD& value )
 	LLUICtrl::setValue(tvalue);
 	if (tvalue.isUUID())
 	{
-		mImagep = LLUI::getUIImageByID(tvalue.asUUID());
+		mImagep = LLUI::getUIImageByID(tvalue.asUUID(), mPriority);
 	}
 	else
 	{
-		mImagep = LLUI::getUIImage(tvalue.asString());
+		mImagep = LLUI::getUIImage(tvalue.asString(), mPriority);
 	}
 }
 
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index ff25b0d53eabe113c79928c24b3a3133e6483123..90f1693060475846f53eb0526a9390cf6f64a0e4 100644
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -72,10 +72,13 @@ class LLIconCtrl
 	std::string	getImageName() const;
 
 	void			setColor(const LLColor4& color) { mColor = color; }
+	
+protected:
+	S32 mPriority;
 
 private:
 	LLUIColor mColor;
-	LLPointer<LLUIImage>	mImagep;
+	LLPointer<LLUIImage> mImagep;
 };
 
 #endif
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 5eade72b61c899c64a2ac058cf5281125509af46..bac54919432a83f44339977e72615f78a907a67e 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -229,7 +229,7 @@ static void get_attribute_bool_and_write(LLXMLNodePtr node,
 LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node)
 {
 	LLLayoutStack::Params p(LLUICtrlFactory::getDefaultParams<LLLayoutStack>());
-	LLXUIParser::instance().readXUI(node, p);
+	LLXUIParser::instance().readXUI(node, p, LLUICtrlFactory::getInstance()->getCurFileName());
 
 	// Export must happen before setupParams() mungles rectangles and before
 	// this item gets added to parent (otherwise screws up last_child_rect
@@ -401,6 +401,16 @@ void LLLayoutStack::collapsePanel(LLPanel* panel, BOOL collapsed)
 	panel_container->mCollapsed = collapsed;
 }
 
+void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize)
+{
+	LayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+
+	if (panel)
+	{
+		panel->mAutoResize = auto_resize;
+	}
+}
+
 void LLLayoutStack::updateLayout(BOOL force_resize)
 {
 	static LLUICachedControl<S32> resize_bar_overlap ("UIResizeBarOverlap", 0);
@@ -713,6 +723,24 @@ LLLayoutStack::LayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) co
 	return NULL;
 }
 
+LLLayoutStack::LayoutPanel* LLLayoutStack::findEmbeddedPanelByName(const std::string& name) const
+{
+	LayoutPanel* result = NULL;
+
+	for (e_panel_list_t::const_iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+	{
+		LayoutPanel* p = *panel_it;
+
+		if (p->mPanel->getName() == name)
+		{
+			result = p;
+			break;
+		}
+	}
+
+	return result;
+}
+
 // Compute sum of min_width or min_height of children
 void LLLayoutStack::calcMinExtents()
 {
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 49cbe7270fe27f70addaca0e5fdf3a278eb1d626..9ded48ef6a19c0629aded4bd1878a144a6efe4f8 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -80,6 +80,7 @@ class LLLayoutStack : public LLView
 	void collapsePanel(LLPanel* panel, BOOL collapsed = TRUE);
 	S32 getNumPanels() { return mPanels.size(); }
 
+	void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
 protected:
 	LLLayoutStack(const Params&);
 	friend class LLUICtrlFactory;
@@ -96,7 +97,9 @@ class LLLayoutStack : public LLView
 
 	typedef std::vector<LayoutPanel*> e_panel_list_t;
 	e_panel_list_t mPanels;
+
 	LayoutPanel* findEmbeddedPanel(LLPanel* panelp) const;
+	LayoutPanel* findEmbeddedPanelByName(const std::string& name) const;
 
 	S32 mMinWidth;  // calculated by calcMinExtents
 	S32 mMinHeight;  // calculated by calcMinExtents
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index a68b9cae575330f65f67ecb38805fcbfa6859246..ef222bad608cad3379b25c5c964964acb4a4312a 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1,1516 +1,1517 @@
-/**
-* @file llnotifications.cpp
-* @brief Non-UI queue manager for keeping a prioritized list of notifications
-*
-* $LicenseInfo:firstyear=2008&license=viewergpl$
-* 
-* Copyright (c) 2008-2009, Linden Research, Inc.
-* 
-* Second Life Viewer Source Code
-* The source code in this file ("Source Code") is provided by Linden Lab
-* to you under the terms of the GNU General Public License, version 2.0
-* ("GPL"), unless you have obtained a separate licensing agreement
-* ("Other License"), formally executed by you and Linden Lab.  Terms of
-* the GPL can be found in doc/GPL-license.txt in this distribution, or
-* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-* 
-* There are special exceptions to the terms and conditions of the GPL as
-* it is applied to this Source Code. View the full text of the exception
-* in the file doc/FLOSS-exception.txt in this software distribution, or
-* online at
-* http://secondlifegrid.net/programs/open_source/licensing/flossexception
-* 
-* By copying, modifying or distributing this software, you acknowledge
-* that you have read and understood your obligations described above,
-* and agree to abide by those obligations.
-* 
-* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-* COMPLETENESS OR PERFORMANCE.
-* $/LicenseInfo$
-*/
-
-#include "linden_common.h"
-
-#include "llnotifications.h"
-
-#include "lluictrl.h"
-#include "lluictrlfactory.h"
-#include "lldir.h"
-#include "llsdserialize.h"
-#include "lltrans.h"
-#include "llnotificationslistener.h"
-
-#include <algorithm>
-#include <boost/regex.hpp>
-
-
-const std::string NOTIFICATION_PERSIST_VERSION = "0.93";
-
-// local channel for notification history
-class LLNotificationHistoryChannel : public LLNotificationChannel
-{
-	LOG_CLASS(LLNotificationHistoryChannel);
-public:
-	LLNotificationHistoryChannel(const std::string& filename) : 
-		LLNotificationChannel("History", "Visible", &historyFilter, LLNotificationComparators::orderByUUID()),
-		mFileName(filename)
-	{
-		connectChanged(boost::bind(&LLNotificationHistoryChannel::historyHandler, this, _1));
-		loadPersistentNotifications();
-	}
-
-private:
-	bool historyHandler(const LLSD& payload)
-	{
-		// we ignore "load" messages, but rewrite the persistence file on any other
-		std::string sigtype = payload["sigtype"];
-		if (sigtype != "load")
-		{
-			savePersistentNotifications();
-		}
-		return false;
-	}
-
-	// The history channel gets all notifications except those that have been cancelled
-	static bool historyFilter(LLNotificationPtr pNotification)
-	{
-		return !pNotification->isCancelled();
-	}
-
-	void savePersistentNotifications()
-	{
-		llinfos << "Saving open notifications to " << mFileName << llendl;
-
-		llofstream notify_file(mFileName.c_str());
-		if (!notify_file.is_open()) 
-		{
-			llwarns << "Failed to open " << mFileName << llendl;
-			return;
-		}
-
-		LLSD output;
-		output["version"] = NOTIFICATION_PERSIST_VERSION;
-		LLSD& data = output["data"];
-
-		for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
-		{
-			if (!LLNotifications::instance().templateExists((*it)->getName())) continue;
-
-			// only store notifications flagged as persisting
-			LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate((*it)->getName());
-			if (!templatep->mPersist) continue;
-
-			data.append((*it)->asLLSD());
-		}
-
-		LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
-		formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY);
-	}
-
-	void loadPersistentNotifications()
-	{
-		llinfos << "Loading open notifications from " << mFileName << llendl;
-
-		llifstream notify_file(mFileName.c_str());
-		if (!notify_file.is_open()) 
-		{
-			llwarns << "Failed to open " << mFileName << llendl;
-			return;
-		}
-
-		LLSD input;
-		LLPointer<LLSDParser> parser = new LLSDXMLParser();
-		if (parser->parse(notify_file, input, LLSDSerialize::SIZE_UNLIMITED) < 0)
-		{
-			llwarns << "Failed to parse open notifications" << llendl;
-			return;
-		}
-
-		if (input.isUndefined()) return;
-		std::string version = input["version"];
-		if (version != NOTIFICATION_PERSIST_VERSION)
-		{
-			llwarns << "Bad open notifications version: " << version << llendl;
-			return;
-		}
-		LLSD& data = input["data"];
-		if (data.isUndefined()) return;
-
-		LLNotifications& instance = LLNotifications::instance();
-		for (LLSD::array_const_iterator notification_it = data.beginArray();
-			notification_it != data.endArray();
-			++notification_it)
-		{
-			instance.add(LLNotificationPtr(new LLNotification(*notification_it)));
-		}
-	}
-
-	//virtual
-	void onDelete(LLNotificationPtr pNotification)
-	{
-		// we want to keep deleted notifications in our log
-		mItems.insert(pNotification);
-		
-		return;
-	}
-	
-private:
-	std::string mFileName;
-};
-
-bool filterIgnoredNotifications(LLNotificationPtr notification)
-{
-	// filter everything if we are to ignore ALL
-	if(LLNotifications::instance().getIgnoreAllNotifications())
-	{
-		return false;
-	}
-
-	LLNotificationFormPtr form = notification->getForm();
-	// Check to see if the user wants to ignore this alert
-	if (form->getIgnoreType() != LLNotificationForm::IGNORE_NO)
-	{
-		return LLUI::sSettingGroups["ignores"]->getBOOL(notification->getName());
-	}
-
-	return true;
-}
-
-bool handleIgnoredNotification(const LLSD& payload)
-{
-	if (payload["sigtype"].asString() == "add")
-	{
-		LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
-		if (!pNotif) return false;
-
-		LLNotificationFormPtr form = pNotif->getForm();
-		LLSD response;
-		switch(form->getIgnoreType())
-		{
-		case LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE:
-			response = pNotif->getResponseTemplate(LLNotification::WITH_DEFAULT_BUTTON);
-			break;
-		case LLNotificationForm::IGNORE_WITH_LAST_RESPONSE:
-			response = LLUI::sSettingGroups["ignores"]->getLLSD("Default" + pNotif->getName());
-			break;
-		case LLNotificationForm::IGNORE_SHOW_AGAIN:
-			break;
-		default:
-			return false;
-		}
-		pNotif->setIgnored(true);
-		pNotif->respond(response);
-		return true; 	// don't process this item any further
-	}
-	return false;
-}
-
-namespace LLNotificationFilters
-{
-	// a sample filter
-	bool includeEverything(LLNotificationPtr p)
-	{
-		return true;
-	}
-};
-
-LLNotificationForm::LLNotificationForm()
-:	mFormData(LLSD::emptyArray()),
-	mIgnore(IGNORE_NO)
-{
-}
-
-
-LLNotificationForm::LLNotificationForm(const std::string& name, const LLXMLNodePtr xml_node) 
-:	mFormData(LLSD::emptyArray()),
-	mIgnore(IGNORE_NO)
-{
-	if (!xml_node->hasName("form"))
-	{
-		llwarns << "Bad xml node for form: " << xml_node->getName() << llendl;
-	}
-	LLXMLNodePtr child = xml_node->getFirstChild();
-	while(child)
-	{
-		child = LLNotifications::instance().checkForXMLTemplate(child);
-
-		LLSD item_entry;
-		std::string element_name = child->getName()->mString;
-
-		if (element_name == "ignore" )
-		{
-			bool save_option = false;
-			child->getAttribute_bool("save_option", save_option);
-			if (!save_option)
-			{
-				mIgnore = IGNORE_WITH_DEFAULT_RESPONSE;
-			}
-			else
-			{
-				// remember last option chosen by user and automatically respond with that in the future
-				mIgnore = IGNORE_WITH_LAST_RESPONSE;
-				LLUI::sSettingGroups["ignores"]->declareLLSD(std::string("Default") + name, "", std::string("Default response for notification " + name));
-			}
-			child->getAttributeString("text", mIgnoreMsg);
-			BOOL show_notification = TRUE;
-			LLUI::sSettingGroups["ignores"]->declareBOOL(name, show_notification, "Ignore notification with this name", TRUE);
-		}
-		else
-		{
-			// flatten xml form entry into single LLSD map with type==name
-			item_entry["type"] = element_name;
-			const LLXMLAttribList::iterator attrib_end = child->mAttributes.end();
-			for(LLXMLAttribList::iterator attrib_it = child->mAttributes.begin();
-				attrib_it != attrib_end;
-				++attrib_it)
-			{
-				item_entry[std::string(attrib_it->second->getName()->mString)] = attrib_it->second->getValue();
-			}
-			item_entry["value"] = child->getTextContents();
-			mFormData.append(item_entry);
-		}
-
-		child = child->getNextSibling();
-	}
-}
-
-LLNotificationForm::LLNotificationForm(const LLSD& sd)
-{
-	if (sd.isArray())
-	{
-		mFormData = sd;
-	}
-	else
-	{
-		llwarns << "Invalid form data " << sd << llendl;
-		mFormData = LLSD::emptyArray();
-	}
-}
-
-LLSD LLNotificationForm::asLLSD() const
-{ 
-	return mFormData; 
-}
-
-LLSD LLNotificationForm::getElement(const std::string& element_name)
-{
-	for (LLSD::array_const_iterator it = mFormData.beginArray();
-		it != mFormData.endArray();
-		++it)
-	{
-		if ((*it)["name"].asString() == element_name) return (*it);
-	}
-	return LLSD();
-}
-
-
-bool LLNotificationForm::hasElement(const std::string& element_name)
-{
-	for (LLSD::array_const_iterator it = mFormData.beginArray();
-		it != mFormData.endArray();
-		++it)
-	{
-		if ((*it)["name"].asString() == element_name) return true;
-	}
-	return false;
-}
-
-void LLNotificationForm::addElement(const std::string& type, const std::string& name, const LLSD& value)
-{
-	LLSD element;
-	element["type"] = type;
-	element["name"] = name;
-	element["text"] = name;
-	element["value"] = value;
-	element["index"] = mFormData.size();
-	mFormData.append(element);
-}
-
-void LLNotificationForm::append(const LLSD& sub_form)
-{
-	if (sub_form.isArray())
-	{
-		for (LLSD::array_const_iterator it = sub_form.beginArray();
-			it != sub_form.endArray();
-			++it)
-		{
-			mFormData.append(*it);
-		}
-	}
-}
-
-void LLNotificationForm::formatElements(const LLSD& substitutions)
-{
-	for (LLSD::array_iterator it = mFormData.beginArray();
-		it != mFormData.endArray();
-		++it)
-	{
-		// format "text" component of each form element
-		if ((*it).has("text"))
-		{
-			std::string text = (*it)["text"].asString();
-			LLStringUtil::format(text, substitutions);
-			(*it)["text"] = text;
-		}
-		if ((*it)["type"].asString() == "text" && (*it).has("value"))
-		{
-			std::string value = (*it)["value"].asString();
-			LLStringUtil::format(value, substitutions);
-			(*it)["value"] = value;
-		}
-	}
-}
-
-std::string LLNotificationForm::getDefaultOption()
-{
-	for (LLSD::array_const_iterator it = mFormData.beginArray();
-		it != mFormData.endArray();
-		++it)
-	{
-		if ((*it)["default"]) return (*it)["name"].asString();
-	}
-	return "";
-}
-
-LLNotificationTemplate::LLNotificationTemplate() :
-	mExpireSeconds(0),
-	mExpireOption(-1),
-	mURLOption(-1),
-    mURLOpenExternally(-1),
-	mUnique(false),
-	mPriority(NOTIFICATION_PRIORITY_NORMAL)
-{
-	mForm = LLNotificationFormPtr(new LLNotificationForm()); 
-}
-
-LLNotification::LLNotification(const LLNotification::Params& p) : 
-	mTimestamp(p.time_stamp), 
-	mSubstitutions(p.substitutions),
-	mPayload(p.payload),
-	mExpiresAt(0),
-	mTemporaryResponder(false),
-	mRespondedTo(false),
-	mPriority(p.priority),
-	mCancelled(false),
-	mIgnored(false)
-{
-	if (p.functor.name.isChosen())
-	{
-		mResponseFunctorName = p.functor.name;
-	}
-	else if (p.functor.function.isChosen())
-	{
-		mResponseFunctorName = LLUUID::generateNewID().asString();
-		LLNotificationFunctorRegistry::instance().registerFunctor(mResponseFunctorName, p.functor.function());
-
-		mTemporaryResponder = true;
-	}
-
-	mId.generate();
-	init(p.name, p.form_elements);
-}
-
-
-LLNotification::LLNotification(const LLSD& sd) :
-	mTemporaryResponder(false),
-	mRespondedTo(false),
-	mCancelled(false),
-	mIgnored(false)
-{ 
-	mId.generate();
-	mSubstitutions = sd["substitutions"];
-	mPayload = sd["payload"]; 
-	mTimestamp = sd["time"]; 
-	mExpiresAt = sd["expiry"];
-	mPriority = (ENotificationPriority)sd["priority"].asInteger();
-	mResponseFunctorName = sd["responseFunctor"].asString();
-	std::string templatename = sd["name"].asString();
-	init(templatename, LLSD());
-	// replace form with serialized version
-	mForm = LLNotificationFormPtr(new LLNotificationForm(sd["form"]));
-}
-
-
-LLSD LLNotification::asLLSD()
-{
-	LLSD output;
-	output["name"] = mTemplatep->mName;
-	output["form"] = getForm()->asLLSD();
-	output["substitutions"] = mSubstitutions;
-	output["payload"] = mPayload;
-	output["time"] = mTimestamp;
-	output["expiry"] = mExpiresAt;
-	output["priority"] = (S32)mPriority;
-	output["responseFunctor"] = mResponseFunctorName;
-	return output;
-}
-
-void LLNotification::update()
-{
-	LLNotifications::instance().update(shared_from_this());
-}
-
-void LLNotification::updateFrom(LLNotificationPtr other)
-{
-	// can only update from the same notification type
-	if (mTemplatep != other->mTemplatep) return;
-
-	// NOTE: do NOT change the ID, since it is the key to
-	// this given instance, just update all the metadata
-	//mId = other->mId;
-
-	mPayload = other->mPayload;
-	mSubstitutions = other->mSubstitutions;
-	mTimestamp = other->mTimestamp;
-	mExpiresAt = other->mExpiresAt;
-	mCancelled = other->mCancelled;
-	mIgnored = other->mIgnored;
-	mPriority = other->mPriority;
-	mForm = other->mForm;
-	mResponseFunctorName = other->mResponseFunctorName;
-	mRespondedTo = other->mRespondedTo;
-	mTemporaryResponder = other->mTemporaryResponder;
-
-	update();
-}
-
-const LLNotificationFormPtr LLNotification::getForm()
-{
-	return mForm;
-}
-
-void LLNotification::cancel()
-{
-	mCancelled = true;
-}
-
-LLSD LLNotification::getResponseTemplate(EResponseTemplateType type)
-{
-	LLSD response = LLSD::emptyMap();
-	for (S32 element_idx = 0;
-		element_idx < mForm->getNumElements();
-		++element_idx)
-	{
-		LLSD element = mForm->getElement(element_idx);
-		if (element.has("name"))
-		{
-			response[element["name"].asString()] = element["value"];
-		}
-
-		if ((type == WITH_DEFAULT_BUTTON) 
-			&& element["default"].asBoolean())
-		{
-			response[element["name"].asString()] = true;
-		}
-	}
-	return response;
-}
-
-//static
-S32 LLNotification::getSelectedOption(const LLSD& notification, const LLSD& response)
-{
-	LLNotificationForm form(notification["form"]);
-
-	for (S32 element_idx = 0;
-		element_idx < form.getNumElements();
-		++element_idx)
-	{
-		LLSD element = form.getElement(element_idx);
-
-		// only look at buttons
-		if (element["type"].asString() == "button" 
-			&& response[element["name"].asString()].asBoolean())
-		{
-			return element["index"].asInteger();
-		}
-	}
-
-	return -1;
-}
-
-//static
-std::string LLNotification::getSelectedOptionName(const LLSD& response)
-{
-	for (LLSD::map_const_iterator response_it = response.beginMap();
-		response_it != response.endMap();
-		++response_it)
-	{
-		if (response_it->second.isBoolean() && response_it->second.asBoolean())
-		{
-			return response_it->first;
-		}
-	}
-	return "";
-}
-
-
-void LLNotification::respond(const LLSD& response)
-{
-	mRespondedTo = true;
-	// look up the functor
-	LLNotificationFunctorRegistry::ResponseFunctor functor = 
-		LLNotificationFunctorRegistry::instance().getFunctor(mResponseFunctorName);
-	// and then call it
-	functor(asLLSD(), response);
-	
-	if (mTemporaryResponder)
-	{
-		LLNotificationFunctorRegistry::instance().unregisterFunctor(mResponseFunctorName);
-		mResponseFunctorName = "";
-		mTemporaryResponder = false;
-	}
-
-	if (mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO)
-	{
-		BOOL show_notification = mIgnored ? FALSE : TRUE;
-		LLUI::sSettingGroups["ignores"]->setBOOL(getName(), show_notification);
-		if (mIgnored && mForm->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)
-		{
-			LLUI::sSettingGroups["ignores"]->setLLSD("Default" + getName(), response);
-		}
-	}
-
-	update();
-}
-
-void LLNotification::setIgnored(bool ignore)
-{
-	mIgnored = ignore;
-}
-
-void LLNotification::setResponseFunctor(std::string const &responseFunctorName)
-{
-	if (mTemporaryResponder)
-		// get rid of the old one
-		LLNotificationFunctorRegistry::instance().unregisterFunctor(mResponseFunctorName);
-	mResponseFunctorName = responseFunctorName;
-	mTemporaryResponder = false;
-}
-
-bool LLNotification::payloadContainsAll(const std::vector<std::string>& required_fields) const
-{
-	for(std::vector<std::string>::const_iterator required_fields_it = required_fields.begin(); 
-		required_fields_it != required_fields.end();
-		required_fields_it++)
-	{
-		std::string required_field_name = *required_fields_it;
-		if( ! getPayload().has(required_field_name))
-		{
-			return false; // a required field was not found
-		}
-	}
-	return true; // all required fields were found
-}
-
-bool LLNotification::isEquivalentTo(LLNotificationPtr that) const
-{
-	if (this->mTemplatep->mName != that->mTemplatep->mName) 
-	{
-		return false; // must have the same template name or forget it
-	}
-	if (this->mTemplatep->mUnique)
-	{
-		// highlander bit sez there can only be one of these
-		return
-			this->payloadContainsAll(that->mTemplatep->mUniqueContext) &&
-			that->payloadContainsAll(this->mTemplatep->mUniqueContext);
-	}
-	return false; 
-}
-
-void LLNotification::init(const std::string& template_name, const LLSD& form_elements)
-{
-	mTemplatep = LLNotifications::instance().getTemplate(template_name);
-	if (!mTemplatep) return;
-
-	// add default substitutions
-	const LLStringUtil::format_map_t& default_args = LLTrans::getDefaultArgs();
-	for (LLStringUtil::format_map_t::const_iterator iter = default_args.begin();
-		 iter != default_args.end(); ++iter)
-	{
-		mSubstitutions[iter->first] = iter->second;
-	}
-	mSubstitutions["_URL"] = getURL();
-	mSubstitutions["_NAME"] = template_name;
-	// TODO: something like this so that a missing alert is sensible:
-	//mSubstitutions["_ARGS"] = get_all_arguments_as_text(mSubstitutions);
-
-	mForm = LLNotificationFormPtr(new LLNotificationForm(*mTemplatep->mForm));
-	mForm->append(form_elements);
-
-	// apply substitution to form labels
-	mForm->formatElements(mSubstitutions);
-
-	LLDate rightnow = LLDate::now();
-	if (mTemplatep->mExpireSeconds)
-	{
-		mExpiresAt = LLDate(rightnow.secondsSinceEpoch() + mTemplatep->mExpireSeconds);
-	}
-
-	if (mPriority == NOTIFICATION_PRIORITY_UNSPECIFIED)
-	{
-		mPriority = mTemplatep->mPriority;
-	}
-}
-
-std::string LLNotification::summarize() const
-{
-	std::string s = "Notification(";
-	s += getName();
-	s += ") : ";
-	s += mTemplatep ? mTemplatep->mMessage : "";
-	// should also include timestamp and expiration time (but probably not payload)
-	return s;
-}
-
-std::string LLNotification::getMessage() const
-{
-	// all our callers cache this result, so it gives us more flexibility
-	// to do the substitution at call time rather than attempting to 
-	// cache it in the notification
-	if (!mTemplatep)
-		return std::string();
-
-	std::string message = mTemplatep->mMessage;
-	LLStringUtil::format(message, mSubstitutions);
-	return message;
-}
-
-std::string LLNotification::getLabel() const
-{
-	std::string label = mTemplatep->mLabel;
-	LLStringUtil::format(label, mSubstitutions);
-	return (mTemplatep ? label : "");
-}
-
-std::string LLNotification::getURL() const
-{
-	if (!mTemplatep)
-		return std::string();
-	std::string url = mTemplatep->mURL;
-	LLStringUtil::format(url, mSubstitutions);
-	return (mTemplatep ? url : "");
-}
-
-// =========================================================
-// LLNotificationChannel implementation
-// ---
-LLBoundListener LLNotificationChannelBase::connectChangedImpl(const LLEventListener& slot)
-{
-	// when someone wants to connect to a channel, we first throw them
-	// all of the notifications that are already in the channel
-	// we use a special signal called "load" in case the channel wants to care
-	// only about new notifications
-	for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
-	{
-		slot(LLSD().insert("sigtype", "load").insert("id", (*it)->id()));
-	}
-	// and then connect the signal so that all future notifications will also be
-	// forwarded.
-	return mChanged.connect(slot);
-}
-
-LLBoundListener LLNotificationChannelBase::connectAtFrontChangedImpl(const LLEventListener& slot)
-{
-	for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
-	{
-		slot(LLSD().insert("sigtype", "load").insert("id", (*it)->id()));
-	}
-	return mChanged.connect(slot, boost::signals2::at_front);
-}
-
-LLBoundListener LLNotificationChannelBase::connectPassedFilterImpl(const LLEventListener& slot)
-{
-	// these two filters only fire for notifications added after the current one, because
-	// they don't participate in the hierarchy.
-	return mPassedFilter.connect(slot);
-}
-
-LLBoundListener LLNotificationChannelBase::connectFailedFilterImpl(const LLEventListener& slot)
-{
-	return mFailedFilter.connect(slot);
-}
-
-// external call, conforms to our standard signature
-bool LLNotificationChannelBase::updateItem(const LLSD& payload)
-{	
-	// first check to see if it's in the master list
-	LLNotificationPtr pNotification	 = LLNotifications::instance().find(payload["id"]);
-	if (!pNotification)
-		return false;	// not found
-	
-	return updateItem(payload, pNotification);
-}
-
-
-//FIX QUIT NOT WORKING
-
-
-// internal call, for use in avoiding lookup
-bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPtr pNotification)
-{	
-	std::string cmd = payload["sigtype"];
-	LLNotificationSet::iterator foundItem = mItems.find(pNotification);
-	bool wasFound = (foundItem != mItems.end());
-	bool passesFilter = mFilter(pNotification);
-	
-	// first, we offer the result of the filter test to the simple
-	// signals for pass/fail. One of these is guaranteed to be called.
-	// If either signal returns true, the change processing is NOT performed
-	// (so don't return true unless you know what you're doing!)
-	bool abortProcessing = false;
-	if (passesFilter)
-	{
-		abortProcessing = mPassedFilter(payload);
-	}
-	else
-	{
-		abortProcessing = mFailedFilter(payload);
-	}
-	
-	if (abortProcessing)
-	{
-		return true;
-	}
-	
-	if (cmd == "load")
-	{
-		// should be no reason we'd ever get a load if we already have it
-		// if passes filter send a load message, else do nothing
-		assert(!wasFound);
-		if (passesFilter)
-		{
-			// not in our list, add it and say so
-			mItems.insert(pNotification);
-			abortProcessing = mChanged(payload);
-			onLoad(pNotification);
-		}
-	}
-	else if (cmd == "change")
-	{
-		// if it passes filter now and was found, we just send a change message
-		// if it passes filter now and wasn't found, we have to add it
-		// if it doesn't pass filter and wasn't found, we do nothing
-		// if it doesn't pass filter and was found, we need to delete it
-		if (passesFilter)
-		{
-			if (wasFound)
-			{
-				// it already existed, so this is a change
-				// since it changed in place, all we have to do is resend the signal
-				abortProcessing = mChanged(payload);
-				onChange(pNotification);
-			}
-			else
-			{
-				// not in our list, add it and say so
-				mItems.insert(pNotification);
-				// our payload is const, so make a copy before changing it
-				LLSD newpayload = payload;
-				newpayload["sigtype"] = "add";
-				abortProcessing = mChanged(newpayload);
-				onChange(pNotification);
-			}
-		}
-		else
-		{
-			if (wasFound)
-			{
-				// it already existed, so this is a delete
-				mItems.erase(pNotification);
-				// our payload is const, so make a copy before changing it
-				LLSD newpayload = payload;
-				newpayload["sigtype"] = "delete";
-				abortProcessing = mChanged(newpayload);
-				onChange(pNotification);
-			}
-			// didn't pass, not on our list, do nothing
-		}
-	}
-	else if (cmd == "add")
-	{
-		// should be no reason we'd ever get an add if we already have it
-		// if passes filter send an add message, else do nothing
-		assert(!wasFound);
-		if (passesFilter)
-		{
-			// not in our list, add it and say so
-			mItems.insert(pNotification);
-			abortProcessing = mChanged(payload);
-			onAdd(pNotification);
-		}
-	}
-	else if (cmd == "delete")
-	{
-		// if we have it in our list, pass on the delete, then delete it, else do nothing
-		if (wasFound)
-		{
-			abortProcessing = mChanged(payload);
-			mItems.erase(pNotification);
-			onDelete(pNotification);
-		}
-	}
-	return abortProcessing;
-}
-
-/* static */
-LLNotificationChannelPtr LLNotificationChannel::buildChannel(const std::string& name, 
-															 const std::string& parent,
-															 LLNotificationFilter filter, 
-															 LLNotificationComparator comparator)
-{
-	// note: this is not a leak; notifications are self-registering.
-	// This factory helps to prevent excess deletions by making sure all smart
-	// pointers to notification channels come from the same source
-	new LLNotificationChannel(name, parent, filter, comparator);
-	return LLNotifications::instance().getChannel(name);
-}
-
-
-LLNotificationChannel::LLNotificationChannel(const std::string& name, 
-											 const std::string& parent,
-											 LLNotificationFilter filter, 
-											 LLNotificationComparator comparator) : 
-LLNotificationChannelBase(filter, comparator),
-mName(name),
-mParent(parent)
-{
-	// store myself in the channel map
-	LLNotifications::instance().addChannel(LLNotificationChannelPtr(this));
-	// bind to notification broadcast
-	if (parent.empty())
-	{
-		LLNotifications::instance().connectChanged(
-			boost::bind(&LLNotificationChannelBase::updateItem, this, _1));
-	}
-	else
-	{
-		LLNotificationChannelPtr p = LLNotifications::instance().getChannel(parent);
-		p->connectChanged(boost::bind(&LLNotificationChannelBase::updateItem, this, _1));
-	}
-}
-
-
-void LLNotificationChannel::setComparator(LLNotificationComparator comparator) 
-{ 
-	mComparator = comparator; 
-	LLNotificationSet s2(mComparator);
-	s2.insert(mItems.begin(), mItems.end());
-	mItems.swap(s2);
-	
-	// notify clients that we've been resorted
-	mChanged(LLSD().insert("sigtype", "sort")); 
-}
-
-bool LLNotificationChannel::isEmpty() const
-{
-	return mItems.empty();
-}
-
-LLNotificationChannel::Iterator LLNotificationChannel::begin()
-{
-	return mItems.begin();
-}
-
-LLNotificationChannel::Iterator LLNotificationChannel::end()
-{
-	return mItems.end();
-}
-
-std::string LLNotificationChannel::summarize()
-{
-	std::string s("Channel '");
-	s += mName;
-	s += "'\n  ";
-	for (LLNotificationChannel::Iterator it = begin(); it != end(); ++it)
-	{
-		s += (*it)->summarize();
-		s += "\n  ";
-	}
-	return s;
-}
-
-
-// ---
-// END OF LLNotificationChannel implementation
-// =========================================================
-
-
-// =========================================================
-// LLNotifications implementation
-// ---
-LLNotifications::LLNotifications() : LLNotificationChannelBase(LLNotificationFilters::includeEverything,
-															   LLNotificationComparators::orderByUUID()),
-									mIgnoreAllNotifications(false)
-{
-	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Notification.Show", boost::bind(&LLNotifications::addFromCallback, this, _2));
-
-    mListener.reset(new LLNotificationsListener(*this));
-}
-
-
-// The expiration channel gets all notifications that are cancelled
-bool LLNotifications::expirationFilter(LLNotificationPtr pNotification)
-{
-	return pNotification->isCancelled() || pNotification->isRespondedTo();
-}
-
-bool LLNotifications::expirationHandler(const LLSD& payload)
-{
-	if (payload["sigtype"].asString() != "delete")
-	{
-		// anything added to this channel actually should be deleted from the master
-		cancel(find(payload["id"]));
-		return true;	// don't process this item any further
-	}
-	return false;
-}
-
-bool LLNotifications::uniqueFilter(LLNotificationPtr pNotif)
-{
-	if (!pNotif->hasUniquenessConstraints())
-	{
-		return true;
-	}
-
-	// checks against existing unique notifications
-	for (LLNotificationMap::iterator existing_it = mUniqueNotifications.find(pNotif->getName());
-		existing_it != mUniqueNotifications.end();
-		++existing_it)
-	{
-		LLNotificationPtr existing_notification = existing_it->second;
-		if (pNotif != existing_notification 
-			&& pNotif->isEquivalentTo(existing_notification))
-		{
-			return false;
-		}
-	}
-
-	return true;
-}
-
-bool LLNotifications::uniqueHandler(const LLSD& payload)
-{
-	LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
-	if (pNotif && pNotif->hasUniquenessConstraints()) 
-	{
-		if (payload["sigtype"].asString() == "add")
-		{
-			// not a duplicate according to uniqueness criteria, so we keep it
-			// and store it for future uniqueness checks
-			mUniqueNotifications.insert(std::make_pair(pNotif->getName(), pNotif));
-		}
-		else if (payload["sigtype"].asString() == "delete")
-		{
-			mUniqueNotifications.erase(pNotif->getName());
-		}
-	}
-
-	return false;
-}
-
-bool LLNotifications::failedUniquenessTest(const LLSD& payload)
-{
-	LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
-	
-	if (!pNotif || !pNotif->hasUniquenessConstraints())
-	{
-		return false;
-	}
-
-	// checks against existing unique notifications
-	for (LLNotificationMap::iterator existing_it = mUniqueNotifications.find(pNotif->getName());
-		existing_it != mUniqueNotifications.end();
-		++existing_it)
-	{
-		LLNotificationPtr existing_notification = existing_it->second;
-		if (pNotif != existing_notification 
-			&& pNotif->isEquivalentTo(existing_notification))
-		{
-			// copy notification instance data over to oldest instance
-			// of this unique notification and update it
-			existing_notification->updateFrom(pNotif);
-			// then delete the new one
-			pNotif->cancel();
-		}
-	}
-
-	return false;
-}
-
-
-void LLNotifications::addChannel(LLNotificationChannelPtr pChan)
-{
-	mChannels[pChan->getName()] = pChan;
-}
-
-LLNotificationChannelPtr LLNotifications::getChannel(const std::string& channelName)
-{
-	ChannelMap::iterator p = mChannels.find(channelName);
-	if(p == mChannels.end())
-	{
-		llerrs << "Did not find channel named " << channelName << llendl;
-	}
-	return p->second;
-}
-
-
-// this function is called once at construction time, after the object is constructed.
-void LLNotifications::initSingleton()
-{
-	loadTemplates();
-	createDefaultChannels();
-}
-
-void LLNotifications::createDefaultChannels()
-{
-	// now construct the various channels AFTER loading the notifications,
-	// because the history channel is going to rewrite the stored notifications file
-	LLNotificationChannel::buildChannel("Expiration", "",
-		boost::bind(&LLNotifications::expirationFilter, this, _1));
-	LLNotificationChannel::buildChannel("Unexpired", "",
-		!boost::bind(&LLNotifications::expirationFilter, this, _1)); // use negated bind
-	LLNotificationChannel::buildChannel("Unique", "Unexpired",
-		boost::bind(&LLNotifications::uniqueFilter, this, _1));
-	LLNotificationChannel::buildChannel("Ignore", "Unique",
-		filterIgnoredNotifications);
-	LLNotificationChannel::buildChannel("Visible", "Ignore",
-		&LLNotificationFilters::includeEverything);
-
-	// create special history channel
-	//std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" );
-	// use ^^^ when done debugging notifications serialization
-	std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_USER_SETTINGS, "open_notifications.xml" );
-	// this isn't a leak, don't worry about the empty "new"
-	new LLNotificationHistoryChannel(notifications_log_file);
-
-	// connect action methods to these channels
-	LLNotifications::instance().getChannel("Expiration")->
-        connectChanged(boost::bind(&LLNotifications::expirationHandler, this, _1));
-	// uniqueHandler slot should be added as first slot of the signal due to
-	// usage LLStopWhenHandled combiner in LLStandardSignal
-	LLNotifications::instance().getChannel("Unique")->
-        connectAtFrontChanged(boost::bind(&LLNotifications::uniqueHandler, this, _1));
-// failedUniquenessTest slot isn't necessary
-//	LLNotifications::instance().getChannel("Unique")->
-//        connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
-	LLNotifications::instance().getChannel("Ignore")->
-		connectFailedFilter(&handleIgnoredNotification);
-}
-
-bool LLNotifications::addTemplate(const std::string &name, 
-								  LLNotificationTemplatePtr theTemplate)
-{
-	if (mTemplates.count(name))
-	{
-		llwarns << "LLNotifications -- attempted to add template '" << name << "' twice." << llendl;
-		return false;
-	}
-	mTemplates[name] = theTemplate;
-	return true;
-}
-
-LLNotificationTemplatePtr LLNotifications::getTemplate(const std::string& name)
-{
-	if (mTemplates.count(name))
-	{
-		return mTemplates[name];
-	}
-	else
-	{
-		return mTemplates["MissingAlert"];
-	}
-}
-
-bool LLNotifications::templateExists(const std::string& name)
-{
-	return (mTemplates.count(name) != 0);
-}
-
-void LLNotifications::clearTemplates()
-{
-	mTemplates.clear();
-}
-
-void LLNotifications::forceResponse(const LLNotification::Params& params, S32 option)
-{
-	LLNotificationPtr temp_notify(new LLNotification(params));
-	LLSD response = temp_notify->getResponseTemplate();
-	LLSD selected_item = temp_notify->getForm()->getElement(option);
-	
-	if (selected_item.isUndefined())
-	{
-		llwarns << "Invalid option" << option << " for notification " << (std::string)params.name << llendl;
-		return;
-	}
-	response[selected_item["name"].asString()] = true;
-
-	temp_notify->respond(response);
-}
-
-LLNotifications::TemplateNames LLNotifications::getTemplateNames() const
-{
-	TemplateNames names;
-	for (TemplateMap::const_iterator it = mTemplates.begin(); it != mTemplates.end(); ++it)
-	{
-		names.push_back(it->first);
-	}
-	return names;
-}
-
-typedef std::map<std::string, std::string> StringMap;
-void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)
-{
-	//llwarns << "replaceSubstitutionStrings" << llendl;
-	// walk the list of attributes looking for replacements
-	for (LLXMLAttribList::iterator it=node->mAttributes.begin();
-		 it != node->mAttributes.end(); ++it)
-	{
-		std::string value = it->second->getValue();
-		if (value[0] == '$')
-		{
-			value.erase(0, 1);	// trim off the $
-			std::string replacement;
-			StringMap::const_iterator found = replacements.find(value);
-			if (found != replacements.end())
-			{
-				replacement = found->second;
-				//llwarns << "replaceSubstituionStrings: value: " << value << " repl: " << replacement << llendl;
-
-				it->second->setValue(replacement);
-			}
-			else
-			{
-				llwarns << "replaceSubstituionStrings FAILURE: value: " << value << " repl: " << replacement << llendl;
-			}
-		}
-	}
-	
-	// now walk the list of children and call this recursively.
-	for (LLXMLNodePtr child = node->getFirstChild(); 
-		 child.notNull(); child = child->getNextSibling())
-	{
-		replaceSubstitutionStrings(child, replacements);
-	}
-}
-
-// private to this file
-// returns true if the template request was invalid and there's nothing else we
-// can do with this node, false if you should keep processing (it may have
-// replaced the contents of the node referred to)
-LLXMLNodePtr LLNotifications::checkForXMLTemplate(LLXMLNodePtr item)
-{
-	if (item->hasName("usetemplate"))
-	{
-		std::string replacementName;
-		if (item->getAttributeString("name", replacementName))
-		{
-			StringMap replacements;
-			for (LLXMLAttribList::const_iterator it=item->mAttributes.begin(); 
-				 it != item->mAttributes.end(); ++it)
-			{
-				replacements[it->second->getName()->mString] = it->second->getValue();
-			}
-			if (mXmlTemplates.count(replacementName))
-			{
-				item=LLXMLNode::replaceNode(item, mXmlTemplates[replacementName]);
-				
-				// walk the nodes looking for $(substitution) here and replace
-				replaceSubstitutionStrings(item, replacements);
-			}
-			else
-			{
-				llwarns << "XML template lookup failure on '" << replacementName << "' " << llendl;
-			}
-		}
-	}
-	return item;
-}
-
-bool LLNotifications::loadTemplates()
-{
-	const std::string xml_filename = "notifications.xml";
-	LLXMLNodePtr root;
-	
-	BOOL success  = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root);
-	
-	if (!success || root.isNull() || !root->hasName( "notifications" ))
-	{
-		llerrs << "Problem reading UI Notifications file: " << xml_filename << llendl;
-		return false;
-	}
-	
-	clearTemplates();
-	
-	for (LLXMLNodePtr item = root->getFirstChild();
-		 item.notNull(); item = item->getNextSibling())
-	{
-		// we do this FIRST so that item can be changed if we 
-		// encounter a usetemplate -- we just replace the
-		// current xml node and keep processing
-		item = checkForXMLTemplate(item);
-		
-		if (item->hasName("global"))
-		{
-			std::string global_name;
-			if (item->getAttributeString("name", global_name))
-			{
-				mGlobalStrings[global_name] = item->getTextContents();
-			}
-			continue;
-		}
-		
-		if (item->hasName("template"))
-		{
-			// store an xml template; templates must have a single node (can contain
-			// other nodes)
-			std::string name;
-			item->getAttributeString("name", name);
-			LLXMLNodePtr ptr = item->getFirstChild();
-			mXmlTemplates[name] = ptr;
-			continue;
-		}
-		
-		if (!item->hasName("notification"))
-		{
-            llwarns << "Unexpected entity " << item->getName()->mString << 
-                       " found in " << xml_filename << llendl;
-			continue;
-		}
-		
-		// now we know we have a notification entry, so let's build it
-		LLNotificationTemplatePtr pTemplate(new LLNotificationTemplate());
-
-		if (!item->getAttributeString("name", pTemplate->mName))
-		{
-			llwarns << "Unable to parse notification with no name" << llendl;
-			continue;
-		}
-		
-		//llinfos << "Parsing " << pTemplate->mName << llendl;
-		
-		pTemplate->mMessage = item->getTextContents();
-		pTemplate->mDefaultFunctor = pTemplate->mName;
-		item->getAttributeString("type", pTemplate->mType);
-		item->getAttributeString("icon", pTemplate->mIcon);
-		item->getAttributeString("label", pTemplate->mLabel);
-		item->getAttributeU32("duration", pTemplate->mExpireSeconds);
-		item->getAttributeU32("expireOption", pTemplate->mExpireOption);
-
-		std::string priority;
-		item->getAttributeString("priority", priority);
-		pTemplate->mPriority = NOTIFICATION_PRIORITY_NORMAL;
-		if (!priority.empty())
-		{
-			if (priority == "low")      pTemplate->mPriority = NOTIFICATION_PRIORITY_LOW;
-			if (priority == "normal")   pTemplate->mPriority = NOTIFICATION_PRIORITY_NORMAL;
-			if (priority == "high")     pTemplate->mPriority = NOTIFICATION_PRIORITY_HIGH;
-			if (priority == "critical") pTemplate->mPriority = NOTIFICATION_PRIORITY_CRITICAL;
-		}
-		
-		item->getAttributeString("functor", pTemplate->mDefaultFunctor);
-
-		BOOL persist = false;
-		item->getAttributeBOOL("persist", persist);
-		pTemplate->mPersist = persist;
-		
-		std::string sound;
-		item->getAttributeString("sound", sound);
-		if (!sound.empty())
-		{
-			// test for bad sound effect name / missing effect
-			if (LLUI::sSettingGroups["config"]->controlExists(sound))
-			{
-				pTemplate->mSoundEffect = 
-					LLUUID(LLUI::sSettingGroups["config"]->getString(sound));
-			}
-			else
-			{
-				llwarns << "Unknown sound effect control name " << sound
-					<< llendl;
-			}
-		}
-
-		for (LLXMLNodePtr child = item->getFirstChild();
-			 !child.isNull(); child = child->getNextSibling())
-		{
-			child = checkForXMLTemplate(child);
-			
-			// <url>
-			if (child->hasName("url"))
-			{
-				pTemplate->mURL = child->getTextContents();
-				child->getAttributeU32("option", pTemplate->mURLOption);
-				child->getAttributeU32("openexternally", pTemplate->mURLOpenExternally);
-			}
-			
-            if (child->hasName("unique"))
-            {
-                pTemplate->mUnique = true;
-                for (LLXMLNodePtr formitem = child->getFirstChild();
-                     !formitem.isNull(); formitem = formitem->getNextSibling())
-                {
-                    if (formitem->hasName("context"))
-                    {
-                        std::string key;
-                        formitem->getAttributeString("key", key);
-                        pTemplate->mUniqueContext.push_back(key);
-                        //llwarns << "adding " << key << " to unique context" << llendl;
-                    }
-                    else
-                    {
-                        llwarns << "'unique' has unrecognized subelement " 
-                        << formitem->getName()->mString << llendl;
-                    }
-                }
-            }
-            
-			// <form>
-			if (child->hasName("form"))
-			{
-                pTemplate->mForm = LLNotificationFormPtr(new LLNotificationForm(pTemplate->mName, child));
-			}
-		}
-		addTemplate(pTemplate->mName, pTemplate);
-	}
-	
-	//std::ostringstream ostream;
-	//root->writeToOstream(ostream, "\n  ");
-	//llwarns << ostream.str() << llendl;
-	
-	return true;
-}
-
-// Add a simple notification (from XUI)
-void LLNotifications::addFromCallback(const LLSD& name)
-{
-	add(LLNotification::Params().name(name.asString()));	
-}
-
-// we provide a couple of simple add notification functions so that it's reasonable to create notifications in one line
-LLNotificationPtr LLNotifications::add(const std::string& name, 
-										const LLSD& substitutions, 
-										const LLSD& payload)
-{
-	LLNotification::Params::Functor functor_p;
-	functor_p.name = name;
-	return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
-}
-
-LLNotificationPtr LLNotifications::add(const std::string& name, 
-										const LLSD& substitutions, 
-										const LLSD& payload, 
-										const std::string& functor_name)
-{
-	LLNotification::Params::Functor functor_p;
-	functor_p.name = functor_name;
-	return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
-}
-
-LLNotificationPtr LLNotifications::add(const std::string& name, 
-										const LLSD& substitutions, 
-										const LLSD& payload, 
-										LLNotificationFunctorRegistry::ResponseFunctor functor)
-{
-	LLNotification::Params::Functor functor_p;
-	functor_p.function = functor;
-	return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
-}
-
-// generalized add function that takes a parameter block object for more complex instantiations
-LLNotificationPtr LLNotifications::add(const LLNotification::Params& p)
-{
-	LLNotificationPtr pNotif(new LLNotification(p));
-	add(pNotif);
-	return pNotif;
-}
-
-
-void LLNotifications::add(const LLNotificationPtr pNotif)
-{
-	// first see if we already have it -- if so, that's a problem
-	LLNotificationSet::iterator it=mItems.find(pNotif);
-	if (it != mItems.end())
-	{
-		llerrs << "Notification added a second time to the master notification channel." << llendl;
-	}
-
-	updateItem(LLSD().insert("sigtype", "add").insert("id", pNotif->id()), pNotif);
-}
-
-void LLNotifications::cancel(LLNotificationPtr pNotif)
-{
-	LLNotificationSet::iterator it=mItems.find(pNotif);
-	if (it == mItems.end())
-	{
-		llerrs << "Attempted to delete nonexistent notification " << pNotif->getName() << llendl;
-	}
-	pNotif->cancel();
-	updateItem(LLSD().insert("sigtype", "delete").insert("id", pNotif->id()), pNotif);
-}
-
-void LLNotifications::update(const LLNotificationPtr pNotif)
-{
-	LLNotificationSet::iterator it=mItems.find(pNotif);
-	if (it != mItems.end())
-	{
-		updateItem(LLSD().insert("sigtype", "change").insert("id", pNotif->id()), pNotif);
-	}
-}
-
-
-LLNotificationPtr LLNotifications::find(LLUUID uuid)
-{
-	LLNotificationPtr target = LLNotificationPtr(new LLNotification(uuid));
-	LLNotificationSet::iterator it=mItems.find(target);
-	if (it == mItems.end())
-	{
-		llwarns << "Tried to dereference uuid '" << uuid << "' as a notification key but didn't find it." << llendl;
-		return LLNotificationPtr((LLNotification*)NULL);
-	}
-	else
-	{
-		return *it;
-	}
-}
-
-void LLNotifications::forEachNotification(NotificationProcess process)
-{
-	std::for_each(mItems.begin(), mItems.end(), process);
-}
-
-std::string LLNotifications::getGlobalString(const std::string& key) const
-{
-	GlobalStringMap::const_iterator it = mGlobalStrings.find(key);
-	if (it != mGlobalStrings.end())
-	{
-		return it->second;
-	}
-	else
-	{
-		// if we don't have the key as a global, return the key itself so that the error
-		// is self-diagnosing.
-		return key;
-	}
-}
-
-void LLNotifications::setIgnoreAllNotifications(bool setting)
-{
-	mIgnoreAllNotifications = setting; 
-}
-bool LLNotifications::getIgnoreAllNotifications()
-{
-	return mIgnoreAllNotifications; 
-}
-													
-// ---
-// END OF LLNotifications implementation
-// =========================================================
-
-std::ostream& operator<<(std::ostream& s, const LLNotification& notification)
-{
-	s << notification.summarize();
-	return s;
-}
-
+/**
+* @file llnotifications.cpp
+* @brief Non-UI queue manager for keeping a prioritized list of notifications
+*
+* $LicenseInfo:firstyear=2008&license=viewergpl$
+* 
+* Copyright (c) 2008-2009, Linden Research, Inc.
+* 
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab.  Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+* 
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+* 
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+* 
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#include "linden_common.h"
+
+#include "llnotifications.h"
+
+#include "llxmlnode.h"
+#include "lluictrl.h"
+#include "lluictrlfactory.h"
+#include "lldir.h"
+#include "llsdserialize.h"
+#include "lltrans.h"
+#include "llnotificationslistener.h"
+
+#include <algorithm>
+#include <boost/regex.hpp>
+
+
+const std::string NOTIFICATION_PERSIST_VERSION = "0.93";
+
+// local channel for notification history
+class LLNotificationHistoryChannel : public LLNotificationChannel
+{
+	LOG_CLASS(LLNotificationHistoryChannel);
+public:
+	LLNotificationHistoryChannel(const std::string& filename) : 
+		LLNotificationChannel("History", "Visible", &historyFilter, LLNotificationComparators::orderByUUID()),
+		mFileName(filename)
+	{
+		connectChanged(boost::bind(&LLNotificationHistoryChannel::historyHandler, this, _1));
+		loadPersistentNotifications();
+	}
+
+private:
+	bool historyHandler(const LLSD& payload)
+	{
+		// we ignore "load" messages, but rewrite the persistence file on any other
+		std::string sigtype = payload["sigtype"];
+		if (sigtype != "load")
+		{
+			savePersistentNotifications();
+		}
+		return false;
+	}
+
+	// The history channel gets all notifications except those that have been cancelled
+	static bool historyFilter(LLNotificationPtr pNotification)
+	{
+		return !pNotification->isCancelled();
+	}
+
+	void savePersistentNotifications()
+	{
+		llinfos << "Saving open notifications to " << mFileName << llendl;
+
+		llofstream notify_file(mFileName.c_str());
+		if (!notify_file.is_open()) 
+		{
+			llwarns << "Failed to open " << mFileName << llendl;
+			return;
+		}
+
+		LLSD output;
+		output["version"] = NOTIFICATION_PERSIST_VERSION;
+		LLSD& data = output["data"];
+
+		for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
+		{
+			if (!LLNotifications::instance().templateExists((*it)->getName())) continue;
+
+			// only store notifications flagged as persisting
+			LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate((*it)->getName());
+			if (!templatep->mPersist) continue;
+
+			data.append((*it)->asLLSD());
+		}
+
+		LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
+		formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY);
+	}
+
+	void loadPersistentNotifications()
+	{
+		llinfos << "Loading open notifications from " << mFileName << llendl;
+
+		llifstream notify_file(mFileName.c_str());
+		if (!notify_file.is_open()) 
+		{
+			llwarns << "Failed to open " << mFileName << llendl;
+			return;
+		}
+
+		LLSD input;
+		LLPointer<LLSDParser> parser = new LLSDXMLParser();
+		if (parser->parse(notify_file, input, LLSDSerialize::SIZE_UNLIMITED) < 0)
+		{
+			llwarns << "Failed to parse open notifications" << llendl;
+			return;
+		}
+
+		if (input.isUndefined()) return;
+		std::string version = input["version"];
+		if (version != NOTIFICATION_PERSIST_VERSION)
+		{
+			llwarns << "Bad open notifications version: " << version << llendl;
+			return;
+		}
+		LLSD& data = input["data"];
+		if (data.isUndefined()) return;
+
+		LLNotifications& instance = LLNotifications::instance();
+		for (LLSD::array_const_iterator notification_it = data.beginArray();
+			notification_it != data.endArray();
+			++notification_it)
+		{
+			instance.add(LLNotificationPtr(new LLNotification(*notification_it)));
+		}
+	}
+
+	//virtual
+	void onDelete(LLNotificationPtr pNotification)
+	{
+		// we want to keep deleted notifications in our log
+		mItems.insert(pNotification);
+		
+		return;
+	}
+	
+private:
+	std::string mFileName;
+};
+
+bool filterIgnoredNotifications(LLNotificationPtr notification)
+{
+	// filter everything if we are to ignore ALL
+	if(LLNotifications::instance().getIgnoreAllNotifications())
+	{
+		return false;
+	}
+
+	LLNotificationFormPtr form = notification->getForm();
+	// Check to see if the user wants to ignore this alert
+	if (form->getIgnoreType() != LLNotificationForm::IGNORE_NO)
+	{
+		return LLUI::sSettingGroups["ignores"]->getBOOL(notification->getName());
+	}
+
+	return true;
+}
+
+bool handleIgnoredNotification(const LLSD& payload)
+{
+	if (payload["sigtype"].asString() == "add")
+	{
+		LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
+		if (!pNotif) return false;
+
+		LLNotificationFormPtr form = pNotif->getForm();
+		LLSD response;
+		switch(form->getIgnoreType())
+		{
+		case LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE:
+			response = pNotif->getResponseTemplate(LLNotification::WITH_DEFAULT_BUTTON);
+			break;
+		case LLNotificationForm::IGNORE_WITH_LAST_RESPONSE:
+			response = LLUI::sSettingGroups["ignores"]->getLLSD("Default" + pNotif->getName());
+			break;
+		case LLNotificationForm::IGNORE_SHOW_AGAIN:
+			break;
+		default:
+			return false;
+		}
+		pNotif->setIgnored(true);
+		pNotif->respond(response);
+		return true; 	// don't process this item any further
+	}
+	return false;
+}
+
+namespace LLNotificationFilters
+{
+	// a sample filter
+	bool includeEverything(LLNotificationPtr p)
+	{
+		return true;
+	}
+};
+
+LLNotificationForm::LLNotificationForm()
+:	mFormData(LLSD::emptyArray()),
+	mIgnore(IGNORE_NO)
+{
+}
+
+
+LLNotificationForm::LLNotificationForm(const std::string& name, const LLXMLNodePtr xml_node) 
+:	mFormData(LLSD::emptyArray()),
+	mIgnore(IGNORE_NO)
+{
+	if (!xml_node->hasName("form"))
+	{
+		llwarns << "Bad xml node for form: " << xml_node->getName() << llendl;
+	}
+	LLXMLNodePtr child = xml_node->getFirstChild();
+	while(child)
+	{
+		child = LLNotifications::instance().checkForXMLTemplate(child);
+
+		LLSD item_entry;
+		std::string element_name = child->getName()->mString;
+
+		if (element_name == "ignore" )
+		{
+			bool save_option = false;
+			child->getAttribute_bool("save_option", save_option);
+			if (!save_option)
+			{
+				mIgnore = IGNORE_WITH_DEFAULT_RESPONSE;
+			}
+			else
+			{
+				// remember last option chosen by user and automatically respond with that in the future
+				mIgnore = IGNORE_WITH_LAST_RESPONSE;
+				LLUI::sSettingGroups["ignores"]->declareLLSD(std::string("Default") + name, "", std::string("Default response for notification " + name));
+			}
+			child->getAttributeString("text", mIgnoreMsg);
+			BOOL show_notification = TRUE;
+			LLUI::sSettingGroups["ignores"]->declareBOOL(name, show_notification, "Ignore notification with this name", TRUE);
+		}
+		else
+		{
+			// flatten xml form entry into single LLSD map with type==name
+			item_entry["type"] = element_name;
+			const LLXMLAttribList::iterator attrib_end = child->mAttributes.end();
+			for(LLXMLAttribList::iterator attrib_it = child->mAttributes.begin();
+				attrib_it != attrib_end;
+				++attrib_it)
+			{
+				item_entry[std::string(attrib_it->second->getName()->mString)] = attrib_it->second->getValue();
+			}
+			item_entry["value"] = child->getTextContents();
+			mFormData.append(item_entry);
+		}
+
+		child = child->getNextSibling();
+	}
+}
+
+LLNotificationForm::LLNotificationForm(const LLSD& sd)
+{
+	if (sd.isArray())
+	{
+		mFormData = sd;
+	}
+	else
+	{
+		llwarns << "Invalid form data " << sd << llendl;
+		mFormData = LLSD::emptyArray();
+	}
+}
+
+LLSD LLNotificationForm::asLLSD() const
+{ 
+	return mFormData; 
+}
+
+LLSD LLNotificationForm::getElement(const std::string& element_name)
+{
+	for (LLSD::array_const_iterator it = mFormData.beginArray();
+		it != mFormData.endArray();
+		++it)
+	{
+		if ((*it)["name"].asString() == element_name) return (*it);
+	}
+	return LLSD();
+}
+
+
+bool LLNotificationForm::hasElement(const std::string& element_name)
+{
+	for (LLSD::array_const_iterator it = mFormData.beginArray();
+		it != mFormData.endArray();
+		++it)
+	{
+		if ((*it)["name"].asString() == element_name) return true;
+	}
+	return false;
+}
+
+void LLNotificationForm::addElement(const std::string& type, const std::string& name, const LLSD& value)
+{
+	LLSD element;
+	element["type"] = type;
+	element["name"] = name;
+	element["text"] = name;
+	element["value"] = value;
+	element["index"] = mFormData.size();
+	mFormData.append(element);
+}
+
+void LLNotificationForm::append(const LLSD& sub_form)
+{
+	if (sub_form.isArray())
+	{
+		for (LLSD::array_const_iterator it = sub_form.beginArray();
+			it != sub_form.endArray();
+			++it)
+		{
+			mFormData.append(*it);
+		}
+	}
+}
+
+void LLNotificationForm::formatElements(const LLSD& substitutions)
+{
+	for (LLSD::array_iterator it = mFormData.beginArray();
+		it != mFormData.endArray();
+		++it)
+	{
+		// format "text" component of each form element
+		if ((*it).has("text"))
+		{
+			std::string text = (*it)["text"].asString();
+			LLStringUtil::format(text, substitutions);
+			(*it)["text"] = text;
+		}
+		if ((*it)["type"].asString() == "text" && (*it).has("value"))
+		{
+			std::string value = (*it)["value"].asString();
+			LLStringUtil::format(value, substitutions);
+			(*it)["value"] = value;
+		}
+	}
+}
+
+std::string LLNotificationForm::getDefaultOption()
+{
+	for (LLSD::array_const_iterator it = mFormData.beginArray();
+		it != mFormData.endArray();
+		++it)
+	{
+		if ((*it)["default"]) return (*it)["name"].asString();
+	}
+	return "";
+}
+
+LLNotificationTemplate::LLNotificationTemplate() :
+	mExpireSeconds(0),
+	mExpireOption(-1),
+	mURLOption(-1),
+    mURLOpenExternally(-1),
+	mUnique(false),
+	mPriority(NOTIFICATION_PRIORITY_NORMAL)
+{
+	mForm = LLNotificationFormPtr(new LLNotificationForm()); 
+}
+
+LLNotification::LLNotification(const LLNotification::Params& p) : 
+	mTimestamp(p.time_stamp), 
+	mSubstitutions(p.substitutions),
+	mPayload(p.payload),
+	mExpiresAt(0),
+	mTemporaryResponder(false),
+	mRespondedTo(false),
+	mPriority(p.priority),
+	mCancelled(false),
+	mIgnored(false)
+{
+	if (p.functor.name.isChosen())
+	{
+		mResponseFunctorName = p.functor.name;
+	}
+	else if (p.functor.function.isChosen())
+	{
+		mResponseFunctorName = LLUUID::generateNewID().asString();
+		LLNotificationFunctorRegistry::instance().registerFunctor(mResponseFunctorName, p.functor.function());
+
+		mTemporaryResponder = true;
+	}
+
+	mId.generate();
+	init(p.name, p.form_elements);
+}
+
+
+LLNotification::LLNotification(const LLSD& sd) :
+	mTemporaryResponder(false),
+	mRespondedTo(false),
+	mCancelled(false),
+	mIgnored(false)
+{ 
+	mId.generate();
+	mSubstitutions = sd["substitutions"];
+	mPayload = sd["payload"]; 
+	mTimestamp = sd["time"]; 
+	mExpiresAt = sd["expiry"];
+	mPriority = (ENotificationPriority)sd["priority"].asInteger();
+	mResponseFunctorName = sd["responseFunctor"].asString();
+	std::string templatename = sd["name"].asString();
+	init(templatename, LLSD());
+	// replace form with serialized version
+	mForm = LLNotificationFormPtr(new LLNotificationForm(sd["form"]));
+}
+
+
+LLSD LLNotification::asLLSD()
+{
+	LLSD output;
+	output["name"] = mTemplatep->mName;
+	output["form"] = getForm()->asLLSD();
+	output["substitutions"] = mSubstitutions;
+	output["payload"] = mPayload;
+	output["time"] = mTimestamp;
+	output["expiry"] = mExpiresAt;
+	output["priority"] = (S32)mPriority;
+	output["responseFunctor"] = mResponseFunctorName;
+	return output;
+}
+
+void LLNotification::update()
+{
+	LLNotifications::instance().update(shared_from_this());
+}
+
+void LLNotification::updateFrom(LLNotificationPtr other)
+{
+	// can only update from the same notification type
+	if (mTemplatep != other->mTemplatep) return;
+
+	// NOTE: do NOT change the ID, since it is the key to
+	// this given instance, just update all the metadata
+	//mId = other->mId;
+
+	mPayload = other->mPayload;
+	mSubstitutions = other->mSubstitutions;
+	mTimestamp = other->mTimestamp;
+	mExpiresAt = other->mExpiresAt;
+	mCancelled = other->mCancelled;
+	mIgnored = other->mIgnored;
+	mPriority = other->mPriority;
+	mForm = other->mForm;
+	mResponseFunctorName = other->mResponseFunctorName;
+	mRespondedTo = other->mRespondedTo;
+	mTemporaryResponder = other->mTemporaryResponder;
+
+	update();
+}
+
+const LLNotificationFormPtr LLNotification::getForm()
+{
+	return mForm;
+}
+
+void LLNotification::cancel()
+{
+	mCancelled = true;
+}
+
+LLSD LLNotification::getResponseTemplate(EResponseTemplateType type)
+{
+	LLSD response = LLSD::emptyMap();
+	for (S32 element_idx = 0;
+		element_idx < mForm->getNumElements();
+		++element_idx)
+	{
+		LLSD element = mForm->getElement(element_idx);
+		if (element.has("name"))
+		{
+			response[element["name"].asString()] = element["value"];
+		}
+
+		if ((type == WITH_DEFAULT_BUTTON) 
+			&& element["default"].asBoolean())
+		{
+			response[element["name"].asString()] = true;
+		}
+	}
+	return response;
+}
+
+//static
+S32 LLNotification::getSelectedOption(const LLSD& notification, const LLSD& response)
+{
+	LLNotificationForm form(notification["form"]);
+
+	for (S32 element_idx = 0;
+		element_idx < form.getNumElements();
+		++element_idx)
+	{
+		LLSD element = form.getElement(element_idx);
+
+		// only look at buttons
+		if (element["type"].asString() == "button" 
+			&& response[element["name"].asString()].asBoolean())
+		{
+			return element["index"].asInteger();
+		}
+	}
+
+	return -1;
+}
+
+//static
+std::string LLNotification::getSelectedOptionName(const LLSD& response)
+{
+	for (LLSD::map_const_iterator response_it = response.beginMap();
+		response_it != response.endMap();
+		++response_it)
+	{
+		if (response_it->second.isBoolean() && response_it->second.asBoolean())
+		{
+			return response_it->first;
+		}
+	}
+	return "";
+}
+
+
+void LLNotification::respond(const LLSD& response)
+{
+	mRespondedTo = true;
+	// look up the functor
+	LLNotificationFunctorRegistry::ResponseFunctor functor = 
+		LLNotificationFunctorRegistry::instance().getFunctor(mResponseFunctorName);
+	// and then call it
+	functor(asLLSD(), response);
+	
+	if (mTemporaryResponder)
+	{
+		LLNotificationFunctorRegistry::instance().unregisterFunctor(mResponseFunctorName);
+		mResponseFunctorName = "";
+		mTemporaryResponder = false;
+	}
+
+	if (mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO)
+	{
+		BOOL show_notification = mIgnored ? FALSE : TRUE;
+		LLUI::sSettingGroups["ignores"]->setBOOL(getName(), show_notification);
+		if (mIgnored && mForm->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)
+		{
+			LLUI::sSettingGroups["ignores"]->setLLSD("Default" + getName(), response);
+		}
+	}
+
+	update();
+}
+
+void LLNotification::setIgnored(bool ignore)
+{
+	mIgnored = ignore;
+}
+
+void LLNotification::setResponseFunctor(std::string const &responseFunctorName)
+{
+	if (mTemporaryResponder)
+		// get rid of the old one
+		LLNotificationFunctorRegistry::instance().unregisterFunctor(mResponseFunctorName);
+	mResponseFunctorName = responseFunctorName;
+	mTemporaryResponder = false;
+}
+
+bool LLNotification::payloadContainsAll(const std::vector<std::string>& required_fields) const
+{
+	for(std::vector<std::string>::const_iterator required_fields_it = required_fields.begin(); 
+		required_fields_it != required_fields.end();
+		required_fields_it++)
+	{
+		std::string required_field_name = *required_fields_it;
+		if( ! getPayload().has(required_field_name))
+		{
+			return false; // a required field was not found
+		}
+	}
+	return true; // all required fields were found
+}
+
+bool LLNotification::isEquivalentTo(LLNotificationPtr that) const
+{
+	if (this->mTemplatep->mName != that->mTemplatep->mName) 
+	{
+		return false; // must have the same template name or forget it
+	}
+	if (this->mTemplatep->mUnique)
+	{
+		// highlander bit sez there can only be one of these
+		return
+			this->payloadContainsAll(that->mTemplatep->mUniqueContext) &&
+			that->payloadContainsAll(this->mTemplatep->mUniqueContext);
+	}
+	return false; 
+}
+
+void LLNotification::init(const std::string& template_name, const LLSD& form_elements)
+{
+	mTemplatep = LLNotifications::instance().getTemplate(template_name);
+	if (!mTemplatep) return;
+
+	// add default substitutions
+	const LLStringUtil::format_map_t& default_args = LLTrans::getDefaultArgs();
+	for (LLStringUtil::format_map_t::const_iterator iter = default_args.begin();
+		 iter != default_args.end(); ++iter)
+	{
+		mSubstitutions[iter->first] = iter->second;
+	}
+	mSubstitutions["_URL"] = getURL();
+	mSubstitutions["_NAME"] = template_name;
+	// TODO: something like this so that a missing alert is sensible:
+	//mSubstitutions["_ARGS"] = get_all_arguments_as_text(mSubstitutions);
+
+	mForm = LLNotificationFormPtr(new LLNotificationForm(*mTemplatep->mForm));
+	mForm->append(form_elements);
+
+	// apply substitution to form labels
+	mForm->formatElements(mSubstitutions);
+
+	LLDate rightnow = LLDate::now();
+	if (mTemplatep->mExpireSeconds)
+	{
+		mExpiresAt = LLDate(rightnow.secondsSinceEpoch() + mTemplatep->mExpireSeconds);
+	}
+
+	if (mPriority == NOTIFICATION_PRIORITY_UNSPECIFIED)
+	{
+		mPriority = mTemplatep->mPriority;
+	}
+}
+
+std::string LLNotification::summarize() const
+{
+	std::string s = "Notification(";
+	s += getName();
+	s += ") : ";
+	s += mTemplatep ? mTemplatep->mMessage : "";
+	// should also include timestamp and expiration time (but probably not payload)
+	return s;
+}
+
+std::string LLNotification::getMessage() const
+{
+	// all our callers cache this result, so it gives us more flexibility
+	// to do the substitution at call time rather than attempting to 
+	// cache it in the notification
+	if (!mTemplatep)
+		return std::string();
+
+	std::string message = mTemplatep->mMessage;
+	LLStringUtil::format(message, mSubstitutions);
+	return message;
+}
+
+std::string LLNotification::getLabel() const
+{
+	std::string label = mTemplatep->mLabel;
+	LLStringUtil::format(label, mSubstitutions);
+	return (mTemplatep ? label : "");
+}
+
+std::string LLNotification::getURL() const
+{
+	if (!mTemplatep)
+		return std::string();
+	std::string url = mTemplatep->mURL;
+	LLStringUtil::format(url, mSubstitutions);
+	return (mTemplatep ? url : "");
+}
+
+// =========================================================
+// LLNotificationChannel implementation
+// ---
+LLBoundListener LLNotificationChannelBase::connectChangedImpl(const LLEventListener& slot)
+{
+	// when someone wants to connect to a channel, we first throw them
+	// all of the notifications that are already in the channel
+	// we use a special signal called "load" in case the channel wants to care
+	// only about new notifications
+	for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
+	{
+		slot(LLSD().insert("sigtype", "load").insert("id", (*it)->id()));
+	}
+	// and then connect the signal so that all future notifications will also be
+	// forwarded.
+	return mChanged.connect(slot);
+}
+
+LLBoundListener LLNotificationChannelBase::connectAtFrontChangedImpl(const LLEventListener& slot)
+{
+	for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
+	{
+		slot(LLSD().insert("sigtype", "load").insert("id", (*it)->id()));
+	}
+	return mChanged.connect(slot, boost::signals2::at_front);
+}
+
+LLBoundListener LLNotificationChannelBase::connectPassedFilterImpl(const LLEventListener& slot)
+{
+	// these two filters only fire for notifications added after the current one, because
+	// they don't participate in the hierarchy.
+	return mPassedFilter.connect(slot);
+}
+
+LLBoundListener LLNotificationChannelBase::connectFailedFilterImpl(const LLEventListener& slot)
+{
+	return mFailedFilter.connect(slot);
+}
+
+// external call, conforms to our standard signature
+bool LLNotificationChannelBase::updateItem(const LLSD& payload)
+{	
+	// first check to see if it's in the master list
+	LLNotificationPtr pNotification	 = LLNotifications::instance().find(payload["id"]);
+	if (!pNotification)
+		return false;	// not found
+	
+	return updateItem(payload, pNotification);
+}
+
+
+//FIX QUIT NOT WORKING
+
+
+// internal call, for use in avoiding lookup
+bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPtr pNotification)
+{	
+	std::string cmd = payload["sigtype"];
+	LLNotificationSet::iterator foundItem = mItems.find(pNotification);
+	bool wasFound = (foundItem != mItems.end());
+	bool passesFilter = mFilter(pNotification);
+	
+	// first, we offer the result of the filter test to the simple
+	// signals for pass/fail. One of these is guaranteed to be called.
+	// If either signal returns true, the change processing is NOT performed
+	// (so don't return true unless you know what you're doing!)
+	bool abortProcessing = false;
+	if (passesFilter)
+	{
+		abortProcessing = mPassedFilter(payload);
+	}
+	else
+	{
+		abortProcessing = mFailedFilter(payload);
+	}
+	
+	if (abortProcessing)
+	{
+		return true;
+	}
+	
+	if (cmd == "load")
+	{
+		// should be no reason we'd ever get a load if we already have it
+		// if passes filter send a load message, else do nothing
+		assert(!wasFound);
+		if (passesFilter)
+		{
+			// not in our list, add it and say so
+			mItems.insert(pNotification);
+			abortProcessing = mChanged(payload);
+			onLoad(pNotification);
+		}
+	}
+	else if (cmd == "change")
+	{
+		// if it passes filter now and was found, we just send a change message
+		// if it passes filter now and wasn't found, we have to add it
+		// if it doesn't pass filter and wasn't found, we do nothing
+		// if it doesn't pass filter and was found, we need to delete it
+		if (passesFilter)
+		{
+			if (wasFound)
+			{
+				// it already existed, so this is a change
+				// since it changed in place, all we have to do is resend the signal
+				abortProcessing = mChanged(payload);
+				onChange(pNotification);
+			}
+			else
+			{
+				// not in our list, add it and say so
+				mItems.insert(pNotification);
+				// our payload is const, so make a copy before changing it
+				LLSD newpayload = payload;
+				newpayload["sigtype"] = "add";
+				abortProcessing = mChanged(newpayload);
+				onChange(pNotification);
+			}
+		}
+		else
+		{
+			if (wasFound)
+			{
+				// it already existed, so this is a delete
+				mItems.erase(pNotification);
+				// our payload is const, so make a copy before changing it
+				LLSD newpayload = payload;
+				newpayload["sigtype"] = "delete";
+				abortProcessing = mChanged(newpayload);
+				onChange(pNotification);
+			}
+			// didn't pass, not on our list, do nothing
+		}
+	}
+	else if (cmd == "add")
+	{
+		// should be no reason we'd ever get an add if we already have it
+		// if passes filter send an add message, else do nothing
+		assert(!wasFound);
+		if (passesFilter)
+		{
+			// not in our list, add it and say so
+			mItems.insert(pNotification);
+			abortProcessing = mChanged(payload);
+			onAdd(pNotification);
+		}
+	}
+	else if (cmd == "delete")
+	{
+		// if we have it in our list, pass on the delete, then delete it, else do nothing
+		if (wasFound)
+		{
+			abortProcessing = mChanged(payload);
+			mItems.erase(pNotification);
+			onDelete(pNotification);
+		}
+	}
+	return abortProcessing;
+}
+
+/* static */
+LLNotificationChannelPtr LLNotificationChannel::buildChannel(const std::string& name, 
+															 const std::string& parent,
+															 LLNotificationFilter filter, 
+															 LLNotificationComparator comparator)
+{
+	// note: this is not a leak; notifications are self-registering.
+	// This factory helps to prevent excess deletions by making sure all smart
+	// pointers to notification channels come from the same source
+	new LLNotificationChannel(name, parent, filter, comparator);
+	return LLNotifications::instance().getChannel(name);
+}
+
+
+LLNotificationChannel::LLNotificationChannel(const std::string& name, 
+											 const std::string& parent,
+											 LLNotificationFilter filter, 
+											 LLNotificationComparator comparator) : 
+LLNotificationChannelBase(filter, comparator),
+mName(name),
+mParent(parent)
+{
+	// store myself in the channel map
+	LLNotifications::instance().addChannel(LLNotificationChannelPtr(this));
+	// bind to notification broadcast
+	if (parent.empty())
+	{
+		LLNotifications::instance().connectChanged(
+			boost::bind(&LLNotificationChannelBase::updateItem, this, _1));
+	}
+	else
+	{
+		LLNotificationChannelPtr p = LLNotifications::instance().getChannel(parent);
+		p->connectChanged(boost::bind(&LLNotificationChannelBase::updateItem, this, _1));
+	}
+}
+
+
+void LLNotificationChannel::setComparator(LLNotificationComparator comparator) 
+{ 
+	mComparator = comparator; 
+	LLNotificationSet s2(mComparator);
+	s2.insert(mItems.begin(), mItems.end());
+	mItems.swap(s2);
+	
+	// notify clients that we've been resorted
+	mChanged(LLSD().insert("sigtype", "sort")); 
+}
+
+bool LLNotificationChannel::isEmpty() const
+{
+	return mItems.empty();
+}
+
+LLNotificationChannel::Iterator LLNotificationChannel::begin()
+{
+	return mItems.begin();
+}
+
+LLNotificationChannel::Iterator LLNotificationChannel::end()
+{
+	return mItems.end();
+}
+
+std::string LLNotificationChannel::summarize()
+{
+	std::string s("Channel '");
+	s += mName;
+	s += "'\n  ";
+	for (LLNotificationChannel::Iterator it = begin(); it != end(); ++it)
+	{
+		s += (*it)->summarize();
+		s += "\n  ";
+	}
+	return s;
+}
+
+
+// ---
+// END OF LLNotificationChannel implementation
+// =========================================================
+
+
+// =========================================================
+// LLNotifications implementation
+// ---
+LLNotifications::LLNotifications() : LLNotificationChannelBase(LLNotificationFilters::includeEverything,
+															   LLNotificationComparators::orderByUUID()),
+									mIgnoreAllNotifications(false)
+{
+	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Notification.Show", boost::bind(&LLNotifications::addFromCallback, this, _2));
+
+    mListener.reset(new LLNotificationsListener(*this));
+}
+
+
+// The expiration channel gets all notifications that are cancelled
+bool LLNotifications::expirationFilter(LLNotificationPtr pNotification)
+{
+	return pNotification->isCancelled() || pNotification->isRespondedTo();
+}
+
+bool LLNotifications::expirationHandler(const LLSD& payload)
+{
+	if (payload["sigtype"].asString() != "delete")
+	{
+		// anything added to this channel actually should be deleted from the master
+		cancel(find(payload["id"]));
+		return true;	// don't process this item any further
+	}
+	return false;
+}
+
+bool LLNotifications::uniqueFilter(LLNotificationPtr pNotif)
+{
+	if (!pNotif->hasUniquenessConstraints())
+	{
+		return true;
+	}
+
+	// checks against existing unique notifications
+	for (LLNotificationMap::iterator existing_it = mUniqueNotifications.find(pNotif->getName());
+		existing_it != mUniqueNotifications.end();
+		++existing_it)
+	{
+		LLNotificationPtr existing_notification = existing_it->second;
+		if (pNotif != existing_notification 
+			&& pNotif->isEquivalentTo(existing_notification))
+		{
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool LLNotifications::uniqueHandler(const LLSD& payload)
+{
+	LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
+	if (pNotif && pNotif->hasUniquenessConstraints()) 
+	{
+		if (payload["sigtype"].asString() == "add")
+		{
+			// not a duplicate according to uniqueness criteria, so we keep it
+			// and store it for future uniqueness checks
+			mUniqueNotifications.insert(std::make_pair(pNotif->getName(), pNotif));
+		}
+		else if (payload["sigtype"].asString() == "delete")
+		{
+			mUniqueNotifications.erase(pNotif->getName());
+		}
+	}
+
+	return false;
+}
+
+bool LLNotifications::failedUniquenessTest(const LLSD& payload)
+{
+	LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
+	
+	if (!pNotif || !pNotif->hasUniquenessConstraints())
+	{
+		return false;
+	}
+
+	// checks against existing unique notifications
+	for (LLNotificationMap::iterator existing_it = mUniqueNotifications.find(pNotif->getName());
+		existing_it != mUniqueNotifications.end();
+		++existing_it)
+	{
+		LLNotificationPtr existing_notification = existing_it->second;
+		if (pNotif != existing_notification 
+			&& pNotif->isEquivalentTo(existing_notification))
+		{
+			// copy notification instance data over to oldest instance
+			// of this unique notification and update it
+			existing_notification->updateFrom(pNotif);
+			// then delete the new one
+			pNotif->cancel();
+		}
+	}
+
+	return false;
+}
+
+
+void LLNotifications::addChannel(LLNotificationChannelPtr pChan)
+{
+	mChannels[pChan->getName()] = pChan;
+}
+
+LLNotificationChannelPtr LLNotifications::getChannel(const std::string& channelName)
+{
+	ChannelMap::iterator p = mChannels.find(channelName);
+	if(p == mChannels.end())
+	{
+		llerrs << "Did not find channel named " << channelName << llendl;
+	}
+	return p->second;
+}
+
+
+// this function is called once at construction time, after the object is constructed.
+void LLNotifications::initSingleton()
+{
+	loadTemplates();
+	createDefaultChannels();
+}
+
+void LLNotifications::createDefaultChannels()
+{
+	// now construct the various channels AFTER loading the notifications,
+	// because the history channel is going to rewrite the stored notifications file
+	LLNotificationChannel::buildChannel("Expiration", "",
+		boost::bind(&LLNotifications::expirationFilter, this, _1));
+	LLNotificationChannel::buildChannel("Unexpired", "",
+		!boost::bind(&LLNotifications::expirationFilter, this, _1)); // use negated bind
+	LLNotificationChannel::buildChannel("Unique", "Unexpired",
+		boost::bind(&LLNotifications::uniqueFilter, this, _1));
+	LLNotificationChannel::buildChannel("Ignore", "Unique",
+		filterIgnoredNotifications);
+	LLNotificationChannel::buildChannel("Visible", "Ignore",
+		&LLNotificationFilters::includeEverything);
+
+	// create special history channel
+	//std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" );
+	// use ^^^ when done debugging notifications serialization
+	std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_USER_SETTINGS, "open_notifications.xml" );
+	// this isn't a leak, don't worry about the empty "new"
+	new LLNotificationHistoryChannel(notifications_log_file);
+
+	// connect action methods to these channels
+	LLNotifications::instance().getChannel("Expiration")->
+        connectChanged(boost::bind(&LLNotifications::expirationHandler, this, _1));
+	// uniqueHandler slot should be added as first slot of the signal due to
+	// usage LLStopWhenHandled combiner in LLStandardSignal
+	LLNotifications::instance().getChannel("Unique")->
+        connectAtFrontChanged(boost::bind(&LLNotifications::uniqueHandler, this, _1));
+// failedUniquenessTest slot isn't necessary
+//	LLNotifications::instance().getChannel("Unique")->
+//        connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
+	LLNotifications::instance().getChannel("Ignore")->
+		connectFailedFilter(&handleIgnoredNotification);
+}
+
+bool LLNotifications::addTemplate(const std::string &name, 
+								  LLNotificationTemplatePtr theTemplate)
+{
+	if (mTemplates.count(name))
+	{
+		llwarns << "LLNotifications -- attempted to add template '" << name << "' twice." << llendl;
+		return false;
+	}
+	mTemplates[name] = theTemplate;
+	return true;
+}
+
+LLNotificationTemplatePtr LLNotifications::getTemplate(const std::string& name)
+{
+	if (mTemplates.count(name))
+	{
+		return mTemplates[name];
+	}
+	else
+	{
+		return mTemplates["MissingAlert"];
+	}
+}
+
+bool LLNotifications::templateExists(const std::string& name)
+{
+	return (mTemplates.count(name) != 0);
+}
+
+void LLNotifications::clearTemplates()
+{
+	mTemplates.clear();
+}
+
+void LLNotifications::forceResponse(const LLNotification::Params& params, S32 option)
+{
+	LLNotificationPtr temp_notify(new LLNotification(params));
+	LLSD response = temp_notify->getResponseTemplate();
+	LLSD selected_item = temp_notify->getForm()->getElement(option);
+	
+	if (selected_item.isUndefined())
+	{
+		llwarns << "Invalid option" << option << " for notification " << (std::string)params.name << llendl;
+		return;
+	}
+	response[selected_item["name"].asString()] = true;
+
+	temp_notify->respond(response);
+}
+
+LLNotifications::TemplateNames LLNotifications::getTemplateNames() const
+{
+	TemplateNames names;
+	for (TemplateMap::const_iterator it = mTemplates.begin(); it != mTemplates.end(); ++it)
+	{
+		names.push_back(it->first);
+	}
+	return names;
+}
+
+typedef std::map<std::string, std::string> StringMap;
+void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)
+{
+	//llwarns << "replaceSubstitutionStrings" << llendl;
+	// walk the list of attributes looking for replacements
+	for (LLXMLAttribList::iterator it=node->mAttributes.begin();
+		 it != node->mAttributes.end(); ++it)
+	{
+		std::string value = it->second->getValue();
+		if (value[0] == '$')
+		{
+			value.erase(0, 1);	// trim off the $
+			std::string replacement;
+			StringMap::const_iterator found = replacements.find(value);
+			if (found != replacements.end())
+			{
+				replacement = found->second;
+				//llwarns << "replaceSubstituionStrings: value: " << value << " repl: " << replacement << llendl;
+
+				it->second->setValue(replacement);
+			}
+			else
+			{
+				llwarns << "replaceSubstituionStrings FAILURE: value: " << value << " repl: " << replacement << llendl;
+			}
+		}
+	}
+	
+	// now walk the list of children and call this recursively.
+	for (LLXMLNodePtr child = node->getFirstChild(); 
+		 child.notNull(); child = child->getNextSibling())
+	{
+		replaceSubstitutionStrings(child, replacements);
+	}
+}
+
+// private to this file
+// returns true if the template request was invalid and there's nothing else we
+// can do with this node, false if you should keep processing (it may have
+// replaced the contents of the node referred to)
+LLXMLNodePtr LLNotifications::checkForXMLTemplate(LLXMLNodePtr item)
+{
+	if (item->hasName("usetemplate"))
+	{
+		std::string replacementName;
+		if (item->getAttributeString("name", replacementName))
+		{
+			StringMap replacements;
+			for (LLXMLAttribList::const_iterator it=item->mAttributes.begin(); 
+				 it != item->mAttributes.end(); ++it)
+			{
+				replacements[it->second->getName()->mString] = it->second->getValue();
+			}
+			if (mXmlTemplates.count(replacementName))
+			{
+				item=LLXMLNode::replaceNode(item, mXmlTemplates[replacementName]);
+				
+				// walk the nodes looking for $(substitution) here and replace
+				replaceSubstitutionStrings(item, replacements);
+			}
+			else
+			{
+				llwarns << "XML template lookup failure on '" << replacementName << "' " << llendl;
+			}
+		}
+	}
+	return item;
+}
+
+bool LLNotifications::loadTemplates()
+{
+	const std::string xml_filename = "notifications.xml";
+	LLXMLNodePtr root;
+	
+	BOOL success  = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root);
+	
+	if (!success || root.isNull() || !root->hasName( "notifications" ))
+	{
+		llerrs << "Problem reading UI Notifications file: " << xml_filename << llendl;
+		return false;
+	}
+	
+	clearTemplates();
+	
+	for (LLXMLNodePtr item = root->getFirstChild();
+		 item.notNull(); item = item->getNextSibling())
+	{
+		// we do this FIRST so that item can be changed if we 
+		// encounter a usetemplate -- we just replace the
+		// current xml node and keep processing
+		item = checkForXMLTemplate(item);
+		
+		if (item->hasName("global"))
+		{
+			std::string global_name;
+			if (item->getAttributeString("name", global_name))
+			{
+				mGlobalStrings[global_name] = item->getTextContents();
+			}
+			continue;
+		}
+		
+		if (item->hasName("template"))
+		{
+			// store an xml template; templates must have a single node (can contain
+			// other nodes)
+			std::string name;
+			item->getAttributeString("name", name);
+			LLXMLNodePtr ptr = item->getFirstChild();
+			mXmlTemplates[name] = ptr;
+			continue;
+		}
+		
+		if (!item->hasName("notification"))
+		{
+            llwarns << "Unexpected entity " << item->getName()->mString << 
+                       " found in " << xml_filename << llendl;
+			continue;
+		}
+		
+		// now we know we have a notification entry, so let's build it
+		LLNotificationTemplatePtr pTemplate(new LLNotificationTemplate());
+
+		if (!item->getAttributeString("name", pTemplate->mName))
+		{
+			llwarns << "Unable to parse notification with no name" << llendl;
+			continue;
+		}
+		
+		//llinfos << "Parsing " << pTemplate->mName << llendl;
+		
+		pTemplate->mMessage = item->getTextContents();
+		pTemplate->mDefaultFunctor = pTemplate->mName;
+		item->getAttributeString("type", pTemplate->mType);
+		item->getAttributeString("icon", pTemplate->mIcon);
+		item->getAttributeString("label", pTemplate->mLabel);
+		item->getAttributeU32("duration", pTemplate->mExpireSeconds);
+		item->getAttributeU32("expireOption", pTemplate->mExpireOption);
+
+		std::string priority;
+		item->getAttributeString("priority", priority);
+		pTemplate->mPriority = NOTIFICATION_PRIORITY_NORMAL;
+		if (!priority.empty())
+		{
+			if (priority == "low")      pTemplate->mPriority = NOTIFICATION_PRIORITY_LOW;
+			if (priority == "normal")   pTemplate->mPriority = NOTIFICATION_PRIORITY_NORMAL;
+			if (priority == "high")     pTemplate->mPriority = NOTIFICATION_PRIORITY_HIGH;
+			if (priority == "critical") pTemplate->mPriority = NOTIFICATION_PRIORITY_CRITICAL;
+		}
+		
+		item->getAttributeString("functor", pTemplate->mDefaultFunctor);
+
+		BOOL persist = false;
+		item->getAttributeBOOL("persist", persist);
+		pTemplate->mPersist = persist;
+		
+		std::string sound;
+		item->getAttributeString("sound", sound);
+		if (!sound.empty())
+		{
+			// test for bad sound effect name / missing effect
+			if (LLUI::sSettingGroups["config"]->controlExists(sound))
+			{
+				pTemplate->mSoundEffect = 
+					LLUUID(LLUI::sSettingGroups["config"]->getString(sound));
+			}
+			else
+			{
+				llwarns << "Unknown sound effect control name " << sound
+					<< llendl;
+			}
+		}
+
+		for (LLXMLNodePtr child = item->getFirstChild();
+			 !child.isNull(); child = child->getNextSibling())
+		{
+			child = checkForXMLTemplate(child);
+			
+			// <url>
+			if (child->hasName("url"))
+			{
+				pTemplate->mURL = child->getTextContents();
+				child->getAttributeU32("option", pTemplate->mURLOption);
+				child->getAttributeU32("openexternally", pTemplate->mURLOpenExternally);
+			}
+			
+            if (child->hasName("unique"))
+            {
+                pTemplate->mUnique = true;
+                for (LLXMLNodePtr formitem = child->getFirstChild();
+                     !formitem.isNull(); formitem = formitem->getNextSibling())
+                {
+                    if (formitem->hasName("context"))
+                    {
+                        std::string key;
+                        formitem->getAttributeString("key", key);
+                        pTemplate->mUniqueContext.push_back(key);
+                        //llwarns << "adding " << key << " to unique context" << llendl;
+                    }
+                    else
+                    {
+                        llwarns << "'unique' has unrecognized subelement " 
+                        << formitem->getName()->mString << llendl;
+                    }
+                }
+            }
+            
+			// <form>
+			if (child->hasName("form"))
+			{
+                pTemplate->mForm = LLNotificationFormPtr(new LLNotificationForm(pTemplate->mName, child));
+			}
+		}
+		addTemplate(pTemplate->mName, pTemplate);
+	}
+	
+	//std::ostringstream ostream;
+	//root->writeToOstream(ostream, "\n  ");
+	//llwarns << ostream.str() << llendl;
+	
+	return true;
+}
+
+// Add a simple notification (from XUI)
+void LLNotifications::addFromCallback(const LLSD& name)
+{
+	add(LLNotification::Params().name(name.asString()));	
+}
+
+// we provide a couple of simple add notification functions so that it's reasonable to create notifications in one line
+LLNotificationPtr LLNotifications::add(const std::string& name, 
+										const LLSD& substitutions, 
+										const LLSD& payload)
+{
+	LLNotification::Params::Functor functor_p;
+	functor_p.name = name;
+	return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
+}
+
+LLNotificationPtr LLNotifications::add(const std::string& name, 
+										const LLSD& substitutions, 
+										const LLSD& payload, 
+										const std::string& functor_name)
+{
+	LLNotification::Params::Functor functor_p;
+	functor_p.name = functor_name;
+	return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
+}
+
+LLNotificationPtr LLNotifications::add(const std::string& name, 
+										const LLSD& substitutions, 
+										const LLSD& payload, 
+										LLNotificationFunctorRegistry::ResponseFunctor functor)
+{
+	LLNotification::Params::Functor functor_p;
+	functor_p.function = functor;
+	return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
+}
+
+// generalized add function that takes a parameter block object for more complex instantiations
+LLNotificationPtr LLNotifications::add(const LLNotification::Params& p)
+{
+	LLNotificationPtr pNotif(new LLNotification(p));
+	add(pNotif);
+	return pNotif;
+}
+
+
+void LLNotifications::add(const LLNotificationPtr pNotif)
+{
+	// first see if we already have it -- if so, that's a problem
+	LLNotificationSet::iterator it=mItems.find(pNotif);
+	if (it != mItems.end())
+	{
+		llerrs << "Notification added a second time to the master notification channel." << llendl;
+	}
+
+	updateItem(LLSD().insert("sigtype", "add").insert("id", pNotif->id()), pNotif);
+}
+
+void LLNotifications::cancel(LLNotificationPtr pNotif)
+{
+	LLNotificationSet::iterator it=mItems.find(pNotif);
+	if (it == mItems.end())
+	{
+		llerrs << "Attempted to delete nonexistent notification " << pNotif->getName() << llendl;
+	}
+	pNotif->cancel();
+	updateItem(LLSD().insert("sigtype", "delete").insert("id", pNotif->id()), pNotif);
+}
+
+void LLNotifications::update(const LLNotificationPtr pNotif)
+{
+	LLNotificationSet::iterator it=mItems.find(pNotif);
+	if (it != mItems.end())
+	{
+		updateItem(LLSD().insert("sigtype", "change").insert("id", pNotif->id()), pNotif);
+	}
+}
+
+
+LLNotificationPtr LLNotifications::find(LLUUID uuid)
+{
+	LLNotificationPtr target = LLNotificationPtr(new LLNotification(uuid));
+	LLNotificationSet::iterator it=mItems.find(target);
+	if (it == mItems.end())
+	{
+		llwarns << "Tried to dereference uuid '" << uuid << "' as a notification key but didn't find it." << llendl;
+		return LLNotificationPtr((LLNotification*)NULL);
+	}
+	else
+	{
+		return *it;
+	}
+}
+
+void LLNotifications::forEachNotification(NotificationProcess process)
+{
+	std::for_each(mItems.begin(), mItems.end(), process);
+}
+
+std::string LLNotifications::getGlobalString(const std::string& key) const
+{
+	GlobalStringMap::const_iterator it = mGlobalStrings.find(key);
+	if (it != mGlobalStrings.end())
+	{
+		return it->second;
+	}
+	else
+	{
+		// if we don't have the key as a global, return the key itself so that the error
+		// is self-diagnosing.
+		return key;
+	}
+}
+
+void LLNotifications::setIgnoreAllNotifications(bool setting)
+{
+	mIgnoreAllNotifications = setting; 
+}
+bool LLNotifications::getIgnoreAllNotifications()
+{
+	return mIgnoreAllNotifications; 
+}
+													
+// ---
+// END OF LLNotifications implementation
+// =========================================================
+
+std::ostream& operator<<(std::ostream& s, const LLNotification& notification)
+{
+	s << notification.summarize();
+	return s;
+}
+
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 0335a265b6e0f8e5d6827146646ff5a7bb188547..0d7cb74f7044602874487569445acfff12503b82 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -102,7 +102,6 @@
 #include "llfunctorregistry.h"
 #include "llpointer.h"
 #include "llinitparam.h"
-#include "llxmlnode.h"
 #include "llnotificationslistener.h"
 
 class LLNotification;
@@ -161,7 +160,7 @@ class LLNotificationForm
 	LLNotificationForm();
 	LLNotificationForm(const LLSD& sd);
 	LLNotificationForm(const std::string& name, 
-		const LLPointer<LLXMLNode> xml_node);
+		const LLPointer<class LLXMLNode> xml_node);
 
 	LLSD asLLSD() const;
 
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 742427525b89317cb1585a7d77d35ff87557a248..095200ddc3d502f02562521550065f97bc1fe4b9 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -474,7 +474,7 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
 			{
 				//if we are exporting, we want to export the current xml
 				//not the referenced xml
-				LLXUIParser::instance().readXUI(node, params);
+				LLXUIParser::instance().readXUI(node, params, xml_filename);
 				Params output_params(params);
 				setupParamsForExport(output_params, parent);
 				output_node->setName(node->getName()->mString);
@@ -490,14 +490,15 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
 				return FALSE;
 			}
 
-			LLXUIParser::instance().readXUI(referenced_xml, params);
+			LLXUIParser::instance().readXUI(referenced_xml, params, xml_filename);
 
 			// add children using dimensions from referenced xml for consistent layout
 			setShape(params.rect);
 			LLUICtrlFactory::createChildren(this, referenced_xml, child_registry_t::instance());
 		}
 
-		LLXUIParser::instance().readXUI(node, params);
+		// ask LLUICtrlFactory for filename, since xml_filename might be empty
+		LLXUIParser::instance().readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName());
 
 		if (output_node)
 		{
diff --git a/indra/llui/llrngwriter.cpp b/indra/llui/llrngwriter.cpp
index cf23e3af15a6bd28ccb06de929271b1a141cf2b0..7e3d4b92d3ddc5fdc08f4b26815bf351de24c6ae 100644
--- a/indra/llui/llrngwriter.cpp
+++ b/indra/llui/llrngwriter.cpp
@@ -108,7 +108,8 @@ void LLRNGWriter::addDefinition(const std::string& type_name, const LLInitParam:
 		
 		LLXMLNodePtr old_element_node = mElementNode;
 		LLXMLNodePtr old_child_node = mChildrenNode;
-		addDefinition(child_name, (*LLDefaultParamBlockRegistry::instance().getValue(type))());
+		//FIXME: add LLDefaultParamBlockRegistry back when working on schema generation
+		//addDefinition(child_name, (*LLDefaultParamBlockRegistry::instance().getValue(type))());
 		mElementNode = old_element_node;
 		mChildrenNode = old_child_node;
 
diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp
index 0d674528dcb0163554c6d60a9fc06c482016bfa7..dfd315d4516d94a36620a7091c29fd373dd37120 100644
--- a/indra/llui/llscrollbar.cpp
+++ b/indra/llui/llscrollbar.cpp
@@ -149,7 +149,8 @@ void LLScrollbar::setDocParams( S32 size, S32 pos )
 	updateThumbRect();
 }
 
-void LLScrollbar::setDocPos(S32 pos, BOOL update_thumb)
+// returns true if document position really changed
+bool LLScrollbar::setDocPos(S32 pos, BOOL update_thumb)
 {
 	pos = llclamp(pos, 0, getDocPosMax());
 	if (pos != mDocPos)
@@ -166,7 +167,9 @@ void LLScrollbar::setDocPos(S32 pos, BOOL update_thumb)
 		{
 			updateThumbRect();
 		}
+		return true;
 	}
+	return false;
 }
 
 void LLScrollbar::setDocSize(S32 size)
@@ -409,13 +412,8 @@ BOOL LLScrollbar::handleHover(S32 x, S32 y, MASK mask)
 
 BOOL LLScrollbar::handleScrollWheel(S32 x, S32 y, S32 clicks)
 {
-	S32 pos = llclamp(mDocPos + clicks * mStepSize, 0, getDocPosMax());
-	if (pos != mDocPos)
-	{
-		setDocPos(pos, TRUE);
-		return TRUE;
-	}
-	return FALSE;
+	BOOL handled = changeLine( clicks * mStepSize, TRUE );
+	return handled;
 }
 
 BOOL LLScrollbar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
@@ -578,9 +576,9 @@ void LLScrollbar::draw()
 } // end draw
 
 
-void LLScrollbar::changeLine( S32 delta, BOOL update_thumb )
+bool LLScrollbar::changeLine( S32 delta, BOOL update_thumb )
 {
-	setDocPos(mDocPos + delta, update_thumb);
+	return setDocPos(mDocPos + delta, update_thumb);
 }
 
 void LLScrollbar::setValue(const LLSD& value) 
diff --git a/indra/llui/llscrollbar.h b/indra/llui/llscrollbar.h
index 865a1db409d0603530eb5484acb4bbd44b4b080d..a9f028f9ae8f526ad5b4cc91cbbe1118dfd97310 100644
--- a/indra/llui/llscrollbar.h
+++ b/indra/llui/llscrollbar.h
@@ -109,7 +109,7 @@ class LLScrollbar
 
 	// How many "lines" the "document" has scrolled.
 	// 0 <= DocPos <= DocSize - DocVisibile
-	void				setDocPos( S32 pos, BOOL update_thumb = TRUE );
+	bool				setDocPos( S32 pos, BOOL update_thumb = TRUE );
 	S32					getDocPos() const		{ return mDocPos; }
 
 	BOOL				isAtBeginning();
@@ -133,7 +133,7 @@ class LLScrollbar
 
 private:
 	void				updateThumbRect();
-	void				changeLine(S32 delta, BOOL update_thumb );
+	bool				changeLine(S32 delta, BOOL update_thumb );
 
 	callback_t			mChangeCallback;
 
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 3ca05ff0ff43c9306c514c9a71c5f2ce12c6e0f5..732c01614bc35798b752d2dba2ca8b3d502e7b30 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -105,6 +105,15 @@ struct LLPlaceHolderPanel : public LLPanel
 static LLDefaultChildRegistry::Register<LLPlaceHolderPanel> r1("placeholder");
 static LLDefaultChildRegistry::Register<LLTabContainer> r2("tab_container");
 
+LLTabContainer::TabParams::TabParams()
+:	tab_top_image_unselected("tab_top_image_unselected"),
+	tab_top_image_selected("tab_top_image_selected"),
+	tab_bottom_image_unselected("tab_bottom_image_unselected"),
+	tab_bottom_image_selected("tab_bottom_image_selected"),
+	tab_left_image_unselected("tab_left_image_unselected"),
+	tab_left_image_selected("tab_left_image_selected")
+{}
+
 LLTabContainer::Params::Params()
 :	tab_width("tab_width"),
 	tab_min_width("tab_min_width"),
@@ -113,12 +122,9 @@ LLTabContainer::Params::Params()
 	tab_position("tab_position"),
 	hide_tabs("hide_tabs", false),
 	tab_padding_right("tab_padding_right"),
-	tab_top_image_unselected("tab_top_image_unselected"),
-	tab_top_image_selected("tab_top_image_selected"),
-	tab_bottom_image_unselected("tab_bottom_image_unselected"),
-	tab_bottom_image_selected("tab_bottom_image_selected"),
-	tab_left_image_unselected("tab_left_image_unselected"),
-	tab_left_image_selected("tab_left_image_selected")
+	first_tab("first_tab"),
+	middle_tab("middle_tab"),
+	last_tab("last_tab")
 {
 	name(std::string("tab_container"));
 	mouse_opaque = false;
@@ -147,12 +153,9 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
 	mRightTabBtnOffset(p.tab_padding_right),
 	mTotalTabWidth(0),
 	mTabPosition(p.tab_position),
-	mImageTopUnselected(p.tab_top_image_unselected),
-	mImageTopSelected(p.tab_top_image_selected),
-	mImageBottomUnselected(p.tab_bottom_image_unselected),
-	mImageBottomSelected(p.tab_bottom_image_selected),
-	mImageLeftUnselected(p.tab_left_image_unselected),
-	mImageLeftSelected(p.tab_left_image_selected)
+	mFirstTabParams(p.first_tab),
+	mMiddleTabParams(p.middle_tab),
+	mLastTabParams(p.last_tab)
 {
 	static LLUICachedControl<S32> tabcntr_vert_tab_min_width ("UITabCntrVertTabMinWidth", 0);
 
@@ -791,6 +794,29 @@ void LLTabContainer::addTabPanel(LLPanel* panelp)
 	addTabPanel(TabPanelParams().panel(panelp));
 }
 
+// function to update images
+void LLTabContainer::update_images(LLTabTuple* tuple, TabParams params, LLTabContainer::TabPosition pos)
+{
+	if (tuple && tuple->mButton)
+	{
+		if (pos == LLTabContainer::TOP)
+		{
+			tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_top_image_unselected));
+			tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_top_image_selected));
+		}
+		else if (pos == LLTabContainer::BOTTOM)
+		{
+			tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_bottom_image_unselected));
+			tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_bottom_image_selected));
+		}
+		else if (pos == LLTabContainer::LEFT)
+		{
+			tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_left_image_unselected));
+			tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_left_image_selected));
+		}
+	}
+}
+
 void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 {
 	LLPanel* child = panel.panel();
@@ -888,14 +914,14 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 	else if( getTabPosition() == LLTabContainer::TOP )
 	{
 		btn_rect.setLeftTopAndSize( 0, getRect().getHeight() - getTopBorderHeight() + tab_fudge, button_width, mTabHeight);
-		tab_img = mImageTopUnselected.get();
-		tab_selected_img = mImageTopSelected.get();
+		tab_img = mMiddleTabParams.tab_top_image_unselected;
+		tab_selected_img = mMiddleTabParams.tab_top_image_selected; 
 	}
 	else
 	{
 		btn_rect.setOriginAndSize( 0, 0 + tab_fudge, button_width, mTabHeight);
-		tab_img = mImageBottomUnselected.get();
-		tab_selected_img = mImageBottomSelected.get();
+		tab_img = mMiddleTabParams.tab_bottom_image_unselected;
+		tab_selected_img = mMiddleTabParams.tab_bottom_image_selected;
 	}
 
 	LLTextBox* textbox = NULL;
@@ -926,8 +952,8 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 			p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child));
 			p.font(font);
 			p.label(trimmed_label);
-			p.image_unselected(mImageLeftUnselected);
-			p.image_selected(mImageLeftSelected);
+			p.image_unselected(mMiddleTabParams.tab_left_image_unselected);
+			p.image_selected(mMiddleTabParams.tab_left_image_selected);
 			p.scale_image(true);
 			p.font_halign = LLFontGL::LEFT;
 			p.tab_stop(false);
@@ -983,6 +1009,31 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 	LLTabTuple* tuple = new LLTabTuple( this, child, btn, textbox );
 	insertTuple( tuple, insertion_point );
 
+	// if new tab was added as a first or last tab, update button image 
+	// and update button image of any tab it may have affected
+	if (tuple == mTabList.front())
+	{  
+		update_images(tuple, mFirstTabParams, getTabPosition());
+
+		if (mTabList.size() == 2) 
+		{		
+			update_images(mTabList[1], mLastTabParams, getTabPosition());
+		}
+		else if (mTabList.size() > 2) 
+		{
+			update_images(mTabList[1], mMiddleTabParams, getTabPosition());
+		}
+	}
+	else if (tuple == mTabList.back())
+	{
+		update_images(tuple, mLastTabParams, getTabPosition());
+
+		if (mTabList.size() > 2)
+		{
+			update_images(mTabList[mTabList.size()-2], mMiddleTabParams, getTabPosition());
+		}
+	}
+
 	//Don't add button and textbox if tab buttons are invisible(EXT - 576)
 	if (!getTabsHidden())
 	{
@@ -1064,7 +1115,17 @@ void LLTabContainer::removeTabPanel(LLPanel* child)
 		LLTabTuple* tuple = *iter;
 		if( tuple->mTabPanel == child )
 		{
- 			removeChild( tuple->mButton );
+			// update tab button images if removing the first or last tab
+			if ((tuple == mTabList.front()) && (mTabList.size() > 1))
+			{
+				update_images(mTabList[1], mFirstTabParams, getTabPosition());
+			}
+			else if ((tuple == mTabList.back()) && (mTabList.size() > 2))
+			{
+				update_images(mTabList[mTabList.size()-2], mLastTabParams, getTabPosition());
+			}
+
+			removeChild( tuple->mButton );
  			delete tuple->mButton;
 
  			removeChild( tuple->mTabPanel );
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index e3af5384b18e224948cb7947cbaa428429d7fae5..a81974cd4226b826cbf8094d5875793c67280860 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -61,6 +61,17 @@ class LLTabContainer : public LLPanel
 		static void declareValues();
 	};
 
+	struct TabParams : public LLInitParam::Block<TabParams>
+	{
+		Optional<LLUIImage*>				tab_top_image_unselected,
+											tab_top_image_selected,
+											tab_bottom_image_unselected,
+											tab_bottom_image_selected,
+											tab_left_image_unselected,
+											tab_left_image_selected;		
+		TabParams();
+	};
+
 	struct Params
 	:	public LLInitParam::Block<Params, LLPanel::Params>
 	{
@@ -73,12 +84,9 @@ class LLTabContainer : public LLPanel
 		Optional<bool>						hide_tabs;
 		Optional<S32>						tab_padding_right;
 
-		Optional<LLUIImage*>				tab_top_image_unselected,
-											tab_top_image_selected,
-											tab_bottom_image_unselected,
-											tab_bottom_image_selected,
-											tab_left_image_unselected,
-											tab_left_image_selected;
+		Optional<TabParams>					first_tab,
+											middle_tab,
+											last_tab;
 
 		Params();
 	};
@@ -215,6 +223,9 @@ class LLTabContainer : public LLPanel
 	void updateMaxScrollPos();
 	void commitHoveredButton(S32 x, S32 y);
 
+	// updates tab button images given the tuple, tab position and the corresponding params
+	void update_images(LLTabTuple* tuple, TabParams params, LLTabContainer::TabPosition pos);
+
 	// Variables
 	
 	typedef std::vector<LLTabTuple*> tuple_list_t;
@@ -252,12 +263,9 @@ class LLTabContainer : public LLPanel
 
 	LLFrameTimer					mDragAndDropDelayTimer;
 
-	LLPointer<LLUIImage>			mImageTopUnselected;
-	LLPointer<LLUIImage>			mImageTopSelected;
-	LLPointer<LLUIImage>			mImageBottomUnselected;
-	LLPointer<LLUIImage>			mImageBottomSelected;
-	LLPointer<LLUIImage>			mImageLeftUnselected;
-	LLPointer<LLUIImage>			mImageLeftSelected;
+	TabParams						mFirstTabParams;
+	TabParams						mMiddleTabParams;
+	TabParams						mLastTabParams;
 };
 
 #endif  // LL_TABCONTAINER_H
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 1d36a16ea7eabf23dc210dd0f449005abd32ce93..22cce755b0d36a5d29da071c038b11ae299e1486 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1825,27 +1825,26 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round
 	return pos;
 }
 
-LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
+// returns rectangle of insertion caret 
+// in document coordinate frame from given index into text
+LLRect LLTextBase::getDocRectFromDocIndex(S32 pos) const
 {
-	LLRect local_rect;
 	if (mLineInfoList.empty()) 
 	{ 
-		local_rect = mTextRect;
-		local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight());
-		return local_rect;
+		return LLRect();
 	}
 
+	LLRect doc_rect;
+
 	// clamp pos to valid values
 	pos = llclamp(pos, 0, mLineInfoList.back().mDocIndexEnd - 1);
 
-
 	// find line that contains cursor
 	line_list_t::const_iterator line_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), pos, line_end_compare());
 
-	LLRect scrolled_view_rect = getVisibleDocumentRect();
-	local_rect.mLeft = mTextRect.mLeft - scrolled_view_rect.mLeft + line_iter->mRect.mLeft; 
-	local_rect.mBottom = mTextRect.mBottom + (line_iter->mRect.mBottom - scrolled_view_rect.mBottom);
-	local_rect.mTop = mTextRect.mBottom + (line_iter->mRect.mTop - scrolled_view_rect.mBottom);
+	doc_rect.mLeft = line_iter->mRect.mLeft; 
+	doc_rect.mBottom = line_iter->mRect.mBottom;
+	doc_rect.mTop = line_iter->mRect.mTop;
 
 	segment_set_t::iterator line_seg_iter;
 	S32 line_seg_offset;
@@ -1863,7 +1862,7 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
 			// cursor advanced to right based on difference in offset of cursor to start of line
 			S32 segment_width, segment_height;
 			segmentp->getDimensions(line_seg_offset, cursor_seg_offset - line_seg_offset, segment_width, segment_height);
-			local_rect.mLeft += segment_width;
+			doc_rect.mLeft += segment_width;
 
 			break;
 		}
@@ -1872,7 +1871,7 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
 			// add remainder of current text segment to cursor position
 			S32 segment_width, segment_height;
 			segmentp->getDimensions(line_seg_offset, (segmentp->getEnd() - segmentp->getStart()) - line_seg_offset, segment_width, segment_height);
-			local_rect.mLeft += segment_width;
+			doc_rect.mLeft += segment_width;
 			// offset will be 0 for all segments after the first
 			line_seg_offset = 0;
 			// go to next text segment on this line
@@ -1880,7 +1879,31 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
 		}
 	}
 
-	local_rect.mRight = local_rect.mLeft; 
+	// set rect to 0 width
+	doc_rect.mRight = doc_rect.mLeft; 
+
+	return doc_rect;
+}
+
+LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
+{
+	LLRect local_rect;
+	if (mLineInfoList.empty()) 
+	{ 
+		// return default height rect in upper left
+		local_rect = mTextRect;
+		local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight());
+		return local_rect;
+	}
+
+	// get the rect in document coordinates
+	LLRect doc_rect = getDocRectFromDocIndex(pos);
+
+	// compensate for scrolled, inset view of doc
+	LLRect scrolled_view_rect = getVisibleDocumentRect();
+	local_rect = doc_rect;
+	local_rect.translate(mTextRect.mLeft - scrolled_view_rect.mLeft, 
+						mTextRect.mBottom - scrolled_view_rect.mBottom);
 
 	return local_rect;
 }
@@ -2416,10 +2439,12 @@ void LLNormalTextSegment::dump() const
 // LLInlineViewSegment
 //
 
-LLInlineViewSegment::LLInlineViewSegment(LLView* view, S32 start, S32 end, bool force_new_line)
+LLInlineViewSegment::LLInlineViewSegment(LLView* view, S32 start, S32 end, bool force_new_line, S32 hpad, S32 vpad)
 :	LLTextSegment(start, end),
 	mView(view),
-	mForceNewLine(force_new_line)
+	mForceNewLine(force_new_line),
+	mHPad(hpad), // one sided padding (applied to left and right)
+	mVPad(vpad)
 {
 } 
 
@@ -2439,8 +2464,8 @@ void	LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt
 	}
 	else
 	{
-		width = mView->getRect().getWidth();
-		height = mView->getRect().getHeight();
+		width = mHPad * 2 + mView->getRect().getWidth();
+		height = mVPad * 2 + mView->getRect().getHeight();
 	}
 }
 
@@ -2462,14 +2487,15 @@ S32	LLInlineViewSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
 
 void LLInlineViewSegment::updateLayout(const LLTextBase& editor)
 {
-	LLRect start_rect = editor.getLocalRectFromDocIndex(mStart);
-	LLRect doc_rect = editor.getDocumentView()->getRect();
-	mView->setOrigin(doc_rect.mLeft + start_rect.mLeft, doc_rect.mBottom + start_rect.mBottom);
+	LLRect start_rect = editor.getDocRectFromDocIndex(mStart);
+	mView->setOrigin(start_rect.mLeft + mHPad, start_rect.mBottom + mVPad);
 }
 
 F32	LLInlineViewSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect)
 {
-	return (F32)(draw_rect.mLeft + mView->getRect().getWidth());
+	// return padded width of widget
+	// widget is actually drawn during mDocumentView's draw()
+	return (F32)(draw_rect.mLeft + mView->getRect().getWidth() + mHPad * 2);
 }
 
 void LLInlineViewSegment::unlinkFromDocument(LLTextBase* editor)
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index c05a31baec361c77cbf698c0ba43632ad559b3eb..f0b88784915fe97a57d4df61ecabbd7927e2242a 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -157,6 +157,7 @@ class LLTextBase
 
 	S32						getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const;
 	LLRect					getLocalRectFromDocIndex(S32 pos) const;
+	LLRect					getDocRectFromDocIndex(S32 pos) const;
 
 	void					setReadOnly(bool read_only) { mReadOnly = read_only; }
 	bool					getReadOnly() { return mReadOnly; }
@@ -458,7 +459,7 @@ class LLIndexSegment : public LLTextSegment
 class LLInlineViewSegment : public LLTextSegment
 {
 public:
-	LLInlineViewSegment(LLView* widget, S32 start, S32 end, bool force_new_line);
+	LLInlineViewSegment(LLView* widget, S32 start, S32 end, bool force_new_line, S32 hpad = 0, S32 vpad = 0);
 	~LLInlineViewSegment();
 	/*virtual*/ void		getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
 	/*virtual*/ S32			getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const;
@@ -469,6 +470,8 @@ class LLInlineViewSegment : public LLTextSegment
 	/*virtual*/ void		linkToDocument(class LLTextBase* editor);
 
 private:
+	S32 mHPad;
+	S32 mVPad;
 	LLView* mView;
 	bool	mForceNewLine;
 };
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 953c5b292fc0ed55640dcaefd9cbd3a96c27d76e..d507cf7ce441b23714e53445a725eb9efc891004 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -2276,7 +2276,7 @@ void LLTextEditor::insertText(const std::string &new_text)
 	setEnabled( enabled );
 }
 
-void LLTextEditor::appendWidget(LLView* widget, const std::string &widget_text, bool allow_undo, bool force_new_line)
+void LLTextEditor::appendWidget(LLView* widget, const std::string &widget_text, bool allow_undo, bool force_new_line, S32 hpad, S32 vpad)
 {
 	// Save old state
 	S32 selection_start = mSelectionStart;
@@ -2295,7 +2295,7 @@ void LLTextEditor::appendWidget(LLView* widget, const std::string &widget_text,
 	// Add carriage return if not first line
 	widget_wide_text = utf8str_to_wstring(widget_text);
 
-	LLTextSegmentPtr segment = new LLInlineViewSegment(widget, old_length, old_length + widget_text.size(), force_new_line);
+	LLTextSegmentPtr segment = new LLInlineViewSegment(widget, old_length, old_length + widget_text.size(), force_new_line, hpad, vpad);
 	insert(getLength(), widget_wide_text, FALSE, segment);
 
 	needsReflow();
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 82f39568553b868957db34bfcfb8b4b8defa3229..481a4d1a78d1fe3bc7c4028958a72216528fbe37 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -165,7 +165,7 @@ class LLTextEditor :
 	// inserts text at cursor
 	void			insertText(const std::string &text);
 
-	void			appendWidget(LLView* widget, const std::string &widget_text, bool allow_undo, bool force_newline);
+	void			appendWidget(LLView* widget, const std::string &widget_text, bool allow_undo, bool force_newline, S32 hpad, S32 vpad);
 	// Non-undoable
 	void			setText(const LLStringExplicit &utf8str);
 
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index da9384f8769389ee747691e8eac35963763665e2..48504a1e5400ddf8d1395a253c7b68240aa477b9 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -1807,11 +1807,11 @@ void LLUI::glRectToScreen(const LLRect& gl, LLRect *screen)
 }
 
 //static
-LLPointer<LLUIImage> LLUI::getUIImageByID(const LLUUID& image_id)
+LLPointer<LLUIImage> LLUI::getUIImageByID(const LLUUID& image_id, S32 priority)
 {
 	if (sImageProvider)
 	{
-		return sImageProvider->getUIImageByID(image_id);
+		return sImageProvider->getUIImageByID(image_id, priority);
 	}
 	else
 	{
@@ -1820,10 +1820,10 @@ LLPointer<LLUIImage> LLUI::getUIImageByID(const LLUUID& image_id)
 }
 
 //static 
-LLPointer<LLUIImage> LLUI::getUIImage(const std::string& name)
+LLPointer<LLUIImage> LLUI::getUIImage(const std::string& name, S32 priority)
 {
 	if (!name.empty() && sImageProvider)
-		return sImageProvider->getUIImage(name);
+		return sImageProvider->getUIImage(name, priority);
 	else
 		return NULL;
 }
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 6ab78ab3cd906535967fc7b107533045d0646e6f..efb1b0a36f4676f78db39ec94244212a1fa5c6da 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -195,8 +195,8 @@ class LLUI
 	static void getMousePositionLocal(const LLView* viewp, S32 *x, S32 *y);
 	static void setScaleFactor(const LLVector2& scale_factor);
 	static void setLineWidth(F32 width);
-	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id);
-	static LLPointer<LLUIImage> getUIImage(const std::string& name);
+	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0);
+	static LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0);
 	static LLVector2 getWindowSize();
 	static void screenPointToGL(S32 screen_x, S32 screen_y, S32 *gl_x, S32 *gl_y);
 	static void glPointToScreen(S32 gl_x, S32 gl_y, S32 *screen_x, S32 *screen_y);
@@ -241,8 +241,8 @@ class LLImageProviderInterface
 	LLImageProviderInterface() {};
 	virtual ~LLImageProviderInterface() {};
 public:
-	virtual LLPointer<LLUIImage> getUIImage(const std::string& name) = 0;
-	virtual LLPointer<LLUIImage> getUIImageByID(const LLUUID& id) = 0;
+	virtual LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority) = 0;
+	virtual LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority) = 0;
 	virtual void cleanUp() = 0;
 };
 
diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index 087a99c2b016ea09681bd2bf688da54bd3fccfed..851091f0ca2ecc64f57175b430d5f39f6a534bed 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -3,7 +3,30 @@
  * @brief brief LLUIColorTable class implementation file
  *
  * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
  * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
  */
 
@@ -278,7 +301,7 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename)
 	}
 
 	Params params;
-	LLXUIParser::instance().readXUI(root, params);
+	LLXUIParser::instance().readXUI(root, params, filename);
 
 	if(params.validateBlock())
 	{
diff --git a/indra/llui/lluicolortable.h b/indra/llui/lluicolortable.h
index f102a573b84928c18aabe79def3e2791eeec9478..59be0c4f9a4d9a35597fef9700a4fd68df3c9927 100644
--- a/indra/llui/lluicolortable.h
+++ b/indra/llui/lluicolortable.h
@@ -3,7 +3,30 @@
  * @brief brief LLUIColorTable class header file
  *
  * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
  * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
  */
 
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 209ee76940d61a8d09b73a2b0fb94269d2c7223f..c3c0daed0f4017cd770331d638e655c5246faad1 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -34,6 +34,8 @@
 
 #include "lluictrlfactory.h"
 
+#include "llxmlnode.h"
+
 #include <fstream>
 #include <boost/tokenizer.hpp>
 
@@ -83,8 +85,9 @@ LLUICtrlFactory::LLUICtrlFactory()
 
 LLUICtrlFactory::~LLUICtrlFactory()
 {
-	delete mDummyPanel;
-	mDummyPanel = NULL;
+	// go ahead and leak mDummyPanel since this is static destructor time
+	//delete mDummyPanel;
+	//mDummyPanel = NULL;
 }
 
 void LLUICtrlFactory::loadWidgetTemplate(const std::string& widget_tag, LLInitParam::BaseBlock& block)
@@ -94,7 +97,7 @@ void LLUICtrlFactory::loadWidgetTemplate(const std::string& widget_tag, LLInitPa
 
 	if (LLUICtrlFactory::getLayeredXMLNode(filename, root_node))
 	{
-		LLXUIParser::instance().readXUI(root_node, block);
+		LLXUIParser::instance().readXUI(root_node, block, filename);
 	}
 }
 
@@ -410,3 +413,39 @@ void LLUICtrlFactory::popFactoryFunctions()
 		mFactoryStack.pop_back();
 	}
 }
+
+//static 
+void LLUICtrlFactory::copyName(LLXMLNodePtr src, LLXMLNodePtr dest)
+{
+	dest->setName(src->getName()->mString);
+}
+
+// adds a widget and its param block to various registries
+//static 
+void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const std::type_info* param_block_type, dummy_widget_creator_func_t creator_func, const std::string& tag)
+{
+	// associate parameter block type with template .xml file
+	std::string* existing_tag = LLWidgetNameRegistry::instance().getValue(param_block_type);
+	if (existing_tag != NULL && *existing_tag != tag)
+	{
+		llerrs << "Duplicate entry for T::Params, try creating empty param block in derived classes that inherit T::Params" << llendl;
+	}
+	LLWidgetNameRegistry ::instance().defaultRegistrar().add(param_block_type, tag);
+	// associate widget type with factory function
+	LLDefaultWidgetRegistry::instance().defaultRegistrar().add(widget_type, creator_func);
+	LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type);
+	//FIXME: comment this in when working on schema generation
+	//LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type, &getEmptyParamBlock<T>);
+}
+
+//static
+dummy_widget_creator_func_t* LLUICtrlFactory::getDefaultWidgetFunc(const std::type_info* widget_type)
+{
+	return LLDefaultWidgetRegistry::instance().getValue(widget_type);
+}
+
+//static 
+const std::string* LLUICtrlFactory::getWidgetTag(const std::type_info* widget_type)
+{
+	return LLWidgetNameRegistry::instance().getValue(widget_type);
+}
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index 5e6dad312cefb8c853af72b4b87a8bfb91c26ace..17e32dc7a99ba5be6d937c48ba59735bd090f789 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -36,7 +36,7 @@
 #include "llcallbackmap.h"
 #include "llinitparam.h"
 #include "llregistry.h"
-#include "llxmlnode.h"
+#include "v4color.h"
 #include "llfasttimer.h"
 
 #include "llxuiparser.h"
@@ -98,10 +98,11 @@ class LLDefaultWidgetRegistry
 {};
 
 // lookup function for generating empty param block by widget type
-typedef const LLInitParam::BaseBlock& (*empty_param_block_func_t)();
-class LLDefaultParamBlockRegistry
-:	public LLRegistrySingleton<const std::type_info*, empty_param_block_func_t, LLDefaultParamBlockRegistry, LLCompareTypeID>
-{};
+// this is used for schema generation
+//typedef const LLInitParam::BaseBlock& (*empty_param_block_func_t)();
+//class LLDefaultParamBlockRegistry
+//:	public LLRegistrySingleton<const std::type_info*, empty_param_block_func_t, LLDefaultParamBlockRegistry, LLCompareTypeID>
+//{};
 
 extern LLFastTimer::DeclareTimer FTM_WIDGET_SETUP;
 extern LLFastTimer::DeclareTimer FTM_WIDGET_CONSTRUCTION;
@@ -124,7 +125,7 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 			// recursively initialize from base class param block
 			((typename PARAM_BLOCK::base_block_t&)mPrototype).fillFrom(ParamDefaults<typename PARAM_BLOCK::base_block_t, DUMMY>::instance().get());
 			// after initializing base classes, look up template file for this param block
-			std::string* param_block_tag = LLWidgetNameRegistry::instance().getValue(&typeid(PARAM_BLOCK));
+			const std::string* param_block_tag = getWidgetTag(&typeid(PARAM_BLOCK));
 			if (param_block_tag)
 			{
 				LLUICtrlFactory::loadWidgetTemplate(*param_block_tag, mPrototype);
@@ -241,7 +242,7 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 	template<class T>
 	static T* getDefaultWidget(const std::string& name)
 	{
-		dummy_widget_creator_func_t* dummy_func = LLDefaultWidgetRegistry::instance().getValue(&typeid(T));
+		dummy_widget_creator_func_t* dummy_func = getDefaultWidgetFunc(&typeid(T));
 		return dummy_func ? dynamic_cast<T*>((*dummy_func)(name)) : NULL;
 	}
 
@@ -254,6 +255,8 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 		return create<T>(params);
 	}
 
+	static void copyName(LLXMLNodePtr src, LLXMLNodePtr dest);
+
 	template<typename T>
 	static T* defaultBuilder(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node)
 	{
@@ -262,7 +265,7 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 		//#pragma message("Generating LLUICtrlFactory::defaultBuilder")
 		typename T::Params params(getDefaultParams<T>());
 
-		LLXUIParser::instance().readXUI(node, params);
+		LLXUIParser::instance().readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName());
 
 		if (output_node)
 		{
@@ -271,7 +274,7 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 			T::setupParamsForExport(output_params, parent);
 			// Export only the differences between this any default params
 			typename T::Params default_params(getDefaultParams<T>());
-			output_node->setName(node->getName()->mString);
+			copyName(node, output_node);
 			LLXUIParser::instance().writeXUI(
 				output_node, output_params, &default_params);
 		}
@@ -320,7 +323,15 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 
 	static void loadWidgetTemplate(const std::string& widget_tag, LLInitParam::BaseBlock& block);
 
+	// helper function for adding widget type info to various registries
+	static void registerWidget(const std::type_info* widget_type, const std::type_info* param_block_type, dummy_widget_creator_func_t creator_func, const std::string& tag);
+
 private:
+	// return default widget instance factory func for a given type
+	static dummy_widget_creator_func_t* getDefaultWidgetFunc(const std::type_info* widget_type);
+
+	static const std::string* getWidgetTag(const std::type_info* widget_type);
+
 	// this exists to get around dependency on llview
 	static void setCtrlParent(LLView* view, LLView* parent, S32 tab_group);
 
@@ -347,23 +358,12 @@ template<typename T>
 LLChildRegistry<DERIVED>::Register<T>::Register(const char* tag, LLWidgetCreatorFunc func)
 :	LLChildRegistry<DERIVED>::StaticRegistrar(tag, func.empty() ? (LLWidgetCreatorFunc)&LLUICtrlFactory::defaultBuilder<T> : func)
 {
-	const std::type_info* widget_type_infop = &typeid(T);
-	// associate parameter block type with template .xml file
-	std::string* existing_tag = LLWidgetNameRegistry ::instance().getValue(&typeid(typename T::Params));
-	if (existing_tag != NULL && *existing_tag != tag)
-	{
-		// duplicate entry for T::Params
-		// try creating empty param block in derived classes that inherit T::Params
-		int* crash = 0;
-		*crash = 0;
-	}
-	LLWidgetNameRegistry ::instance().defaultRegistrar().add(&typeid(typename T::Params), tag);
-	// associate widget type with factory function
-	LLDefaultWidgetRegistry::instance().defaultRegistrar().add(widget_type_infop, &LLUICtrlFactory::createDefaultWidget<T>);
-	LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type_infop);
-	LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type_infop, &getEmptyParamBlock<T>);
+	// add this widget to various registries
+	LLUICtrlFactory::instance().registerWidget(&typeid(T), &typeid(typename T::Params), &LLUICtrlFactory::createDefaultWidget<T>, tag);
+	
+	// since registry_t depends on T, do this in line here
 	typedef typename T::child_registry_t registry_t;
-	LLChildRegistryRegistry::instance().defaultRegistrar().add(widget_type_infop, registry_t::instance());
+	LLChildRegistryRegistry::instance().defaultRegistrar().add(&typeid(T), registry_t::instance());
 }
 
 
diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp
index 20ff71378e1ce5409d93106a471aa89c916e3d79..3a1e656364389c800a32b965a3e29471adeb8c7e 100644
--- a/indra/llui/lluistring.cpp
+++ b/indra/llui/lluistring.cpp
@@ -35,8 +35,6 @@
 #include "llsd.h"
 #include "lltrans.h"
 
-const LLStringUtil::format_map_t LLUIString::sNullArgs;
-
 LLFastTimer::DeclareTimer FTM_UI_STRING("UI String");
 
 
diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h
index 195f21a6a7c1e77806a2ce6da90b3c12effe0bf5..763de4d6a3ca80588caf7ae8be7a7fa417727542 100644
--- a/indra/llui/lluistring.h
+++ b/indra/llui/lluistring.h
@@ -95,8 +95,6 @@ class LLUIString
 	void insert(S32 charidx, const LLWString& wchars);
 	void replace(S32 charidx, llwchar wc);
 	
-	static const LLStringUtil::format_map_t sNullArgs;
-
 private:
 	void format();	
 	
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index 6dd1f93baf2180fd989d96f247fadc203792ec64..318a0348a2aec14e5b06b545f034939dbb52498f 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -38,8 +38,6 @@
 
 namespace LLInitParam
 {
-	BlockDescriptor BaseBlock::sBlockDescriptor;
-
 	//
 	// Param
 	//
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index 4c936197c92e9b1b10149ea31bde1b385c733813..9fb464ca7b9c4809a16233c4089009389401a2ad 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -46,6 +46,7 @@
 
 namespace LLInitParam
 {
+
 	template <typename T, bool IS_BOOST_FUNCTION = boost::is_convertible<T, boost::function_base>::value >
     struct ParamCompare 
 	{
@@ -474,7 +475,11 @@ namespace LLInitParam
 
 		BlockDescriptor*		mBlockDescriptor;	// most derived block descriptor
 
-		static BlockDescriptor sBlockDescriptor;
+		static BlockDescriptor& blockDescriptor()
+		{
+			static BlockDescriptor sBlockDescriptor;
+			return sBlockDescriptor;
+		}
 
 	private:
 		const std::string& getParamName(const BlockDescriptor& block_data, const Param* paramp) const;
@@ -493,13 +498,13 @@ namespace LLInitParam
 	// that derive from BaseBlock and those that don't
 	// this is supposedly faster than boost::is_convertible and its ilk
 	template<typename T, typename Void = void>
-	struct is_BaseBlock
+	struct IsBaseBlock
 	{
 		static const bool value = false;
 	};
 
 	template<typename T>
-	struct is_BaseBlock<T, typename T::baseblock_base_class_t>
+	struct IsBaseBlock<T, typename T::baseblock_base_class_t>
 	{
 		static const bool value = true;
 	};
@@ -509,7 +514,7 @@ namespace LLInitParam
 	template<typename	T,
 			typename	NAME_VALUE_LOOKUP = TypeValues<T>,
 			bool		HAS_MULTIPLE_VALUES = false,
-			bool		VALUE_IS_BLOCK = is_BaseBlock<T>::value>
+			bool		VALUE_IS_BLOCK = IsBaseBlock<T>::value>
 	class TypedParam 
 	:	public Param
 	{
@@ -1246,7 +1251,7 @@ namespace LLInitParam
 		bool overwriteFrom(const self_t& other)
 		{
 			mCurChoice = other.mCurChoice;
-			return BaseBlock::overwriteFromImpl(sBlockDescriptor, other);
+			return BaseBlock::overwriteFromImpl(blockDescriptor(), other);
 		}
 
 		// take all provided params that are not already provided, and apply to self
@@ -1277,7 +1282,7 @@ namespace LLInitParam
 		Choice()
 		:	mCurChoice(0)
 		{
-			BaseBlock::init(sBlockDescriptor, BaseBlock::sBlockDescriptor, sizeof(DERIVED_BLOCK));
+			BaseBlock::init(blockDescriptor(), BaseBlock::blockDescriptor(), sizeof(DERIVED_BLOCK));
 		}
 
 		// Alternatives are mutually exclusive wrt other Alternatives in the same block.  
@@ -1290,16 +1295,16 @@ namespace LLInitParam
 			friend class Choice<DERIVED_BLOCK>;
 
 			typedef Alternative<T, NAME_VALUE_LOOKUP>									self_t;
-			typedef TypedParam<T, NAME_VALUE_LOOKUP, false, is_BaseBlock<T>::value>		super_t;
+			typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value>		super_t;
 			typedef typename super_t::value_assignment_t								value_assignment_t;
 
 			explicit Alternative(const char* name, value_assignment_t val = DefaultInitializer<T>::get())
-			:	super_t(DERIVED_BLOCK::sBlockDescriptor, name, val, NULL, 0, 1),
+			:	super_t(DERIVED_BLOCK::blockDescriptor(), name, val, NULL, 0, 1),
 				mOriginalValue(val)
 			{
 				// assign initial choice to first declared option
-				DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::sBlockDescriptor.mCurrentBlockPtr);
-				if (DERIVED_BLOCK::sBlockDescriptor.mInitializationState == BlockDescriptor::INITIALIZING
+				DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::blockDescriptor().mCurrentBlockPtr);
+				if (DERIVED_BLOCK::blockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING
 					&& blockp->mCurChoice == 0)
 				{
 					blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this);
@@ -1345,7 +1350,11 @@ namespace LLInitParam
 		};
 
 	protected:
-		static BlockDescriptor sBlockDescriptor;
+		static BlockDescriptor& blockDescriptor()
+		{
+			static BlockDescriptor sBlockDescriptor;
+			return sBlockDescriptor;
+		}
 
 	private:
 		param_handle_t	mCurChoice;
@@ -1356,15 +1365,6 @@ namespace LLInitParam
 		}
 	};
 
-	template<typename DERIVED_BLOCK> 
-		BlockDescriptor
-			Choice<DERIVED_BLOCK>::sBlockDescriptor;
-
-	//struct CardinalityConstraint
-	//{
-	//	virtual std::pair<S32, S32> getRange() = 0;
-	//};
-
 	struct AnyAmount
 	{
 		static U32 minCount() { return 0; }
@@ -1412,19 +1412,19 @@ namespace LLInitParam
 		// take all provided params from other and apply to self
 		bool overwriteFrom(const self_t& other)
 		{
-			return BaseBlock::overwriteFromImpl(sBlockDescriptor, other);
+			return BaseBlock::overwriteFromImpl(blockDescriptor(), other);
 		}
 
 		// take all provided params that are not already provided, and apply to self
 		bool fillFrom(const self_t& other)
 		{
-			return BaseBlock::fillFromImpl(sBlockDescriptor, other);
+			return BaseBlock::fillFromImpl(blockDescriptor(), other);
 		}
 	protected:
 		Block()
 		{
 			//#pragma message("Parsing LLInitParam::Block")
-			BaseBlock::init(sBlockDescriptor, BASE_BLOCK::sBlockDescriptor, sizeof(DERIVED_BLOCK));
+			BaseBlock::init(blockDescriptor(), BASE_BLOCK::blockDescriptor(), sizeof(DERIVED_BLOCK));
 		}
 
 		//
@@ -1434,11 +1434,11 @@ namespace LLInitParam
 		class Optional : public TypedParam<T, NAME_VALUE_LOOKUP, false>
 		{
 		public:
-			typedef TypedParam<T, NAME_VALUE_LOOKUP, false, is_BaseBlock<T>::value>		super_t;
+			typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value>		super_t;
 			typedef typename super_t::value_assignment_t								value_assignment_t;
 
 			explicit Optional(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get())
-			:	super_t(DERIVED_BLOCK::sBlockDescriptor, name, val, NULL, 0, 1)
+			:	super_t(DERIVED_BLOCK::blockDescriptor(), name, val, NULL, 0, 1)
 			{
 				//#pragma message("Parsing LLInitParam::Block::Optional")
 			}
@@ -1461,13 +1461,13 @@ namespace LLInitParam
 		class Mandatory : public TypedParam<T, NAME_VALUE_LOOKUP, false>
 		{
 		public:
-			typedef TypedParam<T, NAME_VALUE_LOOKUP, false, is_BaseBlock<T>::value>		super_t;
+			typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value>		super_t;
 			typedef Mandatory<T, NAME_VALUE_LOOKUP>										self_t;
 			typedef typename super_t::value_assignment_t								value_assignment_t;
 
 			// mandatory parameters require a name to be parseable
 			explicit Mandatory(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get())
-			:	super_t(DERIVED_BLOCK::sBlockDescriptor, name, val, &validate, 1, 1)
+			:	super_t(DERIVED_BLOCK::blockDescriptor(), name, val, &validate, 1, 1)
 			{}
 
 			Mandatory& operator=(value_assignment_t val)
@@ -1495,7 +1495,7 @@ namespace LLInitParam
 		class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true>
 		{
 		public:
-			typedef TypedParam<T, NAME_VALUE_LOOKUP, true, is_BaseBlock<T>::value>	super_t;
+			typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBaseBlock<T>::value>	super_t;
 			typedef Multiple<T, RANGE, NAME_VALUE_LOOKUP>							self_t;
 			typedef typename super_t::container_t									container_t;
 			typedef typename super_t::value_assignment_t							value_assignment_t;
@@ -1503,7 +1503,7 @@ namespace LLInitParam
 			typedef typename container_t::const_iterator							const_iterator;
 
 			explicit Multiple(const char* name = "", value_assignment_t val = DefaultInitializer<container_t>::get())
-			:	super_t(DERIVED_BLOCK::sBlockDescriptor, name, val, &validate, RANGE::minCount(), RANGE::maxCount())
+			:	super_t(DERIVED_BLOCK::blockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount())
 			{}
 
 			using super_t::operator();
@@ -1531,9 +1531,9 @@ namespace LLInitParam
 		{
 		public:
 			explicit Deprecated(const char* name)
-			:	Param(DERIVED_BLOCK::sBlockDescriptor.mCurrentBlockPtr)
+			:	Param(DERIVED_BLOCK::blockDescriptor().mCurrentBlockPtr)
 			{
-				BlockDescriptor& block_descriptor = DERIVED_BLOCK::sBlockDescriptor;
+				BlockDescriptor& block_descriptor = DERIVED_BLOCK::blockDescriptor();
 				if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)
 				{
 					ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
@@ -1563,13 +1563,13 @@ namespace LLInitParam
 		typedef Deprecated Ignored;
 
 	protected:
-		static BlockDescriptor sBlockDescriptor;
+		static BlockDescriptor& blockDescriptor()
+		{
+			static BlockDescriptor sBlockDescriptor;
+			return sBlockDescriptor;
+		}
 	};
 	
-	template<typename DERIVED_BLOCK, typename BASE_BLOCK> 
-		BlockDescriptor
-			Block<DERIVED_BLOCK, BASE_BLOCK>::sBlockDescriptor;
-
 	template<typename T, typename DERIVED = TypedParam<T> >
 	class BlockValue
 	:	public Block<TypedParam<T, TypeValues<T>, false> >,
@@ -1803,11 +1803,11 @@ namespace LLInitParam
 				// assign individual parameters
 				if (overwrite)
 				{
-					dst_typed_param.BaseBlock::overwriteFromImpl(block_t::sBlockDescriptor, src_param);
+					dst_typed_param.BaseBlock::overwriteFromImpl(block_t::blockDescriptor(), src_param);
 				}
 				else
 				{
-					dst_typed_param.BaseBlock::fillFromImpl(block_t::sBlockDescriptor, src_param);
+					dst_typed_param.BaseBlock::fillFromImpl(block_t::blockDescriptor(), src_param);
 				}
 				// then copy actual value
 				dst_typed_param.mData.mValue = src_param.get();
diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp
index e974dbd0ba02ce71f10122a6997d264e2c5e8794..4c800a502db3ceef9a722ca12df49231a8ebbf7c 100644
--- a/indra/llxuixml/lltrans.cpp
+++ b/indra/llxuixml/lltrans.cpp
@@ -72,7 +72,7 @@ bool LLTrans::parseStrings(LLXMLNodePtr &root, const std::set<std::string>& defa
 	}
 
 	StringTable string_table;
-	LLXUIParser::instance().readXUI(root, string_table);
+	LLXUIParser::instance().readXUI(root, string_table, xml_filename);
 
 	if (!string_table.validateBlock())
 	{
@@ -115,7 +115,7 @@ bool LLTrans::parseLanguageStrings(LLXMLNodePtr &root)
 	}
 	
 	StringTable string_table;
-	LLXUIParser::instance().readXUI(root, string_table);
+	LLXUIParser::instance().readXUI(root, string_table, xml_filename);
 	
 	if (!string_table.validateBlock())
 	{
diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp
index e28e52fd16e9551668017ca72457be33c3aa8ba2..17399865e5295230fa428794a0a09a129cc03bf1 100644
--- a/indra/llxuixml/llxuiparser.cpp
+++ b/indra/llxuixml/llxuiparser.cpp
@@ -34,6 +34,7 @@
 
 #include "llxuiparser.h"
 
+#include "llxmlnode.h"
 #include <fstream>
 #include <boost/tokenizer.hpp>
 
@@ -401,10 +402,11 @@ LLXUIParser::LLXUIParser()
 
 static LLFastTimer::DeclareTimer FTM_PARSE_XUI("XUI Parsing");
 
-void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, bool silent)
+void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename, bool silent)
 {
 	LLFastTimer timer(FTM_PARSE_XUI);
 	mNameStack.clear();
+	mCurFileName = filename;
 	mCurReadDepth = 0;
 	setParseSilently(silent);
 
@@ -946,9 +948,9 @@ bool LLXUIParser::writeSDValue(const void* val_ptr, const name_stack_t& stack)
 
 void LLXUIParser::parserWarning(const std::string& message)
 {
-#if 0 //#ifdef LL_WINDOWS
+#ifdef LL_WINDOWS
 	// use Visual Studo friendly formatting of output message for easy access to originating xml
-	llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", LLUICtrlFactory::getInstance()->getCurFileName().c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
+	llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
 	utf16str += '\n';
 	OutputDebugString(utf16str.c_str());
 #else
@@ -958,8 +960,8 @@ void LLXUIParser::parserWarning(const std::string& message)
 
 void LLXUIParser::parserError(const std::string& message)
 {
-#if 0 //#ifdef LL_WINDOWS
-	llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", LLUICtrlFactory::getInstance()->getCurFileName().c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
+#ifdef LL_WINDOWS
+	llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), mCurReadNode->getLineNumber(), message.c_str()).c_str());
 	utf16str += '\n';
 	OutputDebugString(utf16str.c_str());
 #else
diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h
index 6f000f24226f26f086bd162fbd9408bfd9945583..884f4f75780c1b5a60155abbfc9fcd5813be25b7 100644
--- a/indra/llxuixml/llxuiparser.h
+++ b/indra/llxuixml/llxuiparser.h
@@ -34,9 +34,9 @@
 #define LLXUIPARSER_H
 
 #include "llinitparam.h"
-#include "llxmlnode.h"
 #include "llfasttimer.h"
 #include "llregistry.h"
+#include "llpointer.h"
 
 #include <boost/function.hpp>
 #include <iosfwd>
@@ -48,6 +48,8 @@
 class LLView;
 
 
+typedef LLPointer<class LLXMLNode> LLXMLNodePtr;
+
 
 // lookup widget type by name
 class LLWidgetTypeRegistry
@@ -114,7 +116,7 @@ LOG_CLASS(LLXUIParser);
 	/*virtual*/ void parserWarning(const std::string& message);
 	/*virtual*/ void parserError(const std::string& message);
 
-	void readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, bool silent=false);
+	void readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename = LLStringUtil::null, bool silent=false);
 	void writeXUI(LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const LLInitParam::BaseBlock* diff_block = NULL);
 
 private:
@@ -168,6 +170,7 @@ LOG_CLASS(LLXUIParser);
 	S32								mLastWriteGeneration;
 	LLXMLNodePtr					mLastWrittenChild;
 	S32								mCurReadDepth;
+	std::string						mCurFileName;
 };
 
 
diff --git a/indra/media_plugins/gstreamer010/CMakeLists.txt b/indra/media_plugins/gstreamer010/CMakeLists.txt
index 5c0ce3ee17417659129b88d2c4558515d98ecb0f..a9f7938b412f609976470d598965525affb03cd3 100644
--- a/indra/media_plugins/gstreamer010/CMakeLists.txt
+++ b/indra/media_plugins/gstreamer010/CMakeLists.txt
@@ -42,12 +42,12 @@ set(media_plugin_gstreamer010_HEADER_FILES
     llmediaimplgstreamertriviallogging.h
     )
 
-if (${CXX_VERSION} MATCHES "4.[23]")
+if (${CXX_VERSION} MATCHES "4[23].")
     # Work around a bad interaction between broken gstreamer headers and
     # g++ 4.3's increased strictness.
     set_source_files_properties(llmediaimplgstreamervidplug.cpp PROPERTIES
-                                COMPILE_FLAGS -Wno-error=write-strings)
-endif (${CXX_VERSION} MATCHES "4.[23]")
+                                COMPILE_FLAGS -Wno-write-strings)
+endif (${CXX_VERSION} MATCHES "4[23].")
 
 add_library(media_plugin_gstreamer010
     SHARED
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 65872e1596ae609cf83f7a17d6f335088adfaaaf..e42f9739f4fecdcae84943d9e4bd56aa543c6206 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -53,11 +53,11 @@
 	// to get the path to this dll for webkit initialization.
 	// I don't know how/if this can be done with apr...
 	namespace {	HMODULE gModuleHandle;};
-	BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
-	{
-		gModuleHandle = (HMODULE) hinstDLL;
-		return TRUE;
-	}
+	BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+	{
+		gModuleHandle = (HMODULE) hinstDLL;
+		return TRUE;
+	}
 #endif
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -81,6 +81,8 @@ class MediaPluginWebKit :
 	bool	mCanCut;
 	bool	mCanCopy;
 	bool	mCanPaste;
+	int mLastMouseX;
+	int mLastMouseY;
 	
 	////////////////////////////////////////////////////////////////////////////////
 	//
@@ -145,10 +147,10 @@ class MediaPluginWebKit :
 		std::string component_dir;
 		char dll_path[_MAX_PATH];
 		DWORD len = GetModuleFileNameA(gModuleHandle, (LPCH)&dll_path, _MAX_PATH);
-		while(len && dll_path[ len ] != ('\\') )
-		{
-			len--;
-		}
+		while(len && dll_path[ len ] != ('\\') )
+		{
+			len--;
+		}
 		if(len >= 0)
 		{
 			dll_path[len] = 0;
@@ -345,33 +347,30 @@ class MediaPluginWebKit :
 		message.setValue("uri", event.getStringValue());
 		sendMessage(message);
 	}
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void mouseDown( int x, int y )
-	{
-		LLQtWebKit::getInstance()->mouseDown( mBrowserWindowId, x, y );
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void mouseUp( int x, int y )
+	
+	LLQtWebKit::EKeyboardModifier decodeModifiers(std::string &modifiers)
 	{
-		LLQtWebKit::getInstance()->mouseUp( mBrowserWindowId, x, y );
-		LLQtWebKit::getInstance()->focusBrowser( mBrowserWindowId, true );
-		checkEditState();
-	};
+		int result = 0;
+		
+		if(modifiers.find("shift") != std::string::npos)
+			result |= LLQtWebKit::KM_MODIFIER_SHIFT;
 
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void mouseMove( int x, int y )
-	{
-		LLQtWebKit::getInstance()->mouseMove( mBrowserWindowId, x, y );
-	};
+		if(modifiers.find("alt") != std::string::npos)
+			result |= LLQtWebKit::KM_MODIFIER_ALT;
+		
+		if(modifiers.find("control") != std::string::npos)
+			result |= LLQtWebKit::KM_MODIFIER_CONTROL;
+		
+		if(modifiers.find("meta") != std::string::npos)
+			result |= LLQtWebKit::KM_MODIFIER_META;
+		
+		return (LLQtWebKit::EKeyboardModifier)result;
+	}
+	
 
 	////////////////////////////////////////////////////////////////////////////////
 	//
-	void keyPress( int key )
+	void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers)
 	{
 		int llqt_key;
 		
@@ -425,7 +424,7 @@ class MediaPluginWebKit :
 		
 		if(llqt_key != 0)
 		{
-			LLQtWebKit::getInstance()->keyPress( mBrowserWindowId, llqt_key );
+			LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, key_event, llqt_key, modifiers);
 		}
 
 		checkEditState();
@@ -433,7 +432,7 @@ class MediaPluginWebKit :
 
 	////////////////////////////////////////////////////////////////////////////////
 	//
-	void unicodeInput( const std::string &utf8str )
+	void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers)
 	{
 		LLWString wstr = utf8str_to_wstring(utf8str);
 		
@@ -442,7 +441,7 @@ class MediaPluginWebKit :
 		{
 //			std::cerr << "unicode input, code = 0x" << std::hex << (unsigned long)(wstr[i]) << std::dec << std::endl;
 			
-			LLQtWebKit::getInstance()->unicodeInput(mBrowserWindowId, wstr[i]);
+			LLQtWebKit::getInstance()->unicodeInput(mBrowserWindowId, wstr[i], modifiers);
 		}
 
 		checkEditState();
@@ -494,6 +493,8 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_
 	mCanCut = false;
 	mCanCopy = false;
 	mCanPaste = false;
+	mLastMouseX = 0;
+	mLastMouseY = 0;
 }
 
 MediaPluginWebKit::~MediaPluginWebKit()
@@ -678,66 +679,84 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
 			else if(message_name == "mouse_event")
 			{
 				std::string event = message_in.getValue("event");
-				S32 x = message_in.getValueS32("x");
-				S32 y = message_in.getValueS32("y");
-				// std::string modifiers = message.getValue("modifiers");
-	
+				S32 button = message_in.getValueS32("button");
+				mLastMouseX = message_in.getValueS32("x");
+				mLastMouseY = message_in.getValueS32("y");
+				std::string modifiers = message_in.getValue("modifiers");
+				
+				// Treat unknown mouse events as mouse-moves.
+				LLQtWebKit::EMouseEvent mouse_event = LLQtWebKit::ME_MOUSE_MOVE;
 				if(event == "down")
 				{
-					mouseDown(x, y);
-					//std::cout << "Mouse down at " << x << " x " << y << std::endl;
+					mouse_event = LLQtWebKit::ME_MOUSE_DOWN;
 				}
 				else if(event == "up")
 				{
-					mouseUp(x, y);
-					//std::cout << "Mouse up at " << x << " x " << y << std::endl;
+					mouse_event = LLQtWebKit::ME_MOUSE_UP;
 				}
-				else if(event == "move")
+				else if(event == "double_click")
 				{
-					mouseMove(x, y);
-					//std::cout << ">>>>>>>>>>>>>>>>>>>> Mouse move at " << x << " x " << y << std::endl;
+					mouse_event = LLQtWebKit::ME_MOUSE_DOUBLE_CLICK;
 				}
+				
+				LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, mouse_event, button, mLastMouseX, mLastMouseY, decodeModifiers(modifiers));
+				checkEditState();
 			}
 			else if(message_name == "scroll_event")
 			{
-				// S32 x = message_in.getValueS32("x");
+				S32 x = message_in.getValueS32("x");
 				S32 y = message_in.getValueS32("y");
-				// std::string modifiers = message.getValue("modifiers");
+				std::string modifiers = message_in.getValue("modifiers");
 				
-				// We currently ignore horizontal scrolling.
-				// The scroll values are roughly 1 per wheel click, so we need to magnify them by some factor.
-				// Arbitrarily, I choose 16.
-				y *= 16;
-				LLQtWebKit::getInstance()->scrollByLines(mBrowserWindowId, y);
+				// Incoming scroll events are adjusted so that 1 detent is approximately 1 unit.
+				// Qt expects 1 detent to be 120 units.
+				// It also seems that our y scroll direction is inverted vs. what Qt expects.
+				
+				x *= 120;
+				y *= -120;
+				
+				LLQtWebKit::getInstance()->scrollWheelEvent(mBrowserWindowId, mLastMouseX, mLastMouseY, x, y, decodeModifiers(modifiers));
 			}
 			else if(message_name == "key_event")
 			{
 				std::string event = message_in.getValue("event");
-
-				// act on "key down" or "key repeat"
-				if ( (event == "down") || (event == "repeat") )
+				S32 key = message_in.getValueS32("key");
+				std::string modifiers = message_in.getValue("modifiers");
+				
+				// Treat unknown events as key-up for safety.
+				LLQtWebKit::EKeyEvent key_event = LLQtWebKit::KE_KEY_UP;
+				if(event == "down")
 				{
-					S32 key = message_in.getValueS32("key");
-					keyPress( key );
-				};
+					key_event = LLQtWebKit::KE_KEY_DOWN;
+				}
+				else if(event == "repeat")
+				{
+					key_event = LLQtWebKit::KE_KEY_REPEAT;
+				}
+				
+				keyEvent(key_event, key, decodeModifiers(modifiers));
 			}
 			else if(message_name == "text_event")
 			{
 				std::string text = message_in.getValue("text");
+				std::string modifiers = message_in.getValue("modifiers");
 				
-				unicodeInput(text);
+				unicodeInput(text, decodeModifiers(modifiers));
 			}
 			if(message_name == "edit_cut")
 			{
 				LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_CUT );
+				checkEditState();
 			}
 			if(message_name == "edit_copy")
 			{
 				LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_COPY );
+				checkEditState();
 			}
 			if(message_name == "edit_paste")
 			{
 				LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_PASTE );
+				checkEditState();
 			}
 			else
 			{
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 1e5a798202921fdee24f6a0870acd6b98479a6e4..dd3937a6eff2e79a81bb13bfb919a682919b3567 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -70,6 +70,7 @@ set(viewer_SOURCE_FILES
     llagentaccess.cpp
     llagentdata.cpp
     llagentlanguage.cpp
+    llagentpicksinfo.cpp
     llagentpilot.cpp
     llagentui.cpp
     llagentwearables.cpp
@@ -113,6 +114,7 @@ set(viewer_SOURCE_FILES
     lldebugview.cpp
     lldelayedgestureerror.cpp
     lldirpicker.cpp
+    lldndbutton.cpp
     lldrawable.cpp
     lldrawpoolalpha.cpp
     lldrawpoolavatar.cpp
@@ -341,6 +343,7 @@ set(viewer_SOURCE_FILES
     llpanelteleporthistory.cpp
     llpanelvolume.cpp
     llparcelselection.cpp
+    llparticipantlist.cpp
     llpatchvertexarray.cpp
     llplacesinventorybridge.cpp
     llpolymesh.cpp
@@ -414,6 +417,8 @@ set(viewer_SOURCE_FILES
     lltoolselectland.cpp
     lltoolselectrect.cpp
     lltracker.cpp
+    lltransientdockablefloater.cpp
+    lltransientfloatermgr.cpp
     lluilistener.cpp
     lluploaddialog.cpp
     llurl.cpp
@@ -540,6 +545,7 @@ set(viewer_HEADER_FILES
     llagentaccess.h
     llagentdata.h
     llagentlanguage.h
+    llagentpicksinfo.h
     llagentpilot.h
     llagentui.h
     llagentwearables.h
@@ -585,6 +591,7 @@ set(viewer_HEADER_FILES
     lldebugview.h
     lldelayedgestureerror.h
     lldirpicker.h
+    lldndbutton.h
     lldrawable.h
     lldrawpool.h
     lldrawpoolalpha.h
@@ -810,6 +817,7 @@ set(viewer_HEADER_FILES
     llpanelteleporthistory.h
     llpanelvolume.h
     llparcelselection.h
+    llparticipantlist.h
     llpatchvertexarray.h
     llplacesinventorybridge.h
     llpolymesh.h
@@ -886,6 +894,8 @@ set(viewer_HEADER_FILES
     lltoolselectland.h
     lltoolselectrect.h
     lltracker.h
+    lltransientdockablefloater.h
+    lltransientfloatermgr.h
     lluiconstants.h
     lluilistener.h
     lluploaddialog.h
@@ -1378,7 +1388,11 @@ if (WINDOWS)
         COMMENT "Copying staged dlls."
         )
 
-      add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon llkdu)
+      add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon)
+      if(LLKDU_LIBRARY)
+	# kdu may not exist!
+	add_dependencies(${VIEWER_BINARY_NAME} llkdu)
+      endif(LLKDU_LIBRARY)
     endif(WINDOWS)    
 
     if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
diff --git a/indra/newview/app_settings/foldertypes.xml b/indra/newview/app_settings/foldertypes.xml
index 698158308e142ae3a2ea9a610bc3ea3a8b57fdd8..2038779c4f569ba1304e1615a2954de6c8312ff6 100644
--- a/indra/newview/app_settings/foldertypes.xml
+++ b/indra/newview/app_settings/foldertypes.xml
@@ -65,10 +65,4 @@
     icon_name="inv_folder_outfit_undershirt.tga"
 	allowed="undershirt"
      />
-  <ensemble
-    asset_num="47"
-    xui_name="outfit"
-    icon_name="inv_folder_outfit.tga"
-	allowed="outfit"
-     />
 </ensemble_defs>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 9adf893e4b8a123fae5855f84945590dae366b92..c34b2798d159c464b5bc7d01443eb07de1e1d0b9 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -375,6 +375,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>AutoPlayMedia</key>
+    <map>
+      <key>Comment</key>
+      <string>Allow media objects to automatically play or navigate?</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>AutoSnapshot</key>
     <map>
       <key>Comment</key>
@@ -4842,10 +4853,10 @@
       <key>Value</key>
       <integer>350</integer>
     </map>
-    <key>NotificationToastTime</key>
+    <key>NotificationToastLifeTime</key>
     <map>
       <key>Comment</key>
-      <string>Width of notification messages</string>
+      <string>Number of seconds while a notification toast exists</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -4853,21 +4864,32 @@
       <key>Value</key>
       <integer>5</integer>
     </map>
+    <key>NotificationTipToastLifeTime</key>
+    <map>
+      <key>Comment</key>
+      <string>Number of seconds while a notification tip toast exist</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>10</integer>
+    </map>
     <key>ToastOpaqueTime</key>
     <map>
       <key>Comment</key>
-      <string>Width of notification messages</string>
+      <string>Number of seconds while a toast is fading </string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
       <string>S32</string>
       <key>Value</key>
-      <integer>4</integer>
+      <integer>1</integer>
     </map>
-    <key>StartUpToastTime</key>
+    <key>StartUpToastLifeTime</key>
     <map>
       <key>Comment</key>
-      <string>Width of notification messages</string>
+      <string>Number of seconds while a StartUp toast exist</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -4875,10 +4897,10 @@
       <key>Value</key>
       <integer>5</integer>
     </map>
-    <key>ToastMargin</key>
+    <key>ToastGap</key>
     <map>
       <key>Comment</key>
-      <string>Width of notification messages</string>
+      <string>Gap between toasts on a screen</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -4889,7 +4911,7 @@
     <key>ChannelBottomPanelMargin</key>
     <map>
       <key>Comment</key>
-      <string>Width of notification messages</string>
+      <string>Space from a lower toast to the Bottom Tray</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -4900,7 +4922,7 @@
     <key>NotificationChannelRightMargin</key>
     <map>
       <key>Comment</key>
-      <string>Width of notification messages</string>
+      <string>Space between toasts and a right border of an area where they can appear</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -4911,7 +4933,7 @@
     <key>OverflowToastHeight</key>
     <map>
       <key>Comment</key>
-      <string>Width of notification messages</string>
+      <string>Height of an overflow toast</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -8570,13 +8592,13 @@
     <key>ToolTipVisibleTimeNear</key>
     <map>
       <key>Comment</key>
-      <string>Fade tooltip after after time passes (seconds) while mouse near tooltip</string>
+      <string>Fade tooltip after after time passes (seconds) while mouse near tooltip or original position</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
       <string>F32</string>
       <key>Value</key>
-      <real>5.0</real>
+      <real>10.0</real>
     </map>
     <key>ToolTipVisibleTimeOver</key>
     <map>
@@ -10537,6 +10559,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>ShowDeviceSettings</key>
+    <map>
+      <key>Comment</key>
+      <string>Show device settings</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>soundsbeacon</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
index 8bd702a8da9046d103a8eabdf7102eed7e5f2741..28908a311d77b833a4b948ecb6c4d86b0171723e 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
@@ -46,11 +46,15 @@ void main()
 	
 	dlt /= max(-pos.z*dist_factor, 1.0);
 	
-	vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
+	vec2 defined_weight = kern[0].xy; // special case the kern[0] (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
 	vec4 col = defined_weight.xyxx * ccol;
+
+	float center_e = 1.0 - (texture2DRect(edgeMap, vary_fragcoord.xy).a+
+		      texture2DRect(edgeMap, vary_fragcoord.xy+dlt*0.333).a+
+	              texture2DRect(edgeMap, vary_fragcoord.xy-dlt*0.333).a);
 	
-	float e = 1.0;
-	for (int i = 0; i < 4; i++)
+	float e = center_e;
+	for (int i = 1; i < 4; i++)
 	{
 		vec2 tc = vary_fragcoord.xy + kern[i].z*dlt;
 		
@@ -67,10 +71,8 @@ void main()
 			texture2DRect(edgeMap, tc.xy-dlt*0.333).a;
 	}
 
-
-	e = 1.0;
-	
-	for (int i = 0; i < 4; i++)
+	e = center_e;
+	for (int i = 1; i < 4; i++)
 	{
 		vec2 tc = vary_fragcoord.xy - kern[i].z*dlt;
 		
diff --git a/indra/newview/llagentpicksinfo.cpp b/indra/newview/llagentpicksinfo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6e5835bace2b12a8162ac9a93b7021a7a4b6036e
--- /dev/null
+++ b/indra/newview/llagentpicksinfo.cpp
@@ -0,0 +1,130 @@
+/** 
+ * @file llagentpicksinfo.cpp
+ * @brief LLAgentPicksInfo class implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llagentpicksinfo.h"
+
+#include "llagent.h"
+#include "llavatarconstants.h"
+#include "llavatarpropertiesprocessor.h"
+
+class LLAgentPicksInfo::LLAgentPicksObserver : public LLAvatarPropertiesObserver
+{
+public:
+	LLAgentPicksObserver()
+	{
+		LLAvatarPropertiesProcessor::getInstance()->addObserver(gAgent.getID(), this);
+	}
+
+	~LLAgentPicksObserver()
+	{
+		LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this);
+	}
+
+	void sendAgentPicksRequest()
+	{
+		LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(gAgent.getID());
+	}
+
+	typedef boost::function<void(LLAvatarPicks*)> server_respond_callback_t;
+
+	void setServerRespondCallback(const server_respond_callback_t& cb)
+	{
+		mServerRespondCallback = cb;
+	}
+
+	virtual void processProperties(void* data, EAvatarProcessorType type)
+	{
+		if(APT_PICKS == type)
+		{
+			LLAvatarPicks* picks = static_cast<LLAvatarPicks*>(data);
+			if(picks && gAgent.getID() == picks->target_id)
+			{
+				if(mServerRespondCallback)
+				{
+					mServerRespondCallback(picks);
+				}
+			}
+		}
+	}
+
+private:
+
+	server_respond_callback_t mServerRespondCallback;
+};
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLAgentPicksInfo::LLAgentPicksInfo()
+ : mAgentPicksObserver(NULL)
+ , mMaxNumberOfPicks(MAX_AVATAR_PICKS)
+ // Disable Pick creation until we get number of Picks from server - in case 
+ // avatar has maximum number of Picks.
+ , mNumberOfPicks(mMaxNumberOfPicks) 
+{
+}
+
+LLAgentPicksInfo::~LLAgentPicksInfo()
+{
+	delete mAgentPicksObserver;
+}
+
+void LLAgentPicksInfo::requestNumberOfPicks()
+{
+	if(!mAgentPicksObserver)
+	{
+		mAgentPicksObserver = new LLAgentPicksObserver();
+
+		mAgentPicksObserver->setServerRespondCallback(boost::bind(
+			&LLAgentPicksInfo::onServerRespond, this, _1));
+	}
+
+	mAgentPicksObserver->sendAgentPicksRequest();
+}
+
+bool LLAgentPicksInfo::isPickLimitReached()
+{
+	return getNumberOfPicks() >= getMaxNumberOfPicks();
+}
+
+void LLAgentPicksInfo::onServerRespond(LLAvatarPicks* picks)
+{
+	if(!picks)
+	{
+		llerrs << "Unexpected value" << llendl;
+		return;
+	}
+
+	setNumberOfPicks(picks->picks_list.size());
+}
diff --git a/indra/newview/llagentpicksinfo.h b/indra/newview/llagentpicksinfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..0e30f2c5a0e3ba6cb403301ebac156f639e0ce66
--- /dev/null
+++ b/indra/newview/llagentpicksinfo.h
@@ -0,0 +1,106 @@
+/** 
+ * @file llagentpicksinfo.h
+ * @brief LLAgentPicksInfo class header file
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ * 
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLAGENTPICKS_H
+#define LL_LLAGENTPICKS_H
+
+#include "llsingleton.h"
+
+struct LLAvatarPicks;
+
+/**
+ * Class that provides information about Agent Picks
+ */
+class LLAgentPicksInfo : public LLSingleton<LLAgentPicksInfo>
+{
+	class LLAgentPicksObserver;
+
+public:
+
+	LLAgentPicksInfo();
+	
+	virtual ~LLAgentPicksInfo();
+
+	/**
+	 * Requests number of picks from server. 
+	 * 
+	 * Number of Picks is requested from server, thus it is not available immediately.
+	 */
+	void requestNumberOfPicks();
+
+	/**
+	 * Returns number of Picks.
+	 */
+	S32 getNumberOfPicks() { return mNumberOfPicks; }
+
+	/**
+	 * Returns maximum number of Picks.
+	 */
+	S32 getMaxNumberOfPicks() { return mMaxNumberOfPicks; }
+
+	/**
+	 * Returns TRUE if Agent has maximum allowed number of Picks.
+	 */
+	bool isPickLimitReached();
+
+	/**
+	 * After creating or deleting a Pick we can assume operation on server will be 
+	 * completed successfully. Incrementing/decrementing number of picks makes new number
+	 * of picks available immediately. Actual number of picks will be updated when we receive 
+	 * response from server.
+	 */
+	void incrementNumberOfPicks() { ++mNumberOfPicks; }
+
+	void decrementNumberOfPicks() { --mNumberOfPicks; }
+
+private:
+
+	void onServerRespond(LLAvatarPicks* picks);
+
+	/**
+	* Sets number of Picks.
+	*/
+	void setNumberOfPicks(S32 number) { mNumberOfPicks = number; }
+
+	/**
+	* Sets maximum number of Picks.
+	*/
+	void setMaxNumberOfPicks(S32 max_picks) { mMaxNumberOfPicks = max_picks; }
+
+private:
+
+	LLAgentPicksObserver* mAgentPicksObserver;
+	S32 mMaxNumberOfPicks;
+	S32 mNumberOfPicks;
+};
+
+#endif //LL_LLAGENTPICKS_H
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 34d2c000077e906cd7b8c795f115e23d28b27f8d..b9a0b4293ddd626eadabfb2abe26f5429bd95d0f 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -68,8 +68,11 @@ class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
 		EWearableType mType;
 		LLUUID mItemID;
 		LLUUID mAssetID;
-		InitialWearableData(EWearableType type, LLUUID itemID, LLUUID assetID) :
-			mType(type), mItemID(itemID), mAssetID(assetID) { }
+		InitialWearableData(EWearableType type, LLUUID& itemID, LLUUID& assetID) :
+			mType(type),
+			mItemID(itemID),
+			mAssetID(assetID)
+		{}
 	};
 
 	typedef std::vector<InitialWearableData> initial_wearable_data_vec_t;
@@ -646,6 +649,7 @@ void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearab
 	else
 	{
 		wearable_vec[index] = wearable;
+		mAvatarObject->wearableUpdated(wearable->getType());
 	}
 }
 
@@ -654,20 +658,29 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl
 	if (wearable == NULL)
 	{
 		// no null wearables please!
-		//TODO: insert llwarns
+		llwarns << "Null wearable sent for type " << type << llendl;
 		return MAX_WEARABLES_PER_TYPE;
 	}
 	if (type < WT_COUNT || mWearableDatas[type].size() < MAX_WEARABLES_PER_TYPE)
 	{
 		mWearableDatas[type].push_back(wearable);
+		mAvatarObject->wearableUpdated(wearable->getType());
 		return mWearableDatas[type].size()-1;
 	}
 	return MAX_WEARABLES_PER_TYPE;
 }
 
-void LLAgentWearables::popWearable(const EWearableType type, LLWearable *wearable)
+void LLAgentWearables::popWearable(LLWearable *wearable)
 {
-	U32 index = getWearableIndex(type, wearable);
+	if (wearable == NULL)
+	{
+		// nothing to do here. move along.
+		return;
+	}
+
+	U32 index = getWearableIndex(wearable);
+	EWearableType type = wearable->getType();
+
 	if (index < MAX_WEARABLES_PER_TYPE && index < getWearableCount(type))
 	{
 		popWearable(type, index);
@@ -676,14 +689,22 @@ void LLAgentWearables::popWearable(const EWearableType type, LLWearable *wearabl
 
 void LLAgentWearables::popWearable(const EWearableType type, U32 index)
 {
-	if (getWearable(type, index))
+	LLWearable *wearable = getWearable(type, index);
+	if (wearable)
 	{
 		mWearableDatas[type].erase(mWearableDatas[type].begin() + index);
+		mAvatarObject->wearableUpdated(wearable->getType());
 	}
 }
 
-U32	LLAgentWearables::getWearableIndex(const EWearableType type, LLWearable *wearable)
+U32	LLAgentWearables::getWearableIndex(LLWearable *wearable)
 {
+	if (wearable == NULL)
+	{
+		return MAX_WEARABLES_PER_TYPE;
+	}
+
+	const EWearableType type = wearable->getType();
 	wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type);
 	if (wearable_iter == mWearableDatas.end())
 	{
@@ -777,22 +798,12 @@ const LLUUID LLAgentWearables::getWearableAssetID(EWearableType type, U32 index)
 		return LLUUID();
 }
 
-// Warning: include_linked_items = TRUE makes this operation expensive.
-BOOL LLAgentWearables::isWearingItem(const LLUUID& item_id, BOOL include_linked_items) const
+BOOL LLAgentWearables::isWearingItem(const LLUUID& item_id) const
 {
-	if (getWearableFromItemID(item_id) != NULL) return TRUE;
-	if (include_linked_items)
+	const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
+	if (getWearableFromItemID(base_item_id) != NULL) 
 	{
-		LLInventoryModel::item_array_t item_array;
-		gInventory.collectLinkedItems(item_id, item_array);
-		for (LLInventoryModel::item_array_t::iterator iter = item_array.begin();
-			 iter != item_array.end();
-			 iter++)
-		{
-			LLViewerInventoryItem *linked_item = (*iter);
-			const LLUUID &linked_item_id = linked_item->getUUID();
-			if (getWearableFromItemID(linked_item_id) != NULL) return TRUE;
-		}
+		return TRUE;
 	}
 	return FALSE;
 }
@@ -1090,7 +1101,7 @@ void LLAgentWearables::getAllWearablesArray(LLDynamicArray<S32>& wearables)
 {
 	for( S32 i = 0; i < WT_COUNT; ++i )
 	{
-		if (getWearableCount( (EWearableType) i) !=  0 )
+		if (getWearableCount((EWearableType) i) !=  0)
 		{
 			wearables.push_back(i);
 		}
@@ -1300,13 +1311,18 @@ void LLAgentWearables::addWearableToAgentInventory(LLPointer<LLInventoryCallback
 
 void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_all, U32 index)
 {
-	if ((gAgent.isTeen())
-		&& (type == WT_UNDERSHIRT || type == WT_UNDERPANTS))
+	if (gAgent.isTeen() &&
+		(type == WT_UNDERSHIRT || type == WT_UNDERPANTS))
 	{
 		// Can't take off underclothing in simple UI mode or on PG accounts
 		// TODO: enable the removing of a single undershirt/underpants if multiple are worn. - Nyx
 		return;
 	}
+	if (getWearableCount(type) == 0)
+	{
+		// no wearables to remove
+		return;
+	}
 
 	if (do_remove_all)
 	{
@@ -1373,8 +1389,9 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
 		for (S32 i=max_entry; i>=0; i--)
 		{
 			LLWearable* old_wearable = getWearable(type,i);
-			gInventory.addChangedMask(LLInventoryObserver::LABEL, getWearableItemID(type,i));
+			const LLUUID &item_id = getWearableItemID(type,i);
 			popWearable(type,i);
+			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
 
 			//queryWearableCache(); // moved below
 			if (old_wearable)
@@ -1388,8 +1405,9 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
 	{
 		LLWearable* old_wearable = getWearable(type, index);
 
-		gInventory.addChangedMask(LLInventoryObserver::LABEL, getWearableItemID(type,index));
+		const LLUUID &item_id = getWearableItemID(type,index);
 		popWearable(type, index);
+		gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
 
 		//queryWearableCache(); // moved below
 
@@ -1428,6 +1446,9 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
 	wearables_to_remove[WT_UNDERSHIRT]	= (!gAgent.isTeen()) & remove;
 	wearables_to_remove[WT_UNDERPANTS]	= (!gAgent.isTeen()) & remove;
 	wearables_to_remove[WT_SKIRT]		= remove;
+	wearables_to_remove[WT_ALPHA]		= remove;
+	wearables_to_remove[WT_TATTOO]		= remove;
+
 
 	S32 count = wearables.count();
 	llassert(items.count() == count);
@@ -1454,7 +1475,6 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
 			}
 
 			gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
-
 			// Assumes existing wearables are not dirty.
 			if (old_wearable->isDirty())
 			{
@@ -1476,7 +1496,8 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
 		{
 			// MULTI_WEARABLE: assuming 0th
 			LLWearable* wearable = getWearable((EWearableType)i, 0);
-			gInventory.addChangedMask(LLInventoryObserver::LABEL, getWearableItemID((EWearableType)i,0));
+			const LLUUID &item_id = getWearableItemID((EWearableType)i,0);
+			gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
 			if (wearable)
 			{
 				wearables_being_removed.push_back(wearable);
@@ -1740,6 +1761,8 @@ void LLAgentWearables::userRemoveAllClothesStep2(BOOL proceed)
 		gAgentWearables.removeWearable(WT_UNDERSHIRT,true,0);
 		gAgentWearables.removeWearable(WT_UNDERPANTS,true,0);
 		gAgentWearables.removeWearable(WT_SKIRT,true,0);
+		gAgentWearables.removeWearable(WT_ALPHA,true,0);
+		gAgentWearables.removeWearable(WT_TATTOO,true,0);
 	}
 }
 
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 6b456abfa764f197b46b89ace88912239d887781..667cb9455233e83aa21f7b76532288bb79219cfe 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -70,7 +70,7 @@ class LLAgentWearables
 	// Queries
 	//--------------------------------------------------------------------
 public:
-	BOOL			isWearingItem(const LLUUID& item_id, const BOOL include_linked_items = FALSE) const;
+	BOOL			isWearingItem(const LLUUID& item_id) const;
 	BOOL			isWearableModifiable(EWearableType type, U32 index /*= 0*/) const;
 	BOOL			isWearableCopyable(EWearableType type, U32 index /*= 0*/) const;
 	BOOL			areWearablesLoaded() const;
@@ -79,7 +79,6 @@ class LLAgentWearables
 	
 	// Note: False for shape, skin, eyes, and hair, unless you have MORE than 1.
 	bool			canWearableBeRemoved(const LLWearable* wearable) const;
-
 	
 	//--------------------------------------------------------------------
 	// Accessors
@@ -106,7 +105,7 @@ class LLAgentWearables
 	// Low-level data structure setter - public access is via setWearableItem, etc.
 	void 			setWearable(const EWearableType type, U32 index, LLWearable *wearable);
 	U32 			pushWearable(const EWearableType type, LLWearable *wearable);
-	void 			popWearable(const EWearableType type, LLWearable *wearable);
+	void 			popWearable(LLWearable *wearable);
 	void			popWearable(const EWearableType type, U32 index);
 	
 public:
@@ -114,7 +113,8 @@ class LLAgentWearables
 	void			setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove);
 	void			setWearableName(const LLUUID& item_id, const std::string& new_name);
 	void			addLocalTextureObject(const EWearableType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index);
-	U32				getWearableIndex(const EWearableType type, LLWearable *wearable);
+	U32				getWearableIndex(LLWearable *wearable);
+
 protected:
 	void			setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append = false);
 	static bool		onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable);
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 0cf28f590a669bc972f2ca88ace1da630d8a99e9..4e022aeb299f25df73cb14cc8032f28093cdf56b 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -350,13 +350,15 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
 }
 
 
-/* static */ LLUUID LLAppearanceManager::getCOF()
+/* static */ 
+LLUUID LLAppearanceManager::getCOF()
 {
 	return gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
 }
 
 // Update appearance from outfit folder.
-/* static */ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)
+/* static */ 
+void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)
 {
 	if (!proceed)
 		return;
@@ -381,7 +383,8 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
 }
 
 // Append to current COF contents by recursively traversing a folder.
-/* static */ void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append)
+/* static */ 
+void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append)
 {
 		// BAP consolidate into one "get all 3 types of descendents" function, use both places.
 	LLInventoryModel::item_array_t wear_items;
@@ -473,8 +476,9 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
 	}
 }
 
-/* static */ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
-														   LLPointer<LLInventoryCallback> cb)
+/* static */ 
+void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
+											  LLPointer<LLInventoryCallback> cb)
 {
 	LLInventoryModel::cat_array_t cats;
 	LLInventoryModel::item_array_t items;
@@ -517,13 +521,15 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
 	}
 }
 
-/* static */ bool LLAppearanceManager::isMandatoryWearableType(EWearableType type)
+/* static */ 
+bool LLAppearanceManager::isMandatoryWearableType(EWearableType type)
 {
 	return (type==WT_SHAPE) || (type==WT_SKIN) || (type== WT_HAIR) || (type==WT_EYES);
 }
 
 // For mandatory body parts.
-/* static */ void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found)
+/* static */ 
+void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found)
 {
 	LLInventoryModel::cat_array_t new_cats;
 	LLInventoryModel::item_array_t new_items;
@@ -548,7 +554,8 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
 // with contents of new category.  This means preserving any mandatory
 // body parts that aren't present in the new category, and getting rid
 // of everything else.
-/* static */ void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category)
+/* static */ 
+void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category)
 {
 	// See which mandatory body types are present in the new category.
 	std::set<EWearableType> wt_types_found;
@@ -580,7 +587,8 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
 }
 
 // Replace COF contents from a given outfit folder.
-/* static */ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)
+/* static */ 
+void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)
 {
 	lldebugs << "rebuildCOFFromOutfit()" << llendl;
 
@@ -688,7 +696,8 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
 //	dec_busy_count();
 }
 
-/* static */ void LLAppearanceManager::updateAppearanceFromCOF()
+/* static */ 
+void LLAppearanceManager::updateAppearanceFromCOF()
 {
 	dumpCat(getCOF(),"COF, start");
 
@@ -739,7 +748,7 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
 		LLDynamicArray<LLFoundData*> found_container;
 		for(S32 i = 0; i  < wear_items.count(); ++i)
 		{
-			found = new LLFoundData(wear_items.get(i)->getUUID(),
+			found = new LLFoundData(wear_items.get(i)->getLinkedUUID(), // Wear the base item, not the link
 									wear_items.get(i)->getAssetUUID(),
 									wear_items.get(i)->getName(),
 									wear_items.get(i)->getType());
@@ -770,7 +779,7 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
 
 /* static */ 
 void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category,
-															  LLInventoryModel::item_array_t& items)
+												 LLInventoryModel::item_array_t& items)
 {
 	LLInventoryModel::cat_array_t cats;
 	LLFindCOFValidItems is_cof_valid;
@@ -783,11 +792,12 @@ void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category,
 									follow_folder_links);
 }
 
-/* static */ void LLAppearanceManager::getUserDescendents(const LLUUID& category, 
-														  LLInventoryModel::item_array_t& wear_items,
-														  LLInventoryModel::item_array_t& obj_items,
-														  LLInventoryModel::item_array_t& gest_items,
-														  bool follow_folder_links)
+/* static */ 
+void LLAppearanceManager::getUserDescendents(const LLUUID& category, 
+											 LLInventoryModel::item_array_t& wear_items,
+											 LLInventoryModel::item_array_t& obj_items,
+											 LLInventoryModel::item_array_t& gest_items,
+											 bool follow_folder_links)
 {
 	LLInventoryModel::cat_array_t wear_cats;
 	LLFindWearables is_wearable;
@@ -966,7 +976,7 @@ void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update
 }
 
 /* static */
-void LLAppearanceManager::removeItemLinks(LLUUID& item_id, bool do_update)
+void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
 {
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t item_array;
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 928b5f2bcd4cbbb5aa3f9ebbe81320329e9504d4..828af321013a86a904b1ce4824335be363c93c25 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -62,7 +62,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	static LLUUID getCOF();
 
 	// Remove COF entries
-	static void removeItemLinks(LLUUID& item_id, bool do_update = true);
+	static void removeItemLinks(const LLUUID& item_id, bool do_update = true);
 
 	// For debugging - could be moved elsewhere.
 	static void dumpCat(const LLUUID& cat_id, std::string str);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 5b769dcab469d73077c11cae6a6cec85eea01777..923a66ee8e344f7ca26d6460670430be56d0782e 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1206,6 +1206,9 @@ bool LLAppViewer::mainLoop()
 
 bool LLAppViewer::cleanup()
 {
+	// workaround for DEV-35406 crash on shutdown
+	LLEventPumps::instance().reset();
+
 	// *TODO - generalize this and move DSO wrangling to a helper class -brad
 	std::set<struct apr_dso_handle_t *>::const_iterator i;
 	for(i = mPlugins.begin(); i != mPlugins.end(); ++i)
@@ -1214,9 +1217,7 @@ bool LLAppViewer::cleanup()
 		apr_status_t rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll_plugin_stop_func, *i, "ll_plugin_stop");
 		ll_plugin_stop_func();
 
-		// *NOTE - disabled unloading as partial solution to DEV-35406 crash on shutdown
-		//rv = apr_dso_unload(*i);
-		(void)rv;
+		rv = apr_dso_unload(*i);
 	}
 	mPlugins.clear();
 
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 7ae1b5cd4a75647f082dd2e4ecb142a42da9f9cf..ebcda13dd495310df29805b485192122db4f353c 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -152,6 +152,8 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
 :	LLIconCtrl(p),
 	mDrawTooltip(p.draw_tooltip)
 {
+	mPriority = LLViewerFetchedTexture::BOOST_ICON;
+	
 	LLRect rect = p.rect;
 
 	static LLUICachedControl<S32> llavatariconctrl_symbol_hpad("UIAvatariconctrlSymbolHPad", 2);
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index ef48420490b45201bed5ac6caef7a54b9aed04c1..3a07c6e5efdba952109910e04ef09337beddf496 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -57,17 +57,13 @@ static const LLAvatarItemNameComparator NAME_COMPARATOR;
 static const LLFlatListView::ItemReverseComparator REVERSE_NAME_COMPARATOR(NAME_COMPARATOR);
 
 LLAvatarList::Params::Params()
-:
-volume_column_width("volume_column_width", 0)
-, online_go_first("online_go_first", true)
+: ignore_online_status("ignore_online_status", false)
 {
 }
 
-
-
 LLAvatarList::LLAvatarList(const Params& p)
 :	LLFlatListView(p)
-, mOnlineGoFirst(p.online_go_first)
+, mIgnoreOnlineStatus(p.ignore_online_status)
 , mContextMenu(NULL)
 , mDirty(true) // to force initial update
 {
@@ -194,15 +190,15 @@ void LLAvatarList::refresh()
 }
 
 
-void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_bold, EAddPosition pos)
+void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
 {
 	LLAvatarListItem* item = new LLAvatarListItem();
 	item->showStatus(false);
 	item->showInfoBtn(true);
 	item->showSpeakingIndicator(true);
 	item->setName(name);
-	item->setAvatarId(id);
-	item->setOnline(is_bold);
+	item->setAvatarId(id, mIgnoreOnlineStatus);
+	item->setOnline(mIgnoreOnlineStatus ? true : is_online);
 	item->setContextMenu(mContextMenu);
 
 	item->childSetVisible("info_btn", false);
@@ -210,6 +206,19 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
 	addItem(item, id, pos);
 }
 
+// virtual
+BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+	BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
+	if ( mContextMenu )
+	{
+		std::vector<LLUUID> selected_uuids;
+		getSelectedUUIDs(selected_uuids);
+		mContextMenu->show(this, selected_uuids, x, y);
+	}
+	return handled;
+}
+
 void LLAvatarList::computeDifference(
 	const std::vector<LLUUID>& vnew_unsorted,
 	std::vector<LLUUID>& vadded,
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index ec801645feb10c1e229d1cc6359bc41d89aa3061..a83a72b26ca94ae48cd276b1a4c966c52ca0c4b1 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -55,8 +55,7 @@ class LLAvatarList : public LLFlatListView
 
 	struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> 
 	{
-		Optional<S32> volume_column_width;
-		Optional<bool> online_go_first;
+		Optional<bool> ignore_online_status; // show all items as online
 		Params();
 	};
 
@@ -72,11 +71,12 @@ class LLAvatarList : public LLFlatListView
 	void setContextMenu(LLAvatarListItem::ContextMenu* menu) { mContextMenu = menu; }
 
 	void sortByName();
+	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
 protected:
 	void refresh();
 
-	void addNewItem(const LLUUID& id, const std::string& name, BOOL is_bold, EAddPosition pos = ADD_BOTTOM);
+	void addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos = ADD_BOTTOM);
 	void computeDifference(
 		const std::vector<LLUUID>& vnew,
 		std::vector<LLUUID>& vadded,
@@ -84,7 +84,7 @@ class LLAvatarList : public LLFlatListView
 
 private:
 
-	bool mOnlineGoFirst;
+	bool mIgnoreOnlineStatus;
 	bool mDirty;
 
 	std::string				mNameFilter;
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 90408beca0812299a6b5e4badaa505109d5edd2f..ebc79aae48577fe33f41080fe673133cda1b5606 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -130,15 +130,6 @@ void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
 	LLPanel::onMouseLeave(x, y, mask);
 }
 
-// virtual
-BOOL LLAvatarListItem::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
-	if (mContextMenu)
-		mContextMenu->show(this, const_cast<const LLUUID&>(mAvatarId), x, y);
-
-	return LLPanel::handleRightMouseDown(x, y, mask);
-}
-
 void LLAvatarListItem::setStatus(const std::string& status)
 {
 	mStatus->setValue(status);
@@ -180,7 +171,7 @@ void LLAvatarListItem::setName(const std::string& name)
 	mAvatarName->setToolTip(name);
 }
 
-void LLAvatarListItem::setAvatarId(const LLUUID& id)
+void LLAvatarListItem::setAvatarId(const LLUUID& id, bool ignore_status_changes)
 {
 	if (mAvatarId.notNull())
 		LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarId, this);
@@ -190,7 +181,7 @@ void LLAvatarListItem::setAvatarId(const LLUUID& id)
 	mSpeakingIndicator->setSpeakerId(id);
 
 	// We'll be notified on avatar online status changes
-	if (mAvatarId.notNull())
+	if (!ignore_status_changes && mAvatarId.notNull())
 		LLAvatarTracker::instance().addParticularFriendObserver(mAvatarId, this);
 
 	// Set avatar name.
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 2330db5249172d17b61152bdee598346bdf18d72..b9cfed4b7baa52bc0536f74598ad060d0110c525 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -48,7 +48,7 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 	class ContextMenu
 	{
 	public:
-		virtual void show(LLView* spawning_view, const LLUUID& id, S32 x, S32 y) = 0;
+		virtual void show(LLView* spawning_view, const std::vector<LLUUID>& selected_uuids, S32 x, S32 y) = 0;
 	};
 
 	LLAvatarListItem();
@@ -57,14 +57,13 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 	virtual BOOL postBuild();
 	virtual void onMouseLeave(S32 x, S32 y, MASK mask);
 	virtual void onMouseEnter(S32 x, S32 y, MASK mask);
-	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 	virtual void setValue(const LLSD& value);
 	virtual void changed(U32 mask); // from LLFriendObserver
 
 	void setStatus(const std::string& status);
 	void setOnline(bool online);
 	void setName(const std::string& name);
-	void setAvatarId(const LLUUID& id);
+	void setAvatarId(const LLUUID& id, bool ignore_status_changes = false);
 	
 	const LLUUID& getAvatarId() const;
 	const std::string getAvatarName() const;
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index f58c85d8c509cd25b145f7c09bd8f5c1b0d32819..73e24ca8e76f2eaa57627fd6515ab0d94cc1b8d2 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -36,6 +36,7 @@
 
 // Viewer includes
 #include "llagent.h"
+#include "llagentpicksinfo.h"
 #include "llviewergenericmessage.h"
 
 // Linden library includes
@@ -150,6 +151,13 @@ void LLAvatarPropertiesProcessor::sendAvatarGroupsRequest(const LLUUID& avatar_i
 	sendGenericRequest(avatar_id, APT_GROUPS, "avatargroupsrequest");
 }
 
+void LLAvatarPropertiesProcessor::sendAvatarTexturesRequest(const LLUUID& avatar_id)
+{
+	sendGenericRequest(avatar_id, APT_TEXTURES, "avatartexturesrequest");
+	// No response expected.
+	removePendingRequest(avatar_id, APT_TEXTURES);
+}
+
 void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props)
 {
 	llinfos << "Sending avatarinfo update" << llendl;
@@ -438,6 +446,9 @@ void LLAvatarPropertiesProcessor::sendPickDelete( const LLUUID& pick_id )
 	msg->nextBlock(_PREHASH_Data);
 	msg->addUUID(_PREHASH_PickID, pick_id);
 	gAgent.sendReliableMessage();
+
+	LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
+	LLAgentPicksInfo::getInstance()->decrementNumberOfPicks();
 }
 
 void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick)
@@ -470,6 +481,8 @@ void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick)
 
 	msg->addBOOL(_PREHASH_Enabled, new_pick->enabled);
 	gAgent.sendReliableMessage();
+
+	LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
 }
 
 void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id)
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index ea80c3d4f8a8a294bac64385b9108d76de4e9d21..e6563024b28651c4e8f7c9c1c578cee4e013545d 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -52,7 +52,8 @@ enum EAvatarProcessorType
 	APT_NOTES,
 	APT_GROUPS,
 	APT_PICKS,
-	APT_PICK_INFO
+	APT_PICK_INFO,
+	APT_TEXTURES
 };
 
 struct LLAvatarData
@@ -160,6 +161,7 @@ class LLAvatarPropertiesProcessor
 	void sendAvatarPicksRequest(const LLUUID& avatar_id);
 	void sendAvatarNotesRequest(const LLUUID& avatar_id);
 	void sendAvatarGroupsRequest(const LLUUID& avatar_id);
+	void sendAvatarTexturesRequest(const LLUUID& avatar_id);
 
 	// Duplicate pick info requests are not suppressed.
 	void sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id);
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 8987f14e97a6de1daffad71d804914bd15718504..ddcee5f453699def649897cd9264f8160a03c1a6 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -65,7 +65,7 @@ LLBottomTray::LLBottomTray(const LLSD&)
 
 	mChicletPanel->setChicletClickedCallback(boost::bind(&LLBottomTray::onChicletClick,this,_1));
 
-	LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView",&LLFloaterCameraPresets::onClickCameraPresets);
+	LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2));
 	LLIMMgr::getInstance()->addSessionObserver(this);
 
 	//this is to fix a crash that occurs because LLBottomTray is a singleton
@@ -77,22 +77,6 @@ LLBottomTray::LLBottomTray(const LLSD&)
 	setFocusRoot(TRUE);
 }
 
-BOOL LLBottomTray::postBuild()
-{
-	mBottomTrayContextMenu =  LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-	gMenuHolder->addChild(mBottomTrayContextMenu);
-
-	mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar");
-	mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
-	mMovementPanel = getChild<LLPanel>("movement_panel");
-	mGestureCombo = getChild<LLComboBox>("Gesture");
-	mCamPanel = getChild<LLPanel>("cam_panel");
-	mSnapshotPanel = getChild<LLPanel>("snapshot_panel");
-	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
-
-	return TRUE;
-}
-
 LLBottomTray::~LLBottomTray()
 {
 	if (!LLSingleton<LLIMMgr>::destroyed())
@@ -134,8 +118,9 @@ LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)
 	case LLIMChiclet::TYPE_IM:
 		return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id);
 	case LLIMChiclet::TYPE_GROUP:
-	case LLIMChiclet::TYPE_AD_HOC:
 		return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id);
+	case LLIMChiclet::TYPE_AD_HOC:
+		return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id);
 	case LLIMChiclet::TYPE_UNKNOWN:
 		break;
 	}
@@ -250,24 +235,7 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
 
 void LLBottomTray::showGestureButton(BOOL visible)
 {
-	if (visible != mGestureCombo->getVisible())
-	{
-		LLRect r = mNearbyChatBar->getRect();
-
-		mGestureCombo->setVisible(visible);
-
-		if (!visible)
-		{
-			LLFloaterReg::hideFloaterInstance("gestures");
-			r.mRight -= mGestureCombo->getRect().getWidth();
-		}
-		else
-		{
-			r.mRight += mGestureCombo->getRect().getWidth();
-		}
-
-		mNearbyChatBar->setRect(r);
-	}
+	mGesturePanel->setVisible(visible);
 }
 
 void LLBottomTray::showMoveButton(BOOL visible)
@@ -284,3 +252,191 @@ void LLBottomTray::showSnapshotButton(BOOL visible)
 {
 	mSnapshotPanel->setVisible(visible);
 }
+
+namespace
+{
+	const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
+	const std::string& PANEL_CHATBAR_NAME = "chat_bar";
+	const std::string& PANEL_MOVEMENT_NAME = "movement_panel";
+	const std::string& PANEL_CAMERA_NAME = "cam_panel";
+}
+
+BOOL LLBottomTray::postBuild()
+{
+	mBottomTrayContextMenu =  LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+	gMenuHolder->addChild(mBottomTrayContextMenu);
+
+	mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar");
+	mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
+	mMovementPanel = getChild<LLPanel>("movement_panel");
+	mMovementButton = mMovementPanel->getChild<LLButton>("movement_btn");
+	mGesturePanel = getChild<LLPanel>("gesture_panel");
+	mCamPanel = getChild<LLPanel>("cam_panel");
+	mCamButton = mCamPanel->getChild<LLButton>("camera_btn");
+	mSnapshotPanel = getChild<LLPanel>("snapshot_panel");
+	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
+
+	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
+	{
+		verifyChildControlsSizes();
+	}
+
+	return TRUE;
+}
+
+void LLBottomTray::verifyChildControlsSizes()
+{
+	LLRect rect = mChicletPanel->getRect();
+	if (rect.getWidth() < mChicletPanel->getMinWidth())
+	{
+		mChicletPanel->reshape(mChicletPanel->getMinWidth(), rect.getHeight());
+	}
+
+	rect = mNearbyChatBar->getRect();
+	if (rect.getWidth() < mNearbyChatBar->getMinWidth())
+	{
+		mNearbyChatBar->reshape(mNearbyChatBar->getMinWidth(), rect.getHeight());
+	}
+	else if (rect.getWidth() > mNearbyChatBar->getMaxWidth())
+	{
+		rect.setLeftTopAndSize(rect.mLeft, rect.mTop, mNearbyChatBar->getMaxWidth(), rect.getHeight());
+		mNearbyChatBar->reshape(mNearbyChatBar->getMaxWidth(), rect.getHeight());
+		mNearbyChatBar->setRect(rect);
+	}
+}
+
+void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+
+	if (mChicletPanel && mToolbarStack && mNearbyChatBar)
+	{
+#ifdef __FEATURE_EXT_991__
+		BOOL shrink = width < getRect().getWidth();
+		const S32 MIN_RENDERED_CHARS = 3;
+#endif
+
+		verifyChildControlsSizes();
+		updateResizeState(width, height);
+
+		switch (mResizeState)
+		{
+		case STATE_CHICLET_PANEL:
+			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
+
+			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
+			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
+			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
+
+			break;
+		case STATE_CHATBAR_INPUT:
+			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE);
+
+			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
+			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
+			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
+
+			break;
+
+#ifdef __FEATURE_EXT_991__
+
+		case STATE_BUTTONS:
+			mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, TRUE);
+			mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, TRUE);
+
+			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
+			mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
+
+			if (shrink)
+			{
+
+				if (mSnapshotPanel->getVisible())
+				{
+					showSnapshotButton(FALSE);
+				}
+
+				if (mCamPanel->getVisible() && mCamButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS)
+				{
+					showCameraButton(FALSE);
+				}
+
+				if (mMovementPanel->getVisible() && mMovementButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS)
+				{
+					showMoveButton(FALSE);
+				}
+
+			}
+			else
+			{
+				showMoveButton(TRUE);
+				mMovementPanel->draw();
+
+				if (mMovementButton->getLastDrawCharsCount() >= MIN_RENDERED_CHARS)
+				{
+					showMoveButton(TRUE);
+				}
+				else
+				{
+					showMoveButton(FALSE);
+				}
+			}
+			break;
+#endif
+
+		default:
+			break;
+		}
+	}
+
+	LLPanel::reshape(width, height, called_from_parent);
+}
+
+void LLBottomTray::updateResizeState(S32 width, S32 height)
+{
+	mResizeState = STATE_BUTTONS;
+
+	const S32 chiclet_panel_width = mChicletPanel->getRect().getWidth();
+	const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+
+	const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+	const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+	const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
+
+	// bottom tray is narrowed
+	if (width < getRect().getWidth())
+	{
+		if (chiclet_panel_width > chiclet_panel_min_width)
+		{
+			mResizeState = STATE_CHICLET_PANEL;
+		}
+		else if (chatbar_panel_width > chatbar_panel_min_width)
+		{
+			mResizeState = STATE_CHATBAR_INPUT;
+		}
+		else
+		{
+			mResizeState = STATE_BUTTONS;
+		}
+	}
+	// bottom tray is widen
+	else
+	{
+#ifdef __FEATURE_EXT_991__
+		if (!mMovementPanel->getVisible())
+		{
+			mResizeState = STATE_BUTTONS;
+		}
+		else
+#endif
+		if (chatbar_panel_width < chatbar_panel_max_width)
+		{
+			mResizeState = STATE_CHATBAR_INPUT;
+		}
+		else
+		{
+			mResizeState = STATE_CHICLET_PANEL;
+		}
+	}
+
+
+	// TODO: finish implementation
+}
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index cc35e63524a86a836866fd2fa39aac28fc518824..a28f1e42ecda31df5efab4c8c21597471380acf4 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -69,6 +69,8 @@ class LLBottomTray
 	virtual void sessionRemoved(const LLUUID& session_id);
 	void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
 
+	virtual void reshape(S32 width, S32 height, BOOL called_from_parent);
+
 	virtual void onFocusLost();
 	virtual void setVisible(BOOL visible);
 
@@ -81,6 +83,18 @@ class LLBottomTray
 
 private:
 
+	enum EResizeState
+	{
+		STATE_CHICLET_PANEL = 1,
+		STATE_CHATBAR_INPUT,
+		STATE_BUTTONS
+	};
+
+	void updateResizeState(S32 width, S32 height);
+	void verifyChildControlsSizes();
+
+	EResizeState mResizeState;
+
 protected:
 
 	LLBottomTray(const LLSD& key = LLSD());
@@ -103,7 +117,9 @@ class LLBottomTray
 	LLPanel*			mMovementPanel;
 	LLPanel*			mCamPanel;
 	LLPanel*			mSnapshotPanel;
-	LLComboBox*			mGestureCombo;
+	LLPanel*			mGesturePanel;
+	LLButton*			mCamButton;
+	LLButton*			mMovementButton;
 };
 
 #endif // LL_LLBOTTOMPANEL_H
diff --git a/indra/newview/llcapabilitylistener.cpp b/indra/newview/llcapabilitylistener.cpp
index 785a647fa2901e099b4cfc926164167a0a5e8812..ed9613c1bccf2c69039490edfb700abf93874888 100644
--- a/indra/newview/llcapabilitylistener.cpp
+++ b/indra/newview/llcapabilitylistener.cpp
@@ -5,7 +5,30 @@
  * @brief  Implementation for llcapabilitylistener.
  * 
  * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
  * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
  */
 
diff --git a/indra/newview/llcapabilitylistener.h b/indra/newview/llcapabilitylistener.h
index ce16b7da5daa7be22354392c815d92f54f3b0209..be51cf1b8cae1b9d8e541ef02ca3771493f52517 100644
--- a/indra/newview/llcapabilitylistener.h
+++ b/indra/newview/llcapabilitylistener.h
@@ -5,7 +5,30 @@
  * @brief  Provide an event-based API for capability requests
  * 
  * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
  * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
  */
 
diff --git a/indra/newview/llcapabilityprovider.h b/indra/newview/llcapabilityprovider.h
index 0ddb2b6cb9d675214ca78a8b808518cf5c11d53c..3d07904775740cee7f95e24670c3047c21d9262c 100644
--- a/indra/newview/llcapabilityprovider.h
+++ b/indra/newview/llcapabilityprovider.h
@@ -6,7 +6,30 @@
  *         capability.
  * 
  * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
  * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
  */
 
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index c4619dc57a50ba0997ac30fb74e65c633235b968..77f941eef0ecdf72c0caf227225028f482da9abb 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -39,6 +39,7 @@
 #include "llimview.h"
 #include "llbottomtray.h"
 #include "llviewerwindow.h"
+#include "llrootview.h"
 
 #include <algorithm>
 
@@ -121,6 +122,8 @@ void LLChannelManager::onLoginCompleted()
 		return;
 	}
 
+	gViewerWindow->getRootView()->addChild(mStartUpChannel);
+
 	// init channel's position and size
 	S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); 
 	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
@@ -128,7 +131,7 @@ void LLChannelManager::onLoginCompleted()
 	mStartUpChannel->setShowToasts(true);
 
 	mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
-	mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("ChannelBottomPanelMargin"), gSavedSettings.getS32("StartUpToastTime"));
+	mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
 }
 
 //--------------------------------------------------------------------------
@@ -139,19 +142,11 @@ void LLChannelManager::onStartUpToastClose()
 		mStartUpChannel->setVisible(FALSE);
 		mStartUpChannel->closeStartUpToast();
 		removeChannelByID(LLUUID(gSavedSettings.getString("StartUpChannelUUID")));
-		delete mStartUpChannel;
 		mStartUpChannel = NULL;
 	}
 
 	// set StartUp Toast Flag to allow all other channels to show incoming toasts
 	LLScreenChannel::setStartUpToastShown();
-
-	// force NEARBY CHAT CHANNEL to repost all toasts if present
-	//LLScreenChannelBase* nearby_channel = findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
-	//!!!!!!!!!!!!!!
-	//FIXME
-	//nearby_channel->loadStoredToastsToChannel();
-	//nearby_channel->setCanStoreToasts(false);
 }
 
 //--------------------------------------------------------------------------
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index cc21b636f1c1a081e223e86af13d9ae1d0dc2dfe..ebf46a6e3ffb339c07301d9ff9c60e83b22d5fa6 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -101,12 +101,12 @@ void LLChatHistory::appendWidgetMessage(const LLUUID& avatar_id, std::string& fr
 	if (mLastFromName == from)
 	{
 		view = getSeparator();
-		view_text = "\n";
+		view_text = " ";
 	}
 	else
 	{
 		view = getHeader(avatar_id, from, time);
-		view_text = from + MESSAGE_USERNAME_DATE_SEPARATOR + time;
+		view_text = "\n" + from + MESSAGE_USERNAME_DATE_SEPARATOR + time;
 	}
 	//Prepare the rect for the view
 	LLRect target_rect = getDocumentView()->getRect();
@@ -115,12 +115,12 @@ void LLChatHistory::appendWidgetMessage(const LLUUID& avatar_id, std::string& fr
 	view->reshape(target_rect.getWidth(), view->getRect().getHeight());
 	view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
 
-	this->appendWidget(view, view_text, FALSE, TRUE);
+	appendWidget(view, view_text, FALSE, TRUE, mLeftWidgetPad, 0);
 
 	//Append the text message
-	this->appendText(message, TRUE, style_params);
+	appendText(message, TRUE, style_params);
 
 	mLastFromName = from;
-	this->blockUndo();
-	this->setCursorAndScrollToEnd();
+	blockUndo();
+	setCursorAndScrollToEnd();
 }
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 340b0fa22cec68bcb4027035093f641d07912166..61a60a24be65fb6994289627704ec73db60911f4 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -468,6 +468,115 @@ void LLIMP2PChiclet::setShowSpeaker(bool show)
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
+LLAdHocChiclet::Params::Params()
+: avatar_icon("avatar_icon")
+, unread_notifications("unread_notifications")
+, speaker("speaker")
+, show_speaker("show_speaker")
+{
+	// *TODO Vadim: Get rid of hardcoded values.
+	rect(LLRect(0, 25, 45, 0));
+
+	avatar_icon.name("avatar_icon");
+	avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
+
+	// *NOTE dzaporozhan
+	// Changed icon height from 25 to 24 to fix ticket EXT-794.
+	// In some cases(after changing UI scale) 25 pixel height icon was 
+	// drawn incorrectly, i'm not sure why.
+	avatar_icon.rect(LLRect(0, 24, 25, 0));
+	avatar_icon.mouse_opaque(false);
+
+	unread_notifications.name("unread");
+	unread_notifications.rect(LLRect(25, 25, 45, 0));
+	unread_notifications.font(LLFontGL::getFontSansSerif());
+	unread_notifications.font_halign(LLFontGL::HCENTER);
+	unread_notifications.v_pad(5);
+	unread_notifications.text_color(LLColor4::white);
+	unread_notifications.mouse_opaque(false);
+
+	speaker.name("speaker");
+	speaker.rect(LLRect(45, 25, 65, 0));
+
+	show_speaker = false;
+}
+
+LLAdHocChiclet::LLAdHocChiclet(const Params& p)
+: LLIMChiclet(p)
+, mChicletIconCtrl(NULL)
+, mCounterCtrl(NULL)
+, mSpeakerCtrl(NULL)
+, mPopupMenu(NULL)
+{
+	LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon;
+	mChicletIconCtrl = LLUICtrlFactory::create<LLChicletAvatarIconCtrl>(avatar_params);
+	addChild(mChicletIconCtrl);
+
+	LLChicletNotificationCounterCtrl::Params unread_params = p.unread_notifications;
+	mCounterCtrl = LLUICtrlFactory::create<LLChicletNotificationCounterCtrl>(unread_params);
+	addChild(mCounterCtrl);
+
+	setCounter(getCounter());
+	setShowCounter(getShowCounter());
+
+	LLChicletSpeakerCtrl::Params speaker_params = p.speaker;
+	mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params);
+	addChild(mSpeakerCtrl);
+
+	setShowSpeaker(p.show_speaker);
+}
+
+void LLAdHocChiclet::setSessionId(const LLUUID& session_id)
+{
+	LLChiclet::setSessionId(session_id);
+	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+	mChicletIconCtrl->setValue(im_session->mOtherParticipantID);
+}
+
+void LLAdHocChiclet::setCounter(S32 counter)
+{
+	mCounterCtrl->setCounter(counter);
+
+	if(getShowCounter())
+	{
+		LLRect counter_rect = mCounterCtrl->getRect();
+		LLRect required_rect = mCounterCtrl->getRequiredRect();
+		bool needs_resize = required_rect.getWidth() != counter_rect.getWidth();
+
+		if(needs_resize)
+		{
+			counter_rect.mRight = counter_rect.mLeft + required_rect.getWidth();
+			mCounterCtrl->reshape(counter_rect.getWidth(), counter_rect.getHeight());
+			mCounterCtrl->setRect(counter_rect);
+
+			onChicletSizeChanged();
+		}
+	}
+}
+
+LLRect LLAdHocChiclet::getRequiredRect()
+{
+	LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0);
+	if(getShowCounter())
+	{
+		rect.mRight += mCounterCtrl->getRequiredRect().getWidth();
+	}
+	if(getShowSpeaker())
+	{
+		rect.mRight += mSpeakerCtrl->getRect().getWidth();
+	}
+	return rect;
+}
+
+BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+	return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
 LLIMGroupChiclet::Params::Params()
 : group_icon("group_icon")
 {
@@ -669,7 +778,12 @@ LLChicletPanel::Params::Params()
 {
 	chiclet_padding = 3;
 	scrolling_offset = 40;
-	min_width = 70;
+
+	if (!min_width.isProvided())
+	{
+		// min_width = 4 chiclets + 3 paddings
+		min_width = 179 + 3*chiclet_padding;
+	}
 
 	LLRect scroll_button_rect(0, 25, 19, 5);
 
@@ -704,6 +818,7 @@ LLChicletPanel::LLChicletPanel(const Params&p)
 
 	mLeftScrollButton = LLUICtrlFactory::create<LLButton>(scroll_button_params);
 	addChild(mLeftScrollButton);
+	LLTransientFloaterMgr::getInstance()->addControlView(mLeftScrollButton);
 
 	mLeftScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onLeftScrollClick,this));
 	mLeftScrollButton->setEnabled(false);
@@ -711,6 +826,7 @@ LLChicletPanel::LLChicletPanel(const Params&p)
 	scroll_button_params = p.right_scroll_button;
 	mRightScrollButton = LLUICtrlFactory::create<LLButton>(scroll_button_params);
 	addChild(mRightScrollButton);
+	LLTransientFloaterMgr::getInstance()->addControlView(mRightScrollButton);
 
 	mRightScrollButton->setClickedCallback(boost::bind(&LLChicletPanel::onRightScrollClick,this));
 	mRightScrollButton->setEnabled(false);
@@ -752,25 +868,36 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
 BOOL LLChicletPanel::postBuild()
 {
 	LLPanel::postBuild();
-	LLIMModel::instance().addChangedCallback(boost::bind(im_chiclet_callback, this, _1));
+	LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1));
+	LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1));
 	LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1));
 
 	return TRUE;
 }
 
+S32 LLChicletPanel::calcChickletPanleWidth()
+{
+	S32 res = 0;
+
+	for (chiclet_list_t::iterator it = mChicletList.begin(); it
+			!= mChicletList.end(); it++)
+	{
+		res = (*it)->getRect().getWidth() + getChicletPadding();
+	}
+	return res;
+}
+
 bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index)
 {
 	if(mScrollArea->addChild(chiclet))
 	{
+		// chicklets should be aligned to right edge of scroll panel
 		S32 offset = 0;
 
-		// if index == 0 and chickelt list isn't empty insert chiclet before first in the list
-		// without scrolling, so other visible chicklets aren't change screen position
-		if (0 == index && !mChicletList.empty())
+		if (!canScrollLeft())
 		{
-			offset = getChiclet(0)->getRect().mLeft
-					- (chiclet->getRequiredRect().getWidth()
-							+ getChicletPadding());
+			offset = mScrollArea->getRect().getWidth()
+					- chiclet->getRect().getWidth() - calcChickletPanleWidth();
 		}
 
 		mChicletList.insert(mChicletList.begin() + index, chiclet);
@@ -963,25 +1090,16 @@ void LLChicletPanel::arrange()
 void LLChicletPanel::trimChiclets()
 {
 	// trim right
-	if(canScrollLeft() && !canScrollRight())
+	if(!mChicletList.empty())
 	{
 		S32 last_chiclet_right = (*mChicletList.rbegin())->getRect().mRight;
+		S32 first_chiclet_left = getChiclet(0)->getRect().mLeft;
 		S32 scroll_width = mScrollArea->getRect().getWidth();
-		if(last_chiclet_right < scroll_width)
+		if(last_chiclet_right < scroll_width || first_chiclet_left > 0)
 		{
 			shiftChiclets(scroll_width - last_chiclet_right);
 		}
 	}
-
-	// trim left
-	if(!mChicletList.empty())
-	{
-		LLRect first_chiclet_rect = getChiclet(0)->getRect();
-		if(first_chiclet_rect.mLeft > 0)
-		{
-			shiftChiclets( - first_chiclet_rect.mLeft);
-		}
-	}
 }
 
 void LLChicletPanel::showScrollButtonsIfNeeded()
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 458bc73bc42dcdee01db757d01134233bfe29f02..d1153a075db6011369176ee8479f6f12f8b778a1 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -441,6 +441,65 @@ class LLIMP2PChiclet : public LLIMChiclet
 	LLMenuGL* mPopupMenu;
 };
 
+/**
+ * Implements AD-HOC chiclet.
+ */
+class LLAdHocChiclet : public LLIMChiclet
+{
+public:
+	struct Params : public LLInitParam::Block<Params, LLChiclet::Params>
+	{
+		Optional<LLChicletAvatarIconCtrl::Params> avatar_icon;
+
+		Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
+
+		Optional<LLChicletSpeakerCtrl::Params> speaker;
+
+		Optional<bool>	show_speaker;
+
+		Params();
+	};
+
+	/**
+	 * Sets session id.
+	 * Session ID for group chat is actually Group ID.
+	 */
+	/*virtual*/ void setSessionId(const LLUUID& session_id);
+
+	/*
+	* Sets number of unread messages. Will update chiclet's width if number text 
+	* exceeds size of counter and notify it's parent about size change.
+	*/
+	/*virtual*/ void setCounter(S32);
+
+	/*
+	* Returns number of unread messages.
+	*/
+	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
+
+	/*
+	* Returns rect, required to display chiclet.
+	* Width is the only valid value.
+	*/
+	/*virtual*/ LLRect getRequiredRect();
+
+protected:
+	LLAdHocChiclet(const Params& p);
+	friend class LLUICtrlFactory;
+
+	/*
+	* Displays popup menu.
+	*/
+	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
+private:
+
+	LLChicletAvatarIconCtrl* mChicletIconCtrl;
+	LLChicletNotificationCounterCtrl* mCounterCtrl;
+	LLChicletSpeakerCtrl* mSpeakerCtrl;
+	LLMenuGL* mPopupMenu;
+};
+
 /**
  * Implements Group chat chiclet.
  */
@@ -594,9 +653,14 @@ class LLChicletPanel : public LLPanel
 	virtual ~LLChicletPanel();
 
 	/*
-	 * Creates chiclet and adds it to chiclet list.
+	 * Creates chiclet and adds it to chiclet list at specified index.
+	*/
+	template<class T> T* createChiclet(const LLUUID& session_id, S32 index);
+
+	/*
+	 * Creates chiclet and adds it to chiclet list at right.
 	*/
-	template<class T> T* createChiclet(const LLUUID& session_id = LLUUID::null, S32 index = 0);
+	template<class T> T* createChiclet(const LLUUID& session_id);
 
 	/*
 	 * Returns pointer to chiclet of specified type at specified index.
@@ -660,10 +724,14 @@ class LLChicletPanel : public LLPanel
 
 	/*virtual*/ void draw();
 
+	S32 getMinWidth() const { return mMinWidth; }
+
 protected:
 	LLChicletPanel(const Params&p);
 	friend class LLUICtrlFactory;
 
+	S32 calcChickletPanleWidth();
+
 	/*
 	 * Adds chiclet to list and rearranges all chiclets.
 	*/
@@ -804,7 +872,7 @@ class LLTalkButton : public LLUICtrl
 };
 
 template<class T> 
-T* LLChicletPanel::createChiclet(const LLUUID& session_id /*= LLUUID::null*/, S32 index /*= 0*/)
+T* LLChicletPanel::createChiclet(const LLUUID& session_id, S32 index)
 {
 	typename T::Params params;
 	T* chiclet = LLUICtrlFactory::create<T>(params);
@@ -830,6 +898,12 @@ T* LLChicletPanel::createChiclet(const LLUUID& session_id /*= LLUUID::null*/, S3
 	return chiclet;
 }
 
+template<class T>
+T* LLChicletPanel::createChiclet(const LLUUID& session_id)
+{
+	return createChiclet<T>(session_id, mChicletList.size());
+}
+
 template<class T>
 T* LLChicletPanel::findChiclet(const LLUUID& im_session_id)
 {
diff --git a/indra/newview/llconfirmationmanager.cpp b/indra/newview/llconfirmationmanager.cpp
index 225f1775466307811f233875e0e4a533236dd14a..5813943ad3796a9402cfa20f0cb616df9082404c 100644
--- a/indra/newview/llconfirmationmanager.cpp
+++ b/indra/newview/llconfirmationmanager.cpp
@@ -39,6 +39,7 @@
 // viewer includes
 #include "llnotifications.h"
 #include "llstring.h"
+#include "llxmlnode.h"
 
 LLConfirmationManager::ListenerBase::~ListenerBase()
 {
diff --git a/indra/newview/lldndbutton.cpp b/indra/newview/lldndbutton.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..22f2bb1d165f534606e746de258777d043e0b322
--- /dev/null
+++ b/indra/newview/lldndbutton.cpp
@@ -0,0 +1,60 @@
+/** 
+ * @file lldndbutton.cpp
+ * @brief Implementation of the drag-n-drop button.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lldndbutton.h"
+
+
+static LLDefaultChildRegistry::Register<LLDragAndDropButton> r("dnd_button");
+
+LLDragAndDropButton::Params::Params()
+{
+
+}
+
+LLDragAndDropButton::LLDragAndDropButton(Params& params)
+: LLButton(params)
+{
+
+}
+
+BOOL LLDragAndDropButton::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg)
+{
+	if (mDragDropHandler)
+	{
+		return mDragDropHandler(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+	}
+	return false;
+}
+
+// EOF
diff --git a/indra/newview/lldndbutton.h b/indra/newview/lldndbutton.h
new file mode 100644
index 0000000000000000000000000000000000000000..c8882681875bb45d8f6a6cab40d91193df34ee29
--- /dev/null
+++ b/indra/newview/lldndbutton.h
@@ -0,0 +1,89 @@
+/**
+ * @file lldndbutton.h
+ * @brief Declaration of the drag-n-drop button.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLDNDBUTTON_H
+#define LL_LLDNDBUTTON_H
+
+#include "llbutton.h"
+
+/**
+ * Class representing a button which can handle Drag-And-Drop event.
+ *
+ * LLDragAndDropButton does not contain any logic to handle Drag-And-Drop itself.
+ * Instead it provides drag_drop_handler_t which can be set to the button.
+ * Then each Drag-And-Drop will be delegated to this handler without any pre/post processing.
+ *
+ * All xml parameters are the same as LLButton has.
+ *
+ * @see LLLandmarksPanel for example of usage of this class.
+ */
+class LLDragAndDropButton : public LLButton
+{
+public:
+	struct Params : public LLInitParam::Block<Params, LLButton::Params>
+	{
+		Params();
+	};
+
+	LLDragAndDropButton(Params& params);
+
+	typedef boost::function<bool (
+		S32 /*x*/, S32 /*y*/, MASK /*mask*/, BOOL /*drop*/,
+		EDragAndDropType /*cargo_type*/,
+		void* /*cargo_data*/,
+		EAcceptance* /*accept*/,
+		std::string& /*tooltip_msg*/)> drag_drop_handler_t;
+
+
+	/**
+	 * Sets a handler which should process Drag-And-Drop.
+	 */
+	void setDragAndDropHandler(drag_drop_handler_t handler) { mDragDropHandler = handler; }
+
+
+	/**
+	 * Process Drag-And-Drop by delegating the event to drag_drop_handler_t.
+	 * 
+	 * @return BOOL - value returned by drag_drop_handler_t if it is set, FALSE otherwise.
+	 */
+	/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+		EDragAndDropType cargo_type,
+		void* cargo_data,
+		EAcceptance* accept,
+		std::string& tooltip_msg);
+
+private:
+	drag_drop_handler_t mDragDropHandler;
+};
+
+
+#endif // LL_LLDNDBUTTON_H
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index e7295512c18027e3de9ff84a1e9252ef8717ef93..45f4b4fbd04c47edd184a1e806cca80d86eadbe8 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -156,13 +156,17 @@ void LLDriverParamInfo::toStream(std::ostream &out)
 // LLDriverParam
 //-----------------------------------------------------------------------------
 
-LLDriverParam::LLDriverParam(LLVOAvatar *avatarp)
-	: mCurrentDistortionParam( NULL ), mAvatarp(avatarp), mWearablep(NULL)
+LLDriverParam::LLDriverParam(LLVOAvatar *avatarp) : 
+	mCurrentDistortionParam( NULL ), 
+	mAvatarp(avatarp), 
+	mWearablep(NULL)
 {
 }
 
-LLDriverParam::LLDriverParam(LLWearable *wearablep)
-	: mCurrentDistortionParam( NULL ), mAvatarp(NULL), mWearablep(wearablep)
+LLDriverParam::LLDriverParam(LLWearable *wearablep) : 
+	mCurrentDistortionParam( NULL ), 
+	mAvatarp(NULL), 
+	mWearablep(wearablep)
 {
 }
 
@@ -201,7 +205,7 @@ void LLDriverParam::setAvatar(LLVOAvatar *avatarp)
 	}
 }
 
-/*virtual*/ LLViewerVisualParam * 	LLDriverParam::cloneParam(LLWearable* wearable) const
+/*virtual*/ LLViewerVisualParam* LLDriverParam::cloneParam(LLWearable* wearable) const
 {
 	LLDriverParam *new_param;
 	if (wearable)
@@ -481,7 +485,7 @@ void LLDriverParam::stopAnimating(BOOL set_by_user)
 }
 
 /*virtual*/ 
-BOOL LLDriverParam::linkDrivenParams(visual_param_mapper mapper, bool only_cross_params)
+BOOL LLDriverParam::linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params)
 {
 	BOOL success = TRUE;
 	LLDriverParamInfo::entry_info_list_t::iterator iter;
@@ -584,7 +588,8 @@ F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight
 void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool set_by_user)
 {
 	LLVOAvatarSelf *avatar_self = gAgent.getAvatarObject();
-	if(mWearablep && driven->mParam->getCrossWearable() &&
+	if(mWearablep && 
+	   driven->mParam->getCrossWearable() &&
 	   mWearablep->isOnTop())
 	{
 		// call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values
diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h
index c73e7405748bc2f95555cbf42a3743efb4f89ee3..069e71a2cb3588b5614ff80955bf0f9ceea6fe09 100644
--- a/indra/newview/lldriverparam.h
+++ b/indra/newview/lldriverparam.h
@@ -94,7 +94,7 @@ class LLDriverParam : public LLViewerVisualParam
 	void					setWearable(LLWearable *wearablep);
 	void					setAvatar(LLVOAvatar *avatarp);
 
-	/*virtual*/ LLViewerVisualParam * 	cloneParam(LLWearable* wearable) const;
+	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;
 
 	// LLVisualParam Virtual functions
 	///*virtual*/ BOOL				parseData(LLXmlTreeNode* node);
@@ -102,7 +102,7 @@ class LLDriverParam : public LLViewerVisualParam
 	/*virtual*/ void				setWeight(F32 weight, BOOL set_by_user);
 	/*virtual*/ void				setAnimationTarget( F32 target_value, BOOL set_by_user );
 	/*virtual*/ void				stopAnimating(BOOL set_by_user);
-	/*virtual*/ BOOL				linkDrivenParams(visual_param_mapper mapper, bool only_cross_params);
+	/*virtual*/ BOOL				linkDrivenParams(visual_param_mapper mapper, BOOL only_cross_params);
 	/*virtual*/ void				resetDrivenParams();
 	
 	// LLViewerVisualParam Virtual functions
diff --git a/indra/newview/llface.inl b/indra/newview/llface.inl
index 38f38f5466e0a03ce94b3ec8e71d221ae71154bc..176c73e38e541cfc92fd9006fbfaf7506b0cc472 100644
--- a/indra/newview/llface.inl
+++ b/indra/newview/llface.inl
@@ -4,7 +4,7 @@
  *
  * $LicenseInfo:firstyear=2001&license=viewergpl$
  * 
- * Copyright (c) 2001-2007, Linden Research, Inc.
+ * Copyright (c) 2001-2009, Linden Research, Inc.
  * 
  * Second Life Viewer Source Code
  * The source code in this file ("Source Code") is provided by Linden Lab
@@ -12,12 +12,13 @@
  * ("GPL"), unless you have obtained a separate licensing agreement
  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlife.com/developers/opensource/gplv2
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  * 
  * There are special exceptions to the terms and conditions of the GPL as
  * it is applied to this Source Code. View the full text of the exception
  * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlife.com/developers/opensource/flossexception
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  * 
  * By copying, modifying or distributing this software, you acknowledge
  * that you have read and understood your obligations described above,
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 76ece9d165f9a3383a8a8b59a668f9930e24252d..3b5b7f570ee839f0f0f2be8f924c894b17466289 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -626,8 +626,6 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
 	buttonXMLNode->getAttributeS32("width", buttonWidth);
 	S32 buttonHGap = 2; // default value
 	buttonXMLNode->getAttributeS32("left", buttonHGap);
-
-	const S32 buttonVGap = 2;
 	
 	S32 count = mItems.count();
 
@@ -713,7 +711,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
 		if (chevron_button)
 		{
 			LLRect rect;
-			rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, buttonVGap, chevron_button_width, getRect().getHeight()-buttonVGap);
+			rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, 0, chevron_button_width, getRect().getHeight());
 			chevron_button->setRect(rect);
 			chevron_button->setVisible(TRUE);
 			mChevronRect = rect;
@@ -728,7 +726,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
 			LLButton::Params bparams;
 
 			LLRect rect;
-			rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, buttonVGap, chevron_button_width, getRect().getHeight()-buttonVGap);
+			rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, 0, chevron_button_width, getRect().getHeight());
 
 			bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_BOTTOM);
 			bparams.image_unselected.name(flat_icon);
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index de079b7123999ba3215aa37878eaf0bfe4342d58..893b12ec359a49f97f930ba20537deb63f496d61 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -272,6 +272,8 @@ void LLFirstUse::useMedia()
 	{
 		gWarningSettings.setBOOL("FirstMedia", FALSE);
 
-		LLNotifications::instance().add("FirstMedia");
+		// Popup removed as a short-term fix for EXT-1643.
+		// Ultimately, the plan is to kill all First Use dialogs
+		//LLNotifications::instance().add("FirstMedia");
 	}
 }
diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp
index 81d38f8f680e16b2023286073783d0b4c7241b24..8c7899af3edbf7b9d7177ec9bc52c17a9ab56584 100644
--- a/indra/newview/llfloateravatartextures.cpp
+++ b/indra/newview/llfloateravatartextures.cpp
@@ -81,16 +81,24 @@ static void update_texture_ctrl(LLVOAvatar* avatarp,
 								 ETextureIndex te)
 {
 	LLUUID id = IMG_DEFAULT_AVATAR;
-	EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(te);
-	LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
-	if (wearable)
+	const LLVOAvatarDictionary::TextureEntry* tex_entry = LLVOAvatarDictionary::getInstance()->getTexture(te);
+	if (tex_entry->mIsLocalTexture)
 	{
-		LLLocalTextureObject *lto = wearable->getLocalTextureObject(te);
-		if (lto)
+		const EWearableType wearable_type = tex_entry->mWearableType;
+		LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
+		if (wearable)
 		{
-			id = lto->getID();
+			LLLocalTextureObject *lto = wearable->getLocalTextureObject(te);
+			if (lto)
+			{
+				id = lto->getID();
+			}
 		}
 	}
+	else
+	{
+		id = avatarp->getTE(te)->getID();
+	}
 	//id = avatarp->getTE(te)->getID();
 	if (id == IMG_DEFAULT_AVATAR)
 	{
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 2c2a5107f53c50071885b75572df695568073769..36f031579046d6201445598a96e5c12c82f6f5d8 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -81,6 +81,8 @@ class LLFloaterBuyLandUI
 	LLFloaterBuyLandUI(const LLSD& key);
 	virtual ~LLFloaterBuyLandUI();
 	
+	/*virtual*/ void onClose(bool app_quitting);
+	
 private:
 	class SelectionObserver : public LLParcelObserver
 	{
@@ -300,11 +302,21 @@ LLFloaterBuyLandUI::LLFloaterBuyLandUI(const LLSD& key)
 LLFloaterBuyLandUI::~LLFloaterBuyLandUI()
 {
 	LLViewerParcelMgr::getInstance()->removeObserver(&mParcelSelectionObserver);
-	LLViewerParcelMgr::getInstance()->deleteParcelBuy(mParcelBuyInfo);
+	LLViewerParcelMgr::getInstance()->deleteParcelBuy(&mParcelBuyInfo);
 	
 	delete mTransaction;
 }
 
+// virtual
+void LLFloaterBuyLandUI::onClose(bool app_quitting)
+{
+	// This object holds onto observer, transactions, and parcel state.
+	// Despite being single_instance, destroy it to call destructors and clean
+	// everything up.
+	setVisible(FALSE);
+	destroy();
+}
+
 void LLFloaterBuyLandUI::SelectionObserver::changed()
 {
 	if (LLViewerParcelMgr::getInstance()->selectionEmpty())
@@ -756,7 +768,7 @@ void LLFloaterBuyLandUI::sendBuyLand()
 	if (mParcelBuyInfo)
 	{
 		LLViewerParcelMgr::getInstance()->sendParcelBuy(mParcelBuyInfo);
-		LLViewerParcelMgr::getInstance()->deleteParcelBuy(mParcelBuyInfo);
+		LLViewerParcelMgr::getInstance()->deleteParcelBuy(&mParcelBuyInfo);
 		mBought = true;
 	}
 }
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index db20b11efd939f5f402605a585ef9d6c9f3a1cfa..dca0773139bf03001499d14036135a821067d443 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -50,6 +50,8 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;
 
 #define ORBIT "cam_rotate_stick"
 #define PAN "cam_track_stick"
+#define ZOOM "zoom"
+#define PRESETS "camera_presets"
 #define CONTROLS "controls"
 
 
@@ -125,9 +127,15 @@ void LLFloaterCamera::onOpen(const LLSD& key)
 
 }
 
+void LLFloaterCamera::onClose(bool app_quitting)
+{
+	//We don't care of camera mode if app is quitting
+	if(!app_quitting)
+		switchMode(CAMERA_CTRL_MODE_ORBIT);
+}
 
 LLFloaterCamera::LLFloaterCamera(const LLSD& val)
-:	LLDockableFloater(NULL, val),
+:	LLTransientDockableFloater(NULL, true, val),
 	mCurrMode(CAMERA_CTRL_MODE_ORBIT),
 	mPrevMode(CAMERA_CTRL_MODE_ORBIT)
 {
@@ -139,7 +147,7 @@ BOOL LLFloaterCamera::postBuild()
 	setIsChrome(TRUE);
 
 	mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
-	mZoom = getChild<LLJoystickCameraZoom>("zoom");
+	mZoom = getChild<LLJoystickCameraZoom>(ZOOM);
 	mTrack = getChild<LLJoystickCameraTrack>(PAN);
 
 	assignButton2Mode(CAMERA_CTRL_MODE_ORBIT,			"orbit_btn");
@@ -210,7 +218,6 @@ void LLFloaterCamera::switchMode(ECameraControlMode mode)
 		break;
 
 	case CAMERA_CTRL_MODE_AVATAR_VIEW:
-		gAgent.changeCameraToMouselook();
 		break;
 
 	default:
@@ -246,15 +253,13 @@ void LLFloaterCamera::updateState()
 		iter->second->setToggleState(iter->first == mCurrMode);
 	}
 
-	//updating controls
-	bool isOrbitMode = CAMERA_CTRL_MODE_ORBIT == mCurrMode;
-	bool isPanMode = CAMERA_CTRL_MODE_PAN == mCurrMode;
-
-	childSetVisible(ORBIT, isOrbitMode);
-	childSetVisible(PAN, isPanMode);
+	childSetVisible(ORBIT, CAMERA_CTRL_MODE_ORBIT == mCurrMode);
+	childSetVisible(PAN, CAMERA_CTRL_MODE_PAN == mCurrMode);
+	childSetVisible(ZOOM, CAMERA_CTRL_MODE_AVATAR_VIEW != mCurrMode);
+	childSetVisible(PRESETS, CAMERA_CTRL_MODE_AVATAR_VIEW == mCurrMode);
 
 	//hiding or showing the panel with controls by reshaping the floater
-	bool showControls = isOrbitMode || isPanMode;
+	bool showControls = CAMERA_CTRL_MODE_FREE_CAMERA != mCurrMode;
 	if (showControls == childIsVisible(CONTROLS)) return;
 
 	childSetVisible(CONTROLS, showControls);
@@ -283,29 +288,7 @@ void LLFloaterCamera::updateState()
 	}
 }
 
-//-------------LLFloaterCameraPresets------------------------
-
-LLFloaterCameraPresets::LLFloaterCameraPresets(const LLSD& key):
-LLDockableFloater(NULL, key)
-{}
-
-BOOL LLFloaterCameraPresets::postBuild()
-{
-	setIsChrome(TRUE);
-
-	//build dockTongue 
-	LLDockableFloater::postBuild();
-	 
-	LLButton *anchor_btn = LLBottomTray::getInstance()->getChild<LLButton>("camera_presets_btn");
-
-		setDockControl(new LLDockControl(
-			anchor_btn, this,
-			getDockTongue(), LLDockControl::TOP));
-		return TRUE;
-}
-
-/*static*/
-void LLFloaterCameraPresets::onClickCameraPresets(LLUICtrl* ctrl, const LLSD& param)
+void LLFloaterCamera::onClickCameraPresets(const LLSD& param)
 {
 	std::string name = param.asString();
 
@@ -321,5 +304,9 @@ void LLFloaterCameraPresets::onClickCameraPresets(LLUICtrl* ctrl, const LLSD& pa
 	{
 		gAgent.switchCameraPreset(CAMERA_PRESET_FRONT_VIEW);
 	}
+	else if ("mouselook_view" == name)
+	{
+		gAgent.changeCameraToMouselook();
+	}
 
 }
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 69df861a20536e9df54dae199158833f7dc2ec7f..583f279e6276c70d181d9a864f22eee54d10dfa4 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -33,7 +33,7 @@
 #ifndef LLFLOATERCAMERA_H
 #define LLFLOATERCAMERA_H
 
-#include "lldockablefloater.h"
+#include "lltransientdockablefloater.h"
 
 class LLJoystickCameraRotate;
 class LLJoystickCameraZoom;
@@ -49,7 +49,7 @@ enum ECameraControlMode
 };
 
 class LLFloaterCamera
-	:	public LLDockableFloater
+	:	public LLTransientDockableFloater
 {
 	friend class LLFloaterReg;
 	
@@ -57,6 +57,8 @@ class LLFloaterCamera
 
 	/* whether in free camera mode */
 	static bool inFreeCameraMode();
+	/* callback for camera presets changing */
+	static void onClickCameraPresets(const LLSD& param);
 
 	static void toPrevModeIfInAvatarViewMode();
 
@@ -69,6 +71,7 @@ class LLFloaterCamera
 	static void updateIfNotInAvatarViewMode();
 
 	virtual void onOpen(const LLSD& key);
+	virtual void onClose(bool app_quitting);
 
 	LLJoystickCameraRotate* mRotate;
 	LLJoystickCameraZoom*	mZoom;
@@ -111,15 +114,4 @@ class LLFloaterCamera
 
 };
 
-class LLFloaterCameraPresets : public LLDockableFloater 
-{
-	friend class LLFloaterReg;
-public:
-	static void onClickCameraPresets(LLUICtrl* ctrl, const LLSD& param);
-private:
-	LLFloaterCameraPresets(const LLSD&);
-	~LLFloaterCameraPresets(){}
-	/*virtual*/ BOOL postBuild();
-	
-};
 #endif
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index a33a605f502b0b20ee726696df390deb141a7048..c890f9f1226c963c48d15b1f55a1ea315a919080 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -48,6 +48,7 @@
 #include "message.h"
 
 // newview includes
+#include "llappearancemgr.h"
 #include "llappviewer.h"
 #include "llfirstuse.h"
 #include "llfloaterchat.h"
@@ -1174,7 +1175,6 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p)
 	mHasInventoryConnection(false),
 	mStartFolderString(p.start_folder)
 ,	mBuildDefaultHierarchy(true)
-,	mRootInventoryItemUUID(LLUUID::null)
 ,	mInvFVBridgeBuilder(NULL)
 {
 	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
@@ -1241,7 +1241,19 @@ BOOL LLInventoryPanel::postBuild()
 	// determine the root folder, if any, so inventory contents show just the children
 	// of that folder (i.e. not including the folder itself).
 	const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString);
-	mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
+
+	if ("inventory" == mStartFolderString)
+	{
+		mStartFolderID = gInventory.getRootFolderID();
+	}
+	else if ("library" == mStartFolderString)
+	{
+		mStartFolderID = gInventory.getLibraryRootFolderID();
+	}
+	else
+	{
+		mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
+	}
 
 	// build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback
 	if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection)
@@ -1462,24 +1474,6 @@ void LLInventoryPanel::modelChanged(U32 mask)
 	}
 }
 
-void LLInventoryPanel::setInvFVBridgeBuilder(const LLInventoryFVBridgeBuilder* bridge_builder)
-{
-	if (NULL == bridge_builder)
-	{
-		llwarns << "NULL is passed as Inventory Bridge Builder. Default will be used." << llendl; 
-	}
-	else
-	{
-		mInvFVBridgeBuilder = bridge_builder;
-	}
-
-	if (mInventory->isInventoryUsable() && !mHasInventoryConnection)
-	{
-		rebuildViewsFor(mRootInventoryItemUUID);
-		mHasInventoryConnection = true;
-	}
-}
-
 
 void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
 {
@@ -1508,14 +1502,28 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 		objectp = gInventory.getObject(id);
 		if (objectp)
 		{		
+			const LLUUID &parent_id = objectp->getParentUUID();
+			// If this item's parent is the starting folder, then just add it to the top level (recall that 
+			// the starting folder isn't actually represented in the view, parent_folder would be NULL in
+			// this case otherwise).
+			LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ?
+				mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id));
+
+			// This item exists outside the inventory's hierarchy, so don't add it.
+			if (!parent_folder)
+			{
+				return;
+			}
+
 			if (objectp->getType() <= LLAssetType::AT_NONE ||
 				objectp->getType() >= LLAssetType::AT_COUNT)
 			{
-				llwarns << "LLInventoryPanel::buildNewViews called with objectp->mType == " 
-						<< ((S32) objectp->getType())
-						<< " (shouldn't happen)" << llendl;
+				llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << 
+					((S32) objectp->getType()) << llendl;
+				return;
 			}
-			else if (objectp->getType() == LLAssetType::AT_CATEGORY &&
+			
+			if (objectp->getType() == LLAssetType::AT_CATEGORY &&
 					 objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) 
 			{
 				LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
@@ -1563,27 +1571,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 
 			if (itemp)
 			{
-				
-				const LLUUID &parent_id = objectp->getParentUUID();
-				LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(parent_id);
-
-				// If this item's parent is the starting folder, then just add it to the top level (recall that 
-				// the starting folder isn't actually represented in the view, parent_folder would be NULL in
-				// this case otherwise).
-				if (parent_id == mStartFolderID)
-				{
-					parent_folder = mFolders;
-				}
-
-				if (parent_folder)
-				{
-					itemp->addToFolder(parent_folder, mFolders);
-				}
-				else
-				{
-					llwarns << "Couldn't find parent folder for child " << itemp->getLabel() << llendl;
-					delete itemp;
-				}
+				itemp->addToFolder(parent_folder, mFolders);
 			}
 		}
 	}
@@ -1732,6 +1720,12 @@ void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type)
 
 void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus)
 {
+	// Don't select objects in COF (e.g. to prevent refocus when items are worn).
+	const LLInventoryObject *obj = gInventory.getObject(obj_id);
+	if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF())
+	{
+		return;
+	}
 	mFolders->setSelectionByID(obj_id, take_keyboard_focus);
 }
 
diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h
index 1666f18c05266ea85c271e54def031122a0c38c4..4c9ac5d4c682de1723e371d943447b46b5f64bb4 100644
--- a/indra/newview/llfloaterinventory.h
+++ b/indra/newview/llfloaterinventory.h
@@ -175,9 +175,6 @@ class LLInventoryPanel : public LLPanel
 	void rebuildViewsFor(const LLUUID& id);
 	virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719
 
-	// Be sure that passed pointer will be destroyed where it was created.
-	void setInvFVBridgeBuilder(const LLInventoryFVBridgeBuilder* bridge_builder);
-
 protected:
 	LLInventoryModel*			mInventory;
 	LLInventoryObserver*		mInventoryObserver;
@@ -187,6 +184,12 @@ class LLInventoryPanel : public LLPanel
 //private: // Can not make these private - needed by llinventorysubtreepanel
 	LLFolderView*				mFolders;
 	std::string                 mStartFolderString;
+
+	/**
+	 * Contains UUID of Inventory item from which hierarchy should be built.
+	 * Can be set with the "start_folder" xml property.
+	 * Default is LLUUID::null that means total Inventory hierarchy.
+	 */
 	LLUUID						mStartFolderID;
 	LLScrollContainer*			mScroller;
 	bool						mHasInventoryConnection;
@@ -196,11 +199,6 @@ class LLInventoryPanel : public LLPanel
 	 */
 	bool						mBuildDefaultHierarchy;
 
-	/**
-	 * Contains UUID of Inventory item from which hierarchy should be built.
-	 * Should be set by derived class before modelChanged() is called.
-	 * Default is LLUUID::null that means total Inventory hierarchy.
-	 */
 	LLUUID						mRootInventoryItemUUID;
 
 	/**
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 488d71aa70a27237988009319126108ef32709e3..bdf9842b015ec8288cf50389062d7476d5626533 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1054,9 +1054,9 @@ BOOL LLPanelLandObjects::postBuild()
 	mBtnReturnOwnerList = getChild<LLButton>("Return objects...");
 	mBtnReturnOwnerList->setClickedCallback(onClickReturnOwnerList, this);
 
-	mIconAvatarOnline = LLUIImageList::getInstance()->getUIImage("icon_avatar_online.tga");
-	mIconAvatarOffline = LLUIImageList::getInstance()->getUIImage("icon_avatar_offline.tga");
-	mIconGroup = LLUIImageList::getInstance()->getUIImage("icon_group.tga");
+	mIconAvatarOnline = LLUIImageList::getInstance()->getUIImage("icon_avatar_online.tga", 0);
+	mIconAvatarOffline = LLUIImageList::getInstance()->getUIImage("icon_avatar_offline.tga", 0);
+	mIconGroup = LLUIImageList::getInstance()->getUIImage("icon_group.tga", 0);
 
 	mOwnerList = getChild<LLNameListCtrl>("owner list");
 	mOwnerList->sortByColumnIndex(3, FALSE);
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index 091debe95e3ccdc69531c92caae4329cc74e8e2b..4375787ea2eb0d4add6f915b6a238bbd4aa165e1 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -586,7 +586,6 @@ void LLFloaterProperties::onCommitName()
 		{
 			new_item->updateServer(FALSE);
 			gInventory.updateItem(new_item);
-			gInventory.updateLinkedObjects(new_item->getUUID());
 			gInventory.notifyObservers();
 		}
 		else
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index e15fdd3e3511be4598842357d2eb79c4eddd5e70..11544f5b7b58780180ce9022df5bd14c7ac5c5cc 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -442,52 +442,43 @@ LLPanelRegionInfo::LLPanelRegionInfo()
 {
 }
 
-// static
-void LLPanelRegionInfo::onBtnSet(void* user_data)
+void LLPanelRegionInfo::onBtnSet()
 {
-	LLPanelRegionInfo* panel = (LLPanelRegionInfo*)user_data;
-	if(!panel) return;
-	if (panel->sendUpdate())
+	if (sendUpdate())
 	{
-		panel->disableButton("apply_btn");
+		disableButton("apply_btn");
 	}
 }
 
-//static 
-void LLPanelRegionInfo::onChangeChildCtrl(LLUICtrl* ctrl, void* user_data)
+void LLPanelRegionInfo::onChangeChildCtrl(LLUICtrl* ctrl)
 {
-	if (ctrl)
-	{
-		LLPanelRegionInfo* panel = (LLPanelRegionInfo*) ctrl->getParent();
-		panel->updateChild(ctrl);
-	}
+	updateChild(ctrl); // virtual function
 }
 
-// static
 // Enables the "set" button if it is not already enabled
-void LLPanelRegionInfo::onChangeAnything(LLUICtrl* ctrl, void* user_data)
+void LLPanelRegionInfo::onChangeAnything()
 {
-	LLPanelRegionInfo* panel = (LLPanelRegionInfo*)user_data;
-	if(panel)
-	{
-		panel->enableButton("apply_btn");
-		panel->refresh();
-	}
+	enableButton("apply_btn");
+	refresh();
 }
 
 // static
 // Enables set button on change to line editor
 void LLPanelRegionInfo::onChangeText(LLLineEditor* caller, void* user_data)
 {
-	// reuse the previous method
-	onChangeAnything(0, user_data);
+	LLPanelRegionInfo* panel = dynamic_cast<LLPanelRegionInfo*>(caller->getParent());
+	if(panel)
+	{
+		panel->enableButton("apply_btn");
+		panel->refresh();
+	}
 }
 
 
 // virtual
 BOOL LLPanelRegionInfo::postBuild()
 {
-	childSetAction("apply_btn", onBtnSet, this);
+	getChild<LLUICtrl>("apply_btn")->setCommitCallback(boost::bind(&LLPanelRegionInfo::onBtnSet, this));
 	childDisable("apply_btn");
 	refresh();
 	return TRUE;
@@ -550,19 +541,17 @@ void LLPanelRegionInfo::disableButton(const std::string& btn_name)
 
 void LLPanelRegionInfo::initCtrl(const std::string& name)
 {
-	childSetCommitCallback(name, onChangeAnything, this);
+	getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onChangeAnything, this));
 }
 
 void LLPanelRegionInfo::initHelpBtn(const std::string& name, const std::string& xml_alert)
 {
-	childSetAction(name, onClickHelp, new std::string(xml_alert));
+	getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onClickHelp, this, xml_alert));
 }
 
-// static
-void LLPanelRegionInfo::onClickHelp(void* data)
+void LLPanelRegionInfo::onClickHelp(std::string xml_alert)
 {
-	std::string* xml_alert = (std::string*)data;
-	LLNotifications::instance().add(*xml_alert);
+	LLNotifications::instance().add(xml_alert);
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -1207,9 +1196,9 @@ BOOL LLPanelRegionTerrainInfo::postBuild()
 	initCtrl("terrain_lower_spin");
 
 	initCtrl("fixed_sun_check");
-	childSetCommitCallback("fixed_sun_check", onChangeFixedSun, this);
-	childSetCommitCallback("use_estate_sun_check", onChangeUseEstateTime, this);
-	childSetCommitCallback("sun_hour_slider", onChangeSunHour, this);
+	getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeFixedSun, this));
+	getChild<LLUICtrl>("use_estate_sun_check")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeUseEstateTime, this));
+	getChild<LLUICtrl>("sun_hour_slider")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeSunHour, this));
 
 	childSetAction("download_raw_btn", onClickDownloadRaw, this);
 	childSetAction("upload_raw_btn", onClickUploadRaw, this);
@@ -1292,39 +1281,29 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate()
 	return TRUE;
 }
 
-// static 
-void LLPanelRegionTerrainInfo::onChangeUseEstateTime(LLUICtrl* ctrl, void* user_data)
+void LLPanelRegionTerrainInfo::onChangeUseEstateTime()
 {
-	LLPanelRegionTerrainInfo* panel = (LLPanelRegionTerrainInfo*) user_data;
-	if (!panel) return;
-	BOOL use_estate_sun = panel->childGetValue("use_estate_sun_check").asBoolean();
-	panel->childSetEnabled("fixed_sun_check", !use_estate_sun);
-	panel->childSetEnabled("sun_hour_slider", !use_estate_sun);
+	BOOL use_estate_sun = childGetValue("use_estate_sun_check").asBoolean();
+	childSetEnabled("fixed_sun_check", !use_estate_sun);
+	childSetEnabled("sun_hour_slider", !use_estate_sun);
 	if (use_estate_sun)
 	{
-		panel->childSetValue("fixed_sun_check", LLSD(FALSE));
-		panel->childSetValue("sun_hour_slider", LLSD(0.f));
+		childSetValue("fixed_sun_check", LLSD(FALSE));
+		childSetValue("sun_hour_slider", LLSD(0.f));
 	}
-	panel->childEnable("apply_btn");
+	childEnable("apply_btn");
 }
 
-// static 
-void LLPanelRegionTerrainInfo::onChangeFixedSun(LLUICtrl* ctrl, void* user_data)
+void LLPanelRegionTerrainInfo::onChangeFixedSun()
 {
-	LLPanelRegionTerrainInfo* panel = (LLPanelRegionTerrainInfo*) user_data;
-	if (!panel) return;
 	// Just enable the apply button.  We let the sun-hour slider be enabled
 	// for both fixed-sun and non-fixed-sun. JC
-	panel->childEnable("apply_btn");
+	childEnable("apply_btn");
 }
 
-// static 
-void LLPanelRegionTerrainInfo::onChangeSunHour(LLUICtrl* ctrl, void*)
+void LLPanelRegionTerrainInfo::onChangeSunHour()
 {
-	// can't use userdata to get panel, slider uses it internally
-	LLPanelRegionTerrainInfo* panel = (LLPanelRegionTerrainInfo*) ctrl->getParent();
-	if (!panel) return;
-	panel->childEnable("apply_btn");
+	childEnable("apply_btn");
 }
 
 // static
@@ -1420,32 +1399,23 @@ void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)
 	estate_dispatch_initialized = true;
 }
 
-// static
 // Disables the sun-hour slider and the use fixed time check if the use global time is check
-void LLPanelEstateInfo::onChangeUseGlobalTime(LLUICtrl* ctrl, void* user_data)
+void LLPanelEstateInfo::onChangeUseGlobalTime()
 {
-	LLPanelEstateInfo* panel = (LLPanelEstateInfo*) user_data;
-	if (panel)
-	{
-		bool enabled = !panel->childGetValue("use_global_time_check").asBoolean();
-		panel->childSetEnabled("sun_hour_slider", enabled);
-		panel->childSetEnabled("fixed_sun_check", enabled);
-		panel->childSetValue("fixed_sun_check", LLSD(FALSE));
-		panel->enableButton("apply_btn");
-	}
+	bool enabled = !childGetValue("use_global_time_check").asBoolean();
+	childSetEnabled("sun_hour_slider", enabled);
+	childSetEnabled("fixed_sun_check", enabled);
+	childSetValue("fixed_sun_check", LLSD(FALSE));
+	enableButton("apply_btn");
 }
 
 // Enables the sun-hour slider if the fixed-sun checkbox is set
-void LLPanelEstateInfo::onChangeFixedSun(LLUICtrl* ctrl, void* user_data)
+void LLPanelEstateInfo::onChangeFixedSun()
 {
-	LLPanelEstateInfo* panel = (LLPanelEstateInfo*) user_data;
-	if (panel)
-	{
-		bool enabled = !panel->childGetValue("fixed_sun_check").asBoolean();
-		panel->childSetEnabled("use_global_time_check", enabled);
-		panel->childSetValue("use_global_time_check", LLSD(FALSE));
-		panel->enableButton("apply_btn");
-	}
+	bool enabled = !childGetValue("fixed_sun_check").asBoolean();
+	childSetEnabled("use_global_time_check", enabled);
+	childSetValue("use_global_time_check", LLSD(FALSE));
+	enableButton("apply_btn");
 }
 
 
@@ -2130,7 +2100,7 @@ BOOL LLPanelEstateInfo::postBuild()
 	initCtrl("limit_payment");
 	initCtrl("limit_age_verified");
 	initCtrl("voice_chat_check");
-	childSetCommitCallback("abuse_email_address", onChangeAnything, this);
+	getChild<LLUICtrl>("abuse_email_address")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAnything, this));
 	getChild<LLLineEditor>("abuse_email_address")->setKeystrokeCallback(onChangeText, this);
 
 	initHelpBtn("estate_manager_help",			"HelpEstateEstateManager");
@@ -2144,15 +2114,15 @@ BOOL LLPanelEstateInfo::postBuild()
 	initHelpBtn("allow_resident_help",			"HelpEstateAllowResident");
 	initHelpBtn("allow_group_help",				"HelpEstateAllowGroup");
 	initHelpBtn("ban_resident_help",			"HelpEstateBanResident");
-	initHelpBtn("abuse_email_address_help",         "HelpEstateAbuseEmailAddress");
-	initHelpBtn("voice_chat_help",                  "HelpEstateVoiceChat");
+	initHelpBtn("abuse_email_address_help",     "HelpEstateAbuseEmailAddress");
+	initHelpBtn("voice_chat_help",              "HelpEstateVoiceChat");
 
 	// set up the use global time checkbox
-	childSetCommitCallback("use_global_time_check", onChangeUseGlobalTime, this);
-	childSetCommitCallback("fixed_sun_check", onChangeFixedSun, this);
-	childSetCommitCallback("sun_hour_slider", onChangeChildCtrl, this);
-
-	childSetCommitCallback("allowed_avatar_name_list", onChangeChildCtrl, this);
+	getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this));
+	getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeFixedSun, this));
+	getChild<LLUICtrl>("sun_hour_slider")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
+	
+	getChild<LLUICtrl>("allowed_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));	
 	LLNameListCtrl *avatar_name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list");
 	if (avatar_name_list)
 	{
@@ -2163,7 +2133,7 @@ BOOL LLPanelEstateInfo::postBuild()
 	childSetAction("add_allowed_avatar_btn", onClickAddAllowedAgent, this);
 	childSetAction("remove_allowed_avatar_btn", onClickRemoveAllowedAgent, this);
 
-	childSetCommitCallback("allowed_group_name_list", onChangeChildCtrl, this);
+	getChild<LLUICtrl>("allowed_group_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
 	LLNameListCtrl* group_name_list = getChild<LLNameListCtrl>("allowed_group_name_list");
 	if (group_name_list)
 	{
@@ -2174,7 +2144,7 @@ BOOL LLPanelEstateInfo::postBuild()
 	getChild<LLUICtrl>("add_allowed_group_btn")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onClickAddAllowedGroup, this));
 	childSetAction("remove_allowed_group_btn", onClickRemoveAllowedGroup, this);
 
-	childSetCommitCallback("banned_avatar_name_list", onChangeChildCtrl, this);
+	getChild<LLUICtrl>("banned_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
 	LLNameListCtrl* banned_name_list = getChild<LLNameListCtrl>("banned_avatar_name_list");
 	if (banned_name_list)
 	{
@@ -2185,7 +2155,7 @@ BOOL LLPanelEstateInfo::postBuild()
 	childSetAction("add_banned_avatar_btn", onClickAddBannedAgent, this);
 	childSetAction("remove_banned_avatar_btn", onClickRemoveBannedAgent, this);
 
-	childSetCommitCallback("estate_manager_name_list", onChangeChildCtrl, this);
+	getChild<LLUICtrl>("estate_manager_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
 	LLNameListCtrl* manager_name_list = getChild<LLNameListCtrl>("estate_manager_name_list");
 	if (manager_name_list)
 	{
@@ -2299,13 +2269,18 @@ void LLPanelEstateInfo::getEstateOwner()
 class LLEstateChangeInfoResponder : public LLHTTPClient::Responder
 {
 public:
-	LLEstateChangeInfoResponder(void* userdata) : mpPanel((LLPanelEstateInfo*)userdata) {};
+	LLEstateChangeInfoResponder(LLPanelEstateInfo* panel)
+	{
+		mpPanel = panel->getHandle();
+	}
 	
 	// if we get a normal response, handle it here
 	virtual void result(const LLSD& content)
 	{
 	    // refresh the panel from the database
-		mpPanel->refresh();
+		LLPanelEstateInfo* panel = dynamic_cast<LLPanelEstateInfo*>(mpPanel.get());
+		if (panel)
+			panel->refresh();
 	}
 	
 	// if we get an error response
@@ -2315,7 +2290,7 @@ class LLEstateChangeInfoResponder : public LLHTTPClient::Responder
 			<< status << ": " << reason << llendl;
 	}
 private:
-	LLPanelEstateInfo* mpPanel;
+	LLHandle<LLPanel> mpPanel;
 };
 
 // tries to send estate info using a cap; returns true if it succeeded
@@ -2353,7 +2328,7 @@ bool LLPanelEstateInfo::commitEstateInfoCaps()
 	body["owner_abuse_email"] = childGetValue("abuse_email_address").asString();
 
 	// we use a responder so that we can re-get the data after committing to the database
-	LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder((void*)this));
+	LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this));
     return true;
 }
 
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 68ed4e0c897ac71b70159bd62794ea2fe428b339..95833af8a107f3bf9c7c8e4a5c6468a421260073 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -109,9 +109,9 @@ class LLPanelRegionInfo : public LLPanel
 public:
 	LLPanelRegionInfo();
 	
-	static void onBtnSet(void* user_data);
-	static void onChangeChildCtrl(LLUICtrl* ctrl, void* user_data);
-	static void onChangeAnything(LLUICtrl* ctrl, void* user_data);
+	void onBtnSet();
+	void onChangeChildCtrl(LLUICtrl* ctrl);
+	void onChangeAnything();
 	static void onChangeText(LLLineEditor* caller, void* user_data);
 	
 	virtual bool refreshFromRegion(LLViewerRegion* region);
@@ -128,7 +128,7 @@ class LLPanelRegionInfo : public LLPanel
 	void initHelpBtn(const std::string& name, const std::string& xml_alert);
 
 	// Callback for all help buttons, data is name of XML alert to show.
-	static void onClickHelp(void* data);
+	void onClickHelp(std::string xml_alert);
 	
 	// Returns TRUE if update sent and apply button should be
 	// disabled.
@@ -239,9 +239,9 @@ class LLPanelRegionTerrainInfo : public LLPanelRegionInfo
 protected:
 	virtual BOOL sendUpdate();
 
-	static void onChangeUseEstateTime(LLUICtrl* ctrl, void* user_data);
-	static void onChangeFixedSun(LLUICtrl* ctrl, void* user_data);
-	static void onChangeSunHour(LLUICtrl* ctrl, void*);
+	void onChangeUseEstateTime();
+	void onChangeFixedSun();
+	void onChangeSunHour();
 
 	static void onClickDownloadRaw(void*);
 	static void onClickUploadRaw(void*);
@@ -256,8 +256,8 @@ class LLPanelEstateInfo : public LLPanelRegionInfo
 public:
 	static void initDispatch(LLDispatcher& dispatch);
 	
-	static void onChangeFixedSun(LLUICtrl* ctrl, void* user_data);
-	static void onChangeUseGlobalTime(LLUICtrl* ctrl, void* user_data);
+	void onChangeFixedSun();
+	void onChangeUseGlobalTime();
 	
 	static void onClickEditSky(void* userdata);
 	static void onClickEditSkyHelp(void* userdata);	
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index de0b995f8f9c41a22c557f2d9fd2ae00494a31f2..ac743df4f1c1e5f91e1a94ae6f12940b4a5b3be1 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -553,32 +553,33 @@ void LLFloaterUIPreview::onLanguageComboSelect(LLUICtrl* ctrl)
 
 void LLFloaterUIPreview::onClickExportSchema()
 {
-	gViewerWindow->setCursor(UI_CURSOR_WAIT);
-	std::string template_path = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "xui", "schema");
-
-	typedef LLWidgetTypeRegistry::Registrar::registry_map_t::const_iterator registry_it;
-	registry_it end_it = LLWidgetTypeRegistry::defaultRegistrar().endItems();
-	for(registry_it it = LLWidgetTypeRegistry::defaultRegistrar().beginItems();
-		it != end_it;
-		++it)
-	{
-		std::string widget_name = it->first;
-		const LLInitParam::BaseBlock& block = 
-			(*LLDefaultParamBlockRegistry::instance().getValue(*LLWidgetTypeRegistry::instance().getValue(widget_name)))();
-		LLXMLNodePtr root_nodep = new LLXMLNode();
-		LLRNGWriter().writeRNG(widget_name, root_nodep, block, "http://www.lindenlab.com/xui");
-
-		std::string file_name(template_path + gDirUtilp->getDirDelimiter() + widget_name + ".rng");
-
-		LLFILE* rng_file = LLFile::fopen(file_name.c_str(), "w");
-		{
-			LLXMLNode::writeHeaderToFile(rng_file);
-			const bool use_type_decorations = false;
-			root_nodep->writeToFile(rng_file, std::string(), use_type_decorations);
-		}
-		fclose(rng_file);
-	}
-	gViewerWindow->setCursor(UI_CURSOR_ARROW);
+	//NOTE: schema generation not complete
+	//gViewerWindow->setCursor(UI_CURSOR_WAIT);
+	//std::string template_path = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "xui", "schema");
+
+	//typedef LLWidgetTypeRegistry::Registrar::registry_map_t::const_iterator registry_it;
+	//registry_it end_it = LLWidgetTypeRegistry::defaultRegistrar().endItems();
+	//for(registry_it it = LLWidgetTypeRegistry::defaultRegistrar().beginItems();
+	//	it != end_it;
+	//	++it)
+	//{
+	//	std::string widget_name = it->first;
+	//	const LLInitParam::BaseBlock& block = 
+	//		(*LLDefaultParamBlockRegistry::instance().getValue(*LLWidgetTypeRegistry::instance().getValue(widget_name)))();
+	//	LLXMLNodePtr root_nodep = new LLXMLNode();
+	//	LLRNGWriter().writeRNG(widget_name, root_nodep, block, "http://www.lindenlab.com/xui");
+
+	//	std::string file_name(template_path + gDirUtilp->getDirDelimiter() + widget_name + ".rng");
+
+	//	LLFILE* rng_file = LLFile::fopen(file_name.c_str(), "w");
+	//	{
+	//		LLXMLNode::writeHeaderToFile(rng_file);
+	//		const bool use_type_decorations = false;
+	//		root_nodep->writeToFile(rng_file, std::string(), use_type_decorations);
+	//	}
+	//	fclose(rng_file);
+	//}
+	//gViewerWindow->setCursor(UI_CURSOR_ARROW);
 }
 
 void LLFloaterUIPreview::onClickShowRectangles(const LLSD& data)
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 155262ee133a2178f4dc01ac0a59110d4de7fdc8..de18e7475288f1c9c0c8a8e11f5e1317fa3dd8cb 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -189,9 +189,9 @@ LLFolderView::LLFolderView(const Params& p)
 	mMinWidth(0),
 	mDragAndDropThisFrame(FALSE),
 	mCallbackRegistrar(NULL),
-	mParentPanel(p.parent_panel)
-,	mUseEllipses(false)
-,	mDraggingOverItem(NULL)
+	mParentPanel(p.parent_panel),
+	mUseEllipses(false),
+	mDraggingOverItem(NULL)
 {
 	LLRect rect = p.rect;
 	LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom);
@@ -1240,7 +1240,9 @@ BOOL LLFolderView::canCut() const
 	{
 		const LLFolderViewItem* item = *selected_it;
 		const LLFolderViewEventListener* listener = item->getListener();
-		if (!listener || !listener->isItemMovable())
+
+		// *WARKAROUND: it is too many places where the "isItemRemovable" method should be changed with "const" modifier
+		if (!listener || !(const_cast<LLFolderViewEventListener*>(listener))->isItemRemovable())
 		{
 			return FALSE;
 		}
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 9208beec9eea18d5aaf044a7fb757d6258e2b5df..f83a426cdab91b6802c7f2ebc58a09e8252c4215 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -890,11 +890,11 @@ void LLFolderViewItem::draw()
 				llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD),
 				sHighlightFgColor, FALSE);
 		}
-		if (getRect().getHeight() > llround(font->getLineHeight()) + ICON_PAD + 2)
+		if (getRect().getHeight() > llround(font->getLineHeight()) + ICON_PAD + 4)
 		{
 			gl_rect_2d(
 				0, 
-				llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 2, 
+				llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 4, 
 				getRect().getWidth() - 2,
 				2,
 				sHighlightFgColor, FALSE);
@@ -902,7 +902,7 @@ void LLFolderViewItem::draw()
 			{
 				gl_rect_2d(
 					0, 
-					llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 2, 
+					llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 4, 
 					getRect().getWidth() - 2,
 					2,
 					sHighlightBgColor, TRUE);
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 90c346b381bf249cdae07dfe8655820cec51d95d..62a4b9a18756e40aae08e8bf26333d548be6c2cd 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -202,6 +202,7 @@ class LLFolderViewItem : public LLView
 	virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
 	virtual S32 getItemHeight();
 	void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarhy = dont_show; }
+	bool getDontShowInHierarchy() { return mDontShowInHierarhy; }
 
 	// applies filters to control visibility of inventory items
 	virtual void filter( LLInventoryFilter& filter);
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 97b7f3e9ad04675b9886d985c8700cddcef23b59..fbcaeee01f224be9faecf2784c4a08f5ec58875c 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -166,6 +166,93 @@ bool LLFriendCardsManager::isItemInAnyFriendsList(const LLViewerInventoryItem* i
 	return items.count() > 0;
 }
 
+
+bool LLFriendCardsManager::isObjDirectDescendentOfCategory(const LLInventoryObject* obj, 
+	const LLViewerInventoryCategory* cat) const
+{
+	// we need both params to proceed.
+	if ( !obj || !cat )
+		return false;
+
+	// Need to check that target category is in the Calling Card/Friends folder. 
+	// In other case function returns unpredictable result.
+	if ( !isCategoryInFriendFolder(cat) )
+		return false;
+
+	bool result = false;
+
+	LLInventoryModel::item_array_t* items;
+	LLInventoryModel::cat_array_t* cats;
+
+	gInventory.lockDirectDescendentArrays(cat->getUUID(), cats, items);
+	if ( items )
+	{
+		if ( obj->getType() == LLAssetType::AT_CALLINGCARD )
+		{
+			// For CALLINGCARD compare items by creator's id, if they are equal assume
+			// that it is same card and return true. Note: UUID's of compared items
+			// may be not equal. Also, we already know that obj should be type of LLInventoryItem,
+			// but in case inventory database is broken check what dynamic_cast returns.
+			const LLInventoryItem* item = dynamic_cast < const LLInventoryItem* > (obj);
+			if ( item )
+			{
+				LLUUID creator_id = item->getCreatorUUID();
+				LLViewerInventoryItem* cur_item = NULL;
+				for ( S32 i = items->count() - 1; i >= 0; --i )
+				{
+					cur_item = items->get(i);
+					if ( creator_id == cur_item->getCreatorUUID() )
+					{
+						result = true;
+						break;
+					}
+				}
+			}
+		}
+		else
+		{
+			// Else check that items have same type and name.
+			// Note: UUID's of compared items also may be not equal.
+			std::string obj_name = obj->getName();
+			LLViewerInventoryItem* cur_item = NULL;
+			for ( S32 i = items->count() - 1; i >= 0; --i )
+			{
+				cur_item = items->get(i);
+				if ( obj->getType() != cur_item->getType() )
+					continue;
+				if ( obj_name == cur_item->getName() )
+				{
+					result = true;
+					break;
+				}
+			}
+		}
+	}
+	if ( !result && cats )
+	{
+		// There is no direct descendent in items, so check categories.
+		// If target obj and descendent category have same type and name
+		// then return true. Note: UUID's of compared items also may be not equal.
+		std::string obj_name = obj->getName();
+		LLViewerInventoryCategory* cur_cat = NULL;
+		for ( S32 i = cats->count() - 1; i >= 0; --i )
+		{
+			cur_cat = cats->get(i);
+			if ( obj->getType() != cur_cat->getType() )
+				continue;
+			if ( obj_name == cur_cat->getName() )
+			{
+				result = true;
+				break;
+			}
+		}
+	}
+	gInventory.unlockDirectDescendentArrays(cat->getUUID());
+
+	return result;
+}
+
+
 bool LLFriendCardsManager::isCategoryInFriendFolder(const LLViewerInventoryCategory* cat) const
 {
 	if (NULL == cat)
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index aa391ce2c162fc0e2bfb039093ab94aebc066bbe..6ada3428311c03b52528cca05022a1f2683cf62a 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -71,6 +71,12 @@ class LLFriendCardsManager
 	 */
 	bool isItemInAnyFriendsList(const LLViewerInventoryItem* item);
 
+	/**
+	 *	Checks if specified category is contained in the Calling Card/Friends folder and 
+	 *	determines if specified Inventory Object exists in that category.
+	 */
+	bool isObjDirectDescendentOfCategory(const LLInventoryObject* obj, const LLViewerInventoryCategory* cat) const;
+
 	/**
 	 *	Checks is the specified category is in the Calling Card/Friends folder
 	 */
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index 27e31d4edd685a7c459e2704f9895cdc4510a4e1..2e2b2d51011b0043145c19ddad595e1a6e500a7c 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -43,6 +43,7 @@
 // newview
 #include "llagent.h"
 #include "llgroupactions.h"
+#include "llfloaterreg.h"
 #include "llviewercontrol.h"	// for gSavedSettings
 
 static LLDefaultChildRegistry::Register<LLGroupList> r("group_list");
@@ -231,6 +232,8 @@ BOOL  LLGroupListItem::postBuild()
 	mInfoBtn = getChild<LLButton>("info_btn");
 	mInfoBtn->setClickedCallback(boost::bind(&LLGroupListItem::onInfoBtnClick, this));
 
+	childSetAction("profile_btn", boost::bind(&LLGroupListItem::onProfileBtnClick, this));
+
 	return TRUE;
 }
 
@@ -320,7 +323,13 @@ void LLGroupListItem::setActive(bool active)
 }
 
 void LLGroupListItem::onInfoBtnClick()
+{
+	LLFloaterReg::showInstance("inspect_group", LLSD().insert("group_id", mGroupID));
+}
+
+void LLGroupListItem::onProfileBtnClick()
 {
 	LLGroupActions::show(mGroupID);
 }
+
 //EOF
diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h
index 9c3ab88901bd5312d4b7c0ca0687e8dcf829c792..8dbc13997cece35ecfec2739bd92a9991766d6ba 100644
--- a/indra/newview/llgrouplist.h
+++ b/indra/newview/llgrouplist.h
@@ -98,6 +98,7 @@ class LLGroupListItem : public LLPanel
 private:
 	void setActive(bool active);
 	void onInfoBtnClick();
+	void onProfileBtnClick();
 
 	LLTextBox*	mGroupNameBox;
 	LLUUID		mGroupID;
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index a35c04440bd91030baf749c554b575c134fa0719..a20b5ea66c0ba1d015011477fabdcb135356738f 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -48,20 +48,19 @@
 #include "llpanelimcontrolpanel.h"
 #include "llscreenchannel.h"
 #include "lltrans.h"
-#include "llviewertexteditor.h"
+#include "llchathistory.h"
 #include "llviewerwindow.h"
 #include "lltransientfloatermgr.h"
 
 
 
 LLIMFloater::LLIMFloater(const LLUUID& session_id)
-  : LLDockableFloater(NULL, session_id),
+  : LLTransientDockableFloater(NULL, true, session_id),
 	mControlPanel(NULL),
 	mSessionID(session_id),
 	mLastMessageIndex(-1),
-	mLastFromName(),
 	mDialog(IM_NOTHING_SPECIAL),
-	mHistoryEditor(NULL),
+	mChatHistory(NULL),
 	mInputEditor(NULL), 
 	mPositioned(false),
 	mSessionInitialized(false)
@@ -81,17 +80,22 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
 			mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this);
 		}
 	}
+}
+
+void LLIMFloater::onFocusLost()
+{
+	LLIMModel::getInstance()->resetActiveSessionID();
+}
 
-	LLTransientFloaterMgr::getInstance()->registerTransientFloater(this);
+void LLIMFloater::onFocusReceived()
+{
+	LLIMModel::getInstance()->setActiveSessionID(mSessionID);
 }
 
 // virtual
 void LLIMFloater::onClose(bool app_quitting)
 {
-	LLIMModel::instance().sendLeaveSession(mSessionID, mOtherParticipantUUID);
-
-	//*TODO - move to the IMModel::sendLeaveSession() for the integrity (IB)
-	gIMMgr->removeSession(mSessionID);
+	gIMMgr->leaveSession(mSessionID);
 }
 
 /* static */
@@ -116,6 +120,23 @@ void LLIMFloater::newIMCallback(const LLSD& data){
 	}
 }
 
+void LLIMFloater::onVisibilityChange(const LLSD& new_visibility)
+{
+	bool visible = new_visibility.asBoolean();
+
+	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+
+	if (visible && voice_channel &&
+		voice_channel->getState() == LLVoiceChannel::STATE_CONNECTED)
+	{
+		LLFloaterReg::showInstance("voice_call", mSessionID);
+	}
+	else
+	{
+		LLFloaterReg::hideInstance("voice_call", mSessionID);
+	}
+}
+
 void LLIMFloater::onSendMsg( LLUICtrl* ctrl, void* userdata )
 {
 	LLIMFloater* self = (LLIMFloater*) userdata;
@@ -163,7 +184,6 @@ void LLIMFloater::sendMsg()
 
 LLIMFloater::~LLIMFloater()
 {
-	LLTransientFloaterMgr::getInstance()->unregisterTransientFloater(this);
 }
 
 //virtual
@@ -198,7 +218,7 @@ BOOL LLIMFloater::postBuild()
 
 	childSetCommitCallback("chat_editor", onSendMsg, this);
 	
-	mHistoryEditor = getChild<LLViewerTextEditor>("im_text");
+	mChatHistory = getChild<LLChatHistory>("chat_history");
 		
 	setTitle(LLIMModel::instance().getName(mSessionID));
 	setDocked(true);
@@ -230,7 +250,7 @@ void* LLIMFloater::createPanelIMControl(void* userdata)
 void* LLIMFloater::createPanelGroupControl(void* userdata)
 {
 	LLIMFloater *self = (LLIMFloater*)userdata;
-	self->mControlPanel = new LLPanelGroupControlPanel();
+	self->mControlPanel = new LLPanelGroupControlPanel(self->mSessionID);
 	self->mControlPanel->setXMLFilename("panel_group_control_panel.xml");
 	return self->mControlPanel;
 }
@@ -296,8 +316,10 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
 	LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>
 		(LLNotificationsUI::LLChannelManager::getInstance()->
 											findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+
+	setCanResize(!docked);
 	
-	LLDockableFloater::setDocked(docked, pop_on_undock);
+	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
 
 	// update notification channel state
 	if(channel)
@@ -311,7 +333,7 @@ void LLIMFloater::setVisible(BOOL visible)
 	LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>
 		(LLNotificationsUI::LLChannelManager::getInstance()->
 											findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
-	LLDockableFloater::setVisible(visible);
+	LLTransientDockableFloater::setVisible(visible);
 
 	// update notification channel state
 	if(channel)
@@ -387,7 +409,6 @@ void LLIMFloater::updateMessages()
 
 	if (messages.size())
 	{
-		LLUIColor divider_color = LLUIColorTable::instance().getColor("LtGray_50");
 		LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
 
 		std::ostringstream message;
@@ -397,30 +418,20 @@ void LLIMFloater::updateMessages()
 		{
 			LLSD msg = *iter;
 
-			const bool prepend_newline = true;
 			std::string from = msg["from"].asString();
+			std::string time = msg["time"].asString();
+			LLUUID from_id = msg["from_id"].asUUID();
+			std::string message = msg["message"].asString();
+			LLStyle::Params style_params;
+			style_params.color(chat_color);
+
 			if (from == agent_name)
 				from = LLTrans::getString("You");
-			if (mLastFromName != from)
-			{
-				message << from << " ----- " << msg["time"].asString();
-				mHistoryEditor->appendText(message.str(),
-					prepend_newline, LLStyle::Params().color(divider_color) );
-				message.str("");
-				mLastFromName = from;
-			}
 
-			message << msg["message"].asString(); 
-			mHistoryEditor->appendText(message.str(),
-				prepend_newline, 
-				LLStyle::Params().color(chat_color) );
-			message.str("");
+			mChatHistory->appendWidgetMessage(from_id, from, time, message, style_params);
 
 			mLastMessageIndex = msg["index"].asInteger();
 		}
-		mHistoryEditor->blockUndo();
-
-		mHistoryEditor->setCursorAndScrollToEnd();
 	}
 }
 
@@ -432,7 +443,7 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
 	//in disconnected state IM input editor should be disabled
 	self->mInputEditor->setEnabled(!gDisconnected);
 
-	self->mHistoryEditor->setCursorAndScrollToEnd();
+	self->mChatHistory->setCursorAndScrollToEnd();
 }
 
 // static
@@ -495,7 +506,7 @@ void LLIMFloater::chatFromLogFile(LLLogChat::ELogLineType type, std::string line
 		break;
 	}
 
-	self->mHistoryEditor->appendText(message, true, LLStyle::Params().color(LLUIColorTable::instance().getColor("ChatHistoryTextColor")));
-	self->mHistoryEditor->blockUndo();
+	self->mChatHistory->appendText(message, true, LLStyle::Params().color(LLUIColorTable::instance().getColor("ChatHistoryTextColor")));
+	self->mChatHistory->blockUndo();
 }
 
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 9b519ee7e38e333990b652db72e7a1ced1a260fb..99810b6d6ddaf5de1a7c6d3090b024551c0f72c1 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -33,19 +33,19 @@
 #ifndef LL_IMFLOATER_H
 #define LL_IMFLOATER_H
 
-#include "lldockablefloater.h"
+#include "lltransientdockablefloater.h"
 #include "lllogchat.h"
 
 class LLLineEditor;
 class LLPanelChatControlPanel;
-class LLViewerTextEditor;
+class LLChatHistory;
 
 
 /**
  * Individual IM window that appears at the bottom of the screen,
  * optionally "docked" to the bottom tray.
  */
-class LLIMFloater : public LLDockableFloater
+class LLIMFloater : public LLTransientDockableFloater
 {
 public:
 	LLIMFloater(const LLUUID& session_id);
@@ -84,7 +84,12 @@ class LLIMFloater : public LLDockableFloater
 	// called when docked floater's position has been set by chiclet
 	void setPositioned(bool b) { mPositioned = b; };
 
+	void onVisibilityChange(const LLSD& new_visibility);
+
 private:
+	// process focus events to set a currently active session
+	/* virtual */ void onFocusLost();
+	/* virtual */ void onFocusReceived();
 	
 	static void		onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );
 	static void		onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);
@@ -103,13 +108,9 @@ class LLIMFloater : public LLDockableFloater
 	LLUUID mSessionID;
 	S32 mLastMessageIndex;
 
-	// username of last user who added text to this conversation, used to
-	// suppress duplicate username divider bars
-	std::string mLastFromName;
-
 	EInstantMessage mDialog;
 	LLUUID mOtherParticipantUUID;
-	LLViewerTextEditor* mHistoryEditor;
+	LLChatHistory* mChatHistory;
 	LLLineEditor* mInputEditor;
 	bool mPositioned;
 
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 0ff3bd24e983b59978d9b1d171f5af22936c83f2..163984f7409a6977970d135458575fb384d56140 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -951,7 +951,6 @@ LLFloaterIMPanel::LLFloaterIMPanel(const std::string& session_label,
 	mSentTypingState(TRUE),
 	mNumUnreadMessages(0),
 	mShowSpeakersOnConnect(TRUE),
-	mAutoConnect(FALSE),
 	mTextIMPossible(TRUE),
 	mProfileButtonEnabled(TRUE),
 	mCallBackEnabled(TRUE),
@@ -1179,12 +1178,6 @@ void LLFloaterIMPanel::draw()
 		mInputEditor->setLabel(getString("default_text_label"));
 	}
 
-	if (mAutoConnect && enable_connect)
-	{
-		onClickStartCall(this);
-		mAutoConnect = FALSE;
-	}
-
 	// show speakers window when voice first connects
 	if (mShowSpeakersOnConnect && voice_channel->isActive())
 	{
@@ -1525,7 +1518,7 @@ void LLFloaterIMPanel::onClickStartCall(void* userdata)
 {
 	LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata;
 
-	LLIMModel::getInstance()->getVoiceChannel(self->mSessionUUID)->activate();
+	gIMMgr->startCall(self->mSessionUUID);
 }
 
 // static
@@ -1533,7 +1526,7 @@ void LLFloaterIMPanel::onClickEndCall(void* userdata)
 {
 	LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata;
 
-	LLIMModel::getInstance()->getVoiceChannel(self->mSessionUUID)->deactivate();
+	gIMMgr->endCall(self->mSessionUUID);
 }
 
 // static
@@ -1593,9 +1586,7 @@ void LLFloaterIMPanel::onClose(bool app_quitting)
 {
 	setTyping(FALSE);
 
-	LLIMModel::instance().sendLeaveSession(mSessionUUID, mOtherParticipantUUID);
-
-	gIMMgr->removeSession(mSessionUUID);
+	gIMMgr->leaveSession(mSessionUUID);
 
 	// *HACK hide the voice floater
 	LLFloaterReg::hideInstance("voice_call", mSessionUUID);
@@ -1712,11 +1703,6 @@ void LLFloaterIMPanel::sessionInitReplyReceived(const LLUUID& session_id)
 	}
 }
 
-void LLFloaterIMPanel::requestAutoConnect()
-{
-	mAutoConnect = TRUE;
-}
-
 void LLFloaterIMPanel::setTyping(BOOL typing)
 {
 	LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionUUID);
diff --git a/indra/newview/llimpanel.h b/indra/newview/llimpanel.h
index 57379b2c0d9cc52f09ad3bc2f754d2e446faeb52..4e306c7fabfeb5a882921a7c3d78788677ceacc3 100644
--- a/indra/newview/llimpanel.h
+++ b/indra/newview/llimpanel.h
@@ -250,8 +250,6 @@ class LLFloaterIMPanel : public LLFloater
 	EInstantMessage getDialogType() const { return mDialog; }
 	void setDialogType(EInstantMessage dialog) { mDialog = dialog; }
 
-	void requestAutoConnect();
-
 	void sessionInitReplyReceived(const LLUUID& im_session_id);
 
 	// Handle other participant in the session typing.
@@ -336,8 +334,6 @@ class LLFloaterIMPanel : public LLFloater
 
 	BOOL mShowSpeakersOnConnect;
 
-	BOOL mAutoConnect;
-	
 	BOOL mTextIMPossible;
 	BOOL mProfileButtonEnabled;
 	BOOL mCallBackEnabled;
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 619e7044b4c4b1805ae5550a09bb908963fd7846..b631c991aeba155592d74ebd35d2500eb18d9eb0 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -93,30 +93,45 @@ std::map<LLUUID, LLIMModel::LLIMSession*> LLIMModel::sSessionsMap;
 
 
 void toast_callback(const LLSD& msg){
-	// do not show toast in busy mode
-	if (gAgent.getBusy())
+	// do not show toast in busy mode or it goes from agent
+	if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
 	{
 		return;
 	}
-	
-	//we send notifications to reset counter also
-	if (msg["num_unread"].asInteger())
+
+	// check whether incoming IM belongs to an active session or not
+	if (LLIMModel::getInstance()->getActiveSessionID() == msg["session_id"])
 	{
-		LLSD args;
-		args["MESSAGE"] = msg["message"];
-		args["TIME"] = msg["time"];
-		args["FROM"] = msg["from"];
-		args["FROM_ID"] = msg["from_id"];
-		args["SESSION_ID"] = msg["session_id"];
+		return;
+	}
+	
+	LLSD args;
+	args["MESSAGE"] = msg["message"];
+	args["TIME"] = msg["time"];
+	args["FROM"] = msg["from"];
+	args["FROM_ID"] = msg["from_id"];
+	args["SESSION_ID"] = msg["session_id"];
 
-		LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
+	LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
+}
+
+void LLIMModel::setActiveSessionID(const LLUUID& session_id)
+{
+	// check if such an ID really exists
+	if (!findIMSession(session_id))
+	{
+		llwarns << "Trying to set as active a non-existent session!" << llendl;
+		return;
 	}
+
+	mActiveSessionID = session_id;
 }
 
 LLIMModel::LLIMModel() 
 {
-	addChangedCallback(LLIMFloater::newIMCallback);
-	addChangedCallback(toast_callback);
+	addNewMsgCallback(LLIMFloater::newIMCallback);
+	addNoUnreadMsgsCallback(LLIMFloater::newIMCallback);
+	addNewMsgCallback(toast_callback);
 }
 
 
@@ -311,7 +326,7 @@ std::list<LLSD> LLIMModel::getMessages(LLUUID session_id, int start_index)
 	LLSD arg;
 	arg["session_id"] = session_id;
 	arg["num_unread"] = 0;
-	mChangedSignal(arg);
+	mNoUnreadMsgsSignal(arg);
 
     // TODO: in the future is there a more efficient way to return these
 	//of course there is - return as parameter (IB)
@@ -319,7 +334,7 @@ std::list<LLSD> LLIMModel::getMessages(LLUUID session_id, int start_index)
 
 }
 
-bool LLIMModel::addToHistory(LLUUID session_id, std::string from, std::string utf8_text) { 
+bool LLIMModel::addToHistory(LLUUID session_id, std::string from, LLUUID from_id, std::string utf8_text) { 
 	
 	LLIMSession* session = findIMSession(session_id);
 
@@ -331,6 +346,7 @@ bool LLIMModel::addToHistory(LLUUID session_id, std::string from, std::string ut
 
 	LLSD message;
 	message["from"] = from;
+	message["from_id"] = from_id;
 	message["message"] = utf8_text;
 	message["time"] = LLLogChat::timestamp(false);  //might want to add date separately
 	message["index"] = (LLSD::Integer)session->mMsgs.size(); 
@@ -377,7 +393,7 @@ bool LLIMModel::addMessage(LLUUID session_id, std::string from, LLUUID from_id,
 		return false;
 	}
 
-	addToHistory(session_id, from, utf8_text);
+	addToHistory(session_id, from, from_id, utf8_text);
 	if (log2file) logToFile(session_id, from, utf8_text);
 
 	session->mNumUnread++;
@@ -390,7 +406,7 @@ bool LLIMModel::addMessage(LLUUID session_id, std::string from, LLUUID from_id,
 	arg["from"] = from;
 	arg["from_id"] = from_id;
 	arg["time"] = LLLogChat::timestamp(false);
-	mChangedSignal(arg);
+	mNewMsgSignal(arg);
 
 	return true;
 }
@@ -620,14 +636,8 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
 	}
 
 	// Add the recipient to the recent people list.
-	//*TODO should be deleted, because speaker manager updates through callback the recent list
 	LLRecentPeople::instance().add(other_participant_id);
 }
-										  
-boost::signals2::connection LLIMModel::addChangedCallback( boost::function<void (const LLSD& data)> cb )
-{
-	return mChangedSignal.connect(cb);
-}
 
 void session_starter_helper(
 	const LLUUID& temp_session_id,
@@ -854,23 +864,18 @@ class LLViewerChatterBoxInvitationAcceptResponder :
 				//in case of race conditions
 				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(mSessionID));
 			}
-			
-			LLFloaterIMPanel* floaterp =
-				gIMMgr->findFloaterBySession(mSessionID);
 
-			if (floaterp)
+			if (LLIMMgr::INVITATION_TYPE_VOICE == mInvitiationType)
 			{
-				if ( mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE )
-				{
-					floaterp->requestAutoConnect();
-					LLFloaterIMPanel::onClickStartCall(floaterp);
-					// always open IM window when connecting to voice
-					LLFloaterReg::showInstance("communicate", LLSD(), TRUE);
-				}
-				else if ( mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE )
-				{
-					LLFloaterReg::showInstance("communicate", LLSD(), TRUE);
-				}
+				gIMMgr->startCall(mSessionID);
+			}
+
+			if ((mInvitiationType == LLIMMgr::INVITATION_TYPE_VOICE 
+				|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
+				&& LLIMModel::getInstance()->findIMSession(mSessionID))
+			{
+				// always open IM window when connecting to voice
+				LLIMFloater::show(mSessionID);
 			}
 
 			gIMMgr->clearPendingAgentListUpdates(mSessionID);
@@ -1041,20 +1046,13 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
 
 			if (voice)
 			{
-				LLFloaterIMPanel* im_floater =
-					gIMMgr->findFloaterBySession(
-						session_id);
-
-				if (im_floater)
+				if (gIMMgr->startCall(session_id))
 				{
-					im_floater->requestAutoConnect();
-					LLFloaterIMPanel::onClickStartCall(im_floater);		
+					// always open IM window when connecting to voice
+					LLIMFloater::show(session_id);
 				}
 			}
 
-			// always open IM window when connecting to voice
-			LLFloaterReg::showInstance("communicate", session_id);
-
 			gIMMgr->clearPendingAgentListUpdates(session_id);
 			gIMMgr->clearPendingInvitation(session_id);
 		}
@@ -1159,15 +1157,10 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
 					payload["session_handle"].asString(),
 					payload["session_uri"].asString());
 
-				LLFloaterIMPanel* im_floater =
-					gIMMgr->findFloaterBySession(
-						session_id);
-				if (im_floater)
+				if (gIMMgr->startCall(session_id))
 				{
-					im_floater->requestAutoConnect();
-					LLFloaterIMPanel::onClickStartCall(im_floater);
 					// always open IM window when connecting to voice
-					LLFloaterReg::showInstance("communicate", session_id, TRUE);
+					LLIMFloater::show(session_id);
 				}
 
 				gIMMgr->clearPendingAgentListUpdates(session_id);
@@ -1291,13 +1284,6 @@ void LLIMMgr::addMessage(
 		return;
 	}
 
-	//not sure why...but if it is from ourselves we set the target_id
-	//to be NULL
-	if( other_participant_id == gAgent.getID() )
-	{
-		other_participant_id = LLUUID::null;
-	}
-
 	LLFloaterIMPanel* floater;
 	LLUUID new_session_id = session_id;
 	if (new_session_id.isNull())
@@ -1429,12 +1415,10 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
 	}
 	else // going to IM session
 	{
-		LLFloaterIMPanel* floaterp = findFloaterBySession(session_id);
-		if (floaterp)
+		if (hasSession(session_id))
 		{
-			message = floaterp->getString(message_name);
+			message = LLTrans::getString(message_name + "-im");
 			message.setArgs(args);
-
 			gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString());
 		}
 	}
@@ -1566,6 +1550,16 @@ LLUUID LLIMMgr::addSession(
 	return session_id;
 }
 
+bool LLIMMgr::leaveSession(const LLUUID& session_id)
+{
+	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+	if (!im_session) return false;
+
+	LLIMModel::getInstance()->sendLeaveSession(session_id, im_session->mOtherParticipantID);
+	gIMMgr->removeSession(session_id);
+	return true;
+}
+
 // This removes the panel referenced by the uuid, and then restores
 // internal consistency. The internal pointer is not deleted? Did you mean
 // a pointer to the corresponding LLIMSession? Session data is cleared now.
@@ -1779,7 +1773,7 @@ LLFloaterIMPanel* LLIMMgr::findFloaterBySession(const LLUUID& session_id)
 
 BOOL LLIMMgr::hasSession(const LLUUID& session_id)
 {
-	return (findFloaterBySession(session_id) != NULL);
+	return LLIMModel::getInstance()->findIMSession(session_id) != NULL;
 }
 
 void LLIMMgr::clearPendingInvitation(const LLUUID& session_id)
@@ -1905,6 +1899,24 @@ void LLIMMgr::removeSessionObserver(LLIMSessionObserver *observer)
 	mSessionObservers.remove(observer);
 }
 
+bool LLIMMgr::startCall(const LLUUID& session_id)
+{
+	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
+	if (!voice_channel) return false;
+	
+	voice_channel->activate();
+	return true;
+}
+
+bool LLIMMgr::endCall(const LLUUID& session_id)
+{
+	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(session_id);
+	if (!voice_channel) return false;
+
+	voice_channel->deactivate();
+	return true;
+}
+
 // create a floater and update internal representation for
 // consistency. Returns the pointer, caller (the class instance since
 // it is a private method) is not responsible for deleting the
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 84646a9a6f61081060570a0812cdb21ca8a1ece5..68beb29034a15e7aca48bcf02a9ca28013b998d5 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -75,10 +75,20 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 
 	LLIMModel();
 
+
+	//we should control the currently active session
+	LLUUID	mActiveSessionID;
+	void	setActiveSessionID(const LLUUID& session_id);
+	void	resetActiveSessionID() { mActiveSessionID.setNull(); }
+	LLUUID	getActiveSessionID() { return mActiveSessionID; }
+
 	//*TODO make it non-static as LLIMMOdel is a singleton (IB)
 	static std::map<LLUUID, LLIMSession*> sSessionsMap;  //mapping session_id to session
 
-	boost::signals2::signal<void(const LLSD&)> mChangedSignal;
+	typedef boost::signals2::signal<void(const LLSD&)> session_signal_t;
+	typedef boost::function<void(const LLSD&)> session_callback_t;
+	session_signal_t mNewMsgSignal;
+	session_signal_t mNoUnreadMsgsSignal;
 	
 	/** 
 	 * Find an IM Session corresponding to session_id
@@ -91,7 +101,8 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	 */
 	void updateSessionID(const LLUUID& old_session_id, const LLUUID& new_session_id);
 
-	boost::signals2::connection addChangedCallback( boost::function<void (const LLSD& data)> cb );
+	boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); }
+	boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); }
 
 	bool newSession(LLUUID session_id, std::string name, EInstantMessage type, LLUUID other_participant_id, 
 		const std::vector<LLUUID>& ids = std::vector<LLUUID>());
@@ -99,7 +110,7 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	std::list<LLSD> getMessages(LLUUID session_id, int start_index = 0);
 
 	bool addMessage(LLUUID session_id, std::string from, LLUUID other_participant_id, std::string utf8_text, bool log2file = true);
-	bool addToHistory(LLUUID session_id, std::string from, std::string utf8_text); 
+	bool addToHistory(LLUUID session_id, std::string from, LLUUID from_id, std::string utf8_text); 
 
 	bool logToFile(const LLUUID& session_id, const std::string& from, const std::string& utf8_text);
 
@@ -219,10 +230,12 @@ class LLIMMgr : public LLSingleton<LLIMMgr>
 					  const std::string& voice_session_handle,
 					  const std::string& caller_uri = LLStringUtil::null);
 
-	// This removes the panel referenced by the uuid, and then
-	// restores internal consistency. The internal pointer is not
-	// deleted.
-	void removeSession(LLUUID session_id);
+	/**
+	 * Leave the session with session id. Send leave session notification
+	 * to the server and removes all associated session data
+	 * @return false if the session with specified id was not exist
+	 */
+	bool leaveSession(const LLUUID& session_id);
 
 	void inviteToSession(
 		const LLUUID& session_id, 
@@ -282,7 +295,24 @@ class LLIMMgr : public LLSingleton<LLIMMgr>
 	void addSessionObserver(LLIMSessionObserver *);
 	void removeSessionObserver(LLIMSessionObserver *);
 
+	/**
+	 * Start call in a session
+	 * @return false if voice channel doesn't exist
+	 **/
+	bool startCall(const LLUUID& session_id);
+
+	/**
+	 * End call in a session
+	 * @return false if voice channel doesn't exist
+	 **/
+	bool endCall(const LLUUID& session_id);
+
 private:
+	// This removes the panel referenced by the uuid, and then
+	// restores internal consistency. The internal pointer is not
+	// deleted.
+	void removeSession(LLUUID session_id);
+
 	// create a panel and update internal representation for
 	// consistency. Returns the pointer, caller (the class instance
 	// since it is a private method) is not responsible for deleting
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index db7d4f4c8fbd816c9c7e2702a33075416e6a93ec..3aa35d98f831f79f170440d570789823340c79c2 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -238,8 +238,7 @@ void LLInvFVBridge::renameLinkedItems(const LLUUID &item_id, const std::string&
 		return;
 	}
 	
-	LLInventoryModel::item_array_t item_array;
-	model->collectLinkedItems(item_id, item_array);
+	LLInventoryModel::item_array_t item_array = model->collectLinkedItems(item_id);
 	for (LLInventoryModel::item_array_t::iterator iter = item_array.begin();
 		 iter != item_array.end();
 		 iter++)
@@ -1242,7 +1241,6 @@ BOOL LLItemBridge::renameItem(const std::string& new_name)
 		buildDisplayName(new_item, mDisplayName);
 		new_item->updateServer(FALSE);
 		model->updateItem(new_item);
-		model->updateLinkedObjects(item->getUUID());
 
 		model->notifyObservers();
 	}
@@ -1292,7 +1290,7 @@ BOOL LLItemBridge::isItemCopyable() const
 			return FALSE;
 		}
 
-		if( avatarp->isWearingAttachment( mUUID, TRUE ) )
+		if(avatarp->isWearingAttachment(mUUID))
 		{
 			return FALSE;
 		}
@@ -1416,7 +1414,7 @@ BOOL LLFolderBridge::isItemRemovable()
 		if( (item->getType() == LLAssetType::AT_CLOTHING) ||
 			(item->getType() == LLAssetType::AT_BODYPART) )
 		{
-			if( gAgentWearables.isWearingItem( item->getUUID(), TRUE ) )
+			if(gAgentWearables.isWearingItem(item->getUUID()))
 			{
 				return FALSE;
 			}
@@ -1424,7 +1422,7 @@ BOOL LLFolderBridge::isItemRemovable()
 		else
 		if( item->getType() == LLAssetType::AT_OBJECT )
 		{
-			if( avatar->isWearingAttachment( item->getUUID(), TRUE ) )
+			if(avatar->isWearingAttachment(item->getUUID()))
 			{
 				return FALSE;
 			}
@@ -1462,6 +1460,39 @@ BOOL LLFolderBridge::copyToClipboard() const
 	return FALSE;
 }
 
+BOOL LLFolderBridge::isClipboardPasteable() const
+{
+	if ( ! LLInvFVBridge::isClipboardPasteable() )
+		return FALSE;
+
+	// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599
+	if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) )
+	{
+		LLInventoryModel* model = getInventoryModel();
+		if ( !model )
+		{
+			return FALSE;
+		}
+
+		LLDynamicArray<LLUUID> objects;
+		LLInventoryClipboard::instance().retrieve(objects);
+		const LLViewerInventoryCategory *current_cat = getCategory();
+
+		// Search for the direct descendent of current Friends subfolder among all pasted items, 
+		// and return false if is found.
+		for(S32 i = objects.count() - 1; i >= 0; --i)
+		{
+			const LLUUID &obj_id = objects.get(i);
+			if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) )
+			{
+				return FALSE;
+			}
+		}
+
+	}
+	return TRUE;
+}
+
 BOOL LLFolderBridge::isClipboardPasteableAsLink() const
 {
 	// Check normal paste-as-link permissions
@@ -1479,13 +1510,15 @@ BOOL LLFolderBridge::isClipboardPasteableAsLink() const
 	const LLViewerInventoryCategory *current_cat = getCategory();
 	if (current_cat)
 	{
+		const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat );
 		const LLUUID &current_cat_id = current_cat->getUUID();
 		LLDynamicArray<LLUUID> objects;
 		LLInventoryClipboard::instance().retrieve(objects);
 		S32 count = objects.count();
 		for(S32 i = 0; i < count; i++)
 		{
-			const LLInventoryCategory *cat = model->getCategory(objects.get(i));
+			const LLUUID &obj_id = objects.get(i);
+			const LLInventoryCategory *cat = model->getCategory(obj_id);
 			if (cat)
 			{
 				const LLUUID &cat_id = cat->getUUID();
@@ -1496,6 +1529,17 @@ BOOL LLFolderBridge::isClipboardPasteableAsLink() const
 					return FALSE;
 				}
 			}
+			// Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599
+			if ( is_in_friend_folder )
+			{
+				// If object is direct descendent of current Friends subfolder than return false.
+				// Note: We can't use 'const LLInventoryCategory *cat', because it may be null
+				// in case type of obj_id is LLInventoryItem.
+				if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) )
+				{
+					return FALSE;
+				}
+			}
 		}
 	}
 	return TRUE;
@@ -1547,6 +1591,12 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 			// BAP - restrictions?
 			is_movable = true;
 		}
+
+		if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE))
+		{
+			is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604
+		}
+
 		if( is_movable )
 		{
 			gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE );
@@ -2155,7 +2205,6 @@ BOOL LLFolderBridge::renameItem(const std::string& new_name)
 		new_cat->rename(new_name);
 		new_cat->updateServer(FALSE);
 		model->updateCategory(new_cat);
-		model->updateLinkedObjects(cat->getUUID());
 
 		model->notifyObservers();
 	}
@@ -2803,16 +2852,27 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 			{
 			case LLAssetType::AT_CLOTHING:
 			case LLAssetType::AT_BODYPART:
-				is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID(), TRUE);
+				is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID());
 				break;
 
 			case LLAssetType::AT_OBJECT:
-				is_movable = !avatar->isWearingAttachment(inv_item->getUUID(), TRUE);
+				is_movable = !avatar->isWearingAttachment(inv_item->getUUID());
 				break;
 			default:
 				break;
 			}
 		}
+
+		if ( is_movable )
+		{
+			// Don't allow creating duplicates in the Calling Card/Friends
+			// subfolders, see bug EXT-1599. Check is item direct descendent
+			// of target folder and forbid item's movement if it so.
+			// Note: isItemDirectDescendentOfCategory checks if
+			// passed category is in the Calling Card/Friends folder
+			is_movable = ! LLFriendCardsManager::instance()
+				.isObjDirectDescendentOfCategory (inv_item, getCategory());
+		}
  
 		LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
 
@@ -3706,7 +3766,7 @@ BOOL LLObjectBridge::isItemRemovable()
 {
 	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 	if(!avatar) return FALSE;
-	if(avatar->isWearingAttachment(mUUID, TRUE)) return FALSE;
+	if(avatar->isWearingAttachment(mUUID)) return FALSE;
 	return LLInvFVBridge::isItemRemovable();
 }
 
@@ -3755,14 +3815,13 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
 	else if ("detach" == action)
 	{
 		LLInventoryItem* item = gInventory.getItem(mUUID);
-		if( item )
+		if(item)
 		{
 			gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
-			gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
-			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-			gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getUUID() );
-
-			gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
+			gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+			gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
+			gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
 		}
 		// this object might have been selected, so let the selection manager know it's gone now
 		LLViewerObject *found_obj =
@@ -3819,7 +3878,10 @@ std::string LLObjectBridge::getLabelSuffix() const
 	{
 		std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
 		LLStringUtil::toLower(attachment_point_name);
-		return LLItemBridge::getLabelSuffix() + std::string(" (worn on ") + attachment_point_name + std::string(")");
+		
+		LLStringUtil::format_map_t args;
+		args["[ATTACHMENT_POINT]"] =  attachment_point_name.c_str();
+		return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args);
 	}
 	else
 	{
@@ -4015,7 +4077,6 @@ BOOL LLObjectBridge::renameItem(const std::string& new_name)
 		buildDisplayName(new_item, mDisplayName);
 		new_item->updateServer(FALSE);
 		model->updateItem(new_item);
-		model->updateLinkedObjects(item->getUUID());
 
 		model->notifyObservers();
 
@@ -4115,10 +4176,8 @@ void remove_inventory_category_from_avatar( LLInventoryCategory* category )
 struct OnRemoveStruct
 {
 	LLUUID mUUID;
-	LLFolderView *mFolderToDeleteSelected;
-	OnRemoveStruct(const LLUUID& uuid, LLFolderView *fv = NULL):
-		mUUID(uuid),
-		mFolderToDeleteSelected(fv)
+	OnRemoveStruct(const LLUUID& uuid):
+		mUUID(uuid)
 	{
 	}
 };
@@ -4230,7 +4289,7 @@ BOOL LLWearableBridge::renameItem(const std::string& new_name)
 
 BOOL LLWearableBridge::isItemRemovable()
 {
-	if (gAgentWearables.isWearingItem(mUUID, TRUE)) return FALSE;
+	if (gAgentWearables.isWearingItem(mUUID)) return FALSE;
 	return LLInvFVBridge::isItemRemovable();
 }
 
@@ -4238,7 +4297,7 @@ std::string LLWearableBridge::getLabelSuffix() const
 {
 	if( gAgentWearables.isWearingItem( mUUID ) )
 	{
-		return LLItemBridge::getLabelSuffix() + " (worn)";
+		return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
 	}
 	else
 	{
@@ -4274,24 +4333,11 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
 			LLViewerInventoryItem* item = getItem();
 			if (item)
 			{	
-				if (item->getIsLinkType() &&
-					model->isObjectDescendentOf(mUUID,LLAppearanceManager::getCOF()))
-				{
-					// Delete link after item has been taken off.
-					LLWearableList::instance().getAsset(item->getAssetUUID(),
-														item->getName(),
-														item->getType(),
-														LLWearableBridge::onRemoveFromAvatarArrived,
-														new OnRemoveStruct(mUUID, folder));
-				}
-				else
-				{
-					LLWearableList::instance().getAsset(item->getAssetUUID(),
-														item->getName(),
-														item->getType(),
-														LLWearableBridge::onRemoveFromAvatarArrived,
-														new OnRemoveStruct(mUUID));
-				}
+				LLWearableList::instance().getAsset(item->getAssetUUID(),
+													item->getName(),
+													item->getType(),
+													LLWearableBridge::onRemoveFromAvatarArrived,
+													new OnRemoveStruct(mUUID));
 			}
 		}
 	}
@@ -4402,9 +4448,27 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 			disabled_items.push_back(std::string("Wearable Edit"));
 		}
 
-		if( item && (item->getType() == LLAssetType::AT_CLOTHING) )
+		// Disable wear and take off based on whether the item is worn.
+		if(item)
 		{
-			items.push_back(std::string("Take Off"));
+			switch (item->getType())
+			{
+				case LLAssetType::AT_CLOTHING:
+					items.push_back(std::string("Take Off"));
+				case LLAssetType::AT_BODYPART:
+					if (gAgentWearables.isWearingItem(item->getUUID()))
+					{
+						disabled_items.push_back(std::string("Wearable Wear"));
+						disabled_items.push_back(std::string("Wearable Add"));
+					}
+					else
+					{	
+						disabled_items.push_back(std::string("Take Off"));
+					}
+					break;
+				default:
+					break;
+			}
 		}
 	}
 	hideContextEntries(menu, items, disabled_items);
@@ -4619,7 +4683,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
 												 void* userdata)
 {
 	OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata;
-	LLUUID item_id = on_remove_struct->mUUID;
+	const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);
 	if(wearable)
 	{
 		if( gAgentWearables.isWearingItem( item_id ) )
@@ -4635,10 +4699,20 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
 			}
 		}
 	}
-	if (on_remove_struct->mFolderToDeleteSelected)
+
+	// Find and remove this item from the COF.
+	LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF());
+	llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
+	for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
+		 iter != items.end();
+		 ++iter)
 	{
-		on_remove_struct->mFolderToDeleteSelected->removeSelectedItems();
+		const LLViewerInventoryItem *linked_item = (*iter);
+		const LLUUID &item_id = linked_item->getUUID();
+		gInventory.purgeObject(item_id);
 	}
+	gInventory.notifyObservers();
+
 	delete on_remove_struct;
 }
 
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index d1d2c57f074b8a51df7f99005c261fbb1c06cbef..6b2a2d32dec98a3e4113c7d36fab3c57b1c00f50 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -315,6 +315,7 @@ class LLFolderBridge : public LLInvFVBridge
 	virtual BOOL isItemMovable() const ;
 	virtual BOOL isUpToDate() const;
 	virtual BOOL isItemCopyable() const;
+	virtual BOOL isClipboardPasteable() const;
 	virtual BOOL isClipboardPasteableAsLink() const;
 	virtual BOOL copyToClipboard() const;
 	
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 9a8647aba4e49675c3234a6b8c5b6eb1f383ac6a..d5a527773cc04567c2b34fd7986025a96486b21e 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -507,8 +507,12 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
 	}
 }
 
-void LLInventoryModel::updateLinkedObjects(const LLUUID& object_id)
+void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)
 {
+	const LLInventoryObject *obj = getObject(object_id);
+	if (!obj || obj->getIsLinkType())
+		return;
+
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t item_array;
 	LLLinkedItemIDMatches is_linked_item_match(object_id);
@@ -536,16 +540,31 @@ void LLInventoryModel::updateLinkedObjects(const LLUUID& object_id)
 	notifyObservers();
 }
 
-void LLInventoryModel::collectLinkedItems(const LLUUID& id,
-										  item_array_t& items)
+const LLUUID& LLInventoryModel::getLinkedItemID(const LLUUID& object_id) const
 {
+	const LLInventoryItem *item = gInventory.getItem(object_id);
+	if (!item)
+	{
+		return object_id;
+	}
+
+	// Find the base item in case this a link (if it's not a link,
+	// this will just be inv_item_id)
+	return item->getLinkedUUID();
+}
+
+LLInventoryModel::item_array_t LLInventoryModel::collectLinkedItems(const LLUUID& id,
+																	const LLUUID& start_folder_id)
+{
+	item_array_t items;
 	LLInventoryModel::cat_array_t cat_array;
 	LLLinkedItemIDMatches is_linked_item_match(id);
-	collectDescendentsIf(gInventory.getRootFolderID(),
+	collectDescendentsIf((start_folder_id == LLUUID::null ? gInventory.getRootFolderID() : start_folder_id),
 						 cat_array,
 						 items,
 						 LLInventoryModel::INCLUDE_TRASH,
 						 is_linked_item_match);
+	return items;
 }
 
 // Generates a string containing the path to the item specified by
@@ -909,8 +928,7 @@ void LLInventoryModel::purgeLinkedObjects(const LLUUID &id)
 		return;
 	}
 
-	LLInventoryModel::item_array_t item_array;
-	collectLinkedItems(id, item_array);
+	LLInventoryModel::item_array_t item_array = collectLinkedItems(id);
 	
 	for (LLInventoryModel::item_array_t::iterator iter = item_array.begin();
 		 iter != item_array.end();
@@ -1131,6 +1149,13 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
 	{
 		mChangedItemIDs.insert(referent);
 	}
+	
+	// Update all linked items.  Starting with just LABEL because I'm
+	// not sure what else might need to be accounted for this.
+	if (mModifyMask & LLInventoryObserver::LABEL)
+	{
+		updateLinkedItems(referent);
+	}
 }
 
 // This method to prepares a set of mock inventory which provides
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index e7f9db9221f305cb4d57adc9c9be04cd60ebc5c2..7d4f3372e979e5ea8b4998f736a197d05aa0ce45 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -190,10 +190,13 @@ class LLInventoryModel
 
 	// Collect all items in inventory that are linked to item_id.
 	// Assumes item_id is itself not a linked item.
-	void collectLinkedItems(const LLUUID& item_id,
-							item_array_t& items);
-	// Updates all linked objects pointing to this id.
-	void updateLinkedObjects(const LLUUID& object_id);
+	item_array_t collectLinkedItems(const LLUUID& item_id,
+									const LLUUID& start_folder_id = LLUUID::null);
+	// Updates all linked items pointing to this id.
+	void updateLinkedItems(const LLUUID& object_id);
+
+	// Get the inventoryID that this item points to, else just return item_id
+	const LLUUID& getLinkedItemID(const LLUUID& object_id) const;
 
 	// The inventory model usage is sensitive to the initial construction of the 
 	// model. 
diff --git a/indra/newview/lllocaltextureobject.cpp b/indra/newview/lllocaltextureobject.cpp
index 99c98ec16e2e97fd1f726555421105a7db2bb37b..6bcbe6f58ca1304797dcb7e2c3cbe010e2926633 100644
--- a/indra/newview/lllocaltextureobject.cpp
+++ b/indra/newview/lllocaltextureobject.cpp
@@ -47,18 +47,18 @@ LLLocalTextureObject::LLLocalTextureObject() :
 	mImage = NULL;
 }
 
-LLLocalTextureObject::LLLocalTextureObject(LLViewerFetchedTexture *image, LLUUID id)
+LLLocalTextureObject::LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id)
 {
 	mImage = image;
 	gGL.getTexUnit(0)->bind(mImage);
 	mID = id;
 }
 
-LLLocalTextureObject::LLLocalTextureObject(const LLLocalTextureObject &lto) :
-mImage(lto.mImage),
-mID(lto.mID),
-mIsBakedReady(lto.mIsBakedReady),
-mDiscard(lto.mDiscard)
+LLLocalTextureObject::LLLocalTextureObject(const LLLocalTextureObject& lto) :
+	mImage(lto.mImage),
+	mID(lto.mID),
+	mIsBakedReady(lto.mIsBakedReady),
+	mDiscard(lto.mDiscard)
 {
 	U32 num_layers = lto.getNumTexLayers();
 	mTexLayers.reserve(num_layers);
@@ -97,7 +97,7 @@ LLTexLayer* LLLocalTextureObject::getTexLayer(U32 index) const
 
 LLTexLayer* LLLocalTextureObject::getTexLayer(const std::string &name)
 {
-	for( tex_layer_p::iterator iter = mTexLayers.begin(); iter != mTexLayers.end(); iter++)
+	for( tex_layer_vec_t::iterator iter = mTexLayers.begin(); iter != mTexLayers.end(); iter++)
 	{
 		LLTexLayer *layer = *iter;
 		if (layer->getName().compare(name) == 0)
@@ -190,7 +190,7 @@ BOOL LLLocalTextureObject::removeTexLayer(U32 index)
 	{
 		return FALSE;
 	}
-	tex_layer_p::iterator iter = mTexLayers.begin();
+	tex_layer_vec_t::iterator iter = mTexLayers.begin();
 	iter += index;
 
 	delete *iter;
diff --git a/indra/newview/lllocaltextureobject.h b/indra/newview/lllocaltextureobject.h
index 138bbad677768f7893b95398863ab6f731e995d5..c8b8aa924be730320fd1376d7c619c2a8c3ab945 100644
--- a/indra/newview/lllocaltextureobject.h
+++ b/indra/newview/lllocaltextureobject.h
@@ -35,7 +35,8 @@
 
 #include <boost/shared_ptr.hpp>
 
-class LLViewerFetchedTexture;
+#include "llviewertexture.h"
+
 class LLUUID;
 class LLTexLayer;
 class LLTextureEntry;
@@ -49,8 +50,8 @@ class LLLocalTextureObject
 {
 public:
 	LLLocalTextureObject();
-	LLLocalTextureObject(LLViewerFetchedTexture *image, LLUUID id);
-	LLLocalTextureObject(const LLLocalTextureObject &lto);
+	LLLocalTextureObject(LLViewerFetchedTexture* image, const LLUUID& id);
+	LLLocalTextureObject(const LLLocalTextureObject& lto);
 	~LLLocalTextureObject();
 
 	LLViewerFetchedTexture* getImage() const;
@@ -79,8 +80,8 @@ class LLLocalTextureObject
 	// NOTE: LLLocalTextureObject should be the exclusive owner of mTexEntry and mTexLayer
 	// using shared pointers here only for smart assignment & cleanup
 	// do NOT create new shared pointers to these objects, or keep pointers to them around
-	typedef std::vector<LLTexLayer*> tex_layer_p;
-	tex_layer_p mTexLayers;
+	typedef std::vector<LLTexLayer*> tex_layer_vec_t;
+	tex_layer_vec_t mTexLayers;
 
 	LLUUID			mID;
 
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 42838b311bd5209a11b8e83d56003dbaacf82c0f..00f12ae2eb89bb63c29ca6e53f4ec0954645d500 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -264,6 +264,8 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 	
 	mAddLandmarkTooltip = LLTrans::getString("LocationCtrlAddLandmarkTooltip");
 	mEditLandmarkTooltip = LLTrans::getString("LocationCtrlEditLandmarkTooltip");
+	getChild<LLView>("Location History")->setToolTip(LLTrans::getString("LocationCtrlComboBtnTooltip"));
+	getChild<LLView>("Place Information")->setToolTip(LLTrans::getString("LocationCtrlInfoBtnTooltip"));
 }
 
 LLLocationInputCtrl::~LLLocationInputCtrl()
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 8005cd118075106700d9ae3acbc9fc4e9b1f9fb2..8f29f908e5c74c70ed77e4fcd08b98320c301871 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -51,6 +51,7 @@
 #include "llpluginclassmedia.h"
 #include "llslurl.h"
 #include "lluictrlfactory.h"	// LLDefaultChildRegistry
+#include "llkeyboard.h"
 
 // linden library includes
 #include "llfocusmgr.h"
@@ -193,7 +194,7 @@ BOOL LLMediaCtrl::handleHover( S32 x, S32 y, MASK mask )
 
 	if (mMediaSource)
 	{
-		mMediaSource->mouseMove(x, y);
+		mMediaSource->mouseMove(x, y, mask);
 		gViewerWindow->setCursor(mMediaSource->getLastSetCursor());
 	}
 
@@ -205,7 +206,7 @@ BOOL LLMediaCtrl::handleHover( S32 x, S32 y, MASK mask )
 BOOL LLMediaCtrl::handleScrollWheel( S32 x, S32 y, S32 clicks )
 {
 	if (mMediaSource && mMediaSource->hasMedia())
-		mMediaSource->getMediaPlugin()->scrollEvent(0, clicks, MASK_NONE);
+		mMediaSource->getMediaPlugin()->scrollEvent(0, clicks, gKeyboard->currentMask(TRUE));
 
 	return TRUE;
 }
@@ -218,7 +219,7 @@ BOOL LLMediaCtrl::handleMouseUp( S32 x, S32 y, MASK mask )
 
 	if (mMediaSource)
 	{
-		mMediaSource->mouseUp(x, y);
+		mMediaSource->mouseUp(x, y, mask);
 
 		// *HACK: LLMediaImplLLMozLib automatically takes focus on mouseup,
 		// in addition to the onFocusReceived() call below.  Undo this. JC
@@ -241,7 +242,50 @@ BOOL LLMediaCtrl::handleMouseDown( S32 x, S32 y, MASK mask )
 	convertInputCoords(x, y);
 
 	if (mMediaSource)
-		mMediaSource->mouseDown(x, y);
+		mMediaSource->mouseDown(x, y, mask);
+	
+	gFocusMgr.setMouseCapture( this );
+
+	if (mTakeFocusOnClick)
+	{
+		setFocus( TRUE );
+	}
+
+	return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleRightMouseUp( S32 x, S32 y, MASK mask )
+{
+	convertInputCoords(x, y);
+
+	if (mMediaSource)
+	{
+		mMediaSource->mouseUp(x, y, mask, 1);
+
+		// *HACK: LLMediaImplLLMozLib automatically takes focus on mouseup,
+		// in addition to the onFocusReceived() call below.  Undo this. JC
+		if (!mTakeFocusOnClick)
+		{
+			mMediaSource->focus(false);
+			gViewerWindow->focusClient();
+		}
+	}
+	
+	gFocusMgr.setMouseCapture( NULL );
+
+	return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )
+{
+	convertInputCoords(x, y);
+
+	if (mMediaSource)
+		mMediaSource->mouseDown(x, y, mask, 1);
 	
 	gFocusMgr.setMouseCapture( this );
 
@@ -260,7 +304,7 @@ BOOL LLMediaCtrl::handleDoubleClick( S32 x, S32 y, MASK mask )
 	convertInputCoords(x, y);
 
 	if (mMediaSource)
-		mMediaSource->mouseLeftDoubleClick( x, y );
+		mMediaSource->mouseDoubleClick( x, y, mask);
 
 	gFocusMgr.setMouseCapture( this );
 
@@ -321,36 +365,9 @@ BOOL LLMediaCtrl::handleKeyHere( KEY key, MASK mask )
 {
 	BOOL result = FALSE;
 	
-	// FIXME: THIS IS SO WRONG.
-	// Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it...
-	
 	if (mMediaSource)
 	{
-		if( MASK_CONTROL & mask )
-		{
-			if( 'C' == key )
-			{
-				mMediaSource->copy();
-				result = TRUE;
-			}
-			else
-			if( 'V' == key )
-			{
-				mMediaSource->paste();
-				result = TRUE;
-			}
-			else
-			if( 'X' == key )
-			{
-				mMediaSource->cut();
-				result = TRUE;
-			}
-		}
-		
-		if(!result)
-		{
-			result = mMediaSource->handleKeyHere(key, mask);
-		}
+		result = mMediaSource->handleKeyHere(key, mask);
 	}
 		
 	return result;
@@ -373,12 +390,9 @@ BOOL LLMediaCtrl::handleUnicodeCharHere(llwchar uni_char)
 {
 	BOOL result = FALSE;
 	
-	// only accept 'printable' characters, sigh...
-	if (uni_char >= 32 // discard 'control' characters
-	    && uni_char != 127) // SDL thinks this is 'delete' - yuck.
+	if (mMediaSource)
 	{
-		if (mMediaSource)
-			result = mMediaSource->handleUnicodeCharHere(uni_char);
+		result = mMediaSource->handleUnicodeCharHere(uni_char);
 	}
 
 	return result;
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 5ea03f1e6c0fabae03edb15552255306e0af2272..76ddc61ebf28ec285f07f32b1f9e0a2d48362702 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -86,6 +86,8 @@ class LLMediaCtrl :
 		virtual BOOL handleHover( S32 x, S32 y, MASK mask );
 		virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
 		virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
+		virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+		virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
 		virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
 		virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
 
diff --git a/indra/newview/llmimetypes.cpp b/indra/newview/llmimetypes.cpp
index 525e89cdff55b4de13a651d205303d87fd9c285f..235487cf46f30f3b274313f0bce281651cc10c2e 100644
--- a/indra/newview/llmimetypes.cpp
+++ b/indra/newview/llmimetypes.cpp
@@ -34,6 +34,7 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llmimetypes.h"
+#include "llxmlnode.h"
 
 #include "lluictrlfactory.h"
 
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 1bbcc3f98ed1fdaa20ee63277fbffadff7059a69..2b4e35208aec404873632ee99efd5863413289ef 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -70,7 +70,7 @@ const std::string BOTTOM_TRAY_BUTTON_NAME = "movement_btn";
 
 // protected
 LLFloaterMove::LLFloaterMove(const LLSD& key)
-:	LLDockableFloater(NULL, key),
+:	LLTransientDockableFloater(NULL, true, key),
 	mForwardButton(NULL),
 	mBackwardButton(NULL),
 	mTurnLeftButton(NULL), 
@@ -498,7 +498,13 @@ void LLFloaterMove::setDocked(bool docked, bool pop_on_undock/* = true*/)
 {
 	LLDockableFloater::setDocked(docked, pop_on_undock);
 	bool show_mode_buttons = isDocked() || !gAgent.getFlying();
-	updateHeight(show_mode_buttons);
+
+	if (!isMinimized())
+	{
+		updateHeight(show_mode_buttons);
+	}
+
+	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
 }
 
 void LLFloaterMove::setModeButtonToggleState(const EMovementMode mode)
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index cbed36f10dc2b655fabeae3bbfe9be5dac02653d..cee6078ee990530f5fb01ca44325adb68224d40a 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -34,7 +34,7 @@
 #define LL_LLMOVEVIEW_H
 
 // Library includes
-#include "lldockablefloater.h"
+#include "lltransientdockablefloater.h"
 
 class LLButton;
 class LLJoystickAgentTurn;
@@ -44,7 +44,7 @@ class LLJoystickAgentSlide;
 // Classes
 //
 class LLFloaterMove
-:	public LLDockableFloater
+:	public LLTransientDockableFloater
 {
 	friend class LLFloaterReg;
 
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index dec8d7576ebb72137975562bbfd7f520eed6fdde..409b637bf2d6c3dbfce828af103c652c3bda203f 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -153,7 +153,13 @@ class LLMuteList : public LLSingleton<LLMuteList>
 	{
 		bool operator()(const LLMute& a, const LLMute& b) const
 		{
-			return a.mName < b.mName;
+			std::string name1 = a.mName;
+			std::string name2 = b.mName;
+
+			LLStringUtil::toUpper(name1);
+			LLStringUtil::toUpper(name2);
+
+			return name1 < name2;
 		}
 	};
 	struct compare_by_id
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index b77415dfee894db9e171a9e10a2ae045e66a0225..b91e23eace4ac9e0d6b63b1b4fef8f343864f7da 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -613,6 +613,9 @@ void LLNavigationBar::showNavigationPanel(BOOL visible)
 		}
 	}
 
+	childSetVisible("bg_icon", fpVisible);
+	childSetVisible("bg_icon_no_fav", !fpVisible);
+
 	if(LLSideTray::instanceCreated())
 	{
 		LLSideTray::getInstance()->resetPanelRect();
@@ -677,6 +680,9 @@ void LLNavigationBar::showFavoritesPanel(BOOL visible)
 		setRect(nbRect);
 	}
 
+	childSetVisible("bg_icon", visible);
+	childSetVisible("bg_icon_no_fav", !visible);
+
 	fb->setVisible(visible);
 	if(LLSideTray::instanceCreated())
 	{
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 7160cce5cb865f92d1c6e4c8f8d09cc1cdad566a..bbab9944f32b33c483eaf61588862a16d11769fd 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -54,17 +54,17 @@
 #include "llstylemap.h"
 
 #include "lldraghandle.h"
-
+#include "lltrans.h"
+#include "llbottomtray.h"
+#include "llnearbychatbar.h"
 
 static const S32 RESIZE_BAR_THICKNESS = 3;
 
-LLNearbyChat::LLNearbyChat(const LLSD& key) :
-	LLFloater(key),
-	mEChatTearofState(CHAT_PINNED),
-	mChatCaptionPanel(NULL),
-	mChatHistory(NULL)
+LLNearbyChat::LLNearbyChat(const LLSD& key) 
+	: LLDockableFloater(NULL, key)
+	,mChatHistory(NULL)
 {
-	m_isDirty = false;
+	
 }
 
 LLNearbyChat::~LLNearbyChat()
@@ -73,25 +73,6 @@ LLNearbyChat::~LLNearbyChat()
 
 BOOL LLNearbyChat::postBuild()
 {
-	//resize bars
-	setCanResize(true);
-
-	mResizeBar[LLResizeBar::BOTTOM]->setVisible(false);
-	mResizeBar[LLResizeBar::LEFT]->setVisible(false);
-	mResizeBar[LLResizeBar::RIGHT]->setVisible(false);
-
-	mResizeBar[LLResizeBar::BOTTOM]->setResizeLimits(120,500);
-	mResizeBar[LLResizeBar::TOP]->setResizeLimits(120,500);
-	mResizeBar[LLResizeBar::LEFT]->setResizeLimits(220,600);
-	mResizeBar[LLResizeBar::RIGHT]->setResizeLimits(220,600);
-
-	mResizeHandle[0]->setVisible(false);
-	mResizeHandle[1]->setVisible(false);
-	mResizeHandle[2]->setVisible(false);
-	mResizeHandle[3]->setVisible(false);
-
-	getDragHandle()->setVisible(false);
-
 	//menu
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
@@ -101,18 +82,26 @@ BOOL LLNearbyChat::postBuild()
 
 	
 	LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_nearby_chat.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-
 	if(menu)
 		mPopupMenuHandle = menu->getHandle();
 
 	gSavedSettings.declareS32("nearbychat_showicons_and_names",2,"NearByChat header settings",true);
 
-	mChatCaptionPanel = getChild<LLPanel>("chat_caption", false);
 	mChatHistory = getChild<LLChatHistory>("chat_history");
 
-	reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
-	
-	return LLFloater::postBuild();
+	setCanResize(true);
+
+	if(!LLDockableFloater::postBuild())
+		return false;
+
+	if (getDockControl() == NULL)
+	{
+		setDockControl(new LLDockControl(
+				LLBottomTray::getInstance()->getNearbyChatBar(), this,
+				getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
+	}
+
+	return true;
 }
 
 
@@ -181,6 +170,22 @@ LLColor4 nearbychat_get_text_color(const LLChat& chat)
 	return text_color;
 }
 
+std::string formatCurrentTime()
+{
+	time_t utc_time;
+	utc_time = time_corrected();
+	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
+		+LLTrans::getString("TimeMin")+"] ";
+
+	LLSD substitution;
+
+	substitution["datetime"] = (S32) utc_time;
+	LLStringUtil::format (timeStr, substitution);
+
+	return timeStr;
+}
+
+
 void LLNearbyChat::add_timestamped_line(const LLChat& chat, const LLColor4& color)
 {
 	S32 font_size = gSavedSettings.getS32("ChatFontSize");
@@ -205,7 +210,7 @@ void LLNearbyChat::add_timestamped_line(const LLChat& chat, const LLColor4& colo
 	style_params.font(fontp);
 	LLUUID uuid = chat.mFromID;
 	std::string from = chat.mFromName;
-	std::string time = "";
+	std::string time = formatCurrentTime();
 	std::string message = chat.mText;
 	mChatHistory->appendWidgetMessage(uuid, from, time, message, style_params);
 }
@@ -239,193 +244,6 @@ void LLNearbyChat::onNearbySpeakers()
 	LLSideTray::getInstance()->showPanel("panel_people",param);
 }
 
-void LLNearbyChat::onTearOff()
-{
-	if(mEChatTearofState == CHAT_PINNED)
-		float_panel();
-	else
-		pinn_panel();
-}
-
-void LLNearbyChat::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
-	
-	LLFloater::reshape(width, height, called_from_parent);
-
-	LLRect resize_rect;
-	resize_rect.setLeftTopAndSize( 0, height, width, RESIZE_BAR_THICKNESS);
-	if (mResizeBar[LLResizeBar::TOP])
-	{
-		mResizeBar[LLResizeBar::TOP]->reshape(width,RESIZE_BAR_THICKNESS);
-		mResizeBar[LLResizeBar::TOP]->setRect(resize_rect);
-	}
-	
-	resize_rect.setLeftTopAndSize( 0, RESIZE_BAR_THICKNESS, width, RESIZE_BAR_THICKNESS);
-	if (mResizeBar[LLResizeBar::BOTTOM])
-	{
-		mResizeBar[LLResizeBar::BOTTOM]->reshape(width,RESIZE_BAR_THICKNESS);
-		mResizeBar[LLResizeBar::BOTTOM]->setRect(resize_rect);
-	}
-
-	resize_rect.setLeftTopAndSize( 0, height, RESIZE_BAR_THICKNESS, height);
-	if (mResizeBar[LLResizeBar::LEFT])
-	{
-		mResizeBar[LLResizeBar::LEFT]->reshape(RESIZE_BAR_THICKNESS,height);
-		mResizeBar[LLResizeBar::LEFT]->setRect(resize_rect);
-	}
-
-	resize_rect.setLeftTopAndSize( width - RESIZE_BAR_THICKNESS, height, RESIZE_BAR_THICKNESS, height);
-	if (mResizeBar[LLResizeBar::RIGHT])
-	{
-		mResizeBar[LLResizeBar::RIGHT]->reshape(RESIZE_BAR_THICKNESS,height);
-		mResizeBar[LLResizeBar::RIGHT]->setRect(resize_rect);
-	}
-
-	// *NOTE: we must check mChatCaptionPanel and mChatHistory against NULL because reshape is called from the 
-	// LLView::initFromParams BEFORE postBuild is called and child controls are not exist yet
-	LLRect caption_rect;
-	if (NULL != mChatCaptionPanel)
-	{
-		caption_rect = mChatCaptionPanel->getRect();
-		caption_rect.setLeftTopAndSize( 2, height - RESIZE_BAR_THICKNESS, width - 4, caption_rect.getHeight());
-		mChatCaptionPanel->reshape( width - 4, caption_rect.getHeight(), 1);
-		mChatCaptionPanel->setRect(caption_rect);
-	}
-	
-	if (NULL != mChatHistory)
-	{
-		LLRect scroll_rect = mChatHistory->getRect();
-		scroll_rect.setLeftTopAndSize( 2, height - caption_rect.getHeight() - RESIZE_BAR_THICKNESS, width - 4, height - caption_rect.getHeight() - RESIZE_BAR_THICKNESS*2);
-		mChatHistory->reshape( width - 4, height - caption_rect.getHeight() - RESIZE_BAR_THICKNESS*2, 1);
-		mChatHistory->setRect(scroll_rect);
-	}
-	
-	//
-	if(mEChatTearofState == CHAT_PINNED)
-	{
-		const LLRect& parent_rect = gViewerWindow->getRootView()->getRect();
-		
-		LLRect 	panel_rect;
-		panel_rect.setLeftTopAndSize( parent_rect.mLeft+2, parent_rect.mBottom+height+4, width, height);
-		setRect(panel_rect);
-	}
-	else
-	{
-		LLRect 	panel_rect;
-		panel_rect.setLeftTopAndSize( getRect().mLeft, getRect().mTop, width, height);
-		setRect(panel_rect);
-	}
-	
-}
-
-BOOL	LLNearbyChat::handleMouseDown	(S32 x, S32 y, MASK mask)
-{
-	LLUICtrl* nearby_speakers_btn = mChatCaptionPanel->getChild<LLUICtrl>("nearby_speakers_btn");
-	LLUICtrl* tearoff_btn = mChatCaptionPanel->getChild<LLUICtrl>("tearoff_btn");
-	LLUICtrl* close_btn = mChatCaptionPanel->getChild<LLUICtrl>("close_btn");
-	
-	S32 caption_local_x = x - mChatCaptionPanel->getRect().mLeft;
-	S32 caption_local_y = y - mChatCaptionPanel->getRect().mBottom;
-	
-	S32 local_x = caption_local_x - nearby_speakers_btn->getRect().mLeft;
-	S32 local_y = caption_local_y - nearby_speakers_btn->getRect().mBottom;
-	if(nearby_speakers_btn->pointInView(local_x, local_y))
-	{
-
-		onNearbySpeakers();
-		bringToFront( x, y );
-		return true;
-	}
-	local_x = caption_local_x - tearoff_btn->getRect().mLeft;
-	local_y = caption_local_y- tearoff_btn->getRect().mBottom;
-	if(tearoff_btn->pointInView(local_x, local_y))
-	{
-		onTearOff();
-		bringToFront( x, y );
-		return true;
-	}
-
-	local_x = caption_local_x - close_btn->getRect().mLeft;
-	local_y = caption_local_y - close_btn->getRect().mBottom;
-	if(close_btn->pointInView(local_x, local_y))
-	{
-		setVisible(false);
-		bringToFront( x, y );
-		return true;
-	}
-
-	if(mEChatTearofState == CHAT_UNPINNED && mChatCaptionPanel->pointInView(caption_local_x, caption_local_y) )
-	{
-		//start draggind
-		gFocusMgr.setMouseCapture(this);
-		mStart_Y = y;
-		mStart_X = x;
-		bringToFront( x, y );
-		return true;
-	}
-	
-	return LLFloater::handleMouseDown(x,y,mask);
-}
-
-BOOL	LLNearbyChat::handleMouseUp(S32 x, S32 y, MASK mask)
-{
-	if( hasMouseCapture() )
-	{
-		// Release the mouse
-		gFocusMgr.setMouseCapture( NULL );
-		mStart_X = 0;
-		mStart_Y = 0;
-		return true; 
-	}
-
-	return LLFloater::handleMouseUp(x,y,mask);
-}
-
-BOOL	LLNearbyChat::handleHover(S32 x, S32 y, MASK mask)
-{
-	if( hasMouseCapture() )
-	{
-		translate(x-mStart_X,y-mStart_Y);
-		return true;
-	}
-	return LLFloater::handleHover(x,y,mask);
-}
-
-void	LLNearbyChat::pinn_panel()
-{
-	mEChatTearofState = CHAT_PINNED;
-	LLIconCtrl* tearoff_btn = mChatCaptionPanel->getChild<LLIconCtrl>("tearoff_btn",false);
-	
-	tearoff_btn->setValue("Inv_Landmark");
-
-	const LLRect& parent_rect = gViewerWindow->getRootView()->getRect();
-	
-	LLRect 	panel_rect;
-	panel_rect.setLeftTopAndSize( parent_rect.mLeft+2, parent_rect.mBottom+getRect().getHeight()+4, getRect().getWidth(), getRect().getHeight());
-	setRect(panel_rect);
-
-	mResizeBar[LLResizeBar::BOTTOM]->setVisible(false);
-	mResizeBar[LLResizeBar::LEFT]->setVisible(false);
-	mResizeBar[LLResizeBar::RIGHT]->setVisible(false);
-
-	getDragHandle()->setVisible(false);
-
-}
-
-void	LLNearbyChat::float_panel()
-{
-	mEChatTearofState = CHAT_UNPINNED;
-	LLIconCtrl* tearoff_btn = mChatCaptionPanel->getChild<LLIconCtrl>("tearoff_btn", false);
-	
-	tearoff_btn->setValue("Inv_Landmark");
-	mResizeBar[LLResizeBar::BOTTOM]->setVisible(true);
-	mResizeBar[LLResizeBar::LEFT]->setVisible(true);
-	mResizeBar[LLResizeBar::RIGHT]->setVisible(true);
-
-	getDragHandle()->setVisible(true);
-
-	translate(4,4);
-}
 
 void	LLNearbyChat::onNearbyChatContextMenuItemClicked(const LLSD& userdata)
 {
@@ -438,23 +256,6 @@ bool	LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)
 	return false;
 }
 
-BOOL LLNearbyChat::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
-	if(mChatCaptionPanel->pointInView(x - mChatCaptionPanel->getRect().mLeft, y - mChatCaptionPanel->getRect().mBottom) )
-	{
-		LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
-
-		if(menu)
-		{
-			menu->buildDrawLabels();
-			menu->updateParent(LLMenuGL::sMenuContainer);
-			LLMenuGL::showPopup(this, menu, x, y);
-		}
-		return true;
-	}
-	return LLFloater::handleRightMouseDown(x, y, mask);
-}
-
 void	LLNearbyChat::onOpen(const LLSD& key )
 {
 	LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
@@ -464,9 +265,27 @@ void	LLNearbyChat::onOpen(const LLSD& key )
 	}
 }
 
-void	LLNearbyChat::draw		()
+void	LLNearbyChat::setDocked			(bool docked, bool pop_on_undock)
+{
+	LLDockableFloater::setDocked(docked, pop_on_undock);
+
+	setCanResize(!docked);
+}
+
+void LLNearbyChat::setRect	(const LLRect &rect)
 {
-	LLFloater::draw();
+	LLDockableFloater::setRect(rect);
 }
 
+void LLNearbyChat::getAllowedRect(LLRect& rect)
+{
+	rect = gViewerWindow->getWorldViewRect();
+}
+void LLNearbyChat::setVisible	(BOOL visible)
+{
+	LLDockableFloater::setVisible(visible);
+}
+void LLNearbyChat::toggleWindow()
+{
+}
 
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 47cae8ed0d0534a7791c13c1a97f69ba5792a9b7..20cbf7537d64be511a39ff48a7868954d4108daa 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -33,65 +33,44 @@
 #ifndef LL_LLNEARBYCHAT_H_
 #define LL_LLNEARBYCHAT_H_
 
-#include "llfloater.h"
+#include "lldockablefloater.h"
 #include "llscrollbar.h"
 #include "llchat.h"
 
 class LLResizeBar;
 class LLChatHistory;
 
-class LLNearbyChat: public LLFloater
+class LLNearbyChat: public LLDockableFloater
 {
 public:
-	// enumerations used by the chat system
-	typedef enum e_chat_tearof_state
-	{
-		CHAT_PINNED = 0,
-		CHAT_UNPINNED = 1,
-	} EChatTearofState;
-
-	enum { RESIZE_BAR_COUNT=4 };
-
 	LLNearbyChat(const LLSD& key);
 	~LLNearbyChat();
 
 	BOOL	postBuild			();
-	void	reshape				(S32 width, S32 height, BOOL called_from_parent = TRUE);
-	
-	BOOL	handleMouseDown		(S32 x, S32 y, MASK mask);
-	BOOL	handleMouseUp		(S32 x, S32 y, MASK mask);
-	BOOL	handleHover			(S32 x, S32 y, MASK mask);
-
-	BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask);
-	
 	void	addMessage			(const LLChat& message);
 	
-	void	onNearbySpeakers	();
-	void	onTearOff();
-
 	void	onNearbyChatContextMenuItemClicked(const LLSD& userdata);
 	bool	onNearbyChatCheckContextMenuItem(const LLSD& userdata);
 
+	void	setDocked			(bool docked, bool pop_on_undock);
+	void	toggleWindow		();
+
 	/*virtual*/ void	onOpen	(const LLSD& key);
 
-	/*virtual*/ void	draw	();
+	virtual void setVisible		(BOOL visible);
+
+	virtual void setRect		(const LLRect &rect);
 
 private:
+	void	getAllowedRect		(LLRect& rect);
+
+	void	onNearbySpeakers	();
 	void	add_timestamped_line(const LLChat& chat, const LLColor4& color);
 	
-	void	pinn_panel();
-	void	float_panel();
 
 private:
-	EChatTearofState mEChatTearofState;
-	S32		mStart_X;
-	S32		mStart_Y;
-
 	LLHandle<LLView>	mPopupMenuHandle;
-	LLPanel*			mChatCaptionPanel;
 	LLChatHistory*		mChatHistory;
-
-	bool				m_isDirty;
 };
 
 #endif
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 4f3bca50ff18e8241ad20679db30f0bc566bec9c..5fa97926a5c02fd304dd66ce13e3a6ed21a5f05f 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -203,7 +203,7 @@ BOOL LLNearbyChatBar::postBuild()
 
 	mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");
 	mOutputMonitor->setVisible(FALSE);
-	mTalkBtn = getChild<LLTalkButton>("talk");
+	mTalkBtn = getParent()->getChild<LLTalkButton>("talk");
 
 	// Speak button should be initially disabled because
 	// it takes some time between logging in to world and connecting to voice channel.
@@ -229,6 +229,16 @@ bool LLNearbyChatBar::instanceExists()
 
 void LLNearbyChatBar::draw()
 {
+	LLRect rect = getRect();
+	S32 max_width = getMaxWidth();
+
+	if (rect.getWidth() > max_width)
+	{
+		rect.setLeftTopAndSize(rect.mLeft, rect.mTop, max_width, rect.getHeight());
+		reshape(rect.getWidth(), rect.getHeight(), FALSE);
+		setRect(rect);
+	}
+
 	displaySpeakingIndicator();
 	LLPanel::draw();
 }
@@ -254,6 +264,32 @@ BOOL LLNearbyChatBar::handleKeyHere( KEY key, MASK mask )
 	return handled;
 }
 
+S32 LLNearbyChatBar::getMinWidth() const
+{
+	static S32 min_width = -1;
+
+	if (min_width < 0)
+	{
+		const std::string& s = getString("min_width");
+		min_width = !s.empty() ? atoi(s.c_str()) : 300;
+	}
+
+	return min_width;
+}
+
+S32 LLNearbyChatBar::getMaxWidth() const
+{
+	static S32 max_width = -1;
+
+	if (max_width < 0)
+	{
+		const std::string& s = getString("max_width");
+		max_width = !s.empty() ? atoi(s.c_str()) : 510;
+	}
+
+	return max_width;
+}
+
 BOOL LLNearbyChatBar::matchChatTypeTrigger(const std::string& in_str, std::string* out_str)
 {
 	U32 in_len = in_str.length();
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index d6827315f2ae031392d3a196a488a05baee78131..b902ff86cc36bf14a5967cd35518cf186dddf3a1 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -97,6 +97,9 @@ class LLNearbyChatBar
 	static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);
 	static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate);
 
+	S32 getMinWidth() const;
+	S32 getMaxWidth() const;
+
 	/**
 	 * Implements LLVoiceClientStatusObserver::onChange()
 	 */
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 59b19b6dcb6aa7b26923a10f10a7c3c044ea2483..4aefbd1a334fd5dc55f21f9d3492bd0060fafb47 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -225,7 +225,7 @@ void LLNearbyChatScreenChannel::showToastsBottom()
 
 	LLRect	toast_rect;	
 	S32		bottom = getRect().mBottom;
-	S32		margin = gSavedSettings.getS32("ToastMargin");
+	S32		margin = gSavedSettings.getS32("ToastGap");
 
 	for(std::vector<LLToast*>::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it)
 	{
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index c08f92b983d4b84780afba3998e53ff91812ed63..7239f49b7f664cebd6b1960b1a879c4cab61a778 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -91,6 +91,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)
 		LLToast::Params p;
 		p.notif_id = notification->getID();
 		p.notification = notification;
+		p.lifetime_secs = gSavedSettings.getS32("NotificationTipToastLifeTime");
 		p.panel = notify_box;
 		p.is_tip = true;
 		p.can_be_stored = false;
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 7670a5120c6691df5d7aa09604785955b3f6fd86..6413d939f0ecd96fd99656b9cd7b304fa79930c6 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -336,10 +336,10 @@ BOOL LLPanelAvatarProfile::postBuild()
 	childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL);
 
 	LLTextureCtrl* pic = getChild<LLTextureCtrl>("2nd_life_pic");
-	pic->setFallbackImageName("default_land_picture.j2c");
+	pic->setFallbackImageName("default_profile_picture.j2c");
 
 	pic = getChild<LLTextureCtrl>("real_world_pic");
-	pic->setFallbackImageName("default_land_picture.j2c");
+	pic->setFallbackImageName("default_profile_picture.j2c");
 
 	resetControls();
 	resetData();
@@ -351,6 +351,8 @@ void LLPanelAvatarProfile::onOpen(const LLSD& key)
 {
 	LLPanelProfileTab::onOpen(key);
 
+	mGroups.erase();
+
 	//Disable "Add Friend" button for friends.
 	childSetEnabled("add_friend", !LLAvatarActions::isFriend(getAvatarId()));
 }
@@ -381,6 +383,7 @@ void LLPanelAvatarProfile::resetControls()
 
 void LLPanelAvatarProfile::resetData()
 {
+	mGroups.erase();
 	childSetValue("2nd_life_pic",LLUUID::null);
 	childSetValue("real_world_pic",LLUUID::null);
 	childSetValue("online_status",LLStringUtil::null);
@@ -428,11 +431,15 @@ void LLPanelAvatarProfile::processProfileProperties(const LLAvatarData* avatar_d
 
 void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_groups)
 {
-	std::string groups;
+	// *NOTE dzaporozhan
+	// Group properties may arrive in two callbacks, we need to save them across
+	// different calls. We can't do that in textbox as textbox may change the text.
+
+	std::string groups = mGroups;
 	LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin();
 	const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end();
 
-	if(it_end != it)
+	if(groups.empty() && it_end != it)
 	{
 		groups = (*it).group_name;
 		++it;
@@ -443,7 +450,8 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g
 		groups += ", ";
 		groups += group_data.group_name;
 	}
-	childSetValue("sl_groups",groups);
+	mGroups = groups;
+	childSetValue("sl_groups",mGroups);
 }
 
 void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index a03902caba599edc6220d045959771403a1d0e27..ae0b8e98449f893b2fc2f4f419c20cf632fb480b 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -173,6 +173,10 @@ class LLPanelAvatarProfile
 	void onCallButtonClick();
 	void onTeleportButtonClick();
 	void onShareButtonClick();
+
+private:
+
+	std::string mGroups;
 };
 
 /**
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index c2c32527fb17234b15236d8fe31a537037b8246c..e7acc68b93fe12032e0cfcd06dcb4fe5fbb0ca04 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -369,7 +369,7 @@ void LLPanelEditWearable::saveChanges()
 		return;
 	}
 
-	U32 index = gAgentWearables.getWearableIndex(mWearablePtr->getType(), mWearablePtr);
+	U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
 	
 	if (mWearablePtr->getName().compare(mTextEditor->getText()) != 0)
 	{
@@ -601,15 +601,14 @@ LLPanel* LLPanelEditWearable::getPanel(EWearableType type)
 
 void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std::string &edit_group)
 {
-	LLWearable::visualParamCluster_t param_list;
+	LLWearable::visual_param_vec_t param_list;
 	ESex avatar_sex = gAgent.getAvatarObject()->getSex();
 
 	mWearablePtr->getVisualParams(param_list);
 
-	LLWearable::visualParamCluster_t::iterator iter = param_list.begin();
-	LLWearable::visualParamCluster_t::iterator end = param_list.end();
-
-	for (; iter != end; ++iter)
+	for (LLWearable::visual_param_vec_t::iterator iter = param_list.begin();
+		iter != param_list.end();
+		++iter)
 	{
 		LLViewerVisualParam *param = (LLViewerVisualParam*) *iter;
 
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index a7590ac1ddf1e56ead6c52ebf4c6a7d30ad11e98..6eed956eb840e11730e44340f2e05b3db13aea18 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -38,6 +38,9 @@
 #include "llavatariconctrl.h"
 #include "llbutton.h"
 #include "llgroupactions.h"
+#include "llavatarlist.h"
+#include "llparticipantlist.h"
+#include "llimview.h"
 
 LLPanelIMControlPanel::LLPanelIMControlPanel()
 {
@@ -89,15 +92,35 @@ void LLPanelIMControlPanel::setID(const LLUUID& avatar_id)
 }
 
 
+LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id)
+{
+	mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id);
+}
 
 BOOL LLPanelGroupControlPanel::postBuild()
 {
 	childSetAction("group_info_btn", boost::bind(&LLPanelGroupControlPanel::onGroupInfoButtonClicked, this));
 	childSetAction("call_btn", boost::bind(&LLPanelGroupControlPanel::onCallButtonClicked, this));
 
+	mAvatarList = getChild<LLAvatarList>("speakers_list");
+	mParticipantList = new LLParticipantList(mSpeakerManager, mAvatarList);
+
 	return TRUE;
 }
 
+LLPanelGroupControlPanel::~LLPanelGroupControlPanel()
+{
+	delete mParticipantList;
+	mParticipantList = NULL;
+}
+
+// virtual
+void LLPanelGroupControlPanel::draw()
+{
+	mSpeakerManager->update(true);
+	LLPanelChatControlPanel::draw();
+}
+
 void LLPanelGroupControlPanel::onGroupInfoButtonClicked()
 {
 	LLGroupActions::show(mGroupID);
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index e82942a31d6d202a20d98849e41f7d6533dd84b9..138b1630c454d59e983d3ba7aa9e7d20b381ee81 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -35,6 +35,9 @@
 
 #include "llpanel.h"
 
+class LLSpeakerMgr;
+class LLAvatarList;
+class LLParticipantList;
 
 class LLPanelChatControlPanel : public LLPanel
 {
@@ -68,18 +71,22 @@ class LLPanelIMControlPanel : public LLPanelChatControlPanel
 class LLPanelGroupControlPanel : public LLPanelChatControlPanel
 {
 public:
-	LLPanelGroupControlPanel() {};
-	~LLPanelGroupControlPanel() {};
+	LLPanelGroupControlPanel(const LLUUID& session_id);
+	~LLPanelGroupControlPanel();
 
 	BOOL postBuild();
 
 	void setID(const LLUUID& id);
+	/*virtual*/ void draw();
 
 private:
 	void onGroupInfoButtonClicked();
 	void onCallButtonClicked();
 
 	LLUUID mGroupID;
+	LLSpeakerMgr* mSpeakerManager;
+	LLAvatarList* mAvatarList;
+	LLParticipantList* mParticipantList;
 };
 
 
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 521e145816e935528ee3bf77d57e23805fab99a3..83fb147a4960e12b68269d308144374995b6bb28 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -40,7 +40,9 @@
 
 #include "llaccordionctrltab.h"
 #include "llagent.h"
+#include "llagentpicksinfo.h"
 #include "llagentui.h"
+#include "lldndbutton.h"
 #include "llfloaterworldmap.h"
 #include "llfolderviewitem.h"
 #include "llinventorysubtreepanel.h"
@@ -58,7 +60,6 @@ static const std::string ADD_LANDMARK_BUTTON_NAME = "add_landmark_btn";
 static const std::string ADD_FOLDER_BUTTON_NAME = "add_folder_btn";
 static const std::string TRASH_BUTTON_NAME = "trash_btn";
 
-static const LLPlacesInventoryBridgeBuilder PLACES_INVENTORY_BUILDER;
 
 // helper functions
 static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string);
@@ -214,6 +215,17 @@ bool LLLandmarksPanel::isLandmarkSelected() const
 	return false;
 }
 
+bool LLLandmarksPanel::isReceivedFolderSelected() const
+{
+	// Received Folder can be only in Landmarks accordion
+	if (mCurrentSelectedList != mLandmarksInventoryPanel) return false;
+
+	// *TODO: it should be filled with logic when EXT-976 is done.
+
+	llwarns << "Not implemented yet until EXT-976 is done." << llendl;
+
+	return false;
+}
 LLLandmark* LLLandmarksPanel::getCurSelectedLandmark() const
 {
 
@@ -317,9 +329,7 @@ void LLLandmarksPanel::initFavoritesInventroyPanel()
 {
 	mFavoritesInventoryPanel = getChild<LLInventorySubTreePanel>("favorites_list");
 
-	LLUUID start_folder_id = mFavoritesInventoryPanel->getModel()->findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
-
-	initLandmarksPanel(mFavoritesInventoryPanel, start_folder_id);
+	initLandmarksPanel(mFavoritesInventoryPanel);
 
 	initAccordion("tab_favorites", mFavoritesInventoryPanel);
 }
@@ -328,9 +338,8 @@ void LLLandmarksPanel::initLandmarksInventroyPanel()
 {
 	mLandmarksInventoryPanel = getChild<LLInventorySubTreePanel>("landmarks_list");
 
-	LLUUID start_folder_id = mLandmarksInventoryPanel->getModel()->findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+	initLandmarksPanel(mLandmarksInventoryPanel);
 
-	initLandmarksPanel(mLandmarksInventoryPanel, start_folder_id);
 	mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
 
 	// subscribe to have auto-rename functionality while creating New Folder
@@ -343,9 +352,7 @@ void LLLandmarksPanel::initMyInventroyPanel()
 {
 	mMyInventoryPanel= getChild<LLInventorySubTreePanel>("my_inventory_list");
 
-	LLUUID start_folder_id = mMyInventoryPanel->getModel()->getRootFolderID();
-
-	initLandmarksPanel(mMyInventoryPanel, start_folder_id);
+	initLandmarksPanel(mMyInventoryPanel);
 
 	initAccordion("tab_inventory", mMyInventoryPanel);
 }
@@ -354,18 +361,13 @@ void LLLandmarksPanel::initLibraryInventroyPanel()
 {
 	mLibraryInventoryPanel = getChild<LLInventorySubTreePanel>("library_list");
 
-	LLUUID start_folder_id = mLibraryInventoryPanel->getModel()->getLibraryRootFolderID();
-
-	initLandmarksPanel(mLibraryInventoryPanel, start_folder_id);
+	initLandmarksPanel(mLibraryInventoryPanel);
 
 	initAccordion("tab_library", mLibraryInventoryPanel);
 }
 
-
-void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_list, const LLUUID& start_folder_id)
+void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_list)
 {
-	inventory_list->buildSubtreeViewsFor(start_folder_id, &PLACES_INVENTORY_BUILDER);
-
 	inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK);
 	inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2));
 
@@ -378,6 +380,10 @@ void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_lis
 		root_folder->setupMenuHandle(LLInventoryType::IT_CATEGORY, mGearFolderMenu->getHandle());
 		root_folder->setupMenuHandle(LLInventoryType::IT_LANDMARK, mGearLandmarkMenu->getHandle());
 	}
+
+	// save initial folder state to avoid incorrect work while switching between Landmarks & Teleport History tabs
+	// See EXT-1609.
+	inventory_list->saveFolderState();
 }
 
 void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list)
@@ -432,10 +438,18 @@ void LLLandmarksPanel::initListCommandsHandlers()
 	mListCommands->childSetAction(TRASH_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onTrashButtonClick, this));
 
 	
+	LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>(TRASH_BUTTON_NAME);
+	trash_btn->setDragAndDropHandler(boost::bind(&LLLandmarksPanel::handleDragAndDropToTrash, this
+			,	_4 // BOOL drop
+			,	_5 // EDragAndDropType cargo_type
+			,	_7 // EAcceptance* accept
+			));
+
 	mCommitCallbackRegistrar.add("Places.LandmarksGear.Add.Action", boost::bind(&LLLandmarksPanel::onAddAction, this, _2));
-	mCommitCallbackRegistrar.add("Places.LandmarksGear.CopyPaste.Action", boost::bind(&LLLandmarksPanel::onCopyPasteAction, this, _2));
+	mCommitCallbackRegistrar.add("Places.LandmarksGear.CopyPaste.Action", boost::bind(&LLLandmarksPanel::onClipboardAction, this, _2));
 	mCommitCallbackRegistrar.add("Places.LandmarksGear.Custom.Action", boost::bind(&LLLandmarksPanel::onCustomAction, this, _2));
 	mCommitCallbackRegistrar.add("Places.LandmarksGear.Folding.Action", boost::bind(&LLLandmarksPanel::onFoldingAction, this, _2));
+	mEnableCallbackRegistrar.add("Places.LandmarksGear.Check", boost::bind(&LLLandmarksPanel::isActionChecked, this, _2));
 	mEnableCallbackRegistrar.add("Places.LandmarksGear.Enable", boost::bind(&LLLandmarksPanel::isActionEnabled, this, _2));
 	mGearLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
@@ -444,20 +458,8 @@ void LLLandmarksPanel::initListCommandsHandlers()
 
 void LLLandmarksPanel::updateListCommands()
 {
-	// TODO: should be false when "Received" folder is selected
-	bool add_folder_enabled = mCurrentSelectedList == mLandmarksInventoryPanel;
-	bool trash_enabled = false; // TODO: should be false when "Received" folder is selected
-
-	LLFolderViewItem* current_item = getCurSelectedItem();
-
-	if (current_item)
-	{
-		LLFolderViewEventListener* listenerp = current_item->getListener();
-		if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
-		{
-			trash_enabled = mCurrentSelectedList != mLibraryInventoryPanel;
-		}
-	}
+	bool add_folder_enabled = isActionEnabled("category");
+	bool trash_enabled = isActionEnabled("delete");
 
 	// keep Options & Add Landmark buttons always enabled
 	mListCommands->childSetEnabled(ADD_FOLDER_BUTTON_NAME, add_folder_enabled);
@@ -515,31 +517,29 @@ void LLLandmarksPanel::onAddFolderButtonClick() const
 	LLFolderViewItem*  item = getCurSelectedItem();
 	if(item &&  mCurrentSelectedList == mLandmarksInventoryPanel)
 	{
-		LLFolderBridge *parentBridge = NULL;
+		LLFolderViewEventListener* folder_bridge = NULL;
 		if(item-> getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
 		{
-			parentBridge = dynamic_cast<LLFolderBridge*>(item->getParentFolder()->getListener());
-			/*WORKAROUND:* 
-			 LLFolderView::doIdle() is calling in each frame,
-			 it changes selected items before LLFolderView::startRenamingSelectedItem.
-			 To avoid it we have to change keyboardFocus. 
-			*/
-			gFocusMgr.setKeyboardFocus(item->getParentFolder());
+			// for a landmark get parent folder bridge
+			folder_bridge = item->getParentFolder()->getListener();
 		}
 		else if (item-> getListener()->getInventoryType() == LLInventoryType::IT_CATEGORY) 
 		{
-			parentBridge = dynamic_cast<LLFolderBridge*>(item->getListener());
-			gFocusMgr.setKeyboardFocus(item);
+			// for a folder get its own bridge
+			folder_bridge = item->getListener();
 		}
-		menu_create_inventory_item(mCurrentSelectedList->getRootFolder(),parentBridge, LLSD("category"));
+
+		menu_create_inventory_item(mCurrentSelectedList->getRootFolder()
+			, dynamic_cast<LLFolderBridge*>(folder_bridge)
+			, LLSD("category")
+			, gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK)
+			);
 	}
 }
 
 void LLLandmarksPanel::onTrashButtonClick() const
 {
-	if(!mCurrentSelectedList) return;
-
-	mCurrentSelectedList->getRootFolder()->doToSelected(mCurrentSelectedList->getModel(), "delete");
+	onClipboardAction("delete");
 }
 
 void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
@@ -555,7 +555,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
 	}
 }
 
-void LLLandmarksPanel::onCopyPasteAction(const LLSD& userdata) const
+void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const
 {
 	if(!mCurrentSelectedList) 
 		return;
@@ -599,7 +599,6 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)
 	else if ( "sort_by_date" == command_name)
 	{
 		mSortByDate = !mSortByDate;
-		updateSortOrder(mFavoritesInventoryPanel, mSortByDate);
 		updateSortOrder(mLandmarksInventoryPanel, mSortByDate);
 		updateSortOrder(mMyInventoryPanel, mSortByDate);
 		updateSortOrder(mLibraryInventoryPanel, mSortByDate);
@@ -610,31 +609,79 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)
 	}
 }
 
+bool LLLandmarksPanel::isActionChecked(const LLSD& userdata) const
+{
+	const std::string command_name = userdata.asString();
+
+	if ( "sort_by_date" == command_name)
+	{
+		return  mSortByDate;
+	}
+
+	return false;
+}
+
 bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
 {
 	std::string command_name = userdata.asString();
+
+
+	LLPlacesFolderView* rootFolderView = mCurrentSelectedList ?
+		static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder()) : NULL;
+
+	if (NULL == rootFolderView) return false;
+
+	// disable some commands for multi-selection. EXT-1757
+	if (rootFolderView->getSelectedCount() > 1)
+	{
+		if (   "teleport"		== command_name 
+			|| "more_info"		== command_name
+			|| "rename"			== command_name
+			|| "show_on_map"	== command_name
+			|| "copy_slurl"		== command_name
+			)
+		{
+			return false;
+		}
+
+	}
+
+	// disable some commands for Favorites accordion. EXT-1758
+	if (mCurrentSelectedList == mFavoritesInventoryPanel)
+	{
+		if (   "expand_all"		== command_name
+			|| "collapse_all"	== command_name
+			|| "sort_by_date"	== command_name
+			)
+			return false;
+	}
+
+
 	if("category" == command_name)
 	{
-		return mCurrentSelectedList == mLandmarksInventoryPanel; 
+		// we can add folder only in Landmarks Accordion
+		if (mCurrentSelectedList == mLandmarksInventoryPanel)
+		{
+			// ... but except Received folder
+			return !isReceivedFolderSelected();
+		}
+		else return false;
 	}
-	else if("paste" == command_name)
+	else if("paste" == command_name || "rename" == command_name || "cut" == command_name || "delete" == command_name)
 	{
-		return mCurrentSelectedList ? mCurrentSelectedList->getRootFolder()->canPaste() : false;
+		return canSelectedBeModified(command_name);
 	}
 	else if ( "sort_by_date" == command_name)
 	{
 		return  mSortByDate;
 	}
-	// do not allow teleport and more info for multi-selections
-	else if ("teleport" == command_name || "more_info" == command_name)
+	else if("create_pick" == command_name)
 	{
-		return mCurrentSelectedList ?
-			static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder())->getSelectedCount() == 1 : false;
+		return !LLAgentPicksInfo::getInstance()->isPickLimitReached();
 	}
-	// we can add folder, or change item/folder only in Landmarks Accordion
-	else if ("add_folder" == command_name || "rename" == command_name || "delete" == command_name)
+	else
 	{
-		return mLandmarksInventoryPanel == mCurrentSelectedList;
+		llwarns << "Unprocessed command has come: " << command_name << llendl;
 	}
 
 	return true;
@@ -699,6 +746,75 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
 	}
 }
 
+/*
+Processes such actions: cut/rename/delete/paste actions
+
+Rules:
+ 1. We can't perform any action in Library
+ 2. For Landmarks we can:
+	- cut/rename/delete in any other accordions
+	- paste - only in Favorites, Landmarks accordions
+ 3. For Folders we can: perform any action in Landmarks accordion, except Received folder
+ 4. We can not paste folders from Clipboard (processed by LLFolderView::canPaste())
+ 5. Check LLFolderView/Inventory Bridges rules
+ */
+bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) const
+{
+	// validate own rules first
+
+	// nothing can be modified in Library
+	if (mLibraryInventoryPanel == mCurrentSelectedList) return false;
+
+	bool can_be_modified = false;
+
+	// landmarks can be modified in any other accordion...
+	if (isLandmarkSelected())
+	{
+		can_be_modified = true;
+
+		// we can modify landmarks anywhere except paste to My Inventory
+		if ("paste" == command_name)
+		{
+			can_be_modified = (mCurrentSelectedList != mMyInventoryPanel);
+		}
+	}
+	else
+	{
+		// ...folders only in the Landmarks accordion...
+		can_be_modified = mLandmarksInventoryPanel == mCurrentSelectedList;
+
+		// ...except "Received" folder
+		can_be_modified &= !isReceivedFolderSelected();
+	}
+
+	// then ask LLFolderView permissions
+	if (can_be_modified)
+	{
+		if ("cut" == command_name)
+		{
+			can_be_modified = mCurrentSelectedList->getRootFolder()->canCut();
+		}
+		else if ("rename" == command_name)
+		{
+			can_be_modified = getCurSelectedItem()->getListener()->isItemRenameable();
+		}
+		else if ("delete" == command_name)
+		{
+			can_be_modified = getCurSelectedItem()->getListener()->isItemRemovable();
+		}
+		else if("paste" == command_name)
+		{
+			return mCurrentSelectedList->getRootFolder()->canPaste();
+		}
+		else
+		{
+			llwarns << "Unprocessed command has come: " << command_name << llendl;
+		}
+	}
+
+	return can_be_modified;
+}
+
 void LLLandmarksPanel::onPickPanelExit( LLPanelPickEdit* pick_panel, LLView* owner, const LLSD& params)
 {
 	pick_panel->setVisible(FALSE);
@@ -710,6 +826,33 @@ void LLLandmarksPanel::onPickPanelExit( LLPanelPickEdit* pick_panel, LLView* own
 	pick_panel = NULL;
 }
 
+bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
+{
+	*accept = ACCEPT_NO;
+
+	switch (cargo_type)
+	{
+
+	case DAD_LANDMARK:
+	case DAD_CATEGORY:
+		{
+			bool is_enabled = isActionEnabled("delete");
+
+			if (is_enabled) *accept = ACCEPT_YES_MULTI;
+
+			if (is_enabled && drop)
+			{
+				onClipboardAction("delete");
+			}
+		}
+		break;
+	default:
+		break;
+	}
+
+	return true;
+}
+
 
 //////////////////////////////////////////////////////////////////////////
 // HELPER FUNCTIONS
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 389a04a76fb33980d25db3cdac0069511c1adb93..47c9f7647cd311c4abe0c9f4d5d421cd8b38f4de 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -66,6 +66,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	 * @return true - if current selected panel is not null and selected item is a landmark
 	 */
 	bool isLandmarkSelected() const;
+	bool isReceivedFolderSelected() const;
 	LLLandmark* getCurSelectedLandmark() const;
 	LLFolderViewItem* getCurSelectedItem () const;
 	void updateSortOrder(LLInventoryPanel* panel, bool byDate);
@@ -80,7 +81,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	void initLandmarksInventroyPanel();
 	void initMyInventroyPanel();
 	void initLibraryInventroyPanel();
-	void initLandmarksPanel(LLInventorySubTreePanel* inventory_list, const LLUUID& start_folder_id);
+	void initLandmarksPanel(LLInventorySubTreePanel* inventory_list);
 	void initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list);
 	void onAccordionExpandedCollapsed(const LLSD& param, LLInventorySubTreePanel* inventory_list);
 	void deselectOtherThan(const LLInventorySubTreePanel* inventory_list);
@@ -93,12 +94,26 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	void onAddFolderButtonClick() const;
 	void onTrashButtonClick() const;
 	void onAddAction(const LLSD& command_name) const;
-	void onCopyPasteAction(const LLSD& command_name) const;
+	void onClipboardAction(const LLSD& command_name) const;
 	void onFoldingAction(const LLSD& command_name);
+	bool isActionChecked(const LLSD& userdata) const;
 	bool isActionEnabled(const LLSD& command_name) const;
 	void onCustomAction(const LLSD& command_name);
+
+	/**
+	 * Determines if selected item can be modified via context/gear menu.
+	 *
+	 * It validates Places Landmarks rules first. And then LLFolderView permissions.
+	 * For now it checks cut/rename/delete/paste actions.
+	 */
+	bool canSelectedBeModified(const std::string& command_name) const;
 	void onPickPanelExit( LLPanelPickEdit* pick_panel, LLView* owner, const LLSD& params);
 
+	/**
+	 * Processes drag-n-drop of the Landmarks and folders into trash button.
+	 */
+	bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
+
 private:
 	LLInventorySubTreePanel*	mFavoritesInventoryPanel;
 	LLInventorySubTreePanel*	mLandmarksInventoryPanel;
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index ab5d8601d05c1354e1a29ddca840233442f3db70..6a3617f008440f420b8a2ab223ed56ba006d1f6d 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -68,15 +68,11 @@ LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() :
 	mHeightPixels( NULL ),
 	mHomeURL( NULL ),
 	mCurrentURL( NULL ),
-	mAltImageEnable( NULL ),
 	mParent( NULL ),
 	mMediaEditable(false)
 {
 	// build dialog from XML
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_general.xml");
-//	mCommitCallbackRegistrar.add("Media.ResetCurrentUrl",		boost::bind(&LLPanelMediaSettingsGeneral::onBtnResetCurrentUrl, this));
-//	mCommitCallbackRegistrar.add("Media.CommitHomeURL",			boost::bind(&LLPanelMediaSettingsGeneral::onCommitHomeURL, this));	
-
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -84,7 +80,6 @@ LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() :
 BOOL LLPanelMediaSettingsGeneral::postBuild()
 {
 	// connect member vars with UI widgets
-    mAltImageEnable = getChild< LLCheckBoxCtrl >( LLMediaEntry::ALT_IMAGE_ENABLE_KEY );
 	mAutoLoop = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_LOOP_KEY );
 	mAutoPlay = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_PLAY_KEY );
 	mAutoScale = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_SCALE_KEY );
@@ -192,7 +187,6 @@ void LLPanelMediaSettingsGeneral::draw()
 void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
 {	
 	LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
-	self->mAltImageEnable ->clear();
 	self->mAutoLoop->clear();
 	self->mAutoPlay->clear();
 	self->mAutoScale->clear();
@@ -203,7 +197,6 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
 	self->mHeightPixels->clear();
 	self->mHomeURL->clear();
 	self->mWidthPixels->clear();
-	self->mAltImageEnable ->setEnabled(editable);
 	self->mAutoLoop ->setEnabled(editable);
 	self->mAutoPlay ->setEnabled(editable);
 	self->mAutoScale ->setEnabled(editable);
@@ -214,7 +207,7 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
 	self->mHeightPixels ->setEnabled(editable);
 	self->mHomeURL ->setEnabled(editable);
 	self->mWidthPixels ->setEnabled(editable);
-	self->mPreviewMedia->unloadMediaSource(); 
+	self->updateMediaPreview();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -272,7 +265,6 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_
 		{ LLMediaEntry::HOME_URL_KEY,				self->mHomeURL,			"LLLineEditor" },
 		{ LLMediaEntry::FIRST_CLICK_INTERACT_KEY,	self->mFirstClick,		"LLCheckBoxCtrl" },
 		{ LLMediaEntry::WIDTH_PIXELS_KEY,			self->mWidthPixels,		"LLSpinCtrl" },
-		{ LLMediaEntry::ALT_IMAGE_ENABLE_KEY,		self->mAltImageEnable,	"LLCheckBoxCtrl" },
 		{ "", NULL , "" }
 	};
 
@@ -320,10 +312,10 @@ void LLPanelMediaSettingsGeneral::updateMediaPreview()
 		mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
 	}
 	else
-	// new home URL will be empty if media is deleted but
-	// we still need to clean out the preview.
+	// new home URL will be empty if media is deleted so display a 
+	// "preview goes here" data url page
 	{
-		mPreviewMedia->unloadMediaSource();
+		mPreviewMedia->navigateTo( "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E" );
 	};
 }
 
@@ -393,7 +385,6 @@ void LLPanelMediaSettingsGeneral::apply( void* userdata )
 //
 void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )
 {
-    fill_me_in[LLMediaEntry::ALT_IMAGE_ENABLE_KEY] = mAltImageEnable->getValue();
     fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue();
     fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue();
     fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue();
diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h
index 5eb42ffaf484c259d12e63d2e6de7b8b3bf1e66e..e82a31382ef6226e23da4513fe0b09d5a1959877 100644
--- a/indra/newview/llpanelmediasettingsgeneral.h
+++ b/indra/newview/llpanelmediasettingsgeneral.h
@@ -85,7 +85,6 @@ class LLPanelMediaSettingsGeneral : public LLPanel
 	LLSpinCtrl* mHeightPixels;
 	LLLineEditor* mHomeURL;
 	LLLineEditor* mCurrentURL;
-	LLCheckBoxCtrl* mAltImageEnable;
 	LLMediaCtrl* mPreviewMedia;
 };
 
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 9dc80c051559a81a6cfeb48dda534931c9024e5b..61d66873ea564d7f36d5cc8c3ec68e6e42a5595d 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -690,6 +690,27 @@ LLUUID LLPanelPeople::getCurrentItemID() const
 	return LLUUID::null;
 }
 
+void LLPanelPeople::getCurrentItemIDs(std::vector<LLUUID>& selected_uuids) const
+{
+	std::string cur_tab = getActiveTabName();
+
+	if (cur_tab == FRIENDS_TAB_NAME)
+	{
+		// friends tab has two lists
+		mOnlineFriendList->getSelectedUUIDs(selected_uuids);
+		mAllFriendList->getSelectedUUIDs(selected_uuids);
+	}
+	else if (cur_tab == NEARBY_TAB_NAME)
+		mNearbyList->getSelectedUUIDs(selected_uuids);
+	else if (cur_tab == RECENT_TAB_NAME)
+		mRecentList->getSelectedUUIDs(selected_uuids);
+	else if (cur_tab == GROUP_TAB_NAME)
+		mGroupList->getSelectedUUIDs(selected_uuids);
+	else
+		llassert(0 && "unknown tab selected");
+
+}
+
 void LLPanelPeople::showGroupMenu(LLMenuGL* menu)
 {
 	// Shows the menu at the top of the button bar.
@@ -873,10 +894,17 @@ void LLPanelPeople::onChatButtonClicked()
 
 void LLPanelPeople::onImButtonClicked()
 {
-	LLUUID id = getCurrentItemID();
-	if (id.notNull())
+	std::vector<LLUUID> selected_uuids;
+	getCurrentItemIDs(selected_uuids);
+	if ( selected_uuids.size() == 1 )
+	{
+		// if selected only one person then start up IM
+		LLAvatarActions::startIM(selected_uuids.at(0));
+	}
+	else if ( selected_uuids.size() > 1 )
 	{
-		LLAvatarActions::startIM(id);
+		// for multiple selection start up friends conference
+		LLAvatarActions::startConference(selected_uuids);
 	}
 }
 
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index aa78080d7e59b4d4d6bfcc3343af9ccc304b1ea0..dc0aaeb70f1f19f4f69d73a4d9eb0f4293b2a9fe 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -72,6 +72,7 @@ class LLPanelPeople : public LLPanel
 	void					updateButtons();
 	std::string				getActiveTabName() const;
 	LLUUID					getCurrentItemID() const;
+	void					getCurrentItemIDs(std::vector<LLUUID>& selected_uuids) const;
 	void					buttonSetVisible(std::string btn_name, BOOL visible);
 	void					buttonSetEnabled(const std::string& btn_name, bool enabled);
 	void					buttonSetAction(const std::string& btn_name, const commit_signal_t::slot_type& cb);
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 0e88058bb18f41570fd7830b1f100a8647a72fb9..aaf6849fe94128f50226b54307259a3c14adb4c9 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -55,7 +55,7 @@ ContextMenu::ContextMenu()
 {
 }
 
-void ContextMenu::show(LLView* spawning_view, const LLUUID& id, S32 x, S32 y)
+void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
 {
 	if (mMenu)
 	{
@@ -67,9 +67,16 @@ void ContextMenu::show(LLView* spawning_view, const LLUUID& id, S32 x, S32 y)
 			mMenu->setParent(NULL);
 		}
 		delete mMenu;
+		mMenu = NULL;
+		mUUIDs.clear();
 	}
 
-	mID = id;
+	if ( uuids.empty() )
+		return;
+
+	mUUIDs.resize(uuids.size());
+	std::copy(uuids.begin(), uuids.end(), mUUIDs.begin());
+
 	mMenu = createMenu();
 	mMenu->show(x, y);
 	LLMenuGL::showPopup(spawning_view, mMenu, x, y);
@@ -80,47 +87,92 @@ void ContextMenu::show(LLView* spawning_view, const LLUUID& id, S32 x, S32 y)
 LLContextMenu* NearbyMenu::createMenu()
 {
 	// set up the callbacks for all of the avatar menu items
-	// (N.B. callbacks don't take const refs as mID is local scope)
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
 
-	registrar.add("Avatar.Profile",			boost::bind(&LLAvatarActions::showProfile,				mID));
-	registrar.add("Avatar.AddFriend",		boost::bind(&LLAvatarActions::requestFriendshipDialog,	mID));
-	registrar.add("Avatar.IM",				boost::bind(&LLAvatarActions::startIM,					mID));
-	registrar.add("Avatar.Call",			boost::bind(&LLAvatarActions::startIM,					mID)); // *TODO: unimplemented
-	registrar.add("Avatar.OfferTeleport",	boost::bind(&NearbyMenu::offerTeleport,					this));
-	registrar.add("Avatar.ShowOnMap",		boost::bind(&LLAvatarActions::startIM,					mID)); // *TODO: unimplemented
-	registrar.add("Avatar.Share",			boost::bind(&LLAvatarActions::startIM,					mID)); // *TODO: unimplemented
-	registrar.add("Avatar.Pay",				boost::bind(&LLAvatarActions::pay,						mID));
-	registrar.add("Avatar.BlockUnblock",	boost::bind(&LLAvatarActions::toggleBlock,				mID));
-
-	enable_registrar.add("Avatar.EnableItem",	boost::bind(&NearbyMenu::enableContextMenuItem,	this, _2));
-	enable_registrar.add("Avatar.CheckItem",	boost::bind(&NearbyMenu::checkContextMenuItem,	this, _2));
-
-	// create the context menu from the XUI
-	return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
-		"menu_people_nearby.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+	if ( mUUIDs.size() == 1 )
+	{
+		// Set up for one person selected menu
+
+		const LLUUID& id = mUUIDs.front();
+		registrar.add("Avatar.Profile",			boost::bind(&LLAvatarActions::showProfile,				id));
+		registrar.add("Avatar.AddFriend",		boost::bind(&LLAvatarActions::requestFriendshipDialog,	id));
+		registrar.add("Avatar.IM",				boost::bind(&LLAvatarActions::startIM,					id));
+		registrar.add("Avatar.Call",			boost::bind(&LLAvatarActions::startIM,					id));	// *TODO: unimplemented
+		registrar.add("Avatar.OfferTeleport",	boost::bind(&NearbyMenu::offerTeleport,					this));
+		registrar.add("Avatar.ShowOnMap",		boost::bind(&LLAvatarActions::startIM,					id));	// *TODO: unimplemented
+		registrar.add("Avatar.Share",			boost::bind(&LLAvatarActions::startIM,					id));	// *TODO: unimplemented
+		registrar.add("Avatar.Pay",				boost::bind(&LLAvatarActions::pay,						id));
+		registrar.add("Avatar.BlockUnblock",	boost::bind(&LLAvatarActions::toggleBlock,				id));
+
+		enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem,	this, _2));
+		enable_registrar.add("Avatar.CheckItem",  boost::bind(&NearbyMenu::checkContextMenuItem,	this, _2));
+
+		// create the context menu from the XUI
+		return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
+			"menu_people_nearby.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+	}
+	else
+	{
+		// Set up for multi-selected People
+
+		// registrar.add("Avatar.AddFriend",	boost::bind(&LLAvatarActions::requestFriendshipDialog,	mUUIDs)); // *TODO: unimplemented
+		registrar.add("Avatar.IM",			boost::bind(&LLAvatarActions::startConference,			mUUIDs));
+		// registrar.add("Avatar.Call",		boost::bind(&LLAvatarActions::startConference,			mUUIDs)); // *TODO: unimplemented
+		// registrar.add("Avatar.Share",		boost::bind(&LLAvatarActions::startIM,					mUUIDs)); // *TODO: unimplemented
+		// registrar.add("Avatar.Pay",		boost::bind(&LLAvatarActions::pay,						mUUIDs)); // *TODO: unimplemented
+		enable_registrar.add("Avatar.EnableItem",	boost::bind(&NearbyMenu::enableContextMenuItem,	this, _2));
+
+		// create the context menu from the XUI
+		return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
+			("menu_people_nearby_multiselect.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+
+	}
 }
 
 bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
 {
 	std::string item = userdata.asString();
 
+	// Note: can_block and can_delete is used only for one person selected menu
+	// so we don't need to go over all uuids.
+
 	if (item == std::string("can_block"))
 	{
+		const LLUUID& id = mUUIDs.front();
 		std::string firstname, lastname;
-		gCacheName->getName(mID, firstname, lastname);
+		gCacheName->getName(id, firstname, lastname);
 		bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden");
-		bool is_self = mID == gAgentID;
+		bool is_self = id == gAgentID;
 		return !is_self && !is_linden;
 	}
 	else if (item == std::string("can_add"))
 	{
-		return !LLAvatarActions::isFriend(mID);
+		// We can add friends if:
+		// - there are selected people
+		// - and there are no friends among selection yet.
+
+		bool result = (mUUIDs.size() > 0);
+
+		std::vector<LLUUID>::const_iterator
+			id = mUUIDs.begin(),
+			uuids_end = mUUIDs.end();
+
+		for (;id != uuids_end; ++id)
+		{
+			if ( LLAvatarActions::isFriend(*id) )
+			{
+				result = false;
+				break;
+			}
+		}
+
+		return result;
 	}
 	else if (item == std::string("can_delete"))
 	{
-		return LLAvatarActions::isFriend(mID);
+		const LLUUID& id = mUUIDs.front();
+		return LLAvatarActions::isFriend(id);
 	}
 
 	return false;
@@ -129,10 +181,11 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
 bool NearbyMenu::checkContextMenuItem(const LLSD& userdata)
 {
 	std::string item = userdata.asString();
+	const LLUUID& id = mUUIDs.front();
 
 	if (item == std::string("is_blocked"))
 	{
-		return LLAvatarActions::isBlocked(mID);
+		return LLAvatarActions::isBlocked(id);
 	}
 
 	return false;
@@ -142,7 +195,8 @@ void NearbyMenu::offerTeleport()
 {
 	// boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),
 	// so we have to use a wrapper.
-	LLAvatarActions::offerTeleport(mID);
+	const LLUUID& id = mUUIDs.front();
+	LLAvatarActions::offerTeleport(id);
 }
 
 } // namespace LLPanelPeopleMenus
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index 0012ac38f85386ad165e8a8cc14baee0015352c8..ed0f8208f670e745d2d1d1a2a32ffb85298ad76a 100644
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -49,17 +49,17 @@ class ContextMenu : public LLAvatarListItem::ContextMenu
 
 	/**
 	 * Show the menu at specified coordinates.
-	 * 
-	 * @param id either avatar or group id
+	 *
+	 * @param  uuids - an array of avatar or group ids
 	 */
-	/*virtual*/ void show(LLView* spawning_view, const LLUUID& id, S32 x, S32 y);
+	/*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y);
 
 protected:
 
 	virtual LLContextMenu* createMenu() = 0;
 
-	LLUUID			mID;
-	LLContextMenu*	mMenu;
+	std::vector<LLUUID>	mUUIDs;
+	LLContextMenu*		mMenu;
 };
 
 /**
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index 664ebfd7a447ba9c5b6873c05ab376494e22c696..e725479abb5fe27eab0ca3aa82b462b2448b9c45 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -38,6 +38,7 @@
 #include "llpanel.h"
 #include "message.h"
 #include "llagent.h"
+#include "llagentpicksinfo.h"
 #include "llbutton.h"
 #include "lllineeditor.h"
 #include "llparcel.h"
@@ -45,6 +46,7 @@
 #include "lltexteditor.h"
 #include "lltexturectrl.h"
 #include "lluiconstants.h"
+#include "llviewerregion.h"
 #include "llworldmap.h"
 #include "llfloaterworldmap.h"
 #include "llfloaterreg.h"
@@ -310,6 +312,7 @@ LLPanelPickEdit::LLPanelPickEdit()
  : LLPanelPickInfo()
  , mLocationChanged(false)
  , mNeedData(true)
+ , mNewPick(false)
 {
 }
 
@@ -325,6 +328,8 @@ void LLPanelPickEdit::onOpen(const LLSD& key)
 	// creating new Pick
 	if(pick_id.isNull())
 	{
+		mNewPick = true;
+
 		setAvatarId(gAgent.getID());
 
 		resetData();
@@ -344,6 +349,15 @@ void LLPanelPickEdit::onOpen(const LLSD& key)
 			snapshot_id = parcel->getSnapshotID();
 		}
 
+		if(pick_name.empty())
+		{
+			LLViewerRegion* region = gAgent.getRegion();
+			if(region)
+			{
+				pick_name = region->getName();
+			}
+		}
+
 		setParcelID(parcel_id);
 		childSetValue("pick_name", pick_name);
 		childSetValue("pick_desc", pick_desc);
@@ -356,6 +370,7 @@ void LLPanelPickEdit::onOpen(const LLSD& key)
 	// editing existing pick
 	else
 	{
+		mNewPick = false;
 		LLPanelPickInfo::onOpen(key);
 
 		enableSaveButton(false);
@@ -463,6 +478,14 @@ void LLPanelPickEdit::sendUpdate()
 	pick_data.enabled = TRUE;
 
 	LLAvatarPropertiesProcessor::instance().sendPickInfoUpdate(&pick_data);
+
+	if(mNewPick)
+	{
+		// Assume a successful create pick operation, make new number of picks
+		// available immediately. Actual number of picks will be requested in 
+		// LLAvatarPropertiesProcessor::sendPickInfoUpdate and updated upon server respond.
+		LLAgentPicksInfo::getInstance()->incrementNumberOfPicks();
+	}
 }
 
 void LLPanelPickEdit::onPickChanged(LLUICtrl* ctrl)
diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h
index c5b13c69eaffb2b8c66f86bb31f730b92add87f5..9b605cd6b1a40a6cfc959fa219303cf4b4a370b7 100644
--- a/indra/newview/llpanelpick.h
+++ b/indra/newview/llpanelpick.h
@@ -235,6 +235,7 @@ class LLPanelPickEdit : public LLPanelPickInfo
 
 	bool mLocationChanged;
 	bool mNeedData;
+	bool mNewPick;
 };
 
 #endif // LL_LLPANELPICK_H
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 073da5cc06b4335b4942b94a8d6467234f416590..aa6909560dd59a2372a609eed38f79b89a0af220 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -33,11 +33,13 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llagent.h"
+#include "llagentpicksinfo.h"
 #include "llavatarconstants.h"
 #include "llflatlistview.h"
 #include "llfloaterreg.h"
 #include "llfloaterworldmap.h"
 #include "lltexturectrl.h"
+#include "lltoggleablemenu.h"
 #include "llviewergenericmessage.h"	// send_generic_message
 #include "llmenugl.h"
 #include "llviewermenu.h"
@@ -54,6 +56,7 @@ static const std::string XML_BTN_DELETE = "trash_btn";
 static const std::string XML_BTN_INFO = "info_btn";
 static const std::string XML_BTN_TELEPORT = "teleport_btn";
 static const std::string XML_BTN_SHOW_ON_MAP = "show_on_map_btn";
+static const std::string XML_BTN_OVERFLOW = "overflow_btn";
 
 static const std::string PICK_ID("pick_id");
 static const std::string PICK_CREATOR_ID("pick_creator_id");
@@ -73,6 +76,7 @@ LLPanelPicks::LLPanelPicks()
 	mPicksList(NULL)
 	, mPanelPickInfo(NULL)
 	, mPanelPickEdit(NULL)
+	, mOverflowMenu(NULL)
 {
 }
 
@@ -91,7 +95,12 @@ void* LLPanelPicks::create(void* data /* = NULL */)
 
 void LLPanelPicks::updateData()
 {
-	LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId());
+	// Send Picks request only when we need to, not on every onOpen(during tab switch).
+	if(isDirty())
+	{
+		mPicksList->clear();
+		LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId());
+	}
 }
 
 void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
@@ -134,6 +143,7 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
 				picture->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
 			}
 
+			resetDirty();
 			LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
 			updateButtons();
 		}
@@ -152,25 +162,56 @@ BOOL LLPanelPicks::postBuild()
 {
 	mPicksList = getChild<LLFlatListView>("picks_list");
 
+	childSetAction(XML_BTN_NEW, boost::bind(&LLPanelPicks::onClickNew, this));
 	childSetAction(XML_BTN_DELETE, boost::bind(&LLPanelPicks::onClickDelete, this));
-
-	childSetAction("teleport_btn", boost::bind(&LLPanelPicks::onClickTeleport, this));
-	childSetAction("show_on_map_btn", boost::bind(&LLPanelPicks::onClickMap, this));
-
-	childSetAction("info_btn", boost::bind(&LLPanelPicks::onClickInfo, this));
-	childSetAction("new_btn", boost::bind(&LLPanelPicks::onClickNew, this));
+	childSetAction(XML_BTN_TELEPORT, boost::bind(&LLPanelPicks::onClickTeleport, this));
+	childSetAction(XML_BTN_SHOW_ON_MAP, boost::bind(&LLPanelPicks::onClickMap, this));
+	childSetAction(XML_BTN_INFO, boost::bind(&LLPanelPicks::onClickInfo, this));
+	childSetAction(XML_BTN_OVERFLOW, boost::bind(&LLPanelPicks::onOverflowButtonClicked, this));
 	
-	CommitCallbackRegistry::ScopedRegistrar registar;
+	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar;
 	registar.add("Pick.Info", boost::bind(&LLPanelPicks::onClickInfo, this));
 	registar.add("Pick.Edit", boost::bind(&LLPanelPicks::onClickMenuEdit, this)); 
 	registar.add("Pick.Teleport", boost::bind(&LLPanelPicks::onClickTeleport, this));
 	registar.add("Pick.Map", boost::bind(&LLPanelPicks::onClickMap, this));
 	registar.add("Pick.Delete", boost::bind(&LLPanelPicks::onClickDelete, this));
 	mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_picks.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+
+	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar overflow_registar;
+	overflow_registar.add("PicksList.Overflow", boost::bind(&LLPanelPicks::onOverflowMenuItemClicked, this, _2));
+	mOverflowMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	
 	return TRUE;
 }
 
+void LLPanelPicks::onOverflowMenuItemClicked(const LLSD& param)
+{
+	std::string value = param.asString();
+
+	if("info" == value)
+	{
+		onClickInfo();
+	}
+	else if("teleport" == value)
+	{
+		onClickTeleport();
+	}
+	else if("map" == value)
+	{
+		onClickMap();
+	}
+}
+
+void LLPanelPicks::onOverflowButtonClicked()
+{
+	LLRect rect;
+	childGetRect(XML_BTN_OVERFLOW, rect);
+
+	mOverflowMenu->updateParent(LLMenuGL::sMenuContainer);
+	mOverflowMenu->setButtonRect(rect, this);
+	LLMenuGL::showPopup(this, mOverflowMenu, rect.mRight, rect.mTop);
+}
+
 void LLPanelPicks::onOpen(const LLSD& key)
 {
 	const LLUUID id(key.asUUID());
@@ -183,8 +224,6 @@ void LLPanelPicks::onOpen(const LLSD& key)
 	// Disable buttons when viewing profile for first time
 	if(getAvatarId() != id)
 	{
-		clear();
-
 		childSetEnabled(XML_BTN_INFO,FALSE);
 		childSetEnabled(XML_BTN_TELEPORT,FALSE);
 		childSetEnabled(XML_BTN_SHOW_ON_MAP,FALSE);
@@ -204,6 +243,8 @@ void LLPanelPicks::onOpen(const LLSD& key)
 	if(getAvatarId() != id)
 	{
 		mPicksList->goToTop();
+		// Set dummy value to make panel dirty and make it reload picks
+		setValue(LLSD());
 	}
 
 	LLPanelProfileTab::onOpen(key);
@@ -296,20 +337,18 @@ void LLPanelPicks::onDoubleClickItem(LLUICtrl* item)
 
 void LLPanelPicks::updateButtons()
 {
-	int picks_num = mPicksList->size();
 	bool has_selected = mPicksList->numSelected();
 
-	childSetEnabled(XML_BTN_INFO, has_selected);
-
 	if (getAvatarId() == gAgentID)
 	{
-		childSetEnabled(XML_BTN_NEW, picks_num < MAX_AVATAR_PICKS);
+		childSetEnabled(XML_BTN_NEW, !LLAgentPicksInfo::getInstance()->isPickLimitReached());
 		childSetEnabled(XML_BTN_DELETE, has_selected);
 	}
 
 	childSetEnabled(XML_BTN_INFO, has_selected);
 	childSetEnabled(XML_BTN_TELEPORT, has_selected);
 	childSetEnabled(XML_BTN_SHOW_ON_MAP, has_selected);
+	childSetEnabled(XML_BTN_OVERFLOW, has_selected);
 }
 
 void LLPanelPicks::setProfilePanel(LLPanelProfile* profile_panel)
@@ -358,6 +397,12 @@ void LLPanelPicks::onPanelPickClose(LLPanel* panel)
 	panel->setVisible(FALSE);
 }
 
+void LLPanelPicks::onPanelPickSave(LLPanel* panel)
+{
+	onPanelPickClose(panel);
+	updateButtons();
+}
+
 void LLPanelPicks::createPickInfoPanel()
 {
 	if(!mPanelPickInfo)
@@ -375,7 +420,7 @@ void LLPanelPicks::createPickEditPanel()
 	{
 		mPanelPickEdit = LLPanelPickEdit::create();
 		mPanelPickEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
-		mPanelPickEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
+		mPanelPickEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelPickSave, this, mPanelPickEdit));
 		mPanelPickEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
 		mPanelPickEdit->setVisible(FALSE);
 	}
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 6264a19318b13065d581f7924419d720ea943837..06a0f0a0fdb3291dde52161ec4e9b5cd24ee6d51 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -50,6 +50,7 @@ class LLPickItem;
 class LLFlatListView;
 class LLPanelPickInfo;
 class LLPanelPickEdit;
+class LLToggleableMenu;
 
 class LLPanelPicks 
 	: public LLPanelProfileTab
@@ -80,12 +81,16 @@ class LLPanelPicks
 	void onClickTeleport();
 	void onClickMap();
 
+	void onOverflowMenuItemClicked(const LLSD& param);
+	void onOverflowButtonClicked();
+
 	//------------------------------------------------
 	// Callbacks which require panel toggling
 	//------------------------------------------------
 	void onClickNew();
 	void onClickInfo();
 	void onPanelPickClose(LLPanel* panel);
+	void onPanelPickSave(LLPanel* panel);
 	void onPanelPickEdit();
 	void onClickMenuEdit();
 
@@ -112,6 +117,7 @@ class LLPanelPicks
 	LLFlatListView* mPicksList;
 	LLPanelPickInfo* mPanelPickInfo;
 	LLPanelPickEdit* mPanelPickEdit;
+	LLToggleableMenu* mOverflowMenu;
 };
 
 class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 6d1a5fb1842c09dcc12dfb89d6bce4d7ba08b7f8..cb9f7184f01dfad38ec6cd321249b96c2d4b53e6 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -56,10 +56,12 @@
 #include "llagentui.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llfloaterworldmap.h"
+#include "llfloaterbuycurrency.h"
 #include "llinventorymodel.h"
 #include "lllandmarkactions.h"
 #include "llpanelpick.h"
 #include "lltexturectrl.h"
+#include "llstatusbar.h"
 #include "llviewerinventory.h"
 #include "llviewerparcelmgr.h"
 #include "llviewerregion.h"
@@ -88,7 +90,10 @@ LLPanelPlaceInfo::LLPanelPlaceInfo()
 	mMinHeight(0),
 	mScrollingPanel(NULL),
 	mInfoPanel(NULL),
-	mMediaPanel(NULL)
+	mMediaPanel(NULL),
+	mForSalePanel(NULL),
+	mYouAreHerePanel(NULL),
+	mSelectedParcelID(-1)
 {}
 
 LLPanelPlaceInfo::~LLPanelPlaceInfo()
@@ -104,14 +109,15 @@ BOOL LLPanelPlaceInfo::postBuild()
 	mTitle = getChild<LLTextBox>("panel_title");
 	mCurrentTitle = mTitle->getText();
 
-	mForSaleIcon = getChild<LLIconCtrl>("icon_for_sale");
+	mForSalePanel = getChild<LLPanel>("for_sale_panel");
+	mYouAreHerePanel = getChild<LLPanel>("here_panel");
+	LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLPanelPlaceInfo::updateYouAreHereBanner,this));
+	
+	//Icon value should contain sale price of last selected parcel. 
+	mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")->
+				setMouseDownCallback(boost::bind(&LLPanelPlaceInfo::onForSaleBannerClick, this));
 
-	// Since this is only used in the directory browser, always
-	// disable the snapshot control. Otherwise clicking on it will
-	// open a texture picker.
 	mSnapshotCtrl = getChild<LLTextureCtrl>("logo");
-	mSnapshotCtrl->setEnabled(FALSE);
-
 	mRegionName = getChild<LLTextBox>("region_title");
 	mParcelName = getChild<LLTextBox>("parcel_title");
 	mDescEditor = getChild<LLTextEditor>("description");
@@ -267,7 +273,8 @@ void LLPanelPlaceInfo::resetLocation()
 	mRequestedID.setNull();
 	mLandmarkID.setNull();
 	mPosRegion.clearVec();
-	mForSaleIcon->setVisible(FALSE);
+	mForSalePanel->setVisible(FALSE);
+	mYouAreHerePanel->setVisible(FALSE);
 	std::string not_available = getString("not_available");
 	mMaturityRatingText->setValue(not_available);
 	mParcelOwner->setValue(not_available);
@@ -480,9 +487,9 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
 
 	//update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE
 	//because we deal with remote parcel response format
-	bool isForSale = (parcel_data.flags & DFQ_FOR_SALE) &&
+	bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) &&
 					 mInfoType == AGENT ? TRUE : FALSE;
-	mForSaleIcon->setVisible(isForSale);
+	mForSalePanel->setVisible(is_for_sale);
 
 	S32 region_x;
 	S32 region_y;
@@ -798,11 +805,11 @@ void LLPanelPlaceInfo::displaySelectedParcelInfo(LLParcel* parcel,
 		}
 	}
 
+	mSelectedParcelID = parcel->getLocalID();
+	mLastSelectedRegionID = region->getRegionID();
 	processParcelInfo(parcel_data);
 
-	// TODO: If agent is in currently within the selected parcel
-	// show the "You Are Here" banner.
-
+	mYouAreHerePanel->setVisible(is_current_parcel);
 	getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale);
 }
 
@@ -979,6 +986,50 @@ void LLPanelPlaceInfo::populateFoldersList()
 		mFolderCombo->add(it->second, LLSD(it->first));
 }
 
+void LLPanelPlaceInfo::updateYouAreHereBanner()
+{
+	//YouAreHere Banner should be displayed only for selected places, 
+	// If you want to display it for landmark or teleport history item, you should check by mParcelId
+	
+	bool is_you_are_here = false;
+	if (mSelectedParcelID != S32(-1) && !mLastSelectedRegionID.isNull())
+	{
+		is_you_are_here = gAgent.getRegion()->getRegionID()== mLastSelectedRegionID &&
+		mSelectedParcelID == LLViewerParcelMgr::getInstance()->getAgentParcel()->getLocalID();
+	}
+	mYouAreHerePanel->setVisible(is_you_are_here);
+}
+
+void LLPanelPlaceInfo::onForSaleBannerClick()
+{
+	LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
+	LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection();
+	LLViewerRegion* selected_region =  mgr->getSelectionRegion();
+	if(!hParcel.isNull() && selected_region)
+	{
+		if(hParcel->getParcel()->getLocalID() == mSelectedParcelID && 
+				mLastSelectedRegionID ==selected_region->getRegionID())
+		{
+			if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0)
+			{
+				LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice());
+			}
+			else
+			{
+				LLViewerParcelMgr::getInstance()->startBuyLand();
+			}
+		}
+		else
+		{
+			LL_WARNS("Places") << "User  is trying  to buy remote parcel.Operation is not supported"<< LL_ENDL; 
+		}
+		
+	}
+	
+	
+}
+ 
+
 static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right)
 {
 	return left.second < right.second;
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index 06fee2224e94632889c5984f0e0c38a449605c54..7b3a8f050b98abde66539db5674e59930aac0b69 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -135,7 +135,12 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
 private:
 
 	void populateFoldersList();
+	void updateYouAreHereBanner();
+	void onForSaleBannerClick();
 
+	/**
+	 * mParcelID is valid only for remote places, in other cases it's null. See resetLocation() 
+	 */
 	LLUUID			mParcelID;
 	LLUUID			mRequestedID;
 	LLUUID			mLandmarkID;
@@ -144,8 +149,15 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
 	S32				mMinHeight;
 	INFO_TYPE 		mInfoType;
 
+	/**
+	 * Hold last displayed parcel. Needs for YouAreHere banner.
+	 */
+	S32			mSelectedParcelID;
+	LLUUID		mLastSelectedRegionID;
+
 	LLTextBox*			mTitle;
-	LLIconCtrl*			mForSaleIcon;
+	LLPanel*			mForSalePanel;
+	LLPanel*			mYouAreHerePanel;
 	LLTextureCtrl*		mSnapshotCtrl;
 	LLTextBox*			mRegionName;
 	LLTextBox*			mParcelName;
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index f30bb1a0a6d99790356922773c25e417ce33af9a..5ab823b6e53a49c77c54ada2c14cf33b091b562a 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -50,6 +50,7 @@
 #include "lluictrlfactory.h"
 
 #include "llagent.h"
+#include "llagentpicksinfo.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llfloaterworldmap.h"
 #include "llinventorybridge.h"
@@ -178,6 +179,8 @@ BOOL LLPanelPlaces::postBuild()
 
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 	registrar.add("Places.OverflowMenu.Action",  boost::bind(&LLPanelPlaces::onOverflowMenuItemClicked, this, _2));
+	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+	enable_registrar.add("Places.OverflowMenu.Enable",  boost::bind(&LLPanelPlaces::onOverflowMenuItemEnable, this, _2));
 
 	mPlaceMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_place.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	if (!mPlaceMenu)
@@ -606,6 +609,16 @@ void LLPanelPlaces::onOverflowButtonClicked()
 	LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop);
 }
 
+bool LLPanelPlaces::onOverflowMenuItemEnable(const LLSD& param)
+{
+	std::string value = param.asString();
+	if("can_create_pick" == value)
+	{
+		return !LLAgentPicksInfo::getInstance()->isPickLimitReached();
+	}
+	return true;
+}
+
 void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
 {
 	std::string item = param.asString();
diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h
index 70c50b20587a534568c61a0d81a9b6e16d5df42f..e2d281dd84061a6434f20cfbe575ad0842d22bed 100644
--- a/indra/newview/llpanelplaces.h
+++ b/indra/newview/llpanelplaces.h
@@ -77,6 +77,7 @@ class LLPanelPlaces : public LLPanel
 	void onCancelButtonClicked();
 	void onOverflowButtonClicked();
 	void onOverflowMenuItemClicked(const LLSD& param);
+	bool onOverflowMenuItemEnable(const LLSD& param);
 	void onCreateLandmarkButtonClicked(const LLUUID& folder_id);
 	void onBackButtonClicked();
 
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 08d2baf6cd868a0bf7980d2e39c9bf5c63eebf2a..bec670cdaa7f74b1ff3df25197d5e4c990e192fe 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -192,8 +192,9 @@ void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params)
 
 void LLPanelProfile::notifyParent(const LLSD& info)
 {
+	std::string action = info["action"];
 	// lets update Picks list after Pick was saved
-	if("save_new_pick" == info["action"])
+	if("save_new_pick" == action)
 	{
 		onOpen(info);
 		return;
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
index f1db2416e480f356727811f85c77e26767fd5413..1d16c4ef5e8e746fb648791dd6cba20bc54a3f09 100644
--- a/indra/newview/llpanelprofileview.cpp
+++ b/indra/newview/llpanelprofileview.cpp
@@ -46,6 +46,7 @@ static LLRegisterPanelClassWrapper<LLPanelProfileView> t_panel_target_profile("p
 
 static std::string PANEL_NOTES = "panel_notes";
 static const std::string PANEL_PROFILE = "panel_profile";
+static const std::string PANEL_PICKS = "panel_picks";
 
 LLPanelProfileView::LLPanelProfileView()
 :	LLPanelProfile()
@@ -103,6 +104,10 @@ BOOL LLPanelProfileView::postBuild()
 
 void LLPanelProfileView::onBackBtnClick()
 {
+	// Set dummy value to make picks panel dirty, 
+	// This will make Picks reload on next open.
+	getTabContainer()[PANEL_PICKS]->setValue(LLSD());
+
 	LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
 	if(parent)
 	{
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 207ed723b2bcbaf27767102d5de19c05008c8f4c..7dd9df674c0c15302dbda39af77831e0187edc36 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -60,6 +60,7 @@ class LLTeleportHistoryFlatItem : public LLPanel
 	virtual BOOL postBuild();
 
 	S32 getIndex() { return mIndex; }
+	void setIndex(S32 index) { mIndex = index; }
 	const std::string& getRegionName() { return mRegionName;}
 
 	/*virtual*/ void setValue(const LLSD& value);
@@ -180,7 +181,7 @@ LLContextMenu* LLTeleportHistoryPanel::ContextMenu::createMenu()
 
 	registrar.add("TeleportHistory.Teleport",	boost::bind(&LLTeleportHistoryPanel::ContextMenu::onTeleport, this));
 	registrar.add("TeleportHistory.MoreInformation",boost::bind(&LLTeleportHistoryPanel::ContextMenu::onInfo, this));
-	registrar.add("TeleportHistory.Copy",		boost::bind(&LLTeleportHistoryPanel::ContextMenu::onCopy, this));
+	registrar.add("TeleportHistory.CopyToClipboard",boost::bind(&LLTeleportHistoryPanel::ContextMenu::onCopyToClipboard, this));
 
 	// create the context menu from the XUI
 	return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
@@ -203,11 +204,11 @@ void LLTeleportHistoryPanel::ContextMenu::gotSLURLCallback(const std::string& sl
 	gClipboard.copyFromString(utf8str_to_wstring(slurl));
 }
 
-void LLTeleportHistoryPanel::ContextMenu::onCopy()
+void LLTeleportHistoryPanel::ContextMenu::onCopyToClipboard()
 {
 	LLVector3d globalPos = LLTeleportHistoryStorage::getInstance()->getItems()[mIndex].mGlobalPos;
 	LLLandmarkActions::getSLURLfromPosGlobal(globalPos,
-		boost::bind(&LLTeleportHistoryPanel::ContextMenu::gotSLURLCallback, _1), false);
+		boost::bind(&LLTeleportHistoryPanel::ContextMenu::gotSLURLCallback, _1));
 }
 
 // Not yet implemented; need to remove buildPanel() from constructor when we switch
@@ -237,7 +238,7 @@ BOOL LLTeleportHistoryPanel::postBuild()
 	mTeleportHistory = LLTeleportHistoryStorage::getInstance();
 	if (mTeleportHistory)
 	{
-		mTeleportHistory->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryPanel::onTeleportHistoryChange, this));
+		mTeleportHistory->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryPanel::onTeleportHistoryChange, this, _1));
 	}
 
 	mHistoryAccordion = getChild<LLAccordionCtrl>("history_accordion");
@@ -488,7 +489,7 @@ void LLTeleportHistoryPanel::refresh()
 			if (mLastSelectedItemIndex == mCurrentItem)
 				curr_flat_view->selectItem(item, true);
 		}
-			
+
 		mCurrentItem--;
 
 		if (++added_items >= ADD_LIMIT)
@@ -503,10 +504,75 @@ void LLTeleportHistoryPanel::refresh()
 		mDirty = false;
 }
 
-void LLTeleportHistoryPanel::onTeleportHistoryChange()
+void LLTeleportHistoryPanel::onTeleportHistoryChange(S32 removed_index)
 {
 	mLastSelectedItemIndex = -1;
-	showTeleportHistory();
+
+	if (-1 == removed_index)
+		showTeleportHistory(); // recreate all items
+	else
+		replaceItem(removed_index); // replace removed item by most recent
+}
+
+void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
+{
+	// Flat list for 'Today' (mItemContainers keeps accordion tabs in reverse order)
+	LLFlatListView* fv = getFlatListViewFromTab(mItemContainers[mItemContainers.size() - 1]);
+
+	// Empty flat list for 'Today' means that other flat lists are empty as well,
+	// so all items from teleport history should be added.
+	if (!fv || fv->size() == 0)
+	{
+		showTeleportHistory();
+		return;
+	}
+
+	const LLTeleportHistoryStorage::slurl_list_t& history_items = mTeleportHistory->getItems();
+	LLTeleportHistoryFlatItem* item = new LLTeleportHistoryFlatItem(history_items.size(), // index will be decremented inside loop below
+									&mContextMenu,
+									history_items[history_items.size() - 1].mTitle); // Most recent item, it was
+															 // added instead of removed
+	fv->addItem(item, LLUUID::null, ADD_TOP);
+
+	// Index of each item, from last to removed item should be decremented
+	// to point to the right item in LLTeleportHistoryStorage
+	for (S32 tab_idx = mItemContainers.size() - 1; tab_idx >= 0; --tab_idx)
+	{
+		LLAccordionCtrlTab* tab = mItemContainers.get(tab_idx);
+		if (!tab->getVisible())
+			continue;
+
+		fv = getFlatListViewFromTab(tab);
+		if (!fv)
+		{
+			showTeleportHistory();
+			return;
+		}
+
+		std::vector<LLPanel*> items;
+		fv->getItems(items);
+
+		S32 items_cnt = items.size();
+		for (S32 n = 0; n < items_cnt; ++n)
+		{
+			LLTeleportHistoryFlatItem *item = (LLTeleportHistoryFlatItem*) items[n];
+
+			if (item->getIndex() == removed_index)
+			{
+				fv->removeItem(item);
+
+				// If flat list becames empty, then accordion tab should be hidden
+				if (fv->size() == 0)
+					tab->setVisible(false);
+
+				mHistoryAccordion->arrange();
+
+				return; // No need to decrement idexes for the rest of items
+			}
+
+			item->setIndex(item->getIndex() - 1);
+		}
+	}
 }
 
 void LLTeleportHistoryPanel::showTeleportHistory()
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index 49a97c5022e226f4d8e577c108f8e85c01daa0e8..7c1b403432475a4ae6225ae2b78505795631d43e 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -57,7 +57,7 @@ class LLTeleportHistoryPanel : public LLPanelPlacesTab
 		LLContextMenu* createMenu();
 		void onTeleport();
 		void onInfo();
-		void onCopy();
+		void onCopyToClipboard();
 
 		static void gotSLURLCallback(const std::string& slurl);
 
@@ -90,7 +90,8 @@ class LLTeleportHistoryPanel : public LLPanelPlacesTab
 
 	void refresh();
 	void getNextTab(const LLDate& item_date, S32& curr_tab, LLDate& tab_date);
-	void onTeleportHistoryChange();
+	void onTeleportHistoryChange(S32 removed_index);
+	void replaceItem(S32 removed_index);
 	void showTeleportHistory();
 	void handleItemSelect(LLFlatListView* );
 	LLFlatListView* getFlatListViewFromTab(LLAccordionCtrlTab *);
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..25e773e8b8557ff590d75792eb46741269b5966d
--- /dev/null
+++ b/indra/newview/llparticipantlist.cpp
@@ -0,0 +1,105 @@
+/** 
+ * @file llparticipantlist.cpp
+ * @brief LLParticipantList intended to update view(LLAvatarList) according to incoming messages
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llparticipantlist.h"
+#include "llavatarlist.h"
+#include "llfloateractivespeakers.h"
+
+//LLParticipantList retrieves add, clear and remove events and updates view accordingly 
+LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list):
+	mSpeakerMgr(data_source),
+	mAvatarList(avatar_list)
+{
+	mSpeakerAddListener = new SpeakerAddListener(mAvatarList);
+	mSpeakerRemoveListener = new SpeakerRemoveListener(mAvatarList);
+	mSpeakerClearListener = new SpeakerClearListener(mAvatarList);
+
+	mSpeakerMgr->addListener(mSpeakerAddListener, "add");
+	mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove");
+	mSpeakerMgr->addListener(mSpeakerClearListener, "clear");
+}
+
+LLParticipantList::~LLParticipantList()
+{
+	delete mSpeakerAddListener;
+	delete mSpeakerRemoveListener;
+	delete mSpeakerClearListener;
+	mSpeakerAddListener = NULL;
+	mSpeakerRemoveListener = NULL;
+	mSpeakerClearListener = NULL;
+}
+
+//
+// LLParticipantList::SpeakerAddListener
+//
+bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
+	LLUUID uu_id = event->getValue().asUUID();
+
+	LLAvatarList::uuid_vector_t::iterator found = std::find(group_members.begin(), group_members.end(), uu_id);
+	if(found != group_members.end())
+	{
+		llinfos << "Already got a buddy" << llendl;
+		return true;
+	}
+
+	group_members.push_back(uu_id);
+	mAvatarList->setDirty();
+	mAvatarList->sortByName();
+	return true;
+}
+
+//
+// LLParticipantList::SpeakerRemoveListener
+//
+bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
+	group_members.erase(std::find(group_members.begin(), group_members.end(), event->getValue().asUUID()));
+	mAvatarList->setDirty();
+	return true;
+}
+
+//
+// LLParticipantList::SpeakerClearListener
+//
+bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
+	group_members.clear();
+	mAvatarList->setDirty();
+	return true;
+}
+
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
new file mode 100644
index 0000000000000000000000000000000000000000..68aae0aee540dca7e64e12d1aa4a622efccaeb00
--- /dev/null
+++ b/indra/newview/llparticipantlist.h
@@ -0,0 +1,83 @@
+/** 
+ * @file llparticipantlist.h
+ * @brief LLParticipantList intended to update view(LLAvatarList) according to incoming messages
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llevent.h"
+
+class LLSpeakerMgr;
+class LLAvatarList;
+
+class LLParticipantList
+{
+	public:
+		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);
+		~LLParticipantList();
+
+	protected:
+
+		//List of listeners implementing LLOldEvents::LLSimpleListener.
+		//There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way
+		//that one listener can handle only one type of event
+		class SpeakerAddListener : public LLOldEvents::LLSimpleListener
+		{
+		public:
+			SpeakerAddListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
+
+			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+			LLAvatarList* mAvatarList;
+		};
+
+		class SpeakerRemoveListener : public LLOldEvents::LLSimpleListener
+		{
+		public:
+			SpeakerRemoveListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
+
+			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+			LLAvatarList* mAvatarList;
+		};
+
+		class SpeakerClearListener : public LLOldEvents::LLSimpleListener
+		{
+		public:
+			SpeakerClearListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
+
+			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+			LLAvatarList* mAvatarList;
+		};
+	private:
+		LLSpeakerMgr*		mSpeakerMgr;
+		LLAvatarList* 		mAvatarList;
+
+		SpeakerAddListener* mSpeakerAddListener;
+		SpeakerRemoveListener* mSpeakerRemoveListener;
+		SpeakerClearListener* mSpeakerClearListener;
+};
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index 02e11cefad36e69c1fbc36db7bf5166347702d96..d5a2d66bcfc6444273b7e49d2d9644d50e04ef05 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -1118,7 +1118,7 @@ BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info)
 	return TRUE;
 }
 
-/*virtual*/ LLViewerVisualParam * 	LLPolySkeletalDistortion::cloneParam(LLWearable* wearable) const
+/*virtual*/ LLViewerVisualParam* LLPolySkeletalDistortion::cloneParam(LLWearable* wearable) const
 {
 	LLPolySkeletalDistortion *new_param = new LLPolySkeletalDistortion(mAvatar);
 	*new_param = *this;
diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h
index 709b176c8d96a4336f249af2e0bee57ddd1029f6..c2e5451dfe3f085ea21ef1ad7dfffe3ad2381ace 100644
--- a/indra/newview/llpolymesh.h
+++ b/indra/newview/llpolymesh.h
@@ -417,7 +417,7 @@ class LLPolySkeletalDistortion : public LLViewerVisualParam
 	//   This sets mInfo and calls initialization functions
 	BOOL							setInfo(LLPolySkeletalDistortionInfo *info);
 
-	/*virtual*/ LLViewerVisualParam * 	cloneParam(LLWearable* wearable) const;
+	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;
 
 	// LLVisualParam Virtual functions
 	///*virtual*/ BOOL				parseData(LLXmlTreeNode* node);
diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp
index 924b1a4d6e500de4daca09e3fec99a55c411120e..80983cad2434d0be8002ce9834a1973fc8f8d5cb 100644
--- a/indra/newview/llpolymorph.cpp
+++ b/indra/newview/llpolymorph.cpp
@@ -302,7 +302,7 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info)
 	return TRUE;
 }
 
-/*virtual*/ LLViewerVisualParam * 	LLPolyMorphTarget::cloneParam(LLWearable* wearable) const
+/*virtual*/ LLViewerVisualParam* LLPolyMorphTarget::cloneParam(LLWearable* wearable) const
 {
 	LLPolyMorphTarget *new_param = new LLPolyMorphTarget(mMesh);
 	*new_param = *this;
diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h
index 5089fc2e8a4f95d67aeed8b0aacea9896e43f528..01731402df52117b623db91bdb43c490ed35c6d8 100644
--- a/indra/newview/llpolymorph.h
+++ b/indra/newview/llpolymorph.h
@@ -154,7 +154,7 @@ class LLPolyMorphTarget : public LLViewerVisualParam
 	//   This sets mInfo and calls initialization functions
 	BOOL					setInfo(LLPolyMorphTargetInfo *info);
 
-	/*virtual*/ LLViewerVisualParam * 	cloneParam(LLWearable* wearable) const;
+	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;
 
 	// LLVisualParam Virtual functions
 	///*virtual*/ BOOL				parseData(LLXmlTreeNode* node);
diff --git a/indra/newview/llrootview.h b/indra/newview/llrootview.h
index f704fecdddd7f098983b94117a594711c32ca029..760b1a7a4c384728f89be3d3673506d815a673c7 100644
--- a/indra/newview/llrootview.h
+++ b/indra/newview/llrootview.h
@@ -47,5 +47,27 @@ class LLRootView : public LLView
 	LLRootView(const Params& p)
 	:	LLView(p)
 	{}
+
+	// added to provide possibility to handle mouse click event inside all application
+	// window without creating any floater
+	typedef boost::signals2::signal<void(S32 x, S32 y, MASK mask)>
+			mouse_signal_t;
+
+	private:
+		mouse_signal_t mMouseDownSignal;
+
+	public:
+	/*virtual*/
+	BOOL handleMouseDown(S32 x, S32 y, MASK mask)
+	{
+		mMouseDownSignal(x, y, mask);
+		return LLView::handleMouseDown(x, y, mask);
+	}
+
+	boost::signals2::connection addMouseDownCallback(
+			const mouse_signal_t::slot_type& cb)
+	{
+		return mMouseDownSignal.connect(cb);
+	}
 };
 #endif //LL_LLROOTVIEW_H
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index a72100a9b3cbe79e3f6a688cd019160848c43f75..1683d113a997638c8fe89d9b7397933d52728639 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -138,7 +138,7 @@ void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_wo
 }
 
 //--------------------------------------------------------------------------
-void LLScreenChannel::addToast(LLToast::Params p)
+void LLScreenChannel::addToast(const LLToast::Params& p)
 {
 	bool store_toast = false, show_toast = false;
 
@@ -381,7 +381,7 @@ void LLScreenChannel::showToastsBottom()
 		if(it != mToastList.rbegin())
 		{
 			bottom = (*(it-1)).toast->getRect().mTop;
-			toast_margin = gSavedSettings.getS32("ToastMargin");
+			toast_margin = gSavedSettings.getS32("ToastGap");
 		}
 
 		toast_rect = (*it).toast->getRect();
@@ -394,7 +394,7 @@ void LLScreenChannel::showToastsBottom()
 		{
 			if( it != mToastList.rend()-1)
 			{
-				stop_showing_toasts = ((*it).toast->getRect().mTop + gSavedSettings.getS32("OverflowToastHeight") + gSavedSettings.getS32("ToastMargin")) > getRect().mTop;
+				stop_showing_toasts = ((*it).toast->getRect().mTop + gSavedSettings.getS32("OverflowToastHeight") + gSavedSettings.getS32("ToastGap")) > getRect().mTop;
 			}
 		} 
 
@@ -412,7 +412,7 @@ void LLScreenChannel::showToastsBottom()
 			(*it).toast->stopTimer();
 			mHiddenToastsNum++;
 		}
-		createOverflowToast(bottom, gSavedSettings.getS32("NotificationToastTime"));
+		createOverflowToast(bottom, gSavedSettings.getS32("NotificationTipToastLifeTime"));
 	}	
 }
 
@@ -426,7 +426,7 @@ void LLScreenChannel::showToastsCentre()
 	for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
 	{
 		toast_rect = (*it).toast->getRect();
-		toast_rect.setLeftTopAndSize(getRect().mLeft - toast_rect.getWidth() / 2, bottom + toast_rect.getHeight() / 2 + gSavedSettings.getS32("ToastMargin"), toast_rect.getWidth() ,toast_rect.getHeight());
+		toast_rect.setLeftTopAndSize(getRect().mLeft - toast_rect.getWidth() / 2, bottom + toast_rect.getHeight() / 2 + gSavedSettings.getS32("ToastGap"), toast_rect.getWidth() ,toast_rect.getHeight());
 		(*it).toast->setRect(toast_rect);
 
 		(*it).toast->setVisible(TRUE);	
@@ -443,13 +443,13 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 {
 	LLRect toast_rect;
 	LLToast::Params p;
-	p.timer_period = timer;
+	p.lifetime_secs = timer;
 	mOverflowToastPanel = new LLToast(p);
 
 	if(!mOverflowToastPanel)
 		return;
 
-	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this));
+	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::closeOverflowToastPanel, this));
 
 	LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text");
 	LLIconCtrl* icon = mOverflowToastPanel->getChild<LLIconCtrl>("icon");
@@ -465,7 +465,7 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 
 	toast_rect = mOverflowToastPanel->getRect();
 	mOverflowToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);
-	toast_rect.setLeftTopAndSize(getRect().mLeft, bottom + toast_rect.getHeight()+gSavedSettings.getS32("ToastMargin"), getRect().getWidth(), toast_rect.getHeight());	
+	toast_rect.setLeftTopAndSize(getRect().mLeft, bottom + toast_rect.getHeight()+gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());	
 	mOverflowToastPanel->setRect(toast_rect);
 
 	text_box->setValue(text);
@@ -514,11 +514,11 @@ void LLScreenChannel::closeOverflowToastPanel()
 }
 
 //--------------------------------------------------------------------------
-void LLScreenChannel::createStartUpToast(S32 notif_num, S32 bottom, F32 timer)
+void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
 {
 	LLRect toast_rect;
 	LLToast::Params p;
-	p.timer_period = timer;
+	p.lifetime_secs = timer;
 	mStartUpToastPanel = new LLToast(p);
 
 	if(!mStartUpToastPanel)
@@ -545,13 +545,15 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, S32 bottom, F32 timer)
 
 	toast_rect = mStartUpToastPanel->getRect();
 	mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);
-	toast_rect.setLeftTopAndSize(getRect().mLeft, bottom + toast_rect.getHeight()+gSavedSettings.getS32("ToastMargin"), getRect().getWidth(), toast_rect.getHeight());	
+	toast_rect.setLeftTopAndSize(0, toast_rect.getHeight()+gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());	
 	mStartUpToastPanel->setRect(toast_rect);
 
 	text_box->setValue(text);
 	text_box->setVisible(TRUE);
 	icon->setVisible(TRUE);
 
+	addChild(mStartUpToastPanel);
+	
 	mStartUpToastPanel->setVisible(TRUE);
 }
 
@@ -572,7 +574,7 @@ void LLScreenChannel::closeStartUpToast()
 {
 	if(mStartUpToastPanel != NULL)
 	{
-		mStartUpToastPanel->closeFloater();
+		mStartUpToastPanel->setVisible(FALSE);
 		mStartUpToastPanel = NULL;
 	}
 }
@@ -703,7 +705,7 @@ void LLScreenChannel::updateShowToastsState()
 		LLRect this_rect = getRect();
 		if(floater->getVisible() && floater->isDocked())
 		{
-			channel_bottom += (floater->getRect().getHeight() + gSavedSettings.getS32("ToastMargin"));
+			channel_bottom += (floater->getRect().getHeight() + gSavedSettings.getS32("ToastGap"));
 		}
 
 		if(channel_bottom != this_rect.mBottom)
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index 459c28ac7c3a6ac06e7011663b8f292097fa66d6..987bc4b596aaea6d8671eb8bd30c4e807b45bf7e 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -158,7 +158,7 @@ class LLScreenChannel : public LLScreenChannelBase
 	
 	// Operating with toasts
 	// add a toast to a channel
-	void		addToast(LLToast::Params p);
+	void		addToast(const LLToast::Params& p);
 	// kill or modify a toast by its ID
 	void		killToastByNotificationID(LLUUID id);
 	void		modifyToastByNotificationID(LLUUID id, LLPanel* panel);
@@ -256,7 +256,7 @@ class LLScreenChannel : public LLScreenChannelBase
 	void	createOverflowToast(S32 bottom, F32 timer);
 
 	// create the StartUp Toast
-	void	createStartUpToast(S32 notif_num, S32 bottom, F32 timer);
+	void	createStartUpToast(S32 notif_num, F32 timer);
 
 	// Channel's flags
 	static bool	mWasStartUpToastShown;
diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp
index 5123d862ced68a33af471cb00a8f1f056b7b23a1..f95671685b3b9173a04af80cc970dac412795d08 100644
--- a/indra/newview/llsearchcombobox.cpp
+++ b/indra/newview/llsearchcombobox.cpp
@@ -85,11 +85,6 @@ LLSearchComboBox::LLSearchComboBox(const Params&p)
 	setSelectionCallback(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
 	setPrearrangeCallback(boost::bind(&LLSearchComboBox::onSearchPrearrange, this, _2));
 	mSearchButton->setCommitCallback(boost::bind(&LLSearchComboBox::onTextCommit, this, _2));
-
-	// set tooltip here for now since we don't want to parse /en/widgets
-	std::string tool_tip = LLTrans::getString("Search");
-	getChild<LLView>("child1")->setToolTip(tool_tip);
-	getChild<LLView>("child3")->setToolTip(tool_tip);
 }
 
 void LLSearchComboBox::rebuildSearchHistory(const std::string& filter)
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index ff95f8adce628ceb1ba9b3dab55c221d5fea4f2c..a11ee05532fe8e920607409696d943de7861e618 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -111,12 +111,72 @@ bool	LLSideTray::instanceCreated	()
 	return sInstance!=0;
 }
 
-LLSideTrayTab::LLSideTrayTab(const Params& params):mMainPanel(0)
+//////////////////////////////////////////////////////////////////////////////
+// LLSideTrayTab
+// Represents a single tab in the side tray, only used by LLSideTray
+//////////////////////////////////////////////////////////////////////////////
+
+class LLSideTrayTab: public LLPanel
 {
-	mImagePath = params.image_path;
-	mTabTitle = params.tab_title;
-	mDescription = params.description;
+	friend class LLUICtrlFactory;
+	friend class LLSideTray;
+public:
+	
+	struct Params 
+	:	public LLInitParam::Block<Params, LLPanel::Params>
+	{
+		// image name
+		Optional<std::string>		image;
+		Optional<std::string>		image_selected;
+		Optional<std::string>		tab_title;
+		Optional<std::string>		description;
+		Params()
+		:	image("image"),
+			image_selected("image_selected"),
+			tab_title("tab_title","no title"),
+			description("description","no description")
+		{};
+	};
+protected:
+	LLSideTrayTab(const Params& params);
+	
+	
+public:
+	virtual ~LLSideTrayTab();
+	
+    /*virtual*/ BOOL	postBuild	();
+	/*virtual*/ bool	addChild	(LLView* view, S32 tab_group);
+	
+	
+	void			arrange		(S32 width, S32 height);
+	void			reshape		(S32 width, S32 height, BOOL called_from_parent = TRUE);
+	
+	static LLSideTrayTab*  createInstance	();
+	
+	const std::string& getDescription () const { return mDescription;}
+	const std::string& getTabTitle() const { return mTabTitle;}
+	
+	void draw();
+	
+	void			onOpen		(const LLSD& key);
+	
+private:
+	std::string mTabTitle;
+	std::string mImage;
+	std::string mImageSelected;
+	std::string	mDescription;
+	
+	LLView*	mMainPanel;
+};
 
+LLSideTrayTab::LLSideTrayTab(const Params& p)
+:	LLPanel(),
+	mTabTitle(p.tab_title),
+	mImage(p.image),
+	mImageSelected(p.image_selected),
+	mDescription(p.description),
+	mMainPanel(NULL)
+{
 	// Necessary for focus movement among child controls
 	setFocusRoot(TRUE);
 }
@@ -144,12 +204,6 @@ BOOL LLSideTrayTab::postBuild()
 	
 	title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle);
 
-	static LLUIColor default_background_color = LLUIColorTable::instance().getColor("FloaterDefaultBackgroundColor");
-	static LLUIColor focus_background_color = LLUIColorTable::instance().getColor("FloaterFocusBackgroundColor");
-	
-	setTransparentColor(default_background_color);
-	setBackgroundColor(focus_background_color);
-	
 	return true;
 }
 
@@ -209,11 +263,6 @@ void LLSideTrayTab::reshape		(S32 width, S32 height, BOOL called_from_parent )
 void LLSideTrayTab::draw()
 {
 	LLPanel::draw();
-
-	//border
-	gl_rect_2d(0,0,getRect().getWidth() - 1,getRect().getHeight() - 1,LLColor4::black,false);
-
-
 }
 
 void	LLSideTrayTab::onOpen		(const LLSD& key)
@@ -232,6 +281,18 @@ LLSideTrayTab*  LLSideTrayTab::createInstance	()
 	return tab;
 }
 
+//////////////////////////////////////////////////////////////////////////////
+// LLSideTray
+//////////////////////////////////////////////////////////////////////////////
+
+LLSideTray::Params::Params()
+:	collapsed("collapsed",false),
+	tab_btn_image_normal("tab_btn_image","sidebar_tab_left.tga"),
+	tab_btn_image_selected("tab_btn_image_selected","button_enabled_selected_32x128.tga"),
+	default_button_width("tab_btn_width",32),
+	default_button_height("tab_btn_height",32),
+	default_button_margin("tab_btn_margin",0)
+{}
 
 //virtual 
 LLSideTray::LLSideTray(Params& params)
@@ -266,35 +327,6 @@ BOOL LLSideTray::postBuild()
 	setMouseOpaque(false);
 	return true;
 }
-    
-/**
- * add new panel to tab with tab_name name
- * @param tab_name - name of sidebar tab to add new panel
- * @param panel - pointer to panel 
- */
-bool        LLSideTray::addPanel        ( const std::string& tab_name
-										,LLPanel* panel )
-{
-	return false;
-}
-/**
- * Add new tab to side bar
- * @param tab_name - name of the new tab
- * @param image - image for new sidebar button
- * @param title -  title for new tab
- */
-bool        LLSideTray::addTab          ( const std::string& tab_name
-										,const std::string& image
-										,const std::string& title)
-{
-	LLSideTrayTab::Params params;
-	params.image_path = image;
-	params.tab_title = title;
-	LLSideTrayTab* tab = LLUICtrlFactory::create<LLSideTrayTab> (params);
-	addChild(tab,1);
-	return true;
-}
-
 
 LLSideTrayTab* LLSideTray::getTab(const std::string& name)
 {
@@ -302,15 +334,19 @@ LLSideTrayTab* LLSideTray::getTab(const std::string& name)
 }
 
 
-
-void LLSideTray::toggleTabButton	(LLSideTrayTab* tab)
+void LLSideTray::toggleTabButton(LLSideTrayTab* tab)
 {
 	if(tab == NULL)
 		return;
-	string name = tab->getName();
-	std::map<std::string,LLButton*>::iterator tIt = mTabButtons.find(name);
-	if(tIt!=mTabButtons.end())
-		tIt->second->setToggleState(!tIt->second->getToggleState());
+	std::string name = tab->getName();
+	std::map<std::string,LLButton*>::iterator it = mTabButtons.find(name);
+	if(it != mTabButtons.end())
+	{
+		LLButton* btn = it->second;
+		bool new_state = !btn->getToggleState();
+		btn->setToggleState(new_state); 
+		btn->setImageOverlay( new_state ? tab->mImageSelected : tab->mImage );
+	}
 }
 
 bool LLSideTray::selectTabByIndex(size_t index)
@@ -318,9 +354,7 @@ bool LLSideTray::selectTabByIndex(size_t index)
 	if(index>=mTabs.size())
 		return false;
 
-	LLSideTrayTab* sidebar_tab = dynamic_cast<LLSideTrayTab*>(mTabs[index]);
-	if(sidebar_tab == NULL)
-		return false;
+	LLSideTrayTab* sidebar_tab = mTabs[index];
 	return selectTabByName(sidebar_tab->getName());
 }
 
@@ -349,9 +383,7 @@ bool LLSideTray::selectTabByName	(const std::string& name)
 	child_vector_const_iter_t child_it;
 	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
 	{
-		LLSideTrayTab* sidebar_tab = dynamic_cast<LLSideTrayTab*>(*child_it);
-		if(sidebar_tab == NULL)
-			continue;
+		LLSideTrayTab* sidebar_tab = *child_it;
 		sidebar_tab->setVisible(sidebar_tab  == mActiveTab);
 	}
 	return true;
@@ -404,25 +436,28 @@ bool LLSideTray::addChild(LLView* view, S32 tab_group)
 
 void	LLSideTray::createButtons	()
 {
-	//create show/hide button
-	mCollapseButton = createButton(EXPANDED_NAME,"",boost::bind(&LLSideTray::onToggleCollapse, this));
-
 	//create buttons for tabs
 	child_vector_const_iter_t child_it = mTabs.begin();
-	++child_it;
-
 	for ( ; child_it != mTabs.end(); ++child_it)
 	{
-		LLSideTrayTab* sidebar_tab = dynamic_cast<LLSideTrayTab*>(*child_it);
-		if(sidebar_tab == NULL)
-			continue;
+		LLSideTrayTab* sidebar_tab = *child_it;
 
-		string name = sidebar_tab->getName();
+		std::string name = sidebar_tab->getName();
 		
-		LLButton* button = createButton("",sidebar_tab->mImagePath,boost::bind(&LLSideTray::onTabButtonClick, this, sidebar_tab->getName()));
-		mTabButtons[sidebar_tab->getName()] = button;
+		// The "home" button will open/close the whole panel, this will need to
+		// change if the home screen becomes its own tab.
+		if (name == "sidebar_home")
+		{
+			mCollapseButton = createButton("",sidebar_tab->mImage,
+				boost::bind(&LLSideTray::onToggleCollapse, this));
+		}
+		else
+		{
+			LLButton* button = createButton("",sidebar_tab->mImage,
+				boost::bind(&LLSideTray::onTabButtonClick, this, name));
+			mTabButtons[name] = button;
+		}
 	}
-	
 }
 
 void		LLSideTray::onTabButtonClick(string name)
@@ -491,9 +526,7 @@ void LLSideTray::arrange			()
 	int offset = (sidetray_params.default_button_height+sidetray_params.default_button_margin)*2;
 	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)	
 	{
-		LLSideTrayTab* sidebar_tab = dynamic_cast<LLSideTrayTab*>(*child_it);
-		if(sidebar_tab == NULL)
-			continue;
+		LLSideTrayTab* sidebar_tab = *child_it;
 		
 		ctrl_rect.setLeftTopAndSize(0,getRect().getHeight()-offset
 								,sidetray_params.default_button_width
@@ -516,49 +549,69 @@ void LLSideTray::arrange			()
 	//arrange tabs
 	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
 	{
-		LLSideTrayTab* sidebar_tab = dynamic_cast<LLSideTrayTab*>(*child_it);
-		if(sidebar_tab == NULL)
-			continue;
-		
+		LLSideTrayTab* sidebar_tab = *child_it;
 		sidebar_tab->setRect(ctrl_rect);
 		sidebar_tab->arrange(mMaxBarWidth,getRect().getHeight());
 	}
 }
 
-void LLSideTray::collapseSideBar	()
+void LLSideTray::collapseSideBar()
 {
 	mCollapsed = true;
-	mCollapseButton->setLabel(COLLAPSED_NAME);
+	// Reset all overlay images, because there is no "selected" tab when the
+	// whole side tray is hidden.
+	child_vector_const_iter_t it = mTabs.begin();
+	for ( ; it != mTabs.end(); ++it )
+	{
+		LLSideTrayTab* tab = *it;
+		std::string name = tab->getName();
+		std::map<std::string,LLButton*>::const_iterator btn_it =
+			mTabButtons.find(name);
+		if (btn_it != mTabButtons.end())
+		{
+			LLButton* btn = btn_it->second;
+			btn->setImageOverlay( tab->mImage );
+		}
+	}
+		
+	// Home tab doesn't put its button in mTabButtons
+	LLSideTrayTab* home_tab = getTab("sidebar_home");
+	if (home_tab)
+	{
+		mCollapseButton->setImageOverlay( home_tab->mImage );
+	}
 	mActiveTab->setVisible(FALSE);
 	reflectCollapseChange();
 	setFocus( FALSE );
 
 }
-void LLSideTray::expandSideBar	()
+
+void LLSideTray::expandSideBar()
 {
 	mCollapsed = false;
-	mCollapseButton->setLabel(EXPANDED_NAME);
+	LLSideTrayTab* home_tab = getTab("sidebar_home");
+	if (home_tab)
+	{
+		mCollapseButton->setImageOverlay( home_tab->mImageSelected );
+	}
 	LLSD key;//empty
 	mActiveTab->onOpen(key);
 	mActiveTab->setVisible(TRUE);
 
 	reflectCollapseChange();
-
 }
 
 void LLSideTray::highlightFocused()
 {
+	/* uncomment in case something change
 	if(!mActiveTab)
 		return;
-	/* uncomment in case something change
 	BOOL dependent_has_focus = gFocusMgr.childHasKeyboardFocus(this);
 	setBackgroundOpaque( dependent_has_focus ); 
 	mActiveTab->setBackgroundOpaque( dependent_has_focus ); 
 	*/
-	mActiveTab->setBackgroundOpaque( true ); 
-
-	
 }
+
 BOOL	LLSideTray::handleScrollWheel(S32 x, S32 y, S32 mask)
 {
 	BOOL ret = LLPanel::handleScrollWheel(x,y,mask);
@@ -576,6 +629,7 @@ BOOL		LLSideTray::handleMouseDown	(S32 x, S32 y, MASK mask)
 		setFocus(true);	
 	return ret;
 }
+
 void LLSideTray::reshape			(S32 width, S32 height, BOOL called_from_parent)
 {
 	
@@ -600,9 +654,7 @@ void LLSideTray::reshape			(S32 width, S32 height, BOOL called_from_parent)
 	int offset = (sidetray_params.default_button_height+sidetray_params.default_button_margin)*2;
 	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)	
 	{
-		LLSideTrayTab* sidebar_tab = dynamic_cast<LLSideTrayTab*>(*child_it);
-		if(sidebar_tab == NULL)
-			continue;
+		LLSideTrayTab* sidebar_tab = *child_it;
 		
 		ctrl_rect.setLeftTopAndSize(0,getRect().getHeight()-offset
 								,sidetray_params.default_button_width
@@ -624,9 +676,7 @@ void LLSideTray::reshape			(S32 width, S32 height, BOOL called_from_parent)
 	
 	for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
 	{
-		LLSideTrayTab* sidebar_tab = dynamic_cast<LLSideTrayTab*>(*child_it);
-		if(sidebar_tab == NULL)
-			continue;
+		LLSideTrayTab* sidebar_tab = *child_it;
 		sidebar_tab->reshape(mMaxBarWidth,getRect().getHeight());
 		ctrl_rect.setLeftTopAndSize(sidetray_params.default_button_width,getRect().getHeight(),mMaxBarWidth,getRect().getHeight());
 		sidebar_tab->setRect(ctrl_rect);
@@ -686,7 +736,7 @@ void LLSideTray::resetPanelRect	()
 	static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());	
 
 	S32 panel_width = sidetray_params.default_button_width;
-	panel_width += mCollapsed ? sidetray_params.default_button_margin : mMaxBarWidth;
+	panel_width += mCollapsed ? 0 : mMaxBarWidth;
 
 	S32 panel_height = parent_rect.getHeight()-fake_top_offset;
 
@@ -703,7 +753,7 @@ void	LLSideTray::setPanelRect	()
 	const LLRect& parent_rect = gViewerWindow->getRootView()->getRect();
 
 	S32 panel_width = sidetray_params.default_button_width;
-	panel_width += mCollapsed ? sidetray_params.default_button_margin : mMaxBarWidth;
+	panel_width += mCollapsed ? 0 : mMaxBarWidth;
 
 	S32 panel_height = parent_rect.getHeight()-fake_top_offset - nav_rect.getHeight();
 	S32 panel_top = parent_rect.mTop-fake_top_offset - nav_rect.getHeight();
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 6ea6bafac95b40af2ca27a2db7e9d847377317af..b49251ec79b5535435d3311eedc8a71c4ec9a9b1 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -36,59 +36,9 @@
 #include "llpanel.h"
 #include "string"
 
-class LLSideTray;
+class LLSideTrayTab;
 class LLAccordionCtrl;
 
-class LLSideTrayTab: public LLPanel
-{
-	friend class LLUICtrlFactory;
-	friend class LLSideTray;
-public:
-
-	struct Params 
-	:	public LLInitParam::Block<Params, LLPanel::Params>
-	{
-		// image name
-		Optional<std::string>		image_path;
-		Optional<std::string>		tab_title;
-		Optional<std::string>		description;
-		Params()
-		:	image_path("image"),
-			tab_title("tab_title","no title"),
-			description("description","no description")
-		{};
-	};
-protected:
-	LLSideTrayTab(const Params& params);
-	
-
-public:
-	virtual ~LLSideTrayTab();
-
-    /*virtual*/ BOOL	postBuild	();
-	/*virtual*/ bool	addChild	(LLView* view, S32 tab_group);
-
-
-	void			arrange		(S32 width, S32 height);
-	void			reshape		(S32 width, S32 height, BOOL called_from_parent = TRUE);
-	
-	static LLSideTrayTab*  createInstance	();
-
-	const std::string& getDescription () const { return mDescription;}
-	const std::string& getTabTitle() const { return mTabTitle;}
-
-	void draw();
-
-	void			onOpen		(const LLSD& key);
-
-private:
-	std::string mTabTitle;
-	std::string mImagePath;
-	std::string	mDescription;
-
-	LLView*	mMainPanel;
-};
-
 // added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions 
 // while disconnecting viewer in LLAppViewer::disconnectViewer().
 // LLDestroyClassList::instance().fireCallbacks() calls destroyClass method. See EXT-245.
@@ -112,21 +62,14 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 		Optional<S32>				default_button_height;
 		Optional<S32>				default_button_margin;
 		
-		Params()
-		:	collapsed("collapsed",false),
-			tab_btn_image_normal("tab_btn_image","sidebar_tab_left.tga"),
-			tab_btn_image_selected("tab_btn_image_selected","button_enabled_selected_32x128.tga"),
-			default_button_width("tab_btn_width",32),
-			default_button_height("tab_btn_height",32),
-			default_button_margin("tab_btn_margin",0)
-		{};
+		Params();
 	};
 
 	static LLSideTray*	getInstance		();
 	static bool			instanceCreated	();
 protected:
 	LLSideTray(Params& params);
-	typedef std::vector<LLView*> child_vector_t;
+	typedef std::vector<LLSideTrayTab*> child_vector_t;
 	typedef child_vector_t::iterator					child_vector_iter_t;
 	typedef child_vector_t::const_iterator  			child_vector_const_iter_t;
 	typedef child_vector_t::reverse_iterator 			child_vector_reverse_iter_t;
@@ -146,23 +89,6 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
      */
 	bool		selectTabByIndex(size_t index);
 
-    /**
-     * add new panel to tab with tab_name name
-     * @param tab_name - name of sidebar tab to add new panel
-     * @param panel - pointer to panel 
-     */
-    bool        addPanel        ( const std::string& tab_name
-                                 ,LLPanel* panel );
-    /**
-     * Add new tab to side bar
-     * @param tab_name - name of the new tab
-     * @param image - image for new sidebar button
-     * @param title -  title for new tab
-     */
-    bool        addTab          ( const std::string& tab_name
-                                 ,const std::string& image
-                                 ,const std::string& title);
-
 	/**
 	 * Activate tab with "panel_name" panel
 	 * if no such tab - return NULL, otherwise a pointer to the panel
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 3d0e25a7340e1ea3b8946208966f83ba736b8bbf..43b039f94ec06f18ba56a1b5de14a008b9f1872a 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -83,6 +83,7 @@
 #include "v3math.h"
 
 #include "llagent.h"
+#include "llagentpicksinfo.h"
 #include "llagentwearables.h"
 #include "llagentpilot.h"
 #include "llfloateravatarpicker.h"
@@ -2088,7 +2089,7 @@ bool idle_startup()
 		// reset timers now that we are running "logged in" logic
 		LLFastTimer::reset();
 
-		
+		LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
 
 		return TRUE;
 	}
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 6714fe908fe5311fb8b59381ab2984ecdaba0d13..86290e66955a744f8f18552026cf04b21ee381a6 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -246,6 +246,10 @@ void LLSysWellWindow::toggleWindow()
 
 	if(!getVisible() || isMinimized())
 	{
+		if(mChannel)
+		{
+			mChannel->removeAndStoreAllStorableToasts();
+		}
 		if(isWindowEmpty())
 		{
 			return;
@@ -524,7 +528,7 @@ LLSysWellWindow::RowPanel::~RowPanel()
 //---------------------------------------------------------------------------------
 void LLSysWellWindow::RowPanel::onClosePanel()
 {
-	gIMMgr->removeSession(mChiclet->getSessionId());
+	gIMMgr->leaveSession(mChiclet->getSessionId());
 	// This row panel will be removed from the list in LLSysWellWindow::sessionRemoved().
 }
 
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index a588153ca22d3ae8dfcf226f30a1125df0739c65..d3bbda1c72c458448ac791eaff0a3b93479edefb 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -93,14 +93,12 @@ void LLTeleportHistoryStorage::onTeleportHistoryChange()
 
 	addItem(item.mTitle, item.mGlobalPos);
 	save();
-
-	mHistoryChangedSignal();
 }
 
 void LLTeleportHistoryStorage::purgeItems()
 {
 	mItems.clear();
-	mHistoryChangedSignal();
+	mHistoryChangedSignal(-1);
 }
 
 void LLTeleportHistoryStorage::addItem(const std::string title, const LLVector3d& global_pos)
@@ -116,15 +114,16 @@ bool LLTeleportHistoryStorage::compareByTitleAndGlobalPos(const LLTeleportHistor
 
 void LLTeleportHistoryStorage::addItem(const std::string title, const LLVector3d& global_pos, const LLDate& date)
 {
-
 	LLTeleportHistoryPersistentItem item(title, global_pos, date);
 
 	slurl_list_t::iterator item_iter = std::find_if(mItems.begin(), mItems.end(),
 							    boost::bind(&LLTeleportHistoryStorage::compareByTitleAndGlobalPos, this, _1, item));
 
 	// If there is such item already, remove it, since new item is more recent
+	S32 removed_index = -1;
 	if (item_iter != mItems.end())
 	{
+		removed_index = item_iter - mItems.begin();
 		mItems.erase(item_iter);
 	}
 
@@ -141,9 +140,12 @@ void LLTeleportHistoryStorage::addItem(const std::string title, const LLVector3d
 		// If second to last item is more recent than last, then resort items
 		if (item_iter->mDate > item.mDate)
 		{
+			removed_index = -1;
 			std::sort(mItems.begin(), mItems.end(), LLSortItemsByDate());
 		}
 	}
+
+	mHistoryChangedSignal(removed_index);
 }
 
 void LLTeleportHistoryStorage::removeItem(S32 idx)
@@ -211,6 +213,8 @@ void LLTeleportHistoryStorage::load()
 	file.close();
 
 	std::sort(mItems.begin(), mItems.end(), LLSortItemsByDate());
+
+	mHistoryChangedSignal(-1);
 }
 
 void LLTeleportHistoryStorage::dump() const
@@ -234,7 +238,6 @@ boost::signals2::connection LLTeleportHistoryStorage::setHistoryChangedCallback(
 }
 
 void LLTeleportHistoryStorage::goToItem(S32 idx)
-
 {
 	// Validate specified index.
 	if (idx < 0 || idx >= (S32)mItems.size())
diff --git a/indra/newview/llteleporthistorystorage.h b/indra/newview/llteleporthistorystorage.h
index f67c4e2fb94cca7954f765168cc157da895607da..2eaa94f2eda014e4fc8224d8abd38b7a39b2e16e 100644
--- a/indra/newview/llteleporthistorystorage.h
+++ b/indra/newview/llteleporthistorystorage.h
@@ -80,8 +80,9 @@ class LLTeleportHistoryStorage: public LLSingleton<LLTeleportHistoryStorage>
 
 	typedef std::vector<LLTeleportHistoryPersistentItem> slurl_list_t;
 
-	typedef boost::function<void()>		history_callback_t;
-	typedef boost::signals2::signal<void()>	history_signal_t;
+	// removed_index is index of removed item, which replaced by more recent
+	typedef boost::function<void(S32 removed_index)>		history_callback_t;
+	typedef boost::signals2::signal<void(S32 removed_index)>	history_signal_t;
 
 	LLTeleportHistoryStorage();
 	~LLTeleportHistoryStorage();
diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp
index d0bb9e1cf1bcb50a6a02b312f259011472a7870f..595b24ad471441bd9d15219ef49f1fa482c7f40d 100644
--- a/indra/newview/lltexglobalcolor.cpp
+++ b/indra/newview/lltexglobalcolor.cpp
@@ -101,7 +101,7 @@ LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color)
 {
 }
 
-/*virtual*/ LLViewerVisualParam * 	LLTexParamGlobalColor::cloneParam(LLWearable* wearable) const
+/*virtual*/ LLViewerVisualParam* LLTexParamGlobalColor::cloneParam(LLWearable* wearable) const
 {
 	LLTexParamGlobalColor *new_param = new LLTexParamGlobalColor(mTexGlobalColor);
 	*new_param = *this;
diff --git a/indra/newview/lltexglobalcolor.h b/indra/newview/lltexglobalcolor.h
index f0d22d317ccf01c1f656458c3b1ef4ebeb710335..1e6754133fb5f398fb1ca22c5d41a5cd0f99bb11 100644
--- a/indra/newview/lltexglobalcolor.h
+++ b/indra/newview/lltexglobalcolor.h
@@ -78,7 +78,7 @@ class LLTexParamGlobalColor : public LLTexLayerParamColor
 {
 public:
 	LLTexParamGlobalColor(LLTexGlobalColor *tex_color);
-	/*virtual*/ LLViewerVisualParam * 	cloneParam(LLWearable* wearable) const;
+	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;
 protected:
 	/*virtual*/ void onGlobalColorChanged(bool set_by_user);
 private:
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index de8458c0fac95cb283d499b8fad2b296e2ea593c..17547cae39e115158005d14641ee17405f35548f 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -1078,13 +1078,13 @@ BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearab
 	mInfo = info;
 	//mID = info->mID; // No ID
 
-		mParamColorList.reserve(mInfo->mParamColorInfoList.size());
+	mParamColorList.reserve(mInfo->mParamColorInfoList.size());
 	for (param_color_info_list_t::const_iterator iter = mInfo->mParamColorInfoList.begin(); 
 		 iter != mInfo->mParamColorInfoList.end(); 
 		 iter++)
 	{
 		LLTexLayerParamColor* param_color;
-			if (!wearable)
+		if (!wearable)
 			{
 				param_color = new LLTexLayerParamColor(this);
 				if (!param_color->setInfo(*iter, TRUE))
@@ -1105,7 +1105,7 @@ BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearab
 			mParamColorList.push_back( param_color );
 		}
 
-		mParamAlphaList.reserve(mInfo->mParamAlphaInfoList.size());
+	mParamAlphaList.reserve(mInfo->mParamAlphaInfoList.size());
 	for (param_alpha_info_list_t::const_iterator iter = mInfo->mParamAlphaInfoList.begin(); 
 		 iter != mInfo->mParamAlphaInfoList.end(); 
 		 iter++)
@@ -1893,13 +1893,13 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
 //-----------------------------------------------------------------------------
 // finds a specific layer based on a passed in name
 //-----------------------------------------------------------------------------
-LLTexLayerInterface*  LLTexLayerSet::findLayerByName(std::string name)
+LLTexLayerInterface*  LLTexLayerSet::findLayerByName(const std::string& name)
 {
 	for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
 	{
 		LLTexLayerInterface* layer = *iter;
 
-		if (layer->getName().compare(name) == 0)
+		if (layer->getName() == name)
 		{
 			return layer;
 		}
@@ -1908,7 +1908,7 @@ LLTexLayerInterface*  LLTexLayerSet::findLayerByName(std::string name)
 	{
 		LLTexLayerInterface* layer = *iter;
 
-		if (layer->getName().compare(name) == 0)
+		if (layer->getName() == name)
 		{
 			return layer;
 		}
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index 2269c3c9a554b2b72fd6f662ba02781a19386226..e4a6e82ba5b03fffc80485c48f66b1a8df2467b7 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -60,6 +60,11 @@ typedef std::vector<LLTexLayerParamAlpha *> param_alpha_list_t;
 typedef std::vector<LLTexLayerParamColorInfo *> param_color_info_list_t;
 typedef std::vector<LLTexLayerParamAlphaInfo *> param_alpha_info_list_t;
 
+
+//-----------------------------------------------------------------------------
+// LLTexLayerInterface
+// Interface class to generalize functionality shared by LLTexLayer and LLTexLayerTemplate.
+
 class LLTexLayerInterface 
 {
 public:
@@ -256,7 +261,7 @@ class LLTexLayerSet
 	void					deleteCaches();
 	void					gatherMorphMaskAlpha(U8 *data, S32 width, S32 height);
 	void					applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
-	LLTexLayerInterface*	findLayerByName(std::string name);
+	LLTexLayerInterface*	findLayerByName(const std::string& name);
 	void					cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable);
 	
 	LLVOAvatarSelf*		    getAvatar()	const { return mAvatar; }
diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp
index 9cd73c465606a14284c800e3fb07429f695f02eb..e1643af71de9054816695bc8903e1d986ef5f7e6 100644
--- a/indra/newview/lltexlayerparams.cpp
+++ b/indra/newview/lltexlayerparams.cpp
@@ -42,7 +42,8 @@
 //-----------------------------------------------------------------------------
 LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) :
 	mTexLayer(layer),
-	mAvatar(NULL)
+	mAvatar(NULL),
+	mIsWearableParam(TRUE)
 {
 	if (mTexLayer != NULL)
 	{
@@ -55,7 +56,8 @@ LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) :
 }
 
 LLTexLayerParam::LLTexLayerParam(LLVOAvatar *avatar) :
-	mTexLayer(NULL)
+	mTexLayer(NULL),
+	mIsWearableParam(FALSE)
 {
 	mAvatar = avatar;
 }
@@ -140,7 +142,7 @@ LLTexLayerParamAlpha::~LLTexLayerParamAlpha()
 	sInstances.remove(this);
 }
 
-/*virtual*/ LLViewerVisualParam * 	LLTexLayerParamAlpha::cloneParam(LLWearable* wearable) const
+/*virtual*/ LLViewerVisualParam* LLTexLayerParamAlpha::cloneParam(LLWearable* wearable) const
 {
 	LLTexLayerParamAlpha *new_param = new LLTexLayerParamAlpha(mTexLayer);
 	*new_param = *this;
@@ -175,16 +177,15 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user)
 	{
 		mCurWeight = new_weight;
 
-		LLVOAvatar* avatar = mTexLayer->getTexLayerSet()->getAvatar();
-		if (avatar->getSex() & getSex())
+		if ((mAvatar->getSex() & getSex()) && !mIsWearableParam) // only trigger a baked texture update if we're changing a wearable's visual param.
 		{
 			if (gAgent.cameraCustomizeAvatar())
 			{
 				set_by_user = FALSE;
 			}
-			avatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user);
+			mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user);
 			mTexLayer->invalidateMorphMasks();
-			avatar->updateMeshTextures();
+			mAvatar->updateMeshTextures();
 		}
 	}
 }
@@ -409,7 +410,7 @@ LLTexLayerParamColor::~LLTexLayerParamColor()
 {
 }
 
-/*virtual*/ LLViewerVisualParam * 	LLTexLayerParamColor::cloneParam(LLWearable* wearable) const
+/*virtual*/ LLViewerVisualParam* LLTexLayerParamColor::cloneParam(LLWearable* wearable) const
 {
 	LLTexLayerParamColor *new_param = new LLTexLayerParamColor(mTexLayer);
 	*new_param = *this;
@@ -467,14 +468,16 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user)
 			return;
 		}
 
-		if (mAvatar->getSex() & getSex())
+		if ((mAvatar->getSex() & getSex()) && !mIsWearableParam) // only trigger a baked texture update if we're changing a wearable's visual param.
 		{
 			onGlobalColorChanged(set_by_user);
 			if (mTexLayer)
 			{
 				mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user);
+				mAvatar->updateMeshTextures();
 			}
 		}
+
 //		llinfos << "param " << mName << " = " << new_weight << llendl;
 	}
 }
diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h
index 589bd41054185bd8ebd893680b8982d0fa74746b..dcb108bbf63b7bc2fbf0266e3723772b0077b0bd 100644
--- a/indra/newview/lltexlayerparams.h
+++ b/indra/newview/lltexlayerparams.h
@@ -43,12 +43,13 @@ class LLTexLayerParam : public LLViewerVisualParam
 public: 
 	LLTexLayerParam(LLTexLayerInterface *layer);
 	LLTexLayerParam(LLVOAvatar *avatar);
-	/* Virtual */ BOOL setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar  );
-	/*virtual*/ LLViewerVisualParam * 	cloneParam(LLWearable* wearable) const = 0;
+	/*virtual*/ BOOL setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar  );
+	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const = 0;
 
 protected:
 	LLTexLayerInterface*	mTexLayer;
 	LLVOAvatar*             mAvatar;
+	BOOL					mIsWearableParam;
 };
 
 //-----------------------------------------------------------------------------
@@ -61,7 +62,7 @@ class LLTexLayerParamAlpha : public LLTexLayerParam
 	LLTexLayerParamAlpha( LLVOAvatar* avatar );
 	/*virtual*/ ~LLTexLayerParamAlpha();
 
-	/*virtual*/ LLViewerVisualParam * 	cloneParam(LLWearable* wearable = NULL) const;
+	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const;
 
 	// LLVisualParam Virtual functions
 	///*virtual*/ BOOL		parseData(LLXmlTreeNode* node);
@@ -138,7 +139,7 @@ class LLTexLayerParamColor : public LLTexLayerParam
 	LLTexLayerParamColor( LLVOAvatar* avatar );
 	/* virtual */ ~LLTexLayerParamColor();
 
-	/*virtual*/ LLViewerVisualParam * 	cloneParam(LLWearable* wearable = NULL) const;
+	/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const;
 
 	// LLVisualParam Virtual functions
 	///*virtual*/ BOOL			parseData(LLXmlTreeNode* node);
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 84931e4d2dcedc42c8cd557854efa0f47d77be5f..eba43d76a6b1a999694d35e47d659e4778f24373 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -41,17 +41,29 @@
 using namespace LLNotificationsUI;
 
 //--------------------------------------------------------------------------
-LLToast::LLToast(LLToast::Params p) :	LLModalDialog(LLSD(), p.is_modal),
-										mPanel(p.panel), 
-										mTimerValue(p.timer_period),  
-										mNotificationID(p.notif_id),  
-										mSessionID(p.session_id),
-										mCanFade(p.can_fade),
-										mCanBeStored(p.can_be_stored),
-										mHideBtnEnabled(p.enable_hide_btn),
-										mHideBtn(NULL),
-										mNotification(p.notification),
-										mHideBtnPressed(false)
+LLToast::Params::Params() 
+:	can_fade("can_fade", true),
+	can_be_stored("can_be_stored", true),
+	is_modal("is_modal", false),
+	is_tip("is_tip", false),
+	enable_hide_btn("enable_hide_btn", true),
+	force_show("force_show", false),
+	force_store("force_store", false),
+	lifetime_secs("lifetime_secs", gSavedSettings.getS32("NotificationToastLifeTime"))
+{};
+
+LLToast::LLToast(const LLToast::Params& p) 
+:	LLModalDialog(LLSD(), p.is_modal),
+	mPanel(p.panel), 
+	mToastLifetime(p.lifetime_secs),  
+	mNotificationID(p.notif_id),  
+	mSessionID(p.session_id),
+	mCanFade(p.can_fade),
+	mCanBeStored(p.can_be_stored),
+	mHideBtnEnabled(p.enable_hide_btn),
+	mHideBtn(NULL),
+	mNotification(p.notification),
+	mHideBtnPressed(false)
 {
 	LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
 
@@ -67,11 +79,11 @@ LLToast::LLToast(LLToast::Params p) :	LLModalDialog(LLSD(), p.is_modal),
 	}
 
 	// init callbacks if present
-	if(!p.on_delete_toast.empty())
-		mOnDeleteToastSignal.connect(p.on_delete_toast);
+	if(!p.on_delete_toast().empty())
+		mOnDeleteToastSignal.connect(p.on_delete_toast());
 
-	if(!p.on_mouse_enter.empty())
-		mOnMouseEnterSignal.connect(p.on_mouse_enter);
+	if(!p.on_mouse_enter().empty())
+		mOnMouseEnterSignal.connect(p.on_mouse_enter());
 }
 
 //--------------------------------------------------------------------------
@@ -103,22 +115,22 @@ void LLToast::setAndStartTimer(F32 period)
 {
 	if(mCanFade)
 	{
-		mTimerValue = period;
+		mToastLifetime = period;
 		mTimer.start();
 	}
 }
 
 //--------------------------------------------------------------------------
-bool LLToast::timerHasExpired()
+bool LLToast::lifetimeHasExpired()
 {
 	if (mTimer.getStarted())
 	{
 		F32 elapsed_time = mTimer.getElapsedTimeF32();
-		if (elapsed_time > gSavedSettings.getS32("ToastOpaqueTime")) 
+		if ((mToastLifetime - elapsed_time) <= gSavedSettings.getS32("ToastOpaqueTime")) 
 		{
 			setBackgroundOpaque(FALSE);
 		}
-		if (elapsed_time > mTimerValue) 
+		if (elapsed_time > mToastLifetime) 
 		{
 			return true;
 		}
@@ -183,7 +195,7 @@ void LLToast::insertPanel(LLPanel* panel)
 //--------------------------------------------------------------------------
 void LLToast::draw()
 {
-	if(timerHasExpired())
+	if(lifetimeHasExpired())
 	{
 		tick();
 	}
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 29c231a01d9a41911244cc25964507f2ccd18fa3..1826c13ebc8bc69185319151c2099336a0f66ea3 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -57,37 +57,28 @@ class LLToast : public LLModalDialog
 	typedef boost::function<void (LLToast* toast)> toast_callback_t;
 	typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t;
 
-	struct Params
+	struct Params : public LLInitParam::Block<Params>
 	{
-		LLPanel*			panel;
-		LLUUID				notif_id;	 //notification ID
-		LLUUID				session_id;	 //im session ID
-		LLNotificationPtr	notification;
-		F32					timer_period;
-		toast_callback_t	on_delete_toast;
-		toast_callback_t	on_mouse_enter;
-		bool				can_fade;
-		bool				can_be_stored;
-		bool				enable_hide_btn;
-		bool				is_modal;
-		bool				is_tip;
-		bool				force_show;
-		bool				force_store;
-
-		Params() :	can_fade(true),
-					can_be_stored(true),
-					is_modal(false),
-					is_tip(false),
-					enable_hide_btn(true),
-					force_show(false),
-					force_store(false),
-					panel(NULL),
-					timer_period(gSavedSettings.getS32("NotificationToastTime"))
-
-		{};
+		Mandatory<LLPanel*>				panel;
+		Optional<LLUUID>				notif_id,	 //notification ID
+										session_id;	 //im session ID
+		Optional<LLNotificationPtr>		notification;
+		Optional<F32>					lifetime_secs;
+		Optional<toast_callback_t>		on_delete_toast,
+										on_mouse_enter;
+		Optional<bool>					can_fade,
+										can_be_stored,
+										enable_hide_btn,
+										is_modal,
+										is_tip,
+										force_show,
+										force_store;
+
+
+		Params();
 	};
 
-	LLToast(LLToast::Params p);
+	LLToast(const LLToast::Params& p);
 	virtual ~LLToast();
 	BOOL postBuild();
 
@@ -153,7 +144,7 @@ class LLToast : public LLModalDialog
 private:
 
 	// check timer
-	bool	timerHasExpired();
+	bool	lifetimeHasExpired();
 	// on timer finished function
 	void	tick();
 
@@ -161,8 +152,9 @@ class LLToast : public LLModalDialog
 	LLUUID				mSessionID;
 	LLNotificationPtr	mNotification;
 
+	// timer counts a lifetime of a toast
 	LLTimer		mTimer;
-	F32			mTimerValue;
+	F32			mToastLifetime; // in seconds
 
 	LLPanel*	mPanel;
 	LLButton*	mHideBtn;
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index bc0a654eb966efc5e9aca9a5dab6c1d6ff101ef9..9a63f07a7e578d0c121714b21c1500b912d50324 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1905,7 +1905,7 @@ BOOL LLToolDragAndDrop::isInventoryGroupGiveAcceptable(LLInventoryItem* item)
 	switch(item->getType())
 	{
 	case LLAssetType::AT_OBJECT:
-		if(my_avatar->isWearingAttachment(item->getUUID(), TRUE))
+		if(my_avatar->isWearingAttachment(item->getUUID()))
 		{
 			acceptable = FALSE;
 		}
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index b035fd53fd2d47808eecdf3038bb0bb8a7807f00..22ed1ec219602747804f42fb8c0aa804755dd559 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -48,6 +48,7 @@
 #include "lltooltip.h"
 #include "llhudeffecttrail.h"
 #include "llhudmanager.h"
+#include "llkeyboard.h"
 #include "llmediaentry.h"
 #include "llmenugl.h"
 #include "llmutelist.h"
@@ -1048,7 +1049,7 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
 		}
 		else
 		{
-			media_impl->mouseDown(pick.mUVCoords);
+			media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(TRUE));
 			mMediaMouseCaptureID = mep->getMediaID();
 			setMouseCapture(TRUE);  // This object will send a mouse-up to the media when it loses capture.
 		}
@@ -1098,7 +1099,7 @@ bool LLToolPie::handleMediaHover(const LLPickInfo& pick)
 			// If this is the focused media face, send mouse move events.
 			if (LLViewerMediaFocus::getInstance()->isFocusedOnFace(objectp, pick.mObjectFace))
 			{
-				media_impl->mouseMove(pick.mUVCoords);
+				media_impl->mouseMove(pick.mUVCoords, gKeyboard->currentMask(TRUE));
 				gViewerWindow->setCursor(media_impl->getLastSetCursor());
 			}
 			else
diff --git a/indra/newview/lltransientdockablefloater.cpp b/indra/newview/lltransientdockablefloater.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7e4d4988d128b55863d13fbfdf3971c07b8953ed
--- /dev/null
+++ b/indra/newview/lltransientdockablefloater.cpp
@@ -0,0 +1,96 @@
+/** 
+ * @file lltransientdockablefloater.cpp
+ * @brief Creates a panel of a specific kind for a toast
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ * 
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltransientfloatermgr.h"
+#include "lltransientdockablefloater.h"
+#include "llfloaterreg.h"
+
+
+LLTransientDockableFloater::LLTransientDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
+		const LLSD& key, const Params& params) :
+		LLDockableFloater(dockControl, uniqueDocking, key, params)
+{
+	LLTransientFloaterMgr::getInstance()->registerTransientFloater(this);
+}
+
+LLTransientDockableFloater::~LLTransientDockableFloater()
+{
+	LLTransientFloaterMgr::getInstance()->unregisterTransientFloater(this);
+}
+
+void LLTransientDockableFloater::setVisible(BOOL visible)
+{
+	LLView* dock = getDockWidget();
+	if(visible && isDocked())
+	{
+		LLTransientFloaterMgr::getInstance()->addControlView(this);
+		if (dock != NULL)
+		{
+			LLTransientFloaterMgr::getInstance()->addControlView(dock);
+		}
+	}
+	else
+	{
+		LLTransientFloaterMgr::getInstance()->removeControlView(this);
+		if (dock != NULL)
+		{
+			LLTransientFloaterMgr::getInstance()->removeControlView(dock);
+		}
+	}
+
+	LLDockableFloater::setVisible(visible);
+}
+
+void LLTransientDockableFloater::setDocked(bool docked, bool pop_on_undock)
+{
+	LLView* dock = getDockWidget();
+	if(docked)
+	{
+		LLTransientFloaterMgr::getInstance()->addControlView(this);
+		if (dock != NULL)
+		{
+			LLTransientFloaterMgr::getInstance()->addControlView(dock);
+		}
+	}
+	else
+	{
+		LLTransientFloaterMgr::getInstance()->removeControlView(this);
+		if (dock != NULL)
+		{
+			LLTransientFloaterMgr::getInstance()->removeControlView(dock);
+		}
+	}
+
+	LLDockableFloater::setDocked(docked, pop_on_undock);
+}
diff --git a/indra/newview/lltransientdockablefloater.h b/indra/newview/lltransientdockablefloater.h
new file mode 100644
index 0000000000000000000000000000000000000000..6e8a3afd2213a6dbf92ef2fc4e72f93393834e0f
--- /dev/null
+++ b/indra/newview/lltransientdockablefloater.h
@@ -0,0 +1,57 @@
+/** 
+ * @file lltransientdockablefloater.h
+ * @brief Creates a panel of a specific kind for a toast.
+ *
+ * $LicenseInfo:firstyear=2003&license=viewergpl$
+ * 
+ * Copyright (c) 2003-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_TRANSIENTDOCKABLEFLOATER_H
+#define LL_TRANSIENTDOCKABLEFLOATER_H
+
+#include "llerror.h"
+#include "llfloater.h"
+#include "lldockcontrol.h"
+#include "lldockablefloater.h"
+
+/**
+ * Represents floater that can dock and managed by transient floater manager.
+ * Transient floaters should be hidden if user click anywhere except defined view list.
+ */
+class LLTransientDockableFloater : public LLDockableFloater
+{
+public:
+	LOG_CLASS(LLTransientDockableFloater);
+	LLTransientDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
+			const LLSD& key, const Params& params = getDefaultParams());
+	virtual ~LLTransientDockableFloater();
+
+	/*virtual*/ void setVisible(BOOL visible);
+	/* virtual */void setDocked(bool docked, bool pop_on_undock = true);
+};
+
+#endif /* LL_TRANSIENTDOCKABLEFLOATER_H */
diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7befb8724873a9ccc98d6c6f12e21e6aade093c1
--- /dev/null
+++ b/indra/newview/lltransientfloatermgr.cpp
@@ -0,0 +1,110 @@
+/** 
+ * @file lltransientfloatermgr.cpp
+ * @brief LLFocusMgr base class
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltransientfloatermgr.h"
+#include "llfocusmgr.h"
+#include "llrootview.h"
+#include "llviewerwindow.h"
+#include "lldockablefloater.h"
+
+
+LLTransientFloaterMgr::LLTransientFloaterMgr()
+{
+	gViewerWindow->getRootView()->addMouseDownCallback(boost::bind(
+			&LLTransientFloaterMgr::leftMouseClickCallback, this, _1, _2, _3));
+}
+
+void LLTransientFloaterMgr::registerTransientFloater(LLFloater* floater)
+{
+	mTransSet.insert(floater);
+}
+
+void LLTransientFloaterMgr::unregisterTransientFloater(LLFloater* floater)
+{
+	mTransSet.erase(floater);
+}
+
+void LLTransientFloaterMgr::addControlView(LLView* view)
+{
+	mControlsSet.insert(view);
+}
+
+void LLTransientFloaterMgr::removeControlView(LLView* view)
+{
+	// we will still get focus lost callbacks on this view, but that's ok
+	// since we run sanity checking logic every time
+	mControlsSet.erase(view);
+}
+
+void LLTransientFloaterMgr::hideTransientFloaters()
+{
+	for (std::set<LLFloater*>::iterator it = mTransSet.begin(); it
+			!= mTransSet.end(); it++)
+	{
+		LLFloater* floater = *it;
+		if (floater->isDocked())
+		{
+			floater->setVisible(FALSE);
+		}
+	}
+}
+
+void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
+		MASK mask)
+{
+	bool hide = true;
+	for (controls_set_t::iterator it = mControlsSet.begin(); it
+			!= mControlsSet.end(); it++)
+	{
+		LLView* control_view = *it;
+		if (!control_view->getVisible())
+		{
+			continue;
+		}
+
+		LLRect rect = control_view->calcScreenRect();
+		// if click inside view rect
+		if (rect.pointInRect(x, y))
+		{
+			hide = false;
+			break;
+		}
+	}
+
+	if (hide)
+	{
+		hideTransientFloaters();
+	}
+}
+
diff --git a/indra/newview/lltransientfloatermgr.h b/indra/newview/lltransientfloatermgr.h
new file mode 100644
index 0000000000000000000000000000000000000000..cef6e1fe4566a2615209e6a306d3c3723b0eaec1
--- /dev/null
+++ b/indra/newview/lltransientfloatermgr.h
@@ -0,0 +1,63 @@
+/** 
+ * @file lltransientfloatermgr.h
+ * @brief LLFocusMgr base class
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTRANSIENTFLOATERMGR_H
+#define LL_LLTRANSIENTFLOATERMGR_H
+
+#include "llui.h"
+#include "llsingleton.h"
+#include "llfloater.h"
+
+
+/**
+ * Provides functionality to hide transient floaters.
+ */
+class LLTransientFloaterMgr: public LLSingleton<LLTransientFloaterMgr>
+{
+public:
+	LLTransientFloaterMgr();
+	void registerTransientFloater(LLFloater* floater);
+	void unregisterTransientFloater(LLFloater* floater);
+	void addControlView(LLView* view);
+	void removeControlView(LLView* view);
+
+private:
+	void hideTransientFloaters();
+	void leftMouseClickCallback(S32 x, S32 y, MASK mask);
+
+private:
+	std::set<LLFloater*> mTransSet;
+	typedef std::set<LLView*> controls_set_t;
+	controls_set_t mControlsSet;
+};
+
+#endif  // LL_LLTRANSIENTFLOATERMGR_H
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 81917ec76e0c931adb1158bbf3351a43f7d713d8..dace3f875f553c44598c9f84c31d3d86a6645821 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -147,7 +147,6 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBump>);
 
 	LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>);
-	LLFloaterReg::add("camera_presets", "floater_camera_presets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCameraPresets>);
 	LLFloaterReg::add("chat", "floater_chat_history.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChat>);
 	LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>);
 	LLFloaterReg::add("communicate", "floater_chatterbox.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatterBox>);
@@ -190,7 +189,6 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("syswell_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLSysWellWindow>);
 	
 	LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
-	LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>);
 
 	LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
 	
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 7e88320f49853db9767944fef16e917fdc2ac830..57a4117d5d561a59f96dab90760b57b5cf21e77c 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -657,7 +657,6 @@ void LLViewerInventoryCategory::changeType(LLAssetType::EType new_folder_type)
 
 	setPreferredType(new_folder_type);
 	gInventory.addChangedMask(LLInventoryObserver::LABEL, folder_id);
-	gInventory.updateLinkedObjects(folder_id);	
 }
 
 ///----------------------------------------------------------------------------
@@ -990,7 +989,7 @@ const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not
 const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably not)
 const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not)
 
-void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, const LLSD& userdata)
+void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid)
 {
 	std::string type = userdata.asString();
 	
@@ -1003,15 +1002,22 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co
 			a_type = LLAssetType::AT_OUTFIT;
 		if ("my_otfts" == type)
 			a_type = LLAssetType::AT_MY_OUTFITS;
-		LLUUID category;
+
+		LLUUID parent_id;
 		if (bridge)
 		{
-			category = gInventory.createNewCategory(bridge->getUUID(), a_type, LLStringUtil::null);
+			parent_id = bridge->getUUID();
+		}
+		else if (default_parent_uuid.notNull())
+		{
+			parent_id = default_parent_uuid;
 		}
 		else
 		{
-			category = gInventory.createNewCategory(gInventory.getRootFolderID(), a_type, LLStringUtil::null);
+			parent_id = gInventory.getRootFolderID();
 		}
+
+		LLUUID category = gInventory.createNewCategory(parent_id, a_type, LLStringUtil::null);
 		gInventory.notifyObservers();
 		folder->setSelectionByID(category, TRUE);
 	}
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index f55a6956520962696b5f27ec5dcfd137ea141da9..d523bf2859413eee54869d2f023a9270693d2053 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -341,6 +341,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id,
 
 void menu_create_inventory_item(LLFolderView* folder,
 								LLFolderBridge* bridge,
-								const LLSD& userdata);
+								const LLSD& userdata,
+								const LLUUID& default_parent_uuid = LLUUID::null);
 
 #endif // LL_LLVIEWERINVENTORY_H
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index ba3d1914a7d71319e6a8d17545cf121f5b91e35d..464ba4a5b1672a15cc02309a8ecfc6a0112358c9 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -48,6 +48,7 @@
 #include "llevent.h"		// LLSimpleListener
 #include "llnotifications.h"
 #include "lluuid.h"
+#include "llkeyboard.h"
 
 #include <boost/bind.hpp>	// for SkinFolder listener
 #include <boost/signals2.hpp>
@@ -250,7 +251,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 			media_impl->mMediaSource->setSize(media_entry->getWidthPixels(), media_entry->getHeightPixels());
 		}
 		
-		if((was_loaded || media_entry->getAutoPlay()) && !update_from_self)
+		if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))) && !update_from_self)
 		{
 			if(!media_entry->getCurrentURL().empty())
 			{
@@ -273,7 +274,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 		
 		media_impl->setHomeURL(media_entry->getHomeURL());
 		
-		if(media_entry->getAutoPlay())
+		if(media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))
 		{
 			needs_navigate = true;
 		}
@@ -792,6 +793,7 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
 		media_source->setLoop(mMediaLoop);
 		media_source->setAutoScale(mMediaAutoScale);
 		media_source->setBrowserUserAgent(LLViewerMedia::getCurrentUserAgent());
+		media_source->focus(mHasFocus);
 		
 		mMediaSource = media_source;
 		return true;
@@ -917,7 +919,7 @@ bool LLViewerMediaImpl::hasFocus() const
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-void LLViewerMediaImpl::mouseDown(S32 x, S32 y)
+void LLViewerMediaImpl::mouseDown(S32 x, S32 y, MASK mask, S32 button)
 {
 	scaleMouse(&x, &y);
 	mLastMouseX = x;
@@ -925,12 +927,12 @@ void LLViewerMediaImpl::mouseDown(S32 x, S32 y)
 //	llinfos << "mouse down (" << x << ", " << y << ")" << llendl;
 	if (mMediaSource)
 	{
-		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_DOWN, x, y, 0);
+		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_DOWN, button, x, y, mask);
 	}
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-void LLViewerMediaImpl::mouseUp(S32 x, S32 y)
+void LLViewerMediaImpl::mouseUp(S32 x, S32 y, MASK mask, S32 button)
 {
 	scaleMouse(&x, &y);
 	mLastMouseX = x;
@@ -938,12 +940,12 @@ void LLViewerMediaImpl::mouseUp(S32 x, S32 y)
 //	llinfos << "mouse up (" << x << ", " << y << ")" << llendl;
 	if (mMediaSource)
 	{
-		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_UP, x, y, 0);
+		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_UP, button, x, y, mask);
 	}
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-void LLViewerMediaImpl::mouseMove(S32 x, S32 y)
+void LLViewerMediaImpl::mouseMove(S32 x, S32 y, MASK mask)
 {
     scaleMouse(&x, &y);
 	mLastMouseX = x;
@@ -951,50 +953,53 @@ void LLViewerMediaImpl::mouseMove(S32 x, S32 y)
 //	llinfos << "mouse move (" << x << ", " << y << ")" << llendl;
 	if (mMediaSource)
 	{
-		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_MOVE, x, y, 0);
+		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_MOVE, 0, x, y, mask);
 	}
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-void LLViewerMediaImpl::mouseDown(const LLVector2& texture_coords)
+void LLViewerMediaImpl::mouseDown(const LLVector2& texture_coords, MASK mask, S32 button)
 {
 	if(mMediaSource)
 	{		
 		mouseDown(
 			llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()),
-			llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()));
+			llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()),
+			mask, button);
 	}
 }
 
-void LLViewerMediaImpl::mouseUp(const LLVector2& texture_coords)
+void LLViewerMediaImpl::mouseUp(const LLVector2& texture_coords, MASK mask, S32 button)
 {
 	if(mMediaSource)
 	{		
 		mouseUp(
 			llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()),
-			llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()));
+			llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()),
+			mask, button);
 	}
 }
 
-void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords)
+void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords, MASK mask)
 {
 	if(mMediaSource)
 	{		
 		mouseMove(
 			llround(texture_coords.mV[VX] * mMediaSource->getTextureWidth()),
-			llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()));
+			llround((1.0f - texture_coords.mV[VY]) * mMediaSource->getTextureHeight()),
+			mask);
 	}
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-void LLViewerMediaImpl::mouseLeftDoubleClick(S32 x, S32 y)
+void LLViewerMediaImpl::mouseDoubleClick(S32 x, S32 y, MASK mask, S32 button)
 {
 	scaleMouse(&x, &y);
 	mLastMouseX = x;
 	mLastMouseY = y;
 	if (mMediaSource)
 	{
-		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_DOUBLE_CLICK, x, y, 0);
+		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_DOUBLE_CLICK, button, x, y, mask);
 	}
 }
 
@@ -1003,7 +1008,7 @@ void LLViewerMediaImpl::onMouseCaptureLost()
 {
 	if (mMediaSource)
 	{
-		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_UP, mLastMouseX, mLastMouseY, 0);
+		mMediaSource->mouseEvent(LLPluginClassMedia::MOUSE_EVENT_UP, 0, mLastMouseX, mLastMouseY, 0);
 	}
 }
 
@@ -1197,7 +1202,33 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)
 	
 	if (mMediaSource)
 	{
-		result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask);
+		// FIXME: THIS IS SO WRONG.
+		// Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it...
+		if( MASK_CONTROL & mask )
+		{
+			if( 'C' == key )
+			{
+				mMediaSource->copy();
+				result = true;
+			}
+			else
+			if( 'V' == key )
+			{
+				mMediaSource->paste();
+				result = true;
+			}
+			else
+			if( 'X' == key )
+			{
+				mMediaSource->cut();
+				result = true;
+			}
+		}
+		
+		if(!result)
+		{
+			result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask);
+		}
 	}
 	
 	return result;
@@ -1210,7 +1241,12 @@ bool LLViewerMediaImpl::handleUnicodeCharHere(llwchar uni_char)
 	
 	if (mMediaSource)
 	{
-		mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)));
+		// only accept 'printable' characters, sigh...
+		if (uni_char >= 32 // discard 'control' characters
+			&& uni_char != 127) // SDL thinks this is 'delete' - yuck.
+		{
+			mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE));
+		}
 	}
 	
 	return result;
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index fc2776ee91eeca10e69a72e08c0a6531081b5ffa..01640de33ad7db10853e6317d97590630b82132e 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -133,13 +133,13 @@ class LLViewerMediaImpl
 	void focus(bool focus);
 	// True if the impl has user focus.
 	bool hasFocus() const;
-	void mouseDown(S32 x, S32 y);
-	void mouseUp(S32 x, S32 y);
-	void mouseMove(S32 x, S32 y);
-	void mouseDown(const LLVector2& texture_coords);
-	void mouseUp(const LLVector2& texture_coords);
-	void mouseMove(const LLVector2& texture_coords);
-	void mouseLeftDoubleClick(S32 x,S32 y );
+	void mouseDown(S32 x, S32 y, MASK mask, S32 button = 0);
+	void mouseUp(S32 x, S32 y, MASK mask, S32 button = 0);
+	void mouseMove(S32 x, S32 y, MASK mask);
+	void mouseDown(const LLVector2& texture_coords, MASK mask, S32 button = 0);
+	void mouseUp(const LLVector2& texture_coords, MASK mask, S32 button = 0);
+	void mouseMove(const LLVector2& texture_coords, MASK mask);
+	void mouseDoubleClick(S32 x,S32 y, MASK mask, S32 button = 0);
 	void mouseCapture();
 	
 	void navigateBack();
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index cad8b5f0ceca7d61f609d01cfda91752936784a1..ad48ec145ba675156a3fdd4faa876255b0c0d04f 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -77,7 +77,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 	if (media_impl.notNull() && objectp.notNull())
 	{
 		bool face_auto_zoom = false;
-		media_impl->focus(true);
 
 		mFocusedImplID = media_impl->getMediaTextureID();
 		mFocusedObjectID = objectp->getID();
@@ -101,6 +100,7 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 			llwarns << "Can't find media entry for focused face" << llendl;
 		}
 
+		media_impl->focus(true);
 		gFocusMgr.setKeyboardFocus(this);
 		
 		// We must do this before  processing the media HUD zoom, or it may zoom to the wrong face. 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index cb4f4de05e2c1196c15f7d9ae033115653eba307..a1c15d9d0f3bad2d39321e4f20bd5d4d748a6d42 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3450,6 +3450,15 @@ bool enable_standup_self()
 	return new_value;
 }
 
+// Used from the login screen to aid in UI work on side tray
+void handle_show_side_tray()
+{
+	LLSideTray* side_tray = LLSideTray::getInstance();
+	LLView* root = gViewerWindow->getRootView();
+	// automatically removes and re-adds if there already
+	root->addChild(side_tray);
+}
+
 class LLSelfFriends : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -6912,7 +6921,7 @@ void handle_debug_avatar_textures(void*)
 	LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
 	if (objectp)
 	{
-		LLFloaterReg::showInstance( "avatar_tetures", LLSD(objectp->getID()) );
+		LLFloaterReg::showInstance( "avatar_textures", LLSD(objectp->getID()) );
 	}
 }
 
@@ -7934,7 +7943,7 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLAdvancedCheckDebugKeys(), "Advanced.CheckDebugKeys");
 	view_listener_t::addMenu(new LLAdvancedToggleDebugWindowProc(), "Advanced.ToggleDebugWindowProc");
 	view_listener_t::addMenu(new LLAdvancedCheckDebugWindowProc(), "Advanced.CheckDebugWindowProc");
-
+	commit.add("Advanced.ShowSideTray", boost::bind(&handle_show_side_tray));
 
 	// Advanced > XUI
 	commit.add("Advanced.ReloadColorSettings", boost::bind(&LLUIColorTable::loadFromSettings, LLUIColorTable::getInstance()));
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index b268413d363962a6eb55e8124b88d11588874c82..791ec07349116ce9d323cff4ac2322a8c0d5c9c2 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1947,52 +1947,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			{
 				return;
 			}
-			chat.mText = name + separator_string + message.substr(message_offset);
-			chat.mFromName = name;
-
-			// Build a link to open the object IM info window.
-			std::string location = ll_safe_string((char*)binary_bucket,binary_bucket_size);
-			
-			LLSD query_string;
-			query_string["owner"] = from_id;
-			query_string["slurl"] = location.c_str();
-			query_string["name"] = name;
-			if (from_group)
-			{
-				query_string["groupowned"] = "true";
-			}	
-
-			if (session_id.notNull())
-			{
-				chat.mFromID = session_id;
-			}
-			else
-			{
-				// This message originated on a region without the updated code for task id and slurl information.
-				// We just need a unique ID for this object that isn't the owner ID.
-				// If it is the owner ID it will overwrite the style that contains the link to that owner's profile.
-				// This isn't ideal - it will make 1 style for all objects owned by the the same person/group.
-				// This works because the only thing we can really do in this case is show the owner name and link to their profile.
-				chat.mFromID = from_id ^ gAgent.getSessionID();
-			}
-
-			std::ostringstream link;
-			link << "secondlife:///app/objectim/" << session_id
-					<< LLURI::mapToQueryString(query_string);
-
-			chat.mURL = link.str();
-			chat.mText = name + separator_string + message.substr(message_offset);
-
-			// Note: lie to LLFloaterChat::addChat(), pretending that this is NOT an IM, because
-			// IMs from objcts don't open IM sessions.
-			chat.mSourceType = CHAT_SOURCE_OBJECT;
-			LLFloaterChat::addChat(chat, FALSE, FALSE);
-
-			// archive message in nearby chat
-			LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
-			if(nearby_chat)
-				nearby_chat->addMessage(chat);
 
+			LLSD substitutions;
+			substitutions["MSG"] = message.substr(message_offset);
+			LLNotifications::instance().add("ServerObjectMessage", substitutions);
 		}
 		break;
 	case IM_FROM_TASK_AS_ALERT:
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 44de848d19ec2546a9795d694d7003e6e1c284f8..77b023f6ddfba45e03620d90c7a45cf3878e1bed 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1162,10 +1162,11 @@ void LLViewerParcelMgr::sendParcelBuy(ParcelBuyInfo* info)
 	msg->sendReliable(info->mHost);
 }
 
-void LLViewerParcelMgr::deleteParcelBuy(ParcelBuyInfo*& info)
+void LLViewerParcelMgr::deleteParcelBuy(ParcelBuyInfo* *info)
 {
-	delete info;
-	info = NULL;
+	// Must be here because ParcelBuyInfo is local to this .cpp file
+	delete *info;
+	*info = NULL;
 }
 
 void LLViewerParcelMgr::sendParcelDeed(const LLUUID& group_id)
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 3964a56bf60b3450ff0ce5cb5d43b67f2656fd6d..1c8fe23dba125ed08ca0414935d84988f68ae7f3 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -246,7 +246,7 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 								  BOOL remove_contribution);
 		// callers responsibility to call deleteParcelBuy() on return value
 	void sendParcelBuy(ParcelBuyInfo*);
-	void deleteParcelBuy(ParcelBuyInfo*&);
+	void deleteParcelBuy(ParcelBuyInfo* *info);
 					   
 	void sendParcelDeed(const LLUUID& group_id);
 
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 21d4c724287b426779b6ca7c6fe466205ceb584a..bb317aeb5f193da4aa6fdacf54113d8a995739b3 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -105,7 +105,6 @@
 #include "llstl.h"
 #include "llstrider.h"
 #include "llstring.h"
-#include "llstringtable.h"
 #include "llsys.h"
 #include "llthread.h"
 #include "lltimer.h"
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 95459a7116b5021b7a89d31f1c9ad9c6d873e61a..e5c53c91c90b03feff444d15dee23a9337dffedf 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -191,25 +191,25 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid
 LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(
 	                                               const LLUUID &image_id,											       
 												   BOOL usemipmaps,
-												   BOOL level_immediate,
+												   S32 boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format,
 												   LLHost request_from_host)
 {
-	return gTextureList.getImage(image_id, usemipmaps, level_immediate, texture_type, internal_format, primary_format, request_from_host) ;
+	return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ;
 }
 	
 LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile(
 	                                               const std::string& filename,												   
 												   BOOL usemipmaps,
-												   BOOL level_immediate,
+												   S32 boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format, 
 												   const LLUUID& force_id)
 {
-	return gTextureList.getImageFromFile(filename, usemipmaps, level_immediate, texture_type, internal_format, primary_format, force_id) ;
+	return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ;
 }
 
 LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const LLUUID& image_id, LLHost host) 
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 596bfea670b33b91fa42b5dfdc31dc9c259e009f..480e1c1cbcc2d38bd429210f6e0fea26a85063ca 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -118,10 +118,10 @@ class LLViewerTexture : public LLTexture
 		BOOST_SELECTED		= 12,
 		BOOST_HUD			= 13,
 		BOOST_AVATAR_BAKED_SELF	= 14,
-		BOOST_UI			= 15,
-		BOOST_PREVIEW		= 16,
-		BOOST_MAP			= 17,
-		BOOST_MAP_LAYER		= 18,
+		BOOST_ICON			= 15,
+		BOOST_UI			= 16,
+		BOOST_PREVIEW		= 17,
+		BOOST_MAP			= 18,
 		BOOST_AVATAR_SELF	= 19, // needed for baking avatar
 		BOOST_MAX_LEVEL
 	};
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index dac2331ca3ffed183d2a4596a8d4e36bdfcc6c38..b5986c70f589069618e7adede346fcaf5aeba637 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -111,10 +111,10 @@ void LLViewerTextureList::doPreloadImages()
 	LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL;
 	
 	// Set the "missing asset" image
-	LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, IMMEDIATE_YES);
+	LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI);
 	
 	// Set the "white" image
-	LLViewerFetchedTexture::sWhiteImagep = LLViewerTextureManager::getFetchedTextureFromFile("white.tga", MIPMAP_NO, IMMEDIATE_YES);
+	LLViewerFetchedTexture::sWhiteImagep = LLViewerTextureManager::getFetchedTextureFromFile("white.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI);
 	
 	LLUIImageList* image_list = LLUIImageList::getInstance();
 
@@ -131,31 +131,31 @@ void LLViewerTextureList::doPreloadImages()
 	// prefetch specific UUIDs
 	LLViewerTextureManager::getFetchedTexture(IMG_SHOT, TRUE);
 	LLViewerTextureManager::getFetchedTexture(IMG_SMOKE_POOF, TRUE);
-	LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", MIPMAP_YES, IMMEDIATE_YES);
+	LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI);
 	if (image) 
 	{
 		image->setAddressMode(LLTexUnit::TAM_WRAP);
 		mImagePreloads.insert(image);
 	}
-	image = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryLines.png", MIPMAP_YES, IMMEDIATE_YES);
+	image = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryLines.png", MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI);
 	if (image) 
 	{
 		image->setAddressMode(LLTexUnit::TAM_WRAP);	
 		mImagePreloads.insert(image);
 	}
-	image = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryPassLines.png", MIPMAP_YES, IMMEDIATE_YES);
+	image = LLViewerTextureManager::getFetchedTextureFromFile("world/NoEntryPassLines.png", MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI);
 	if (image) 
 	{
 		image->setAddressMode(LLTexUnit::TAM_WRAP);
 		mImagePreloads.insert(image);
 	}
-	image = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL, MIPMAP_YES, IMMEDIATE_YES);
+	image = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI);
 	if (image) 
 	{
 		image->setAddressMode(LLTexUnit::TAM_WRAP);	
 		mImagePreloads.insert(image);
 	}
-	image = LLViewerTextureManager::getFetchedTextureFromFile("transparent.j2c", MIPMAP_YES, IMMEDIATE_YES, LLViewerTexture::FETCHED_TEXTURE,
+	image = LLViewerTextureManager::getFetchedTextureFromFile("transparent.j2c", MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE,
 		0,0,LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"));
 	if (image) 
 	{
@@ -315,7 +315,7 @@ void LLViewerTextureList::restoreGL()
 
 LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename,												   
 												   BOOL usemipmaps,
-												   BOOL level_immediate,
+												   S32 boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format, 
@@ -369,10 +369,14 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
 
 		addImage(imagep);
 		
-		if (level_immediate)
+		if (boost_priority != 0)
 		{
-			imagep->dontDiscard();
-			imagep->setBoostLevel(LLViewerFetchedTexture::BOOST_UI);
+			if (boost_priority == LLViewerFetchedTexture::BOOST_UI ||
+				boost_priority == LLViewerFetchedTexture::BOOST_ICON)
+			{
+				imagep->dontDiscard();
+			}
+			imagep->setBoostLevel(boost_priority);
 		}
 	}
 
@@ -384,7 +388,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
 
 LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,											       
 												   BOOL usemipmaps,
-												   BOOL level_immediate,
+												   S32 boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format,
@@ -403,7 +407,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
 	
 	if (imagep.isNull())
 	{
-		imagep = createImage(image_id, usemipmaps, level_immediate, texture_type, internal_format, primary_format, request_from_host) ;
+		imagep = createImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ;
 	}
 
 	imagep->setGLTextureCreated(true);
@@ -414,7 +418,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
 //when this function is called, there is no such texture in the gTextureList with image_id.
 LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,											       
 												   BOOL usemipmaps,
-												   BOOL level_immediate,
+												   S32 boost_priority,
 												   S8 texture_type,
 												   LLGLint internal_format,
 												   LLGLenum primary_format,
@@ -443,16 +447,20 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
 	
 	addImage(imagep);
 	
-	if (level_immediate)
+	if (boost_priority != 0)
 	{
-		imagep->dontDiscard();
-		imagep->setBoostLevel(LLViewerFetchedTexture::BOOST_UI);
+		if (boost_priority == LLViewerFetchedTexture::BOOST_UI ||
+			boost_priority == LLViewerFetchedTexture::BOOST_ICON)
+		{
+			imagep->dontDiscard();
+		}
+		imagep->setBoostLevel(boost_priority);
 	}
 	else
 	{
 		//by default, the texure can not be removed from memory even if it is not used.
 		//here turn this off
-		//if this texture should be set to NO_DELETE, either pass level_immediate == TRUE here, or call setNoDelete() afterwards.
+		//if this texture should be set to NO_DELETE, call setNoDelete() afterwards.
 		imagep->forceActive() ;
 	}
 
@@ -1286,7 +1294,7 @@ void LLUIImageList::cleanUp()
 	mUITextureList.clear() ;
 }
 
-LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id)
+LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)
 {
 	// use id as image name
 	std::string image_name = image_id.asString();
@@ -1298,10 +1306,12 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id)
 		return found_it->second;
 	}
 
-	return loadUIImageByID(image_id);
+	const BOOL use_mips = FALSE;
+	const LLRect scale_rect = LLRect::null;
+	return loadUIImageByID(image_id, use_mips, scale_rect, priority);
 }
 
-LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name)
+LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority)
 {
 	// look for existing image
 	uuid_ui_image_map_t::iterator found_it = mUIImages.find(image_name);
@@ -1310,18 +1320,24 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name)
 		return found_it->second;
 	}
 
-	return loadUIImageByName(image_name, image_name);
+	const BOOL use_mips = FALSE;
+	const LLRect scale_rect = LLRect::null;
+	return loadUIImageByName(image_name, image_name, use_mips, scale_rect, priority);
 }
 
-LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect)
+LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename,
+											  BOOL use_mips, const LLRect& scale_rect, S32 boost_priority )
 {
-	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, IMMEDIATE_YES);
+	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);
 	return loadUIImage(imagep, name, use_mips, scale_rect);
 }
 
-LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id, BOOL use_mips, const LLRect& scale_rect)
+LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,
+											BOOL use_mips, const LLRect& scale_rect, S32 boost_priority)
 {
-	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, IMMEDIATE_YES);
+	if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+	LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);
 	return loadUIImage(imagep, id.asString(), use_mips, scale_rect);
 }
 
@@ -1332,11 +1348,11 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st
 	imagep->setAddressMode(LLTexUnit::TAM_CLAMP);
 
 	//all UI images are non-deletable
-	imagep->setNoDelete() ;
+	imagep->setNoDelete();
 
 	LLUIImagePtr new_imagep = new LLUIImage(name, imagep);
 	mUIImages.insert(std::make_pair(name, new_imagep));
-	mUITextureList.push_back(imagep) ;
+	mUITextureList.push_back(imagep);
 
 	LLUIImageLoadData* datap = new LLUIImageLoadData;
 	datap->mImageName = name;
@@ -1474,7 +1490,7 @@ bool LLUIImageList::initFromFile()
 	}
 
 	UIImageDeclarations images;
-	LLXUIParser::instance().readXUI(root, images);
+	LLXUIParser::instance().readXUI(root, images, base_file_path);
 
 	if (!images.validateBlock()) return false;
 
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 11d1dd855fab40ae2be32bc7ce6e7fff8b6c62da..fda57ce981bd5fe6e3bf90684bc31c955660b9b9 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -202,8 +202,8 @@ class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIIm
 {
 public:
 	// LLImageProviderInterface
-	LLUIImagePtr getUIImageByID(const LLUUID& id);
-	LLUIImagePtr getUIImage(const std::string& name);
+	/*virtual*/ LLUIImagePtr getUIImageByID(const LLUUID& id, S32 priority);
+	/*virtual*/ LLUIImagePtr getUIImage(const std::string& name, S32 priority);
 	void cleanUp();
 
 	bool initFromFile();
@@ -212,8 +212,10 @@ class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIIm
 	
 	static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
 private:
-	LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
-	LLUIImagePtr loadUIImageByID(const LLUUID& id, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
+	LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename,
+								   BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
+	LLUIImagePtr loadUIImageByID(const LLUUID& id,
+								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
 
 	LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
 
diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h
index 82a694e277700c84371761d59d477c29e352a32f..3550a46fbfee92c4f831b47d3445f4b84e38b325 100644
--- a/indra/newview/llviewervisualparam.h
+++ b/indra/newview/llviewervisualparam.h
@@ -83,7 +83,7 @@ class LLViewerVisualParam : public LLVisualParam
 	//   This sets mInfo and calls initialization functions
 	BOOL						setInfo(LLViewerVisualParamInfo *info);
 
-	virtual LLViewerVisualParam * 	cloneParam(LLWearable* wearable) const = 0;
+	virtual LLViewerVisualParam* cloneParam(LLWearable* wearable) const = 0;
 	
 	// LLVisualParam Virtual functions
 	///*virtual*/ BOOL			parseData(LLXmlTreeNode* node);
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 76e00db91c7a7f57a07702a54d83bced35c34b5b..a402aff8ab56329277db79f346eb694bf0a9365b 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -49,6 +49,7 @@
 #include "llagent.h" //  Get state values from here
 #include "llagentwearables.h"
 #include "llanimationstates.h"
+#include "llavatarpropertiesprocessor.h"
 #include "llviewercontrol.h"
 #include "lldrawpoolavatar.h"
 #include "lldriverparam.h"
@@ -792,7 +793,8 @@ LLVOAvatar::~LLVOAvatar()
 	mMeshes.clear();
 
 	for (std::vector<LLViewerJoint*>::iterator jointIter = mMeshLOD.begin();
-		 jointIter != mMeshLOD.end(); jointIter++)
+		 jointIter != mMeshLOD.end(); 
+		 ++jointIter)
 	{
 		LLViewerJoint* joint = (LLViewerJoint *) *jointIter;
 		std::for_each(joint->mMeshParts.begin(), joint->mMeshParts.end(), DeletePointer());
@@ -943,7 +945,7 @@ void LLVOAvatar::dumpBakedStatus()
 			
 			for (LLVOAvatarDictionary::BakedTextures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
 				 iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
-				 iter++)
+				 ++iter)
 			{
 				const LLVOAvatarDictionary::BakedEntry *baked_dict = iter->second;
 				const ETextureIndex index = baked_dict->mTextureIndex;
@@ -1135,7 +1137,7 @@ void LLVOAvatar::initInstance(void)
 	
 	for (LLVOAvatarDictionary::Meshes::const_iterator iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin();
 		 iter != LLVOAvatarDictionary::getInstance()->getMeshes().end();
-		 iter++)
+		 ++iter)
 	{
 		const EMeshIndex mesh_index = iter->first;
 		const LLVOAvatarDictionary::MeshEntry *mesh_dict = iter->second;
@@ -1181,7 +1183,7 @@ void LLVOAvatar::initInstance(void)
 	//-------------------------------------------------------------------------
 	for (LLVOAvatarDictionary::Meshes::const_iterator iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin();
 		 iter != LLVOAvatarDictionary::getInstance()->getMeshes().end();
-		 iter++)
+		 ++iter)
 	{
 		const EMeshIndex mesh_index = iter->first;
 		const LLVOAvatarDictionary::MeshEntry *mesh_dict = iter->second;
@@ -1190,7 +1192,8 @@ void LLVOAvatar::initInstance(void)
 		if (baked_texture_index == BAKED_NUM_INDICES) continue;
 		
 		for (std::vector<LLViewerJointMesh* >::iterator iter = mMeshLOD[mesh_index]->mMeshParts.begin();
-			 iter != mMeshLOD[mesh_index]->mMeshParts.end(); iter++)
+			 iter != mMeshLOD[mesh_index]->mMeshParts.end(); 
+			 ++iter)
 		{
 			LLViewerJointMesh* mesh = (LLViewerJointMesh*) *iter;
 			mBakedTextureDatas[(int)baked_texture_index].mMeshes.push_back(mesh);
@@ -1576,7 +1579,7 @@ BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent
 
 	// setup children
 	LLVOAvatarBoneInfo::child_list_t::const_iterator iter;
-	for (iter = info->mChildList.begin(); iter != info->mChildList.end(); iter++)
+	for (iter = info->mChildList.begin(); iter != info->mChildList.end(); ++iter)
 	{
 		LLVOAvatarBoneInfo *child_info = *iter;
 		if (!setupBone(child_info, joint, volume_num, joint_num))
@@ -1619,7 +1622,7 @@ BOOL LLVOAvatar::buildSkeleton(const LLVOAvatarSkeletonInfo *info)
 	S32 current_joint_num = 0;
 	S32 current_volume_num = 0;
 	LLVOAvatarSkeletonInfo::bone_info_list_t::const_iterator iter;
-	for (iter = info->mBoneInfoList.begin(); iter != info->mBoneInfoList.end(); iter++)
+	for (iter = info->mBoneInfoList.begin(); iter != info->mBoneInfoList.end(); ++iter)
 	{
 		LLVOAvatarBoneInfo *info = *iter;
 		if (!setupBone(info, NULL, current_volume_num, current_joint_num))
@@ -1682,11 +1685,11 @@ void LLVOAvatar::buildCharacter()
 	// clear mesh data
 	//-------------------------------------------------------------------------
 	for (std::vector<LLViewerJoint*>::iterator jointIter = mMeshLOD.begin();
-		 jointIter != mMeshLOD.end(); jointIter++)
+		 jointIter != mMeshLOD.end(); ++jointIter)
 	{
 		LLViewerJoint* joint = (LLViewerJoint*) *jointIter;
 		for (std::vector<LLViewerJointMesh*>::iterator meshIter = joint->mMeshParts.begin();
-			 meshIter != joint->mMeshParts.end(); meshIter++)
+			 meshIter != joint->mMeshParts.end(); ++meshIter)
 		{
 			LLViewerJointMesh * mesh = (LLViewerJointMesh *) *meshIter;
 			mesh->setMesh(NULL);
@@ -1831,7 +1834,8 @@ void LLVOAvatar::releaseMeshData()
 
 	// cleanup mesh data
 	for (std::vector<LLViewerJoint*>::iterator iter = mMeshLOD.begin();
-		 iter != mMeshLOD.end(); iter++)
+		 iter != mMeshLOD.end(); 
+		 ++iter)
 	{
 		LLViewerJoint* joint = (LLViewerJoint*) *iter;
 		joint->setValid(FALSE, TRUE);
@@ -1850,10 +1854,10 @@ void LLVOAvatar::releaseMeshData()
 	}
 	
 	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
+		LLViewerJointAttachment* attachment = iter->second;
 		if (!attachment->getIsHUDAttachment())
 		{
 			attachment->setAttachmentVisibility(FALSE);
@@ -1876,10 +1880,10 @@ void LLVOAvatar::restoreMeshData()
 	updateJointLODs();
 
 	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
+		LLViewerJointAttachment* attachment = iter->second;
 		if (!attachment->getIsHUDAttachment())
 		{
 			attachment->setAttachmentVisibility(TRUE);
@@ -2328,10 +2332,10 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
 	{
 		LLFastTimer t(FTM_ATTACHMENT_UPDATE);
 		for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-			 iter != mAttachmentPoints.end(); )
+			 iter != mAttachmentPoints.end();
+			 ++iter)
 		{
-			attachment_map_t::iterator curiter = iter++;
-			LLViewerJointAttachment* attachment = curiter->second;
+			LLViewerJointAttachment* attachment = iter->second;
 
 			for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
 				 attachment_iter != attachment->mAttachedObjects.end();
@@ -3554,10 +3558,10 @@ void LLVOAvatar::updateVisibility()
 			/*llinfos << "SPA: " << sel_pos_agent << llendl;
 			llinfos << "WPA: " << wrist_right_pos_agent << llendl;*/
 			for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-				 iter != mAttachmentPoints.end(); )
+				 iter != mAttachmentPoints.end();
+				 ++iter)
 			{
-				attachment_map_t::iterator curiter = iter++;
-				LLViewerJointAttachment* attachment = curiter->second;
+				LLViewerJointAttachment* attachment = iter->second;
 
 				for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
 					 attachment_iter != attachment->mAttachedObjects.end();
@@ -3989,32 +3993,32 @@ void LLVOAvatar::updateTextures(LLAgent &agent)
 	mMaxPixelArea = 0.f;
 	mMinPixelArea = 99999999.f;
 	mHasGrey = FALSE; // debug
-	for (U32 texture = 0; texture < getNumTEs(); texture++)
+	for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++)
 	{
-		EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture);
+		EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture_index);
 		U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);
-		const LLTextureEntry *te = getTE(texture);
+		const LLTextureEntry *te = getTE(texture_index);
 		const F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
 		LLViewerFetchedTexture *imagep = NULL;
 		for (U32 wearable_index = 0; wearable_index < num_wearables; wearable_index++)
 		{
-			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture, wearable_index), TRUE);
+			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index, wearable_index), TRUE);
 			if (imagep)
 			{
-				const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)texture);
+				const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)texture_index);
 				const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
 				if (texture_dict->mIsLocalTexture)
 				{
-					addLocalTextureStats((ETextureIndex)texture, imagep, texel_area_ratio, render_avatar, layer_baked[baked_index]);
+					addLocalTextureStats((ETextureIndex)texture_index, imagep, texel_area_ratio, render_avatar, layer_baked[baked_index]);
 				}
 			}
 		}
-		if (isIndexBakedTexture((ETextureIndex) texture))
+		if (isIndexBakedTexture((ETextureIndex) texture_index))
 		{
 			const S32 boost_level = getAvatarBakedBoostLevel();
-			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture,0), TRUE);
+			imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index,0), TRUE);
 			// Spam if this is a baked texture, not set to default image, without valid host info
-			if (isIndexBakedTexture((ETextureIndex)texture)
+			if (isIndexBakedTexture((ETextureIndex)texture_index)
 				&& imagep->getID() != IMG_DEFAULT_AVATAR
 				&& !imagep->getTargetHost().isOk())
 			{
@@ -4731,7 +4735,7 @@ BOOL LLVOAvatar::loadAvatar()
 	// avatar_lad.xml : <morph_masks>
 	for (LLVOAvatarXmlInfo::morph_info_list_t::iterator iter = sAvatarXmlInfo->mMorphMaskInfoList.begin();
 		 iter != sAvatarXmlInfo->mMorphMaskInfoList.end();
-		 iter++)
+		 ++iter)
 	{
 		LLVOAvatarXmlInfo::LLVOAvatarMorphInfo *info = *iter;
 
@@ -4755,7 +4759,7 @@ BOOL LLVOAvatar::loadAvatar()
 	// avatar_lad.xml : <driver_parameters>
 	for (LLVOAvatarXmlInfo::driver_info_list_t::iterator iter = sAvatarXmlInfo->mDriverInfoList.begin();
 		 iter != sAvatarXmlInfo->mDriverInfoList.end(); 
-		 iter++)
+		 ++iter)
 	{
 		LLDriverParamInfo *info = *iter;
 		LLDriverParam* driver_param = new LLDriverParam( this );
@@ -4801,7 +4805,8 @@ BOOL LLVOAvatar::loadSkeletonNode ()
 	mRoot.addChild( &mSkeleton[0] );
 
 	for (std::vector<LLViewerJoint *>::iterator iter = mMeshLOD.begin();
-		 iter != mMeshLOD.end(); iter++)
+		 iter != mMeshLOD.end(); 
+		 ++iter)
 	{
 		LLViewerJoint *joint = (LLViewerJoint *) *iter;
 		joint->mUpdateXform = FALSE;
@@ -4837,7 +4842,8 @@ BOOL LLVOAvatar::loadSkeletonNode ()
 	{
 		LLVOAvatarXmlInfo::skeletal_distortion_info_list_t::iterator iter;
 		for (iter = sAvatarXmlInfo->mSkeletalDistortionInfoList.begin();
-			 iter != sAvatarXmlInfo->mSkeletalDistortionInfoList.end(); iter++)
+			 iter != sAvatarXmlInfo->mSkeletalDistortionInfoList.end(); 
+			 ++iter)
 		{
 			LLPolySkeletalDistortionInfo *info = *iter;
 			LLPolySkeletalDistortion *param = new LLPolySkeletalDistortion(this);
@@ -4857,7 +4863,8 @@ BOOL LLVOAvatar::loadSkeletonNode ()
 	{
 		LLVOAvatarXmlInfo::attachment_info_list_t::iterator iter;
 		for (iter = sAvatarXmlInfo->mAttachmentInfoList.begin();
-			 iter != sAvatarXmlInfo->mAttachmentInfoList.end(); iter++)
+			 iter != sAvatarXmlInfo->mAttachmentInfoList.end(); 
+			 ++iter)
 		{
 			LLVOAvatarXmlInfo::LLVOAvatarAttachmentInfo *info = *iter;
 			if (!isSelf() && info->mJointName == "mScreen")
@@ -4938,7 +4945,7 @@ BOOL LLVOAvatar::loadMeshNodes()
 {
 	for (LLVOAvatarXmlInfo::mesh_info_list_t::const_iterator meshinfo_iter = sAvatarXmlInfo->mMeshInfoList.begin();
 		 meshinfo_iter != sAvatarXmlInfo->mMeshInfoList.end(); 
-		 meshinfo_iter++)
+		 ++meshinfo_iter)
 	{
 		const LLVOAvatarXmlInfo::LLVOAvatarMeshInfo *info = *meshinfo_iter;
 		const std::string &type = info->mType;
@@ -4954,7 +4961,7 @@ BOOL LLVOAvatar::loadMeshNodes()
 				mesh = &mHairMesh0; */
 		for (LLVOAvatarDictionary::Meshes::const_iterator mesh_iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin();
 			 mesh_iter != LLVOAvatarDictionary::getInstance()->getMeshes().end();
-			 mesh_iter++)
+			 ++mesh_iter)
 		{
 			const EMeshIndex mesh_index = mesh_iter->first;
 			const LLVOAvatarDictionary::MeshEntry *mesh_dict = mesh_iter->second;
@@ -5026,7 +5033,7 @@ BOOL LLVOAvatar::loadMeshNodes()
 
 		for (LLVOAvatarXmlInfo::LLVOAvatarMeshInfo::morph_info_list_t::const_iterator xmlinfo_iter = info->mPolyMorphTargetInfoList.begin();
 			 xmlinfo_iter != info->mPolyMorphTargetInfoList.end(); 
-			 xmlinfo_iter++)
+			 ++xmlinfo_iter)
 		{
 			const LLVOAvatarXmlInfo::LLVOAvatarMeshInfo::morph_info_pair_t *info_pair = &(*xmlinfo_iter);
 			LLPolyMorphTarget *param = new LLPolyMorphTarget(mesh->getMesh());
@@ -5060,7 +5067,7 @@ BOOL LLVOAvatar::loadLayersets()
 	BOOL success = TRUE;
 	for (LLVOAvatarXmlInfo::layer_info_list_t::const_iterator layerset_iter = sAvatarXmlInfo->mLayerInfoList.begin();
 		 layerset_iter != sAvatarXmlInfo->mLayerInfoList.end(); 
-		 layerset_iter++)
+		 ++layerset_iter)
 	{
 		// Construct a layerset for each one specified in avatar_lad.xml and initialize it as such.
 		LLTexLayerSetInfo *layerset_info = *layerset_iter;
@@ -5467,7 +5474,7 @@ U32 LLVOAvatar::getNumAttachments() const
 	U32 num_attachments = 0;
 	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
 		 iter != mAttachmentPoints.end();
-		 iter++)
+		 ++iter)
 	{
 		const LLViewerJointAttachment *attachment_pt = (*iter).second;
 		num_attachments += attachment_pt->getNumObjects();
@@ -5508,10 +5515,10 @@ void LLVOAvatar::lazyAttach()
 void LLVOAvatar::resetHUDAttachments()
 {
 	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
+		LLViewerJointAttachment* attachment = iter->second;
 		if (attachment->getIsHUDAttachment())
 		{
 			for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
@@ -5534,55 +5541,15 @@ void LLVOAvatar::resetHUDAttachments()
 BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
 {
 	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
+		LLViewerJointAttachment* attachment = iter->second;
 
 		if (attachment->isObjectAttached(viewer_object))
 		{
-			LLUUID item_id = viewer_object->getItemID();
 			attachment->removeObject(viewer_object);
-			if (isSelf())
-			{
-				// the simulator should automatically handle
-				// permission revocation
-				
-				stopMotionFromSource(viewer_object->getID());
-				LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE);
-				
-				LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
-				for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
-					 iter != child_list.end(); iter++)
-				{
-					LLViewerObject* child_objectp = *iter;
-					// the simulator should automatically handle
-					// permissions revocation
-					
-					stopMotionFromSource(child_objectp->getID());
-					LLFollowCamMgr::setCameraActive(child_objectp->getID(), FALSE);
-				}
-			}
 			lldebugs << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << llendl;
-			if (isSelf())
-			{
-				// Then make sure the inventory is in sync with the avatar.
-				
-				// Update COF contents, don't trigger appearance update.
-				if (gAgent.getAvatarObject() == NULL)
-				{
-					llinfos << "removeItemLinks skipped, avatar is under destruction" << llendl;
-				}
-				else
-				{
-					LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
-					LLAppearanceManager::removeItemLinks(item_id, false);
-				}
-				
-				// BAP - needs to change for label to track link.
-				gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-				gInventory.notifyObservers();
-			}
 			return TRUE;
 		}
 	}
@@ -5667,7 +5634,7 @@ void LLVOAvatar::getOffObject()
 
 		LLViewerObject::const_child_list_t& child_list = sit_object->getChildren();
 		for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
-			 iter != child_list.end(); iter++)
+			 iter != child_list.end(); ++iter)
 		{
 			LLViewerObject* child_objectp = *iter;
 
@@ -5837,9 +5804,38 @@ BOOL LLVOAvatar::updateIsFullyLoaded()
 		loading = TRUE;
 	}
 	
+	updateRuthTimer(loading);
 	return processFullyLoadedChange(loading);
 }
 
+void LLVOAvatar::updateRuthTimer(bool loading)
+{
+	if (isSelf() || !loading) 
+	{
+		return;
+	}
+
+	if (mPreviousFullyLoaded)
+	{
+		mRuthTimer.reset();
+	}
+	
+	const F32 LOADING_TIMEOUT = 120.f;
+	if (mRuthTimer.getElapsedTimeF32() > LOADING_TIMEOUT)
+	{
+		/*
+		llinfos << "Ruth Timer timeout: Missing texture data for '" << getFullname() << "' "
+				<< "( Params loaded : " << !visualParamWeightsAreDefault() << " ) "
+				<< "( Lower : " << isTextureDefined(TEX_LOWER_BAKED) << " ) "
+				<< "( Upper : " << isTextureDefined(TEX_UPPER_BAKED) << " ) "
+				<< "( Head : " << isTextureDefined(TEX_HEAD_BAKED) << " )."
+				<< llendl;
+		*/
+		LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID());
+		mRuthTimer.reset();
+	}
+}
+
 BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
 {
 	// we wait a little bit before giving the all clear,
@@ -6008,14 +6004,14 @@ void LLVOAvatar::updateMeshTextures()
 	
 	for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
 		 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
-		 baked_iter++)
+		 ++baked_iter)
 	{
 		const EBakedTextureIndex baked_index = baked_iter->first;
 		const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
 		
 		for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
 			 local_tex_iter != baked_dict->mLocalTextures.end();
-			 local_tex_iter++)
+			 ++local_tex_iter)
 		{
 			const ETextureIndex texture_index = *local_tex_iter;
 			const BOOL is_baked_ready = (is_layer_baked[baked_index] && mBakedTextureDatas[baked_index].mIsLoaded) || other_culled;
@@ -6039,7 +6035,7 @@ void LLVOAvatar::setLocalTexture( ETextureIndex type, LLViewerTexture* in_tex, B
 }
 
 //virtual 
-void	LLVOAvatar::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)
+void LLVOAvatar::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)
 {
 	// invalid for anyone but self
 	llassert(0);
@@ -6131,7 +6127,7 @@ void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_com
 	}
 
 	for (morph_list_t::const_iterator iter = mBakedTextureDatas[index].mMaskedMorphs.begin();
-		 iter != mBakedTextureDatas[index].mMaskedMorphs.end(); iter++)
+		 iter != mBakedTextureDatas[index].mMaskedMorphs.end(); ++iter)
 	{
 		const LLMaskedMorph* maskedMorph = (*iter);
 		maskedMorph->mMorphTarget->applyMask(tex_data, width, height, num_components, maskedMorph->mInvert);
@@ -6283,7 +6279,7 @@ void LLVOAvatar::dumpAvatarTEs( const std::string& context )
 	llinfos << (isSelf() ? "Self: " : "Other: ") << context << llendl;
 	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
 		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
-		 iter++)
+		 ++iter)
 	{
 		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
 		// TODO: handle multiple textures for self
@@ -6332,7 +6328,7 @@ BOOL LLVOAvatar::isWearingWearableType(EWearableType type) const
 			indicator_te = TEX_UPPER_SHIRT; */
 	for (LLVOAvatarDictionary::Textures::const_iterator tex_iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
 		 tex_iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
-		 tex_iter++)
+		 ++tex_iter)
 	{
 		const LLVOAvatarDictionary::TextureEntry *texture_dict = tex_iter->second;
 		if (texture_dict->mWearableType == type)
@@ -6363,10 +6359,10 @@ void LLVOAvatar::clampAttachmentPositions()
 		return;
 	}
 	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
+		LLViewerJointAttachment* attachment = iter->second;
 		if (attachment)
 		{
 			attachment->clampObjectPosition();
@@ -6377,10 +6373,10 @@ void LLVOAvatar::clampAttachmentPositions()
 BOOL LLVOAvatar::hasHUDAttachment() const
 {
 	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::const_iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
+		LLViewerJointAttachment* attachment = iter->second;
 		if (attachment->getIsHUDAttachment() && attachment->getNumObjects() > 0)
 		{
 			return TRUE;
@@ -6393,10 +6389,10 @@ LLBBox LLVOAvatar::getHUDBBox() const
 {
 	LLBBox bbox;
 	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::const_iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
+		LLViewerJointAttachment* attachment = iter->second;
 		if (attachment->getIsHUDAttachment())
 		{
 			for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
@@ -6410,7 +6406,8 @@ LLBBox LLVOAvatar::getHUDBBox() const
 				bbox.addBBoxAgent(attached_object->getBoundingBoxAgent());
 				LLViewerObject::const_child_list_t& child_list = attached_object->getChildren();
 				for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
-					 iter != child_list.end(); iter++)
+					 iter != child_list.end(); 
+					 ++iter)
 				{
 					const LLViewerObject* child_objectp = *iter;
 					bbox.addBBoxAgent(child_objectp->getBoundingBoxAgent());
@@ -6691,7 +6688,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
 			BOOL found_texture_id = false;
 			for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
 				 iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
-				 iter++)
+				 ++iter)
 			{
 
 				const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
@@ -6802,9 +6799,9 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
 			const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);
 			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
 				 local_tex_iter != baked_dict->mLocalTextures.end();
-				 local_tex_iter++)
+				 ++local_tex_iter)
 			{
-				this->setBakedReady(*local_tex_iter, TRUE);
+				setBakedReady(*local_tex_iter, TRUE);
 			}
 
 			// ! BACKWARDS COMPATIBILITY !
@@ -7697,7 +7694,7 @@ const std::string LLVOAvatar::getBakedStatusForPrintout() const
 
 	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
 		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
-		 iter++)
+		 ++iter)
 	{
 		const ETextureIndex index = iter->first;
 		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
@@ -7802,7 +7799,8 @@ U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures)
 
 	LLViewerObject::const_child_list_t& child_list = volume->getChildren();
 	for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
-		 iter != child_list.end(); iter++)
+		 iter != child_list.end(); 
+		 ++iter)
 	{
 		const LLViewerObject* child_objectp = *iter;
 		const LLDrawable* child_drawablep = child_objectp->mDrawable;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 1180d4343896fad94bb23ff1da46098c5f5f61f3..e3add8aa78f2dcd3d802d87133dcaa7e0adbbc94 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -195,7 +195,6 @@ class LLVOAvatar :
 public:
 	virtual bool 	isSelf() const { return false; } // True if this avatar is for this viewer's agent
 	bool isBuilt() const { return mIsBuilt; }
-	
 private:
 	BOOL			mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients
 
@@ -247,15 +246,18 @@ class LLVOAvatar :
 	//--------------------------------------------------------------------
 public:
 	BOOL			isFullyLoaded() const;
+protected:
 	virtual BOOL	updateIsFullyLoaded();
 	BOOL			processFullyLoadedChange(bool loading);
+	void			updateRuthTimer(bool loading);
 private:
 	BOOL			mFullyLoaded;
 	BOOL			mPreviousFullyLoaded;
 	BOOL			mFullyLoadedInitialized;
 	S32				mFullyLoadedFrameCounter;
 	LLFrameTimer	mFullyLoadedTimer;
-
+	LLFrameTimer	mRuthTimer;
+	
 /**                    State
  **                                                                            **
  *******************************************************************************/
@@ -649,7 +651,7 @@ class LLVOAvatar :
 public:
 	void 				clampAttachmentPositions();
 	virtual const LLViewerJointAttachment* attachObject(LLViewerObject *viewer_object);
-	BOOL 				detachObject(LLViewerObject *viewer_object);
+	virtual BOOL 		detachObject(LLViewerObject *viewer_object);
 	static LLVOAvatar*  findAvatarFromAttachment(LLViewerObject* obj);
 protected:
 	LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object);
@@ -800,7 +802,6 @@ class LLVOAvatar :
 	BOOL			isSitting(){return mIsSitting;}
 	void 			sitOnObject(LLViewerObject *sit_object);
 	void 			getOffObject();
-	
 private:
 	// set this property only with LLVOAvatar::sitDown method
 	BOOL 			mIsSitting;
diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp
index 978a61972f805d894a1e5228cbcd90692f36a524..17b502ae80e9c51f914fd99948a2c79b0648a638 100644
--- a/indra/newview/llvoavatardefines.cpp
+++ b/indra/newview/llvoavatardefines.cpp
@@ -61,14 +61,17 @@ LLVOAvatarDictionary::Textures::Textures()
 	addEntry(TEX_UPPER_UNDERSHIRT,            new TextureEntry("upper_undershirt", TRUE,  BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", WT_UNDERSHIRT));
 	addEntry(TEX_LOWER_UNDERPANTS,            new TextureEntry("lower_underpants", TRUE,  BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", WT_UNDERPANTS));
 	addEntry(TEX_SKIRT,                       new TextureEntry("skirt",            TRUE,  BAKED_NUM_INDICES, "UIImgDefaultSkirtUUID",     WT_SKIRT));
+
 	addEntry(TEX_LOWER_ALPHA,                 new TextureEntry("lower_alpha",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     WT_ALPHA));
 	addEntry(TEX_UPPER_ALPHA,                 new TextureEntry("upper_alpha",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     WT_ALPHA));
 	addEntry(TEX_HEAD_ALPHA,                  new TextureEntry("head_alpha",       TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     WT_ALPHA));
 	addEntry(TEX_EYES_ALPHA,                  new TextureEntry("eyes_alpha",       TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     WT_ALPHA));
 	addEntry(TEX_HAIR_ALPHA,                  new TextureEntry("hair_alpha",       TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     WT_ALPHA));
+
 	addEntry(TEX_HEAD_TATTOO,                 new TextureEntry("head_tattoo",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultTattooUUID",     WT_TATTOO));
 	addEntry(TEX_UPPER_TATTOO,                new TextureEntry("upper_tattoo",     TRUE,  BAKED_NUM_INDICES, "UIImgDefaultTattooUUID",     WT_TATTOO));
 	addEntry(TEX_LOWER_TATTOO,                new TextureEntry("lower_tattoo",     TRUE,  BAKED_NUM_INDICES, "UIImgDefaultTattooUUID",     WT_TATTOO));
+
 	addEntry(TEX_HEAD_BAKED,                  new TextureEntry("head-baked",       FALSE, BAKED_HEAD));
 	addEntry(TEX_UPPER_BAKED,                 new TextureEntry("upper-baked",      FALSE, BAKED_UPPER));
 	addEntry(TEX_LOWER_BAKED,                 new TextureEntry("lower-baked",      FALSE, BAKED_LOWER));
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 99e358f4095510bcef908fb9565815eaec7e4f70..4760d5a4725a8b9e0723879325e84282a6cfed61 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -296,10 +296,10 @@ BOOL LLVOAvatarSelf::buildMenus()
 		{
 			BOOL attachment_found = FALSE;
 			for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-				 iter != mAttachmentPoints.end(); )
+				 iter != mAttachmentPoints.end();
+				 ++iter)
 			{
-				attachment_map_t::iterator curiter = iter++;
-				LLViewerJointAttachment* attachment = curiter->second;
+				LLViewerJointAttachment* attachment = iter->second;
 				if (attachment->getGroup() == i)
 				{
 					LLMenuItemCallGL::Params item_params;
@@ -315,9 +315,9 @@ BOOL LLVOAvatarSelf::buildMenus()
 					}
 					item_params.name =(item_params.label );
 					item_params.on_click.function_name = "Object.AttachToAvatar";
-					item_params.on_click.parameter = curiter->first;
+					item_params.on_click.parameter = iter->first;
 					item_params.on_enable.function_name = "Object.EnableWear";
-					item_params.on_enable.parameter = curiter->first;
+					item_params.on_enable.parameter = iter->first;
 					LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
 
 					gAttachPieMenu->addChild(item);
@@ -342,10 +342,10 @@ BOOL LLVOAvatarSelf::buildMenus()
 		{
 			BOOL attachment_found = FALSE;
 			for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-				 iter != mAttachmentPoints.end(); )
+				 iter != mAttachmentPoints.end();
+				 ++iter)
 			{
-				attachment_map_t::iterator curiter = iter++;
-				LLViewerJointAttachment* attachment = curiter->second;
+				LLViewerJointAttachment* attachment = iter->second;
 				if (attachment->getGroup() == i)
 				{
 					LLMenuItemCallGL::Params item_params;
@@ -360,9 +360,9 @@ BOOL LLVOAvatarSelf::buildMenus()
 					}
 					item_params.name =(item_params.label );
 					item_params.on_click.function_name = "Attachment.Detach";
-					item_params.on_click.parameter = curiter->first;
+					item_params.on_click.parameter = iter->first;
 					item_params.on_enable.function_name = "Attachment.EnableDetach";
-					item_params.on_enable.parameter = curiter->first;
+					item_params.on_enable.parameter = iter->first;
 					LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
 
 					gDetachPieMenu->addChild(item);
@@ -381,10 +381,10 @@ BOOL LLVOAvatarSelf::buildMenus()
 
 	// add screen attachments
 	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
+		LLViewerJointAttachment* attachment = iter->second;
 		if (attachment->getGroup() == 8)
 		{
 			LLMenuItemCallGL::Params item_params;
@@ -399,16 +399,16 @@ BOOL LLVOAvatarSelf::buildMenus()
 			}
 			item_params.name =(item_params.label );
 			item_params.on_click.function_name = "Object.AttachToAvatar";
-			item_params.on_click.parameter = curiter->first;
+			item_params.on_click.parameter = iter->first;
 			item_params.on_enable.function_name = "Object.EnableWear";
-			item_params.on_enable.parameter = curiter->first;			
+			item_params.on_enable.parameter = iter->first;
 			LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
 			gAttachScreenPieMenu->addChild(item);
 
 			item_params.on_click.function_name = "Attachment.DetachFromPoint";
-			item_params.on_click.parameter = curiter->first;
+			item_params.on_click.parameter = iter->first;
 			item_params.on_enable.function_name = "Attachment.PointFilled";
-			item_params.on_enable.parameter = curiter->first;
+			item_params.on_enable.parameter = iter->first;
 			item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
 			gDetachScreenPieMenu->addChild(item);
 		}
@@ -422,10 +422,10 @@ BOOL LLVOAvatarSelf::buildMenus()
 			break;
 		}
 		for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-			 iter != mAttachmentPoints.end(); )
+			 iter != mAttachmentPoints.end();
+			 ++iter)
 		{
-			attachment_map_t::iterator curiter = iter++;
-			LLViewerJointAttachment* attachment = curiter->second;
+			LLViewerJointAttachment* attachment = iter->second;
 			if (attachment->getIsHUDAttachment() != (pass == 1))
 			{
 				continue;
@@ -442,12 +442,12 @@ BOOL LLVOAvatarSelf::buildMenus()
 			}
 			item_params.name =(item_params.label );
 			item_params.on_click.function_name = "Object.AttachToAvatar";
-			item_params.on_click.parameter = curiter->first;
+			item_params.on_click.parameter = iter->first;
 			item_params.on_enable.function_name = "Object.EnableWear";
-			item_params.on_enable.parameter = curiter->first;
+			item_params.on_enable.parameter = iter->first;
 			//* TODO: Skinning:
 			//LLSD params;
-			//params["index"] = curiter->first;
+			//params["index"] = iter->first;
 			//params["label"] = attachment->getName();
 			//item->addEventHandler("on_enable", LLMenuItemCallGL::MenuCallback().function_name("Attachment.Label").parameter(params));
 				
@@ -455,9 +455,9 @@ BOOL LLVOAvatarSelf::buildMenus()
 			gAttachSubMenu->addChild(item);
 
 			item_params.on_click.function_name = "Attachment.DetachFromPoint";
-			item_params.on_click.parameter = curiter->first;
+			item_params.on_click.parameter = iter->first;
 			item_params.on_enable.function_name = "Attachment.PointFilled";
-			item_params.on_enable.parameter = curiter->first;
+			item_params.on_enable.parameter = iter->first;
 			//* TODO: Skinning: item->addEventHandler("on_enable", LLMenuItemCallGL::MenuCallback().function_name("Attachment.Label").parameter(params));
 
 			item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
@@ -483,15 +483,15 @@ BOOL LLVOAvatarSelf::buildMenus()
 
 		// gather up all attachment points assigned to this group, and throw into map sorted by pie slice number
 		for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-			 iter != mAttachmentPoints.end(); )
+			 iter != mAttachmentPoints.end();
+			 ++iter)
 		{
-			attachment_map_t::iterator curiter = iter++;
-			LLViewerJointAttachment* attachment = curiter->second;
+			LLViewerJointAttachment* attachment = iter->second;
 			if(attachment->getGroup() == group)
 			{
 				// use multimap to provide a partial order off of the pie slice key
 				S32 pie_index = attachment->getPieSlice();
-				attachment_pie_menu_map.insert(std::make_pair(pie_index, curiter->first));
+				attachment_pie_menu_map.insert(std::make_pair(pie_index, iter->first));
 			}
 		}
 
@@ -556,7 +556,7 @@ BOOL LLVOAvatarSelf::loadLayersets()
 	BOOL success = TRUE;
 	for (LLVOAvatarXmlInfo::layer_info_list_t::const_iterator iter = sAvatarXmlInfo->mLayerInfoList.begin();
 		 iter != sAvatarXmlInfo->mLayerInfoList.end(); 
-		 iter++)
+		 ++iter)
 	{
 		// Construct a layerset for each one specified in avatar_lad.xml and initialize it as such.
 		const LLTexLayerSetInfo *info = *iter;
@@ -574,7 +574,7 @@ BOOL LLVOAvatarSelf::loadLayersets()
 		EBakedTextureIndex baked_index = BAKED_NUM_INDICES;
 		for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
 			 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
-			 baked_iter++)
+			 ++baked_iter)
 		{
 			const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
 			if (layer_set->isBodyRegion(baked_dict->mName))
@@ -597,7 +597,7 @@ BOOL LLVOAvatarSelf::loadLayersets()
 		// scan morph masks and let any affected layers know they have an associated morph
 		for (LLVOAvatar::morph_list_t::const_iterator morph_iter = mBakedTextureDatas[baked_index].mMaskedMorphs.begin();
 			morph_iter != mBakedTextureDatas[baked_index].mMaskedMorphs.end();
-			morph_iter++)
+			 ++morph_iter)
 		{
 			LLMaskedMorph *morph = *morph_iter;
 			LLTexLayerInterface* layer = layer_set->findLayerByName(morph->mLayer);
@@ -704,6 +704,13 @@ void LLVOAvatarSelf::updateVisualParams()
 		}
 	}
 
+	LLWearable *shape = gAgentWearables.getWearable(WT_SHAPE,0);
+	if (shape)
+	{
+		F32 gender = shape->getVisualParamWeight(80); // param 80 == gender
+		setVisualParamWeight("male",gender ,TRUE);
+	}
+
 	LLVOAvatar::updateVisualParams();
 }
 
@@ -907,10 +914,10 @@ void LLVOAvatarSelf::restoreMeshData()
 void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)
 {
 	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
+		LLViewerJointAttachment* attachment = iter->second;
 		if (attachment->getIsHUDAttachment())
 		{
 			attachment->setAttachmentVisibility(TRUE);
@@ -951,7 +958,7 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type )
 {
 	for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
 		 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
-		 baked_iter++)
+		 ++baked_iter)
 	{
 		const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
 		const LLVOAvatarDefines::EBakedTextureIndex index = baked_iter->first;
@@ -959,15 +966,14 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type )
 		{
 			for (LLVOAvatarDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin();
 				type_iter != baked_dict->mWearables.end();
-				type_iter++)
+				 ++type_iter)
 			{
 				const EWearableType comp_type = *type_iter;
 				if (comp_type == type)
 				{
 					if (mBakedTextureDatas[index].mTexLayerSet)
 					{
-						mBakedTextureDatas[index].mTexLayerSet->requestUpdate();
-						mBakedTextureDatas[index].mTexLayerSet->requestUpload();
+						invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, TRUE);
 					}
 					break;
 				}
@@ -979,57 +985,34 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type )
 //-----------------------------------------------------------------------------
 // isWearingAttachment()
 //-----------------------------------------------------------------------------
-// Warning: include_linked_items = TRUE makes this operation expensive.
-BOOL LLVOAvatarSelf::isWearingAttachment( const LLUUID& inv_item_id , BOOL include_linked_items ) const
+BOOL LLVOAvatarSelf::isWearingAttachment(const LLUUID& inv_item_id) const
 {
+	const LLUUID& base_inv_item_id = gInventory.getLinkedItemID(inv_item_id);
 	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::const_iterator curiter = iter++;
-		const LLViewerJointAttachment* attachment = curiter->second;
-		if (attachment->getAttachedObject(inv_item_id))
+		const LLViewerJointAttachment* attachment = iter->second;
+		if (attachment->getAttachedObject(base_inv_item_id))
 		{
 			return TRUE;
 		}
 	}
-
-	if (include_linked_items)
-	{
-		LLInventoryModel::item_array_t item_array;
-		gInventory.collectLinkedItems(inv_item_id, item_array);
-		for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
-			 iter != item_array.end();
-			 iter++)
-		{
-			const LLViewerInventoryItem *linked_item = (*iter);
-			const LLUUID &item_id = linked_item->getUUID();
-			for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
-				 iter != mAttachmentPoints.end(); )
-			{
-				attachment_map_t::const_iterator curiter = iter++;
-				const LLViewerJointAttachment* attachment = curiter->second;
-				if (attachment->getAttachedObject(item_id))
-				{
-					return TRUE;
-				}
-			}
-		}
-	}
-
 	return FALSE;
 }
 
 //-----------------------------------------------------------------------------
 // getWornAttachment()
 //-----------------------------------------------------------------------------
-LLViewerObject* LLVOAvatarSelf::getWornAttachment( const LLUUID& inv_item_id )
+LLViewerObject* LLVOAvatarSelf::getWornAttachment(const LLUUID& inv_item_id)
 {
-	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+	const LLUUID& base_inv_item_id = gInventory.getLinkedItemID(inv_item_id);
+	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
+		 iter != mAttachmentPoints.end();
+		 ++iter)
 	{
-		attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
- 		if (LLViewerObject *attached_object = attachment->getAttachedObject(inv_item_id))
+		LLViewerJointAttachment* attachment = iter->second;
+ 		if (LLViewerObject *attached_object = attachment->getAttachedObject(base_inv_item_id))
 		{
 			return attached_object;
 		}
@@ -1039,12 +1022,13 @@ LLViewerObject* LLVOAvatarSelf::getWornAttachment( const LLUUID& inv_item_id )
 
 const std::string LLVOAvatarSelf::getAttachedPointName(const LLUUID& inv_item_id) const
 {
+	const LLUUID& base_inv_item_id = gInventory.getLinkedItemID(inv_item_id);
 	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
-		 iter != mAttachmentPoints.end(); )
+		 iter != mAttachmentPoints.end(); 
+		 ++iter)
 	{
-		attachment_map_t::const_iterator curiter = iter++;
-		const LLViewerJointAttachment* attachment = curiter->second;
-		if (attachment->getAttachedObject(inv_item_id))
+		const LLViewerJointAttachment* attachment = iter->second;
+		if (attachment->getAttachedObject(base_inv_item_id))
 		{
 			return attachment->getName();
 		}
@@ -1078,12 +1062,56 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
 			gInventory.addChangedMask(LLInventoryObserver::LABEL, attachment_id);
 		}
 	}
-
 	gInventory.notifyObservers();
 
 	return attachment;
 }
 
+//virtual
+BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
+{
+	const LLUUID item_id = viewer_object->getItemID();
+	if (LLVOAvatar::detachObject(viewer_object))
+	{
+		// the simulator should automatically handle permission revocation
+		
+		stopMotionFromSource(item_id);
+		LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE);
+		
+		LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
+		for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+			 iter != child_list.end(); 
+			 ++iter)
+		{
+			LLViewerObject* child_objectp = *iter;
+			// the simulator should automatically handle
+			// permissions revocation
+			
+			stopMotionFromSource(child_objectp->getID());
+			LLFollowCamMgr::setCameraActive(child_objectp->getID(), FALSE);
+		}
+		
+		// Make sure the inventory is in sync with the avatar.
+
+		// Update COF contents, don't trigger appearance update.
+		if (gAgent.getAvatarObject() == NULL)
+		{
+			llinfos << "removeItemLinks skipped, avatar is under destruction" << llendl;
+		}
+		else
+		{
+			LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
+			LLAppearanceManager::removeItemLinks(item_id, false);
+		}
+		
+		// BAP - needs to change for label to track link.
+		gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+		gInventory.notifyObservers();
+		return TRUE;
+	}
+	return FALSE;
+}
+
 void LLVOAvatarSelf::getAllAttachmentsArray(LLDynamicArray<S32>& attachments)
 {
 	for (LLVOAvatar::attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
@@ -1235,7 +1263,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)
 	   return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */
 	for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
 		 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
-		 baked_iter++)
+		 ++baked_iter)
 	{
 		const EBakedTextureIndex baked_index = baked_iter->first;
 		if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet)
@@ -1244,7 +1272,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)
 			const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
 			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
 				 local_tex_iter != baked_dict->mLocalTextures.end();
-				 local_tex_iter++)
+				 ++local_tex_iter)
 			{
 				const ETextureIndex tex_index = *local_tex_iter;
 				const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
@@ -1276,7 +1304,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons
 			const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);
 			for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
 				 local_tex_iter != baked_dict->mLocalTextures.end();
-				 local_tex_iter++)
+				 ++local_tex_iter)
 			{
 				const ETextureIndex tex_index = *local_tex_iter;
 				const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
@@ -1562,7 +1590,7 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te
 	setBakedReady(type,baked_version_ready,index);
 }
 //virtual
-void	LLVOAvatarSelf::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)
+void LLVOAvatarSelf::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)
 {
 	if (!isIndexLocalTexture(type)) return;
 	LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type,index);
@@ -1583,7 +1611,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const
 	   if (isTextureDefined(baked_equiv[i])) */
 	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
 		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
-		 iter++)
+		 ++iter)
 	{
 		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
 		if (!texture_dict->mIsLocalTexture || !texture_dict->mIsUsedByBakedTexture)
@@ -1773,7 +1801,7 @@ BOOL LLVOAvatarSelf::canGrabLocalTexture(ETextureIndex type, U32 index) const
 	const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index);
 	for (texture_vec_t::const_iterator iter = baked_dict->mLocalTextures.begin();
 		 iter != baked_dict->mLocalTextures.end();
-		 iter++)
+		 ++iter)
 	{
 		const ETextureIndex t_index = (*iter);
 		lldebugs << "Checking index " << (U32) t_index << llendl;
@@ -1949,7 +1977,7 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
 			TEX_UPPER_BAKED, */
 	for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
 		 iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
-		 iter++)
+		 ++iter)
 	{
 		const ETextureIndex index = iter->first;
 		const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 0b76d3e960082eec1f973a7ae1146e746c2da6ea..a555d04a6331d4105725ec4171e044b4924a0e37 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -187,8 +187,8 @@ class LLVOAvatarSelf :
 	void				setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_by_user, U32 index);
 	const LLUUID&		grabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
 	BOOL				canGrabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
-protected:
 	/*virtual*/ void	setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index);
+protected:
 	/*virtual*/ void	setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index);
 	void				localTextureLoaded(BOOL succcess, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
 	void				getLocalTextureByteCount(S32* gl_byte_count) const;
@@ -198,8 +198,8 @@ class LLVOAvatarSelf :
 private:
 	static void			onLocalTextureLoaded(BOOL succcess, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
 
-	/*virtual*/	void				setImage(const U8 te, LLViewerTexture *imagep, const U32 index); 
-	/*virtual*/ LLViewerTexture*		getImage(const U8 te, const U32 index) const;
+	/*virtual*/	void	setImage(const U8 te, LLViewerTexture *imagep, const U32 index); 
+	/*virtual*/ LLViewerTexture* getImage(const U8 te, const U32 index) const;
 
 
 	//--------------------------------------------------------------------
@@ -220,7 +220,6 @@ class LLVOAvatarSelf :
 public:
 	void 				requestLayerSetUploads();
 	void				requestLayerSetUpdate(LLVOAvatarDefines::ETextureIndex i);
-public:
 	LLTexLayerSet*		getLayerSet(LLVOAvatarDefines::ETextureIndex index) const;
 	
 	//--------------------------------------------------------------------
@@ -267,26 +266,27 @@ class LLVOAvatarSelf :
  **/
 
 public:
-	/*virtual*/ BOOL			isWearingWearableType(EWearableType type ) const;
-	void			wearableUpdated(EWearableType type);
+	/*virtual*/ BOOL	isWearingWearableType(EWearableType type) const;
+	void				wearableUpdated(EWearableType type);
+protected:
+	U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const;
 
 	//--------------------------------------------------------------------
 	// Attachments
 	//--------------------------------------------------------------------
 public:
 	void 				updateAttachmentVisibility(U32 camera_mode);
-	BOOL 				isWearingAttachment(const LLUUID& inv_item_id, BOOL include_linked_items = FALSE) const;
-	LLViewerObject* 	getWornAttachment(const LLUUID& inv_item_id );
+	BOOL 				isWearingAttachment(const LLUUID& inv_item_id) const;
+	LLViewerObject* 	getWornAttachment(const LLUUID& inv_item_id);
 	const std::string   getAttachedPointName(const LLUUID& inv_item_id) const;
 	/*virtual*/ const LLViewerJointAttachment *attachObject(LLViewerObject *viewer_object);
+	/*virtual*/ BOOL 	detachObject(LLViewerObject *viewer_object);
 	void				getAllAttachmentsArray(LLDynamicArray<S32>& attachments);
 
 	//--------------------------------------------------------------------
 	// HUDs
 	//--------------------------------------------------------------------
 private:
-	U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const;
-
 	LLViewerJoint* 		mScreenp; // special purpose joint for HUD attachments
 	
 /**                    Attachments
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 09e8c522b041f93dc78385f801b1716dcb270e58..8f74ea29ac7764a79e861f3f5653bb3db54bfa2f 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -35,6 +35,7 @@
 #include "llagent.h"
 #include "llagentwearables.h"
 #include "llfloatercustomize.h"
+#include "lllocaltextureobject.h"
 #include "llviewertexturelist.h"
 #include "llinventorymodel.h"
 #include "llviewerregion.h"
@@ -138,11 +139,12 @@ BOOL LLWearable::exportFile(LLFILE* file) const
 		return FALSE;
 	}
 
-	for (VisualParamIndexMap_t::const_iterator iter = mVisualParamIndexMap.begin();
-		 iter != mVisualParamIndexMap.end(); ++iter)
+	for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin();
+		 iter != mVisualParamIndexMap.end(); 
+		 ++iter)
 	{
 		S32 param_id = iter->first;
-		LLVisualParam* param = iter->second;
+		const LLVisualParam* param = iter->second;
 		F32 param_weight = param->getWeight();
 		if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight ).c_str() ) < 0 )
 		{
@@ -173,13 +175,13 @@ BOOL LLWearable::exportFile(LLFILE* file) const
 void LLWearable::createVisualParams()
 {
 	LLVOAvatar* avatar = gAgent.getAvatarObject();
-	for( LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam(); 
-	param;
-	param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
+	for (LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam(); 
+		 param;
+		 param = (LLViewerVisualParam*) avatar->getNextVisualParam())
 	{
-		if( (param->getWearableType() == mType) )
+		if (param->getWearableType() == mType)
 		{
-			if( mVisualParamIndexMap[param->getID()] )
+			if (mVisualParamIndexMap[param->getID()])
 			{
 				delete mVisualParamIndexMap[param->getID()];
 			}
@@ -188,7 +190,9 @@ void LLWearable::createVisualParams()
 	}
 
 	// resync driver parameters to point to the newly cloned driven parameters
-	for( VisualParamIndexMap_t::iterator param_iter = mVisualParamIndexMap.begin(); param_iter != mVisualParamIndexMap.end(); param_iter++ )
+	for (visual_param_index_map_t::iterator param_iter = mVisualParamIndexMap.begin(); 
+		 param_iter != mVisualParamIndexMap.end(); 
+		 ++param_iter)
 	{
 		LLVisualParam* param = param_iter->second;
 		LLVisualParam*(LLWearable::*wearable_function)(S32)const = &LLWearable::getVisualParam; 
@@ -404,9 +408,10 @@ BOOL LLWearable::importFile( LLFILE* file )
 		{
 			delete mSavedTEMap[te];
 		}
-		
-		mTEMap[te] = new LLLocalTextureObject(image, LLUUID(text_buffer));
-		mSavedTEMap[te] = new LLLocalTextureObject(image, LLUUID(text_buffer));
+
+		LLUUID textureid(text_buffer);
+		mTEMap[te] = new LLLocalTextureObject(image, textureid);
+		mSavedTEMap[te] = new LLLocalTextureObject(image, textureid);
 		createLayers(te);
 	}
 
@@ -533,6 +538,7 @@ BOOL LLWearable::isDirty() const
 					const LLUUID& saved_image_id = saved_iter->second->getID();
 					if (saved_image_id != current_image_id)
 					{
+						// saved vs current images are different, wearable is dirty
 						return TRUE;
 					}
 				}
@@ -873,7 +879,7 @@ void LLWearable::setVisualParams()
 {
 	LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
 
-	for (VisualParamIndexMap_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++)
+	for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++)
 	{
 		S32 id = iter->first;
 		LLVisualParam *wearable_param = iter->second;
@@ -912,15 +918,15 @@ F32 LLWearable::getVisualParamWeight(S32 param_index) const
 
 LLVisualParam* LLWearable::getVisualParam(S32 index) const
 {
-	VisualParamIndexMap_t::const_iterator iter = mVisualParamIndexMap.find(index);
+	visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.find(index);
 	return (iter == mVisualParamIndexMap.end()) ? NULL : iter->second;
 }
 
 
-void LLWearable::getVisualParams(visualParamCluster_t &list)
+void LLWearable::getVisualParams(visual_param_vec_t &list)
 {
-	VisualParamIndexMap_t::iterator iter = mVisualParamIndexMap.begin();
-	VisualParamIndexMap_t::iterator end = mVisualParamIndexMap.end();
+	visual_param_index_map_t::iterator iter = mVisualParamIndexMap.begin();
+	visual_param_index_map_t::iterator end = mVisualParamIndexMap.end();
 
 	// add all visual params to the passed-in vector
 	for( ; iter != end; ++iter )
@@ -929,7 +935,7 @@ void LLWearable::getVisualParams(visualParamCluster_t &list)
 	}
 }
 
-LLColor4 LLWearable::getClothesColor(S32 te)
+LLColor4 LLWearable::getClothesColor(S32 te) const
 {
 	LLColor4 color;
 	U32 param_name[3];
@@ -973,7 +979,7 @@ void LLWearable::revertValues()
 	}
 }
 
-BOOL LLWearable::isOnTop()
+BOOL LLWearable::isOnTop() const
 { 
 	return (this == gAgentWearables.getTopWearable(mType));
 }
@@ -996,7 +1002,7 @@ void LLWearable::saveValues()
 {
 	//update saved settings so wearable is no longer dirty
 	mSavedVisualParamMap.clear();
-	for (VisualParamIndexMap_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); ++iter)
+	for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); ++iter)
 	{
 		S32 id = iter->first;
 		LLVisualParam *wearable_param = iter->second;
@@ -1174,7 +1180,7 @@ std::ostream& operator<<(std::ostream &s, const LLWearable &w)
 	//w.mSaleInfo
 
 	s << "    Params:" << "\n";
-	for (LLWearable::VisualParamIndexMap_t::const_iterator iter = w.mVisualParamIndexMap.begin();
+	for (LLWearable::visual_param_index_map_t::const_iterator iter = w.mVisualParamIndexMap.begin();
 		 iter != w.mVisualParamIndexMap.end(); ++iter)
 	{
 		S32 param_id = iter->first;
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index 201f4f91ef762ae7998df09ed5c7b26dfb173a2e..01bd9652a5cc15923fb5f680d00240f37488ef9e 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -84,7 +84,7 @@ class LLWearable
 	LLLocalTextureObject*		getLocalTextureObject(S32 index) const;
 
 public:
-	typedef std::vector<LLVisualParam*> visualParamCluster_t;
+	typedef std::vector<LLVisualParam*> visual_param_vec_t;
 
 	BOOL				isDirty() const;
 	BOOL				isOldVersion() const;
@@ -118,19 +118,19 @@ class LLWearable
 	void 				setVisualParamWeight(S32 index, F32 value, BOOL set_by_user);
 	F32					getVisualParamWeight(S32 index) const;
 	LLVisualParam*		getVisualParam(S32 index) const;
-	void				getVisualParams(visualParamCluster_t &list);
+	void				getVisualParams(visual_param_vec_t &list);
 
-	LLColor4			getClothesColor(S32 te);
+	LLColor4			getClothesColor(S32 te) const;
 	void 				setClothesColor( S32 te, const LLColor4& new_color, BOOL set_by_user );
 
 	void				revertValues();
 
-	BOOL				isOnTop();
+	BOOL				isOnTop() const;
 
 
 private:
 	typedef std::map<S32, LLLocalTextureObject*> te_map_t;
-	typedef std::map<S32, LLVisualParam *>    VisualParamIndexMap_t;
+	typedef std::map<S32, LLVisualParam *>    visual_param_index_map_t;
 
 	void 				createLayers(S32 te);
 	void 				createVisualParams();
@@ -151,7 +151,7 @@ class LLWearable
 	typedef std::map<S32, F32> param_map_t;
 	param_map_t mSavedVisualParamMap; // last saved version of visual params
 
-	VisualParamIndexMap_t mVisualParamIndexMap;
+	visual_param_index_map_t mVisualParamIndexMap;
 
 	te_map_t mTEMap;				// maps TE to LocalTextureObject
 	te_map_t mSavedTEMap;			// last saved version of TEMap
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index 0257329dc1f808ce3d77f13e255410f340972da7..da62223aac203da585296d1f9e1623d225df771b 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -74,21 +74,8 @@ LLWearableList::~LLWearableList()
 	mList.clear();
 }
 
-void LLWearableList::getAsset(const LLAssetID& _assetID, const std::string& wearable_name, LLAssetType::EType asset_type, void(*asset_arrived_callback)(LLWearable*, void* userdata), void* userdata)
+void LLWearableList::getAsset(const LLAssetID& assetID, const std::string& wearable_name, LLAssetType::EType asset_type, void(*asset_arrived_callback)(LLWearable*, void* userdata), void* userdata)
 {
-	LLAssetID assetID = _assetID;
-
-	// A bit of a hack since wearables database doesn't contain asset types...
-	// Perform indirection in case this assetID is in fact a link.  This only works
-	// because of the assumption that all assetIDs and itemIDs are unique (i.e.
-	// no assetID is also used as an itemID elsewhere); therefore if the assetID
-	// exists as an itemID in the user's inventory, then this must be a link.
-	const LLInventoryItem *linked_item = gInventory.getItem(_assetID);
-	if (linked_item)
-	{
-		assetID = linked_item->getAssetUUID();
-		asset_type = linked_item->getType();
-	}
 	llassert( (asset_type == LLAssetType::AT_CLOTHING) || (asset_type == LLAssetType::AT_BODYPART) );
 	LLWearable* instance = get_if_there(mList, assetID, (LLWearable*)NULL );
 	if( instance )
diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp
index 10a9703d1a5ceb00c8afc14ed556d18da7500d43..7f0c1a13f3af8f69ad4cccc32a9101ed1e3794b2 100644
--- a/indra/newview/llwldaycycle.cpp
+++ b/indra/newview/llwldaycycle.cpp
@@ -36,6 +36,7 @@
 #include "llsdserialize.h"
 #include "llwlparammanager.h"
 #include "llnotifications.h"
+#include "llxmlnode.h"
 
 #include <map>
 
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 3aad5c7378b7ee322cf56e8fdbe177366a0d5514..823db027eeb872e0a1f9f3927200c37b4910e3a8 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -368,7 +368,7 @@ void LLWorldMapView::draw()
 			continue;
 		}
 		
-		current_image->setBoostLevel(LLViewerTexture::BOOST_MAP_LAYER);
+		current_image->setBoostLevel(LLViewerTexture::BOOST_MAP);
 		current_image->setKnownDrawSize(llround(pix_width * LLUI::sGLScaleFactor.mV[VX]), llround(pix_height * LLUI::sGLScaleFactor.mV[VY]));
 		
 		if (!current_image->hasGLTexture())
diff --git a/indra/newview/skins/default/textures/alpha_gradient.tga b/indra/newview/skins/default/textures/alpha_gradient.tga
new file mode 100644
index 0000000000000000000000000000000000000000..6fdba25d4e080d0fa508aa7bb3a012b0d98dcf6a
Binary files /dev/null and b/indra/newview/skins/default/textures/alpha_gradient.tga differ
diff --git a/indra/newview/skins/default/textures/alpha_gradient_2d.j2c b/indra/newview/skins/default/textures/alpha_gradient_2d.j2c
new file mode 100644
index 0000000000000000000000000000000000000000..5de5a80a656b2487339ad69e3d4e8a48527134a5
Binary files /dev/null and b/indra/newview/skins/default/textures/alpha_gradient_2d.j2c differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 546a06b93f022d63a873bbef493941f03263253e..01976c9a5c2a67ab1965477b7acd653999c4fe30 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -54,6 +54,11 @@
   <texture name="CameraView_Off" file_name="bottomtray/CameraView_Off.png" preload="false" />
   <texture name="CameraView_Over" file_name="bottomtray/CameraView_Over.png" preload="false" />
 
+  <texture name="CameraPreset_Rear" file_name="camera_presets/camera_presets_rear.png" preload="false" />
+  <texture name="CameraPreset_3_4" file_name="camera_presets/camera_presets_3_4.png" preload="false" />
+  <texture name="CameraPreset_Front" file_name="camera_presets/camera_presets_front.png" preload="false" />
+  <texture name="CameraPreset_Mouselook" file_name="camera_presets/camera_presets_mouselook.png" preload="false" />
+
   <texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" />
   <texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" />
   <texture name="Checkbox_Off" file_name="widgets/Checkbox_Off.png" preload="true" />
@@ -118,6 +123,8 @@
   <texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" />
 
   <texture name="Icon_For_Sale" file_name="icons/Icon_For_sale.png" preload="false" />
+  <texture name="Banner_ForSale" file_name="Banner_ForSale.png" preload="false" />
+  <texture name="Banner_YouAreHere" file_name="Banner_YouAreHere.png" preload="false" />
 
   <texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" />
   <texture name="Icon_Gear_Foreground" file_name="windows/Icon_Gear_Foreground.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/favorites_bar_button.xml b/indra/newview/skins/default/xui/en/favorites_bar_button.xml
index a8d3f440c34c7bfdfe8c5dadc674c4699d5ed226..c35cbb15393aa446f5a4cf386518fae8573306b6 100644
--- a/indra/newview/skins/default/xui/en/favorites_bar_button.xml
+++ b/indra/newview/skins/default/xui/en/favorites_bar_button.xml
@@ -4,7 +4,7 @@
 <button
  follows="left|bottom"
  halign="center"
- height="23"
+ height="15"
  image_disabled="transparent.j2c"
  image_disabled_selected="transparent.j2c"
  image_selected="transparent.j2c"
@@ -18,6 +18,6 @@
  left="0"
  name="favorites_bar_btn"
  tab_stop="false"
- top="10"
+ top="0"
  use_ellipses="true"
  width="120" />
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
index f6b965f139512a84836bcaa9d30c52a4c68cc1c2..e677426ee5167fd0e4293e1d6801b84113583026 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
@@ -5,7 +5,7 @@
  name="avatar_texture_debug"
  help_topic="avatar_texture_debug"
  title="Avatar Textures"
- width="960">
+ width="1250">
     <floater.string
      name="InvalidAvatar">
         INVALID AVATAR
@@ -41,6 +41,7 @@
      name="Dump"
      top_delta="1"
      width="150" />
+
     <texture_picker
      height="143"
      label="Hair"
@@ -54,9 +55,18 @@
      label="Hair"
      layout="topleft"
      left_pad="7"
-     name="hair"
+     name="hair_grain"
      top_delta="0"
      width="128" />
+    <texture_picker
+     height="143"
+     label="Hair Alpha"
+     layout="topleft"
+     left_pad="7"
+     name="hair_alpha"
+     top_delta="0"
+     width="128" />
+
     <texture_picker
      height="143"
      label="Head"
@@ -70,9 +80,26 @@
      label="Makeup"
      layout="topleft"
      left_pad="7"
-     name="head bodypaint"
+     name="head_bodypaint"
+     top_delta="0"
+     width="128" />
+    <texture_picker
+     height="143"
+     label="Head Alpha"
+     layout="topleft"
+     left_pad="7"
+     name="head_alpha"
      top_delta="0"
      width="128" />
+    <texture_picker
+     height="143"
+     label="Head Tattoo"
+     layout="topleft"
+     left_pad="7"
+     name="head_tattoo"
+     top_delta="0"
+     width="128" />
+
     <texture_picker
      height="143"
      label="Eyes"
@@ -86,9 +113,18 @@
      label="Eye"
      layout="topleft"
      left_pad="7"
-     name="iris"
+     name="eyes_iris"
+     top_delta="0"
+     width="128" />
+    <texture_picker
+     height="143"
+     label="Eyes Alpha"
+     layout="topleft"
+     left_pad="7"
+     name="eyes_alpha"
      top_delta="0"
      width="128" />
+
     <texture_picker
      height="143"
      label="Upper Body"
@@ -99,10 +135,10 @@
      width="128" />
     <texture_picker
      height="143"
-     label="Upper Body Tattoo"
+     label="Upper Body Bodypaint"
      layout="topleft"
      left_pad="7"
-     name="upper bodypaint"
+     name="upper_bodypaint"
      top_delta="0"
      width="128" />
     <texture_picker
@@ -110,7 +146,7 @@
      label="Undershirt"
      layout="topleft"
      left_pad="7"
-     name="undershirt"
+     name="upper_undershirt"
      top_delta="0"
      width="128" />
     <texture_picker
@@ -118,7 +154,7 @@
      label="Gloves"
      layout="topleft"
      left_pad="7"
-     name="gloves"
+     name="upper_gloves"
      top_delta="0"
      width="128" />
     <texture_picker
@@ -126,7 +162,7 @@
      label="Shirt"
      layout="topleft"
      left_pad="7"
-     name="shirt"
+     name="upper_shirt"
      top_delta="0"
      width="128" />
     <texture_picker
@@ -134,9 +170,26 @@
      label="Upper Jacket"
      layout="topleft"
      left_pad="7"
-     name="upper jacket"
+     name="upper_jacket"
      top_delta="0"
      width="128" />
+    <texture_picker
+     height="143"
+     label="Upper Alpha"
+     layout="topleft"
+     left_pad="7"
+     name="upper_alpha"
+     top_delta="0"
+     width="128" />
+    <texture_picker
+     height="143"
+     label="Upper Tattoo"
+     layout="topleft"
+     left_pad="7"
+     name="upper_tattoo"
+     top_delta="0"
+     width="128" />
+
     <texture_picker
      height="143"
      label="Lower Body"
@@ -147,10 +200,10 @@
      width="128" />
     <texture_picker
      height="143"
-     label="Lower Body Tattoo"
+     label="Lower Body Bodypaint"
      layout="topleft"
      left_pad="7"
-     name="lower bodypaint"
+     name="lower_bodypaint"
      top_delta="0"
      width="128" />
     <texture_picker
@@ -158,7 +211,7 @@
      label="Underpants"
      layout="topleft"
      left_pad="7"
-     name="underpants"
+     name="lower_underpants"
      top_delta="0"
      width="128" />
     <texture_picker
@@ -166,7 +219,7 @@
      label="Socks"
      layout="topleft"
      left_pad="7"
-     name="socks"
+     name="lower_socks"
      top_delta="0"
      width="128" />
     <texture_picker
@@ -174,7 +227,7 @@
      label="Shoes"
      layout="topleft"
      left_pad="7"
-     name="shoes"
+     name="lower_shoes"
      top_delta="0"
      width="128" />
     <texture_picker
@@ -182,7 +235,7 @@
      label="Pants"
      layout="topleft"
      left_pad="7"
-     name="pants"
+     name="lower_pants"
      top_delta="0"
      width="128" />
     <texture_picker
@@ -190,9 +243,26 @@
      label="Jacket"
      layout="topleft"
      left_pad="7"
-     name="lower jacket"
+     name="lower_jacket"
+     top_delta="0"
+     width="128" />
+    <texture_picker
+     height="143"
+     label="Lower Alpha"
+     layout="topleft"
+     left_pad="7"
+     name="lower_alpha"
+     top_delta="0"
+     width="128" />
+    <texture_picker
+     height="143"
+     label="Lower Tattoo"
+     layout="topleft"
+     left_pad="7"
+     name="lower_tattoo"
      top_delta="0"
      width="128" />
+
     <texture_picker
      height="143"
      label="Skirt"
@@ -209,4 +279,5 @@
      name="skirt"
      top_delta="0"
      width="128" />
+
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index a5c73a7ca41916e7940368f341dfd4dc23f6344e..520249c2a2136a56891e22cf72a39b5b7b5cc8dc 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -80,6 +80,75 @@
          tool_tip="Zoom camera toward focus"
          top_delta="0"
          width="16" />
+        <panel
+         height="70"
+         layout="topleft"
+         left="15"
+         name="camera_presets"
+         top="15"
+         visible="false"
+         width="75">
+            <button
+             height="30"
+             image_selected="CameraPreset_Rear"
+             image_unselected="CameraPreset_Rear"
+             layout="topleft"
+             left="5"
+             name="rear_view"
+             picture_style="true"
+             tool_tip="Rear View"
+             top="2"
+             width="30">
+                <click_callback
+                 function="CameraPresets.ChangeView"
+                 parameter="rear_view" />
+            </button>
+            <button
+             height="30"
+             image_selected="CameraPreset_3_4"
+             image_unselected="CameraPreset_3_4"
+             layout="topleft"
+             left_pad="5"
+             name="group_view"
+             picture_style="true"
+             tool_tip="Group View"
+             top="2"
+             width="30">
+                <click_callback
+                 function="CameraPresets.ChangeView"
+                 parameter="group_view" />
+            </button>
+            <button
+             height="30"
+             image_selected="CameraPreset_Front"
+             image_unselected="CameraPreset_Front"
+             layout="topleft"
+             left="5"
+             name="front_view"
+             picture_style="true"
+             tool_tip="Front View"
+             top_pad="2"
+             width="30">
+                <click_callback
+                 function="CameraPresets.ChangeView"
+                 parameter="front_view" />
+            </button>
+            <button
+             height="30"
+             image_selected="CameraPreset_Mouselook"
+             image_unselected="CameraPreset_Mouselook"
+             layout="topleft"
+             left_pad="5"
+             name="mouselook_view"
+             picture_style="true"
+             tool_tip="Mouselook View"
+             top_pad="-30"
+             width="30">
+                <click_callback
+                 function="CameraPresets.ChangeView"
+                 parameter="mouselook_view" />
+            </button>
+        </panel>
     </panel>
     <panel
      border="true"
diff --git a/indra/newview/skins/default/xui/en/floater_critical.xml b/indra/newview/skins/default/xui/en/floater_critical.xml
index 7d1a1113b0bc9d76d1b6a1b3c2528d4d0a263d44..5475a1cf6a56d712b9c235e24496a1da873a2ed1 100644
--- a/indra/newview/skins/default/xui/en/floater_critical.xml
+++ b/indra/newview/skins/default/xui/en/floater_critical.xml
@@ -5,7 +5,6 @@
  height="500"
  layout="topleft"
  name="modal container"
- help_topic="modal_container"
  width="600">
     <button
      height="20"
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 70468e7474c2fe4d4be4590865a299f616fb2cfb..57f5800f2c6c1ce659ee61f2751198d28779b20b 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -39,10 +39,10 @@
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -335,10 +335,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -590,10 +590,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -818,10 +818,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -1006,10 +1006,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -1212,10 +1212,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -1418,10 +1418,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -1624,10 +1624,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -1830,10 +1830,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -2048,10 +2048,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -2254,10 +2254,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -2460,10 +2460,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -2666,10 +2666,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -2872,10 +2872,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
@@ -3159,10 +3159,10 @@ scratch and wear it.
              height="18"
              image_name="Lock"
              layout="topleft"
-             left="333"
+             left="315"
              mouse_opaque="true"
              name="square"
-             top="5"
+             top="4"
              width="18" />
             <icon
              height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 611c51ad117baf00c3e52edfd60306d5f453dc07..0037c6ef0417ee8a30b44fdb32f3f5ab9a8a0692 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -11,7 +11,10 @@
  can_dock="true"
  can_minimize="true"
  visible="true" 
- width="365">
+ width="365"
+ can_resize="true"
+ min_width="200"
+ min_height="150">
   <layout_stack follows="left|top|right|bottom"
                 height="235"
                 width="365"
@@ -24,9 +27,9 @@
       name="panel_im_control_panel"
       layout="topleft"
       top_delta="-3"
-      min_width="96" 
       width="146"
       height="225"
+      follows="left"
       label="IM Control Panel"
       user_resize="false" />
     <layout_panel height="235"
@@ -35,33 +38,30 @@
                   top="0"
                   user_resize="false">
       <button height="12"
+      		  follows="left|top"
               top="8" 
               label="&lt;&lt;"
               layout="topleft"
               width="35"
               name="slide_left_btn" />
       <button height="12"
+      		  follows="left|top"
               top="8"
               label="&gt;&gt;"
               layout="topleft"
               width="35"
               name="slide_right_btn" />
-      <text_editor
-       enabled="false"
-       type="string"
+      <chat_history
        length="1"
-       follows="left|top|right"
+       follows="left|top|right|bottom"
        font="SansSerif"
        height="185"
        layout="topleft"
-       max_length="2147483647"
-       name="im_text"
+       name="chat_history"
        parse_highlights="true"
        allow_html="true" 
-       track_bottom="true" 
-       width="195"
-       word_wrap="true">
-      </text_editor>
+       width="195">
+      </chat_history>
       <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="190">
       </line_editor>
     </layout_panel>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
index 2882f233c28f051a65958a402d789386bdc48404..e3e2decef7e322665750be4d7b6a911dc5cd44fe 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
@@ -33,10 +33,10 @@
      height="18"
      image_name="Lock"
      layout="topleft"
-     left="294"
+     left="276"
      mouse_opaque="true"
      name="IconLocked"
-     top="5"
+     top="4"
      width="18" />
     <text
      type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml
index 6ba26f938d9d501975c5f2c2be65a66e51642c76..b96573b32abd96046c54c6b38b1a61a8fad51470 100644
--- a/indra/newview/skins/default/xui/en/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml
@@ -1,20 +1,74 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater bottom="-666" can_close="true" can_drag_on_left="false" can_minimize="true"
-     can_resize="false" can_tear_off="true" default_tab_group="1" enabled="true"
-      width="365" height="535" left="330" min_height="430" min_width="620"
-     mouse_opaque="true" name="Medis Settings" title="Media Settings">
-	<button bottom="-525" enabled="true" follows="right|bottom" font="SansSerif"
-	     halign="center" height="20" label="OK" label_selected="OK" left="75"
-	     mouse_opaque="true" name="OK" scale_image="true" width="90" />
-	<button bottom_delta="0" enabled="true" follows="right|bottom" font="SansSerif"
-	     halign="center" height="20" label="Cancel" label_selected="Cancel"
-	     left_delta="93" mouse_opaque="true" name="Cancel" scale_image="true"
-	     width="90" />
-	<button bottom_delta="0" enabled="true" follows="right|bottom" font="SansSerif"
-	     halign="center" height="20" label="Apply" label_selected="Apply"
-	     left_delta="93" mouse_opaque="true" name="Apply" scale_image="true"
-	     width="90" />
-	<tab_container bottom="-500" enabled="true" follows="left|top|right|bottom" height="485"
-	     left="0" mouse_opaque="false" name="tab_container" tab_group="1"
-	     tab_position="top" tab_width="80" width="365" />
+<floater 
+ bottom="-666" 
+ can_close="true" 
+ can_drag_on_left="false" 
+ can_minimize="true"
+ can_resize="false" 
+ can_tear_off="true" 
+ default_tab_group="1" 
+ enabled="true"
+ width="365" 
+ height="535" 
+ left="330" 
+ min_height="430" 
+ min_width="620"
+ mouse_opaque="true" 
+ name="Medis Settings" 
+ help_topic = "media_settings"
+ title="Media Settings">
+	<button 
+	 bottom="-525" 
+	 enabled="true" 
+	 follows="right|bottom" 
+	 font="SansSerif"
+	 halign="center" 
+	 height="20" 
+	 label="OK" 
+	 label_selected="OK" 
+	 left="75"
+	 mouse_opaque="true" 
+	 name="OK" 
+	 scale_image="true" 
+	 width="90" />
+	<button 
+	 bottom_delta="0" 
+	 enabled="true" 
+	 follows="right|bottom" 
+	 font="SansSerif"
+	 halign="center" 
+	 height="20" 
+	 label="Cancel" 
+	 label_selected="Cancel"
+	 left_delta="93" 
+	 mouse_opaque="true" 
+	 name="Cancel" 
+	 scale_image="true"
+	 width="90" />
+	<button 
+	 bottom_delta="0" 
+	 enabled="true" 
+	 follows="right|bottom" 
+	 font="SansSerif"
+	 halign="center" 
+	 height="20" 
+	 label="Apply" 
+	 label_selected="Apply"
+	 left_delta="93" 
+	 mouse_opaque="true" 
+	 name="Apply" 
+	 scale_image="true"
+	 width="90" />
+	<tab_container 
+	 bottom="-500" 
+	 enabled="true" 
+	 follows="left|top|right|bottom" 
+	 height="485"
+	 left="0" 
+	 mouse_opaque="false" 
+	 name="tab_container" 
+	 tab_group="1"
+	 tab_position="top" 
+	 tab_width="80" 
+	 width="365" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index 6fbfed5f6000df3ceaefbeac85cbada3ff1547ff..25d337ccec457be62e2f0d131d93ccff25e49beb 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -1,47 +1,34 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater 
- background_opaque="false"
- background_visible="true" 
+ can_minimize="true"
+ can_tear_off="false"
+ can_resize="false"
+ can_drag_on_left="false"
+ can_close="false"
+ can_dock="true"
  bevel_style="in"
- bg_alpha_color="0.3 0.3 0.3 1.0"
  height="300"
  layout="topleft"
  name="nearby_chat"
  help_topic="nearby_chat"
  save_rect="true"
  title="Nearby Chat"
- single_instance="true"
+ save_visibility="true"
  width="320">
-	<panel top="20" width="320" height="30" background_visible="true" background_opaque="false" bg_alpha_color="0.0 0.0 0.0 1.0" name="chat_caption">
-    	<text
-        	width="140" left="25" height="20" follows="left|right|top"
-        	font="SansSerifBigBold" text_color="white" word_wrap="true"
-        	mouse_opaque="true" name="sender_name" >NEARBY CHAT  </text>
-    	<icon top="5" left="250"
-      			width="20" height="20" follows="top|right"
-		      	color="1 1 1 1" enabled="true" image_name="icn_voice-groupfocus.tga"
-      			mouse_opaque="true" name="nearby_speakers_btn"/>
-    	<icon top="5" left="275"
-      		width="20" height="20" follows="top|right"
-      		color="1 1 1 1" enabled="true" image_name="inv_item_landmark_visited.tga"
-      		mouse_opaque="true" name="tearoff_btn"/>
-    	<icon top="5" left="300"
-      		width="15" height="15" follows="top|right"
-      		color="1 1 1 1" enabled="true" image_name="closebox.tga"
-      		name="close_btn"/>
-	</panel>
             <chat_history
              allow_html="true" 
              bg_readonly_color="ChatHistoryBgColor"
              bg_writeable_color="ChatHistoryBgColor"
-             follows="left|top|right"
+             follows="all"
+			 left="1"
+             top="20"
              font="SansSerif"
              layout="topleft"
-			 height="320"
+			 height="280"
              name="chat_history"
              parse_highlights="true" 
              text_color="ChatHistoryTextColor"
              text_readonly_color="ChatHistoryTextColor"
-             width="250"/>
+             width="320"/>
 
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
index 448b0fa6afa0464e18dd8eb31515758ea433d6d0..8cdafe110a79acba7d98ce8edcd102d2edaec618 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
@@ -33,10 +33,10 @@
      height="18"
      image_name="Lock"
      layout="topleft"
-     left="340"
+     left="322"
      mouse_opaque="true"
      name="lock"
-     top="1"
+     top="4"
      width="18" />
     <text
      type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_script_preview.xml b/indra/newview/skins/default/xui/en/floater_script_preview.xml
index 54ab30124a0a59c2665301bfca429043083eae18..a4152398675915a03576a9e6250914684ee4ebb4 100644
--- a/indra/newview/skins/default/xui/en/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_preview.xml
@@ -30,10 +30,10 @@
      height="18"
      image_name="Lock"
      layout="topleft"
-     left="444"
+     left="426"
      mouse_opaque="true"
      name="lock"
-     top="3"
+     top="4"
      width="18" />
     <text
      type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_select_key.xml b/indra/newview/skins/default/xui/en/floater_select_key.xml
index 8e1317440e7c06cb365ddf1730642ea1d1309899..b89af0ef3e68bc0a0f50e90b73b2d28dcef92f5e 100644
--- a/indra/newview/skins/default/xui/en/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/en/floater_select_key.xml
@@ -6,7 +6,6 @@
  height="100"
  layout="topleft"
  name="modal container"
- help_topic="modal_container"
  width="240">
     <button
      height="20"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index b898fd7c938a7ba2a969f4b8eab6d9eb7ef42720..8cdcee69277fe5e0bf5d1adbb8ee61a9f1e079bb 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -247,7 +247,7 @@
          name="radio stretch" />
         <radio_item
 		 top_pad="6"
-         label="Select Texture"
+         label="Select Face"
          layout="topleft"
          name="radio select face" />
 			<radio_group.commit_callback
diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml
index b290a9c87d50f126fded2423a6f4aa0de84fd9e6..54facbb659153afa7a19f4d172496feecad9cdba 100644
--- a/indra/newview/skins/default/xui/en/floater_tos.xml
+++ b/indra/newview/skins/default/xui/en/floater_tos.xml
@@ -5,7 +5,6 @@
  height="500"
  layout="topleft"
  name="modal container"
- help_topic="modal_container"
  width="600">
     <floater.string
      name="real_url">
diff --git a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml
index e698dfe2dcde225203587a069390503aac2668b9..ee67989d332d3d3eac34373aaa2142ceb5876d76 100644
--- a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml
@@ -6,7 +6,6 @@
  height="100"
  layout="topleft"
  name="modal container"
- help_topic="modal_container"
  width="240">
     <button
      height="20"
diff --git a/indra/newview/skins/default/xui/en/menu_landmark.xml b/indra/newview/skins/default/xui/en/menu_landmark.xml
index 54a4095967ddfaecf464e7615ff8c55c85bdafb6..93b6db222a4e1ddad02f70138481348da2d0d550 100644
--- a/indra/newview/skins/default/xui/en/menu_landmark.xml
+++ b/indra/newview/skins/default/xui/en/menu_landmark.xml
@@ -28,6 +28,9 @@
         <menu_item_call.on_click
          function="Places.OverflowMenu.Action"
          parameter="pick" />
+        <menu_item_call.on_enable
+         function="Places.OverflowMenu.Enable"
+         parameter="can_create_pick" />
     </menu_item_call>
     <menu_item_call
      label="Add to Favorites Bar"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 8cb0a699063b220f601e027947a21c33931bcda8..c3ee6e250b0f601a6622e0e81a66bee06fcff0b7 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -222,6 +222,12 @@
          function="ShowFloater"
          parameter="test_inspectors" />
       </menu_item_call>
+      <menu_item_call
+         label="Show Side Tray"
+         name="Show Side Tray">
+        <menu_item_call.on_click
+         function="Advanced.ShowSideTray" />
+      </menu_item_call>
       <menu_item_separator />
         <menu_item_call
          label="Show TOS"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000000000000000000000000000000000..df74d2dcd4bb30849de221ca280ff8a14656fa03
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Multi-Selected People Context Menu">
+    <menu_item_call
+     enabled="false"
+     label="Add Friends"
+     layout="topleft"
+     name="Add Friends">
+        <on_click
+         function="Avatar.AddFriends" />
+        <on_enable
+         function="Avatar.EnableItem"
+         parameter="can_add" />
+    </menu_item_call>
+    <menu_item_call
+     label="IM"
+     layout="topleft"
+     name="IM">
+        <on_click
+         function="Avatar.IM" />
+    </menu_item_call>
+    <menu_item_call
+     enabled="false"
+     label="Call"
+     layout="topleft"
+     name="Call">
+        <on_click
+         function="Avatar.Call" />
+    </menu_item_call>
+    <menu_item_call
+     enabled="false"
+     label="Share"
+     layout="topleft"
+     name="Share">
+        <on_click
+         function="Avatar.Share" />
+    </menu_item_call>
+    <menu_item_call
+     enabled="false"
+     label="Pay"
+     layout="topleft"
+     name="Pay">
+        <on_click
+         function="Avatar.Pay" />
+    </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_place.xml b/indra/newview/skins/default/xui/en/menu_place.xml
index 01f62985ca2867f12eafbd2077fd4f61692ba321..1b96eb51f0ca2c6811bbafba0998a23e15274fbf 100644
--- a/indra/newview/skins/default/xui/en/menu_place.xml
+++ b/indra/newview/skins/default/xui/en/menu_place.xml
@@ -20,6 +20,9 @@
         <menu_item_call.on_click
          function="Places.OverflowMenu.Action"
          parameter="pick" />
+        <menu_item_call.on_enable
+         function="Places.OverflowMenu.Enable"
+         parameter="can_create_pick" />
     </menu_item_call>
     <menu_item_separator
      layout="topleft"/>
diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
index c95cf32a5af14eb8ada03c756ece18319fb30d6e..c8491886993264baa60a46d4c6ac05b89004dd8b 100644
--- a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
@@ -34,6 +34,9 @@
         <on_click
          function="Places.LandmarksGear.CopyPaste.Action"
          parameter="cut" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="cut" />
     </menu_item_call>
     <menu_item_call
      label="Copy"
@@ -61,6 +64,9 @@
         <on_click
          function="Places.LandmarksGear.CopyPaste.Action"
          parameter="rename" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="rename" />
     </menu_item_call>
     <menu_item_call
      label="Delete"
@@ -69,6 +75,9 @@
         <on_click
          function="Places.LandmarksGear.CopyPaste.Action"
          parameter="delete" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="delete" />
     </menu_item_call>
     <menu_item_separator
      layout="topleft" />
@@ -109,7 +118,7 @@
      layout="topleft"
      name="sort_by_date">
         <on_check
-         function="Places.LandmarksGear.Enable"
+         function="Places.LandmarksGear.Check"
          parameter="sort_by_date" />
         <on_click
          function="Places.LandmarksGear.Folding.Action"
diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml
index 0246d775ee2f45e9285a6e8e9c37f915588f06f0..63d1a67d0f1f0135e821b6c8b65182f8d83a59eb 100644
--- a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml
@@ -35,6 +35,9 @@
         <on_click
          function="Places.LandmarksGear.Custom.Action"
          parameter="show_on_map" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="show_on_map" />
     </menu_item_call>
     <menu_item_separator
      layout="topleft" />
@@ -66,6 +69,9 @@
         <on_click
          function="Places.LandmarksGear.CopyPaste.Action"
          parameter="cut" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="cut" />
     </menu_item_call>
     <menu_item_call
      label="Copy Landmark"
@@ -82,6 +88,9 @@
         <on_click
          function="Places.LandmarksGear.CopyPaste.Action"
          parameter="copy_slurl" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="copy_slurl" />
     </menu_item_call>
     <menu_item_call
      label="Paste"
@@ -101,6 +110,9 @@
         <on_click
          function="Places.LandmarksGear.CopyPaste.Action"
          parameter="rename" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="rename" />
     </menu_item_call>
     <menu_item_call
      label="Delete"
@@ -109,6 +121,9 @@
         <on_click
          function="Places.LandmarksGear.CopyPaste.Action"
          parameter="delete" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="delete" />
     </menu_item_call>
     <menu_item_separator
      layout="topleft" />
@@ -119,6 +134,9 @@
         <on_click
          function="Places.LandmarksGear.Folding.Action"
          parameter="expand_all" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="expand_all" />
     </menu_item_call>
     <menu_item_call
      label="Collapse all folders"
@@ -127,17 +145,23 @@
         <on_click
          function="Places.LandmarksGear.Folding.Action"
          parameter="collapse_all" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="collapse_all" />
     </menu_item_call>
     <menu_item_check
      label="Sort by Date"
      layout="topleft"
      name="sort_by_date">
         <on_check
-         function="Places.LandmarksGear.Enable"
+         function="Places.LandmarksGear.Check"
          parameter="sort_by_date" />
         <on_click
          function="Places.LandmarksGear.Folding.Action"
          parameter="sort_by_date" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="sort_by_date" />
     </menu_item_check>
     <menu_item_call
      label="Create Pick"
@@ -146,5 +170,8 @@
         <on_click
          function="Places.LandmarksGear.Custom.Action"
          parameter="create_pick" />
+        <on_enable
+         function="Places.LandmarksGear.Enable"
+         parameter="create_pick" />
     </menu_item_call>
 </menu>
diff --git a/indra/newview/skins/default/xui/en/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/en/menu_teleport_history_item.xml
index 515278c23d45e5928107c5a51a1479dc3ca417f3..0160d52b171d63d96de3e71052d3ac6b2cdd758e 100644
--- a/indra/newview/skins/default/xui/en/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/en/menu_teleport_history_item.xml
@@ -17,10 +17,10 @@
          function="TeleportHistory.MoreInformation" />
     </menu_item_call>
     <menu_item_call
-     label="Copy"
+     label="Copy to Clipboard"
      layout="topleft"
-     name="Copy">
+     name="CopyToClipboard">
         <menu_item_call.on_click
-         function="TeleportHistory.Copy" />
+         function="TeleportHistory.CopyToClipboard" />
     </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 495795d14a49f26d165a1b78bbaa7c94e2c4d160..34d049818056519ec1a68cd838ffc4b827fb34ae 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -56,7 +56,7 @@
              function="Edit.EnableCustomizeAvatar" />
         </menu_item_call>
         <menu_item_check
-         label="My Things"
+         label="My Inventory"
          layout="topleft"
          name="Inventory"
          shortcut="control|I">
@@ -2933,7 +2933,8 @@
                      function="Advanced.GrabBakedTexture"
                      parameter="iris" />
                     <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture" />
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="iris" />
                 </menu_item_call>
                 <menu_item_call
                  label="Head"
@@ -2943,7 +2944,8 @@
                      function="Advanced.GrabBakedTexture"
                      parameter="head" />
                     <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture" />
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="head" />
                 </menu_item_call>
                 <menu_item_call
                  label="Upper Body"
@@ -2953,7 +2955,8 @@
                      function="Advanced.GrabBakedTexture"
                      parameter="upper" />
                     <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture" />
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="upper" />
                 </menu_item_call>
                 <menu_item_call
                  label="Lower Body"
@@ -2963,7 +2966,8 @@
                      function="Advanced.GrabBakedTexture"
                      parameter="lower" />
                     <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture" />
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="lower" />
                 </menu_item_call>
                 <menu_item_call
                  label="Skirt"
@@ -2973,17 +2977,8 @@
                      function="Advanced.GrabBakedTexture"
                      parameter="skirt" />
                     <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Skirt"
-                 layout="topleft"
-                 name="Hair">
-                    <menu_item_call.on_click
-                     function="Advanced.GrabBakedTexture"
-                     parameter="hair" />
-                    <menu_item_call.on_enable
-                     function="Advanced.EnableGrabBakedTexture" />
+                     function="Advanced.EnableGrabBakedTexture"
+					 parameter="skirt" />
                 </menu_item_call>
             </menu>
             <menu
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 7c5925550a50d9e6bf8d8c0fabaa0b315b69f73d..7d2ef4923eab79aa7586a6a2024d287a8b31c3e9 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5521,6 +5521,13 @@ Non-transferable objects that are deeded to the group have been deleted.
 The objects on the selected parcel that are NOT owned by you have been returned to their owners.
   </notification>
 
+  <notification
+   icon="notify.tga"
+   name="ServerObjectMessage"
+   type="notify">
+[MSG]
+  </notification>
+  
   <notification
    icon="notify.tga"
    name="NotSafe"
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 2c9109449c7df528193a1925f300af31e5bf9e5b..f747c557e226e92dfab3fc367b38c791ffe1cbfb 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -69,14 +69,14 @@
      name="speaking_indicator"
      visible="true"
      width="20" />
-    <button
+   <button
      follows="right"
      height="16"
      image_pressed="Info_Press"
      image_hover="Info_Over"
      image_unselected="Info_Off"
-     layout="topleft"
-     left_pad="5"
+     left_pad="3"
+     right="-25"
      name="info_btn"
      picture_style="true"
      width="16" />
@@ -88,6 +88,7 @@
      image_unselected="BuyArrow_Press"
      layout="topleft"
      left_pad="5"
+     right="-5"
      name="profile_btn"
      picture_style="true"
      width="16" />
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 100b2d7aaaf12f8357a59d78878f4c387e1006ae..1196d788e4ca6346c646e76b9c10841eaffd94d5 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -36,15 +36,15 @@
          width="5"/>
         <layout_panel
  		 mouse_opaque="false"        
-         auto_resize="true"
+         auto_resize="false"
          follows="left|right"
          height="28"
          layout="topleft"
          left="5"
          min_height="28"
-         width="450"
+         width="310"
          top="0"
-         min_width="305"
+         min_width="300"
          name="chat_bar"
          user_resize="false"
          filename="panel_nearby_chat_bar.xml"/>
@@ -59,22 +59,89 @@
          name="DUMMY"
          top="0"
          width="3"/>
+        <layout_panel
+         mouse_opaque="false"
+         auto_resize="false"
+         follows="right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         width="100"
+         top_delta="-10"
+         min_width="100"
+         name="speak_panel"
+         user_resize="false">
+		    <chiclet_talk
+		     follows="right"
+		     height="20"
+		     speak_button.font="SansSerifMedium"
+		     speak_button.tab_stop="true"
+		     show_button.tab_stop="true"
+		     layout="topleft"
+		     left="0"
+		     name="talk"
+		     top="6"
+		     width="100" />
+         </layout_panel>                  
+		 <icon
+         auto_resize="false"
+         color="0 0 0 0"
+         follows="left|right"
+         height="10"
+         image_name="spacer24.tga"
+         layout="topleft"
+         left="0"
+         name="DUMMY"
+         top="0"
+         width="5"/>
+        <layout_panel
+         mouse_opaque="false"
+         auto_resize="false"
+         follows="right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         width="90"
+         top_delta="-10"
+         min_width="90"
+         name="gesture_panel"
+         user_resize="false">
+		    <gesture_combo_box
+		      follows="right"
+		     height="20"
+		     label="Gestures"
+		     layout="topleft"
+		     name="Gesture"
+		     left="0"
+		     top="6"
+		     width="90" />
+        </layout_panel>
+		 <icon
+         auto_resize="false"
+         color="0 0 0 0"
+         follows="left|right"
+         height="10"
+         image_name="spacer24.tga"
+         layout="topleft"
+         left="0"
+         name="DUMMY"
+         top="0"
+         width="5"/>   
         <layout_panel
          mouse_opaque="false"        
          auto_resize="false"
          follows="right"
          height="28"
          layout="topleft"
-		 left="5"
          min_height="28"
+         name="movement_panel"
          width="70"
          top_delta="-10"
-         min_width="70"
-         name="movement_panel"
-         user_resize="false">
+         min_width="70">
             <button
-             follows="right"
+             follows="left|right"
              height="20"
+             use_ellipses="true"
              is_toggle="true"
              label="Move"
              layout="topleft"
@@ -101,7 +168,7 @@
         <layout_panel
          mouse_opaque="false"        
          auto_resize="false"
-         follows="right"
+         follows="left|right"
          height="28"
          layout="topleft"
          min_height="28"
@@ -110,8 +177,9 @@
          top_delta="-10"
          width="100">
             <button
-             follows="right"
+             follows="left|right"
              height="20"
+             use_ellipses="true"
              is_toggle="true"
              label="View"
              layout="topleft"
@@ -123,22 +191,6 @@
                 <button.init_callback
                  function="Button.SetDockableFloaterToggle"
                  parameter="camera" />
-            </button>
- 			<button
-             follows="right"
-             name="camera_presets_btn"
-             top="6"
-             height="20"
-             width="20"
-             left_pad="0"
-             is_toggle="true"
-             picture_style="true"
-         	 image_selected="toggle_button_selected"
-             image_unselected="toggle_button_off">
-             <button.init_callback
-             	function="Button.SetDockableFloaterToggle"
-             	parameter="camera_presets"
-             	/>
             </button>
         </layout_panel>
         <layout_panel
@@ -183,8 +235,10 @@
          min_height="28"
          top="0"
          name="chiclet_list_panel"
-         width="150"
-         user_resize="false">
+         width="189"
+         min_width="189"
+         user_resize="false"
+         auto_resize="true">
             <chiclet_panel
 	         mouse_opaque="false"
              follows="left|right"
@@ -195,7 +249,7 @@
              top="1"
              chiclet_padding="3"
              scrolling_offset="40"
-             width="150" />
+             width="189" />
         </layout_panel>
         <icon
          auto_resize="false"
@@ -282,4 +336,4 @@
          top="0"
          width="5"/>
     </layout_stack>
-</panel>
+</panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index d268258f6f140cad5ce8497dda2cda597aedafb9..b002034a08b6e5191c76266f54cccbe4646855dd 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
+ background_visible="true"
  class="edit_profile_panel"
   follows="all"
  height="535"
@@ -301,76 +302,6 @@
              width="285"
              word_wrap="true" />
          </panel>
-      <text
-       type="string"
-       length="1"
-       follows="left|top"
-       font="SansSerifSmall"
-       font.style="BOLD"
-       height="15"
-       layout="topleft"
-       left="10"
-       name="title_afk_text"
-       text_color="white"
-       top_pad="0"
-       width="190">
-          Away Timeout:
-      </text>
-      <spinner
-       control_name="AFKTimeout"
-       decimal_digits="0"
-       follows="left|top"
-       halign="right"
-       height="15"
-       increment="1"
-       initial_value="300"
-       label=""
-       label_width="0"
-       layout="topleft"
-       max_val="600"
-       min_val="30"
-       name="afk_timeout_spinner"
-       left_pad="4"
-       width="50" />
-      <text
-       type="string"
-       length="1"
-       follows="left|top"
-       halign="left"
-       height="15"
-       layout="topleft"
-       left_pad="2"
-       name="seconds_textbox"
-       width="70">
-         seconds
-      </text>
-      <text
-       type="string"
-       length="1"
-       follows="left|top"
-       height="10"
-       layout="topleft"
-       font="SansSerifSmall"
-       font.style="BOLD"
-       text_color="white"
-       left="10"
-       mouse_opaque="false"
-       name="text_box3"
-       width="240">
-	  Busy Mode Response:
-      </text>
-      <text_editor
-       control_name="BusyModeResponse2"
-       commit_on_focus_lost = "true"
-       follows="left|top"
-       height="56"
-       layout="topleft"
-       left="10"
-       name="busy_response"
-       width="285"
-       word_wrap="true">
-	  log_in_to_change
-      </text_editor>
     </panel>
     </panel>
     </scroll_container>
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index be38492c821102b2b32c2e3472eb571797661851..9767a673f64e3bdda1afa1956fc9bcc3ab82b6d4 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -4,7 +4,7 @@
  width="146"
  height="215"
  border="false">
-    <avatar_list_tmp
+    <avatar_list
      color="DkGray2"
      follows="left|top|right|bottom"
      height="150"
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index c18b62503320b6fbd6977d6a33203194cdf98bad..9bd240eccce73e57069275a95b9f436de2b16a7e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -46,6 +46,7 @@ Hover your mouse over the options for more help.
      layout="topleft"
      left="5"
      name="text_owners_and_visible_members"
+     text_color="EmphasisColor"
      top_pad="10"
      width="270">
         Members
@@ -74,6 +75,7 @@ Hover your mouse over the options for more help.
       follows="left|top"
       height="16"
      type="string"
+     text_color="EmphasisColor"
      top_pad="10"
      font="SansSerifBig"
      layout="topleft"
@@ -165,7 +167,7 @@ Hover your mouse over the options for more help.
          name="spin_enrollment_fee"
          tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."
          top_delta="-2"
-         width="75" />
+         width="105" />
         <check_box
          height="16"
          initial_value="true"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index c3b277fb1ddb69108322969e305aa4f824b16e9f..da6cf8891a4cee47c903421d1584ea4cb4e4e2a3 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -151,16 +151,16 @@
      visible="false"
      width="65" />
       <accordion layout="topleft" left="2" width="296" top="135" height="500" follows="all" name="group_accordion">
-		<accordion_tab min_height="445" title="Group General" name="group_general_tab">
+		<accordion_tab min_height="445" title="General" name="group_general_tab">
         	<panel class="panel_group_general" filename="panel_group_general.xml" name="group_general_tab_panel"/>
 		</accordion_tab>
-		<accordion_tab min_height="380" title="Group Roles" name="group_roles_tab" expanded="False" can_resize="false">
+		<accordion_tab min_height="380" title="Members &amp; Roles" name="group_roles_tab" expanded="False" can_resize="false">
         	<panel class="panel_group_roles" filename="panel_group_roles.xml" name="group_roles_tab_panel"/>
 		</accordion_tab>
-		<accordion_tab min_height="530" title="Group Notices" name="group_notices_tab" expanded="False" can_resize="false">
+		<accordion_tab min_height="530" title="Notices" name="group_notices_tab" expanded="False" can_resize="false">
 			<panel class="panel_group_notices" filename="panel_group_notices.xml" name="group_notices_tab_panel"/>
 		</accordion_tab>
-		<accordion_tab min_height="270" title="Group Land Money" name="group_land_tab" expanded="False" can_resize="false">
+		<accordion_tab min_height="270" title="Land &amp; L$" name="group_land_tab" expanded="False" can_resize="false">
 			<panel class="panel_group_land_money" filename="panel_group_land_money.xml" name="group_land_tab_panel"/>
 		</accordion_tab>
 	  </accordion>
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index d61fcf529a488cec163633e6a0cc32d3c593d818..0845ec014eb2536717efeaa3ba920d16a2c9a018 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -2,7 +2,7 @@
 <panel
  border="true"
  follows="all"
- height="410"
+ height="510"
  label="Land &amp; L$"
  layout="topleft"
  left="1"
@@ -194,7 +194,7 @@
      left_pad="5"
      name="your_contribution_units"
      top_delta="2">
-        ( m² )
+        m²
     </text>
      <text
      type="string"
@@ -239,13 +239,14 @@
      layout="topleft"
      left="10"
      name="group_money_heading"
+     text_color="EmphasisColor"
      top_pad="0"
      width="150">
         Group L$
     </text>
     <tab_container
      follows="all"
-     height="100"
+     height="200"
      layout="topleft"
      left="10"
      name="group_money_tab_container"
@@ -268,13 +269,14 @@
              bg_readonly_color="0.784314 0.819608 0.8 1"
              follows="all"
              font="Monospace"
-             height="172"
+             height="168"
              layout="topleft"
              left="8"
              max_length="4096"
              name="group_money_planning_text"
              top="5"
-             width="250">
+             width="250"
+             word_wrap="true">
                 Computing...
             </text_editor>
         </panel>
@@ -300,7 +302,8 @@
              max_length="4096"
              name="group_money_details_text"
              top="7"
-             width="250">
+             width="250"
+             word_wrap="true">
                 Computing...
             </text_editor> 
           <button
@@ -346,7 +349,8 @@
              max_length="4096"
              name="group_money_sales_text"
              top="7"
-             width="250">
+             width="250"
+             word_wrap="true">
                 Computing...
             </text_editor>
             <button
diff --git a/indra/newview/skins/default/xui/en/panel_group_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
index 6eec0ffe7ae5055955bd7477442ea8152d9c0379..7bdcaafe31508cec3241f13111601d25d8890f5e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
@@ -31,33 +31,44 @@
      follows="top|left"
      height="20"
      image_name="Generic_Group"
+     name="group_icon"
      layout="topleft"
      left="5"
      mouse_opaque="true"
-     name="group_icon"
-     top="4"
+     top="2"
      width="20" />
-    <text
+   <text
      follows="left|right"
      font="SansSerifSmall"
-     height="17"
+     height="15"
      layout="topleft"
      left_pad="5"
      name="group_name"
-     top="7"
+     top="6"
      use_ellipses="true"
      value="Unknown"
-     width="263" />
+     width="246" />
     <button
      follows="right"
      height="16"
      image_pressed="Info_Press"
      image_hover="Info_Over"
      image_unselected="Info_Off"
-     layout="topleft"
+     left_pad="3"
+     right="-25"
      name="info_btn"
      picture_style="true"
+     width="16" />
+    <button
+     follows="right"
+     height="16"
+      image_selected="BuyArrow_Press"
+     image_pressed="BuyArrow_Press"
+     image_unselected="BuyArrow_Press"
+     layout="topleft"
+     left_pad="5"
      right="-5"
-     top="4"
+     name="profile_btn"
+     picture_style="true"
      width="16" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 82a3c98dd927ebe4f7b32cbe4b1e167605565642..d9fb962998246cfac15a5d5cb18205a41e40cc0b 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -52,6 +52,7 @@ the General tab.
      layout="topleft"
      left_delta="10"
      name="lbl2"
+     text_color="EmphasisColor"
      top_pad="10"
      width="270">
         Notices are kept for 14 days. Notice lists are limited to 200 notices per group on a daily basis.
@@ -135,6 +136,7 @@ the General tab.
          left="10"
          mouse_opaque="false"
          name="lbl"
+         text_color="EmphasisColor"
          top_pad="0"
          width="265">
             Create a Notice
@@ -147,6 +149,7 @@ the General tab.
          layout="topleft"
          left_delta="0"
          name="lbl2"
+         text_color="EmphasisColor"
          top_pad="4"
          width="195">
             You can add a single item to a notice by dragging it from your inventory to this panel. Attached items must be copiable and transferrable, and you can&apos;t send a folder.
@@ -289,6 +292,7 @@ the General tab.
          left="10"
          mouse_opaque="false"
          name="lbl"
+         text_color="EmphasisColor"
          top_pad="0"
          width="265">
             Archived Notice
@@ -302,7 +306,7 @@ the General tab.
          name="lbl2"
          top_pad="4"
          width="265">
-            To send a new notice, click the &apos;Create New Notice&apos; button above.
+            To send a new notice, click the &apos;New Notice&apos; button above.
         </text>
         <text
          type="string"
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index ad452b16a78fbc5d61e707b0ad7110b38201145a..c33f68eaf7ac4315ca57b6e54035438e8b593819 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -31,6 +31,7 @@
              left="0"
              mouse_opaque="true"
              name="favorites_list"
+             start_folder="favorite"
              width="380"/>
         </accordion_tab>
         <accordion_tab
@@ -62,6 +63,7 @@
              left="0"
              mouse_opaque="true"
              name="my_inventory_list"
+             start_folder="inventory"
              width="380"/>
         </accordion_tab>
         <accordion_tab
@@ -77,6 +79,7 @@
              left="0"
              mouse_opaque="true"
              name="library_list"
+             start_folder="library"
              width="380"/>
         </accordion_tab>
     </accordion>
@@ -127,7 +130,7 @@
          picture_style="true"
          tool_tip="Add new folder"
          width="18" />
-        <button
+        <dnd_button
          follows="bottom|right"
          height="18"
          image_selected="TrashItem_Press"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index c725334fc016278b4d1319d2fe898156724f6048..cc47e99c2cb9c6d80a22d4259b448e4cf07cf428 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -8,6 +8,7 @@
  left="102" 
  mouse_opaque="true"
  name="Media Settings General" 
+ help_topic = "media_settings_general"
  width="365">
 	
   <text 
@@ -31,6 +32,27 @@
     <!--  <line_editor.commit_callback
 	     function="Media.CommitHomeURL"/> -->
   </line_editor>
+
+  <web_browser
+   border_visible="true"
+   bottom_delta="-133"
+   follows="top|left"
+   left="120"
+   name="preview_media"
+   width="128"
+   height="128"
+   start_url="about:blank"
+   decouple_texture_size="true" />
+  
+  <text
+   bottom_delta="-15"
+   follows="top|left"
+   height="15"
+   left="164"
+   name="">
+    Preview
+  </text>
+  
   <text 
    bottom_delta="-20" 
    follows="top|left" 
@@ -61,27 +83,6 @@
    <button.commit_callback
 	     function="Media.ResetCurrentUrl"/>
   </button>
-
-  <web_browser 
-   border_visible="false" 
-   bottom_delta="-133" 
-   follows="top|left"
-   left="120" 
-   name="preview_media" 
-   width="128" 
-   height="128" 
-   start_url="about:blank" 
-   decouple_texture_size="true" />
-
-  <text 
-   bottom_delta="-15" 
-   follows="top|left" 
-   height="15" 
-   left="164" 
-   name="">
-    Preview
-  </text>
-
   <text 
    bottom_delta="-5" 
    follows="top|left" 
@@ -135,7 +136,8 @@
 
   <check_box 
    bottom_delta="-25" 
-   enabled="true" 
+   visible="false" 
+   enabled="false" 
    follows="left|top" 
    font="SansSerifSmall"
    height="16" 
@@ -148,7 +150,7 @@
    width="150" />
 
   <check_box 
-   bottom_delta="-25" 
+   bottom_delta="0" 
    enabled="true" 
    follows="left|top"
    font="SansSerifSmall"
@@ -161,20 +163,6 @@
    radio_style="false" 
    width="150" />
 
-  <check_box 
-   bottom_delta="-25" 
-   enabled="true" 
-   follows="left|top" 
-   font="SansSerifSmall"
-   height="16" 
-   initial_value="false"
-   label="Use Default Alternative Image" 
-   left="10" 
-   mouse_opaque="true"
-   name="alt_image_enable" 
-   radio_style="false" 
-   width="150" />
-
   <check_box 
    bottom_delta="-25" 
    enabled="true" 
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
index 0cc1406d6277b305bb85cdbe12a0a23c79347be4..85f534c4a3bf4e192ec3366ed4940328634e172d 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
@@ -8,6 +8,7 @@
  left="102" 
  mouse_opaque="true"
  name="Media settings for controls" 
+ help_topic = "media_settings_controls"
  width="365">
 
   <text 
@@ -15,7 +16,6 @@
    follows="top|left" 
    height="15" 
    left="10" 
-   name="media_perms_label_owner" 
    enabled="false">
     Owner
   </text>
@@ -53,9 +53,8 @@
    follows="top|left" 
    height="15" 
    left="10" 
-   name="media_perms_label_group" 
    enabled="false">
-    Group
+    Group:
   </text>
   
   <name_box 
@@ -101,7 +100,6 @@
    follows="top|left" 
    height="15" 
    left="10" 
-   name="media_perms_label_anyone" 
    enabled="false">
     Anyone
   </text>
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
index 695e956e41b1b363f800a5c3c5dbf3403fd2ebce..a26f74844e6960c636477b528c3b4b3c2fc392cb 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
@@ -8,6 +8,7 @@
  left="102" 
  mouse_opaque="true"
  name="Media Settings Security" 
+ help_topic = "media_settings_security"
  width="365">
   <check_box 
    bottom_delta="-40" 
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index 00100693cc96197358e6a4d8a206b5370ae8b5b4..4175d21639b500c7b273fef43835dc571f550b75 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -8,10 +8,33 @@
  layout="topleft"
  name="navigation_bar"
  width="600">
+	<icon
+	 follows="all"
+	 image_name="NavBar_BG"
+	 mouse_opaque="true"
+	 name="bg_icon"
+	 scale_image="true"
+	 visible="true"
+	 left="0"
+	 top="0"
+	 height="65"
+	 width="600"/>
+	<icon
+	 follows="all"
+	 image_name="NavBar_BG_NoFav"
+	 mouse_opaque="true"
+	 name="bg_icon_no_fav"
+	 scale_image="true"
+	 visible="false"
+	 left="0"
+	 top="0"
+	 height="65"
+	 width="600"/>
 	<panel
 	 background_visible="false"
 	 follows="left|top|right"
-	 height="60"
+	 top="5"
+	 height="23"
 	 layout="topleft"
 	 name="navigation_panel"
 	 width="600">
@@ -131,12 +154,12 @@
 
     <favorites_bar
      follows="left|right|top"
-     height="25"
+     height="15"
      layout="topleft"
      left="0"
      name="favorite"
      image_drag_indication="Arrow_Down"
      chevron_button_tool_tip="Show more of My Favorites"
-     top="32"
+     bottom="62"
      width="590" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 4219d9f58f1c94282ee2675112fa3ad64b429b69..2fd82d8f3d4812a41f202fd8b1b0b1c6f6671215 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -7,7 +7,13 @@
  left="0"
  name="chat_bar"
  top="24"
- width="510">
+ width="310">
+    <string name="min_width">
+        310
+    </string>
+    <string name="max_width">
+        320
+    </string>
     <line_editor
      border_style="line"
      border_thickness="1"
@@ -45,27 +51,4 @@
      tool_tip="Shows/hides nearby chat log">
     <button.commit_callback function="Floater.Toggle" parameter="nearby_chat"/>
     </button>
-    <chiclet_talk
-     follows="right"
-     height="20"
-     speak_button.font="SansSerifMedium"
-     speak_button.tab_stop="true"
-     show_button.tab_stop="true"
-     layout="topleft"
-     left_pad="5"
-     name="talk"
-     top="3"
-     width="100"
-     speak_button.tool_tip="Turns microphone on/off"
-     show_button.tool_tip="Shows/hides voice control panel" />
-    <gesture_combo_box
-      follows="right"
-     height="20"
-     label="Gestures"
-     layout="topleft"
-     name="Gesture"
-     left_pad="5"
-     top="3"
-     width="90"
-     tool_tip="Shows/hides gestures" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 4d890b1d4688825e92d0a24332ead3cf7ac2fa01..9c2829d92da360efc9a7be11e9d02cd4f4232c78 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -12,6 +12,7 @@
   width="350">
   <panel
     background_visible="true"
+    bg_alpha_color="0.3 0.3 0.3 0"
     follows="left|right|top"
     height="100"
     label="info_panel"
@@ -70,6 +71,7 @@
   </panel>
   <panel
     background_visible="true"
+    bg_alpha_color="0.3 0.3 0.3 0"
     follows="left|right|bottom"
     height="40"
     label="control_panel"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 8274beb538945e054b8731b5b1a238f215dae556..7b19ab1a1cb61b7ff8286b904d071eb9ea300d96 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Side tray panel -->
 <panel
 background_visible="true"
- draw_border="false"
  follows="all"
  height="570"
  label="People"
@@ -10,7 +10,6 @@ background_visible="true"
  name="people_panel"
  top="0"
  left="0"
- bevel_style="none"
  width="333">
     <string
      name="no_people"
@@ -67,10 +66,13 @@ background_visible="true"
          top="0"
          width="313">
             <avatar_list
+             allow_select="true"
              follows="all"
              height="470"
+             ignore_online_status="true"
              layout="topleft"
              left="0"
+             multi_select="true"
              name="avatar_list"
              top="0"
              volume_column_width="20"
@@ -124,10 +126,12 @@ background_visible="true"
                  name="tab_online"
                  title="Online">
                         <avatar_list
+                         allow_select="true"
                          follows="all"
                          height="150"
                          layout="topleft"
                          left="0"
+                         multi_select="true"
                          name="avatars_online"
                          top="0"
                          width="313" />
@@ -139,10 +143,12 @@ background_visible="true"
                  name="tab_all"
                  title="All">
                         <avatar_list
+                         allow_select="true"
                          follows="all"
                          height="230"
                          layout="topleft"
                          left="0"
+                         multi_select="true"
                          name="avatars_all"
                          top="0"
                          width="313" />
@@ -288,10 +294,12 @@ background_visible="true"
          name="recent_panel"
          width="313">
             <avatar_list
+             allow_select="true"
              follows="all"
              height="470"
              layout="topleft"
              left="0"
+             multi_select="true"
              name="avatar_list"
              top="2"
              width="313" />
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index ac2cf19a96b5a510c09a2b9c6ff85d0f5f2652cf..cbe1f11e3d7e90a7d1b6d7d5d5c2e0bec6101e39 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -71,59 +71,60 @@
              width="18" />
         </panel>
         <panel
-         follows="bottom"
-         auto_resize="false"
          layout="topleft"
-         height="19"
+         left="0"
+         height="25"
+         top_pad="10"
          name="buttons_cucks"
+         help_topic="picks_button_tab"
          width="313">
        <button
+         enabled="false"
          follows="bottom|left"
-         height="19"
-         label="Add"
+         font="SansSerifSmallBold"
+         height="25"
+         label="Info"
          layout="topleft"
-         left="0"
-         mouse_opaque="false"
-         name="add_friend"
-         top="5"
+         left="5"
+         name="info_btn"
+         tab_stop="false"
+         top="0"
          width="55" />
-        <button
-         follows="bottom|left"
-         height="19"
-         label="IM"
-         layout="topleft"
-         name="im"
-         top="5"
-         left_pad="5"
-         width="40" />
         <button
          enabled="false"
          follows="bottom|left"
-         height="19"
-         label="Call"
+         font="SansSerifSmallBold"
+         height="25"
+         label="Teleport"
          layout="topleft"
-         name="call"
          left_pad="5"
-         top="5"
-         width="55" />
+         name="teleport_btn"
+         tab_stop="false"
+         top="0"
+         width="77" />
         <button
          enabled="false"
          follows="bottom|left"
-         height="19"
+         font="SansSerifSmallBold"
+         height="25"
          label="Map"
          layout="topleft"
-         name="show_on_map_btn"
-         top="5"
          left_pad="5"
+         name="show_on_map_btn"
+         tab_stop="false"
+         top="0"
          width="50" />
         <button
-         follows="bottom|left"
-         height="19"
-         label="Teleport"
+         enabled="false"
+         follows="bottom|right"
+         font="SansSerifSmallBold"
+         height="25"
+         label="â–¼"
          layout="topleft"
-         name="teleport"
-         left_pad="5"
-         top="5"
-         width="90" />
+         name="overflow_btn"
+         right="-10"
+         tab_stop="false"
+         top="0"
+         width="30" />
         </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 1ea6e1149d2f10e44d1a3e0c61668f78a0b7e57f..50108aa21f433b2fd3418177446d6b5094b5be7d 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -1,17 +1,18 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
- background_visible="true"
+background_visible="true"
  follows="all"
- height="400"
+ height="570"
  label="Places"
  layout="topleft"
  min_height="350"
- min_width="240"
  name="places panel"
+ top="0"
+ left="0"
  width="333">
     <string
      name="landmarks_tab_title"
-     value="Landmarks" />
+     value="My Landmarks" />
     <string
      name="teleport_history_tab_title"
      value="Teleport History" />
@@ -19,44 +20,47 @@
      follows="left|top|right"
      font="SansSerif"
      height="23"
-     label="Filter"
      layout="topleft"
      left="15"
+     label="Filter"
+     max_length="300"
      name="Filter"
      top="3"
-     width="300" />
+     width="303" />
     <tab_container
      follows="all"
-     height="326"
+     height="500"
      layout="topleft"
-     left="9"
+     left="10"
      name="Places Tabs"
+     tab_min_width="70"
+     tab_height="30"
      tab_position="top"
-     top="30"
+     top_pad="10"
      width="313" />
     <panel
      class="panel_place_info"
      filename="panel_place_info.xml"
      follows="all"
-     height="326"
+     height="533"
      layout="topleft"
      left="0"
      help_topic="places_info_tab"
      name="panel_place_info"
-     top="30"
-     visible="false" />
+     top="5"
+     visible="false"
+     width="313" />
     <panel
-     height="25"
+     height="19"
      layout="topleft"
      left="0"
      help_topic="places_button_tab"
      name="button_panel"
-     top_pad="10"
      width="313">
         <button
          follows="bottom|left"
-         font="SansSerifSmallBold"
-         height="25"
+         font="SansSerifSmall"
+         height="19"
          label="Teleport"
          layout="topleft"
          left="5"
@@ -65,8 +69,8 @@
          width="77" />
         <button
          follows="bottom|left"
-         font="SansSerifSmallBold"
-         height="25"
+         font="SansSerifSmall"
+         height="19"
          label="Map"
          layout="topleft"
          left_pad="5"
@@ -76,8 +80,8 @@
         <button
          enabled="false"
          follows="bottom|left"
-         font="SansSerifSmallBold"
-         height="25"
+         font="SansSerifSmall"
+         height="19"
          label="Share"
          layout="topleft"
          left_pad="5"
@@ -86,8 +90,8 @@
          width="60" />
         <button
          follows="bottom|left"
-         font="SansSerifSmallBold"
-         height="25"
+         font="SansSerifSmall"
+         height="19"
          label="Edit"
          layout="topleft"
          left_pad="5"
@@ -96,18 +100,21 @@
          width="50" />
         <button
          follows="bottom|right"
-         font="SansSerifSmallBold"
-         height="25"
-         label="â–¼"
+         font="SansSerifSmall"
+         height="19"
+         image_disabled="ForwardArrow_Disabled"
+         image_selected="ForwardArrow_Press"
+         image_unselected="ForwardArrow_Off"
+         picture_style="true"
          layout="topleft"
          name="overflow_btn"
          right="-10"
          top="0"
-         width="30" />
+         width="18" />
         <button
          follows="bottom|right"
-         font="SansSerifSmallBold"
-         height="25"
+         font="SansSerifSmall"
+         height="19"
          label="Close"
          layout="topleft"
          name="close_btn"
@@ -116,8 +123,8 @@
          width="60" />
         <button
          follows="bottom|right"
-         font="SansSerifSmallBold"
-         height="25"
+         font="SansSerifSmall"
+         height="19"
          label="Cancel"
          layout="topleft"
          name="cancel_btn"
@@ -126,8 +133,8 @@
          width="60" />
         <button
          follows="bottom|right"
-         font="SansSerifSmallBold"
-         height="25"
+         font="SansSerifSmall"
+         height="19"
          label="Save"
          layout="topleft"
          name="save_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index f7d7d52b68bec636ae6159b3b8f329c294f1dd06..16fdbd704542612ec1089fae6054898bef2d2f6f 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -196,7 +196,7 @@ Automatic positioning for:
      name="heading3"
      top_pad="10"
      width="270">
-My Avatar:
+Avatars:
 	</text>
     <check_box
      control_name="FirstPersonAvatarVisible"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index a94cfbeec46e45f4bc4715d59220e1296dd3fdbc..975d21aaa6a16e1424bdfebceee7c2a1e380b0c6 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -33,7 +33,7 @@
      width="170">
         <combo_box.item
          enabled="true"
-         label="System Default"
+         label="System default"
          name="System Default Language"
          value="default" />
         <combo_box.item
@@ -189,7 +189,7 @@
      name="start_location_textbox"
      top_delta="20"
      width="394">
-        Start Location:
+        Start location:
     </text>
     <combo_box
      control_name="LoginLocation"
@@ -213,7 +213,7 @@
      control_name="ShowStartLocation"
      height="16"
      initial_value="true"
-     label="Show on Login"
+     label="Show on login"
      layout="topleft"
      left_delta="175"
      name="show_location_checkbox"
@@ -272,7 +272,7 @@
      layout="topleft"
      left_delta="0"
      name="show_my_name_checkbox1"
-     top_pad="5"
+     top_pad="-7"
      width="300" />
     <check_box
 	 enabled_control="AvatarNameTagMode"
@@ -303,7 +303,7 @@
      layout="topleft"
      left="30"
      name="effects_color_textbox"
-     top_pad="10"
+     top_pad="5"
      width="400">
         My Effects:
     </text>
@@ -316,7 +316,76 @@
      left_delta="50"
      name="effect_color_swatch"
      tool_tip="Click to open Color Picker"
-     top_pad="10"
+     top_pad="5"
      width="32" />
+    <text
+     type="string"
+     length="1"
+     follows="left|top"
+     height="15"
+     layout="topleft"
+     left="30"
+     name="title_afk_text"
+     text_color="white"
+     top_pad="-5"
+     width="190">
+        Away timeout:
+    </text>
+    <spinner
+     control_name="AFKTimeout"
+     decimal_digits="0"
+     follows="left|top"
+     halign="right"
+     height="15"
+     increment="1"
+     initial_value="300"
+     label=""
+     label_width="0"
+     layout="topleft"
+     left_delta="50"
+     max_val="600"
+     min_val="30"
+     name="afk_timeout_spinner"
+     top_pad="5"
+     width="50" />
+    <text
+     type="string"
+     length="1"
+     follows="left|top"
+     halign="left"
+     height="15"
+     layout="topleft"
+     left_pad="2"
+     name="seconds_textbox"
+     width="70">
+       seconds
+    </text>
+    <text
+     type="string"
+     length="1"
+     follows="left|top"
+     height="10"
+     layout="topleft"
+     text_color="white"
+     left="30"
+     mouse_opaque="false"
+     name="text_box3"
+     top_pad="10"
+     width="240">
+       Busy mode response:
+    </text>
+    <text_editor
+     control_name="BusyModeResponse2"
+     commit_on_focus_lost = "true"
+     follows="left|top"
+     height="56"
+     layout="topleft"
+     left_delta="50"
+     name="busy_response"
+     width="400"
+     word_wrap="true"
+     top_pad="5">
+       log_in_to_change
+    </text_editor>
     
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 519b46986805498f2e19b8d89a78f1d59a98c5a5..b1308a194283a2f0ff394bb8a5b16fc6281f4819 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -92,7 +92,7 @@
      name="UI Size:"
      top_pad="4"
      width="300">
-        UI Size:
+        UI size:
     </text>
     <slider
      can_edit_text="true"
@@ -290,7 +290,7 @@
 		control_name="RenderObjectBump"
 		height="16"
 		initial_value="true"
-		label="Bump Mapping and Shiny"
+		label="Bump mapping and shiny"
 		layout="topleft"
 		left_delta="0"
 		name="BumpShiny"
@@ -300,7 +300,7 @@
 		control_name="VertexShaderEnable"
 		height="16"
 		initial_value="true"
-		label="Basic Shaders"
+		label="Basic shaders"
 		layout="topleft"
 		left_delta="0"
 		name="BasicShaders"
@@ -314,7 +314,7 @@
 		control_name="WindLightUseAtmosShaders"
 		height="16"
 		initial_value="true"
-		label="Atmospheric Shaders"
+		label="Atmospheric shaders"
 		layout="topleft"
 		left_delta="0"
 		name="WindLightUseAtmosShaders"
@@ -327,7 +327,7 @@
 		control_name="RenderWaterReflections"
 		height="16"
 		initial_value="true"
-		label="Water Reflections"
+		label="Water reflections"
 		layout="topleft"
 		left_delta="0"
 		name="Reflections"
@@ -346,7 +346,7 @@
 		name="ReflectionDetailText"
 		top_pad="7"
 		width="128">
-			Reflection Detail:
+			Reflection detail:
 		</text>
 		<radio_group
 		control_name="RenderReflectionDetail"
@@ -359,7 +359,7 @@
 		width="321">
 			<radio_item
 			height="16"
-			label="Terrain and Trees"
+			label="Terrain and trees"
 			layout="topleft"
 			left="3"
 			name="0"
@@ -367,7 +367,7 @@
 			width="315" />
 			<radio_item
 			height="16"
-			label="All Static Objects"
+			label="All static objects"
 			layout="topleft"
 			left_delta="0"
 			name="1"
@@ -375,7 +375,7 @@
 			width="315" />
 			<radio_item
 			height="16"
-			label="All Avatars and Objects"
+			label="All avatars and objects"
 			layout="topleft"
 			left_delta="0"
 			name="2"
@@ -400,13 +400,13 @@
 		name="AvatarRenderingText"
 		top_pad="5"
 		width="128">
-			Avatar Rendering:
+			Avatar rendering:
 		</text>
 		<check_box
 		control_name="RenderUseImpostors"
 		height="16"
 		initial_value="true"
-		label="Avatar Impostors"
+		label="Avatar impostors"
 		layout="topleft"
 		left_delta="0"
 		name="AvatarImpostors"
@@ -416,7 +416,7 @@
 		control_name="RenderAvatarVP"
 		height="16"
 		initial_value="true"
-		label="Hardware Skinning"
+		label="Hardware skinning"
 		layout="topleft"
 		left_delta="0"
 		name="AvatarVertexProgram"
@@ -429,7 +429,7 @@
 		control_name="RenderAvatarCloth"
 		height="16"
 		initial_value="true"
-		label="Avatar Cloth"
+		label="Avatar cloth"
 		layout="topleft"
 		left_delta="0"
 		name="AvatarCloth"
@@ -443,7 +443,7 @@
 		height="16"
 		increment="8"
 		initial_value="160"
-		label="Draw Distance:"
+		label="Draw distance:"
 		label_width="140"
 		layout="topleft"
 		left="216"
@@ -474,7 +474,7 @@
 		height="16"
 		increment="256"
 		initial_value="4096"
-		label="Max. Particle Count:"
+		label="Max. particle count:"
 		label_width="140"
 		layout="topleft"
 		left="216"
@@ -489,7 +489,7 @@
 		height="16"
 		increment="1"
 		initial_value="8"
-		label="Post Process Quality:"
+		label="Post process quality:"
 		label_width="140"
 		layout="topleft"
 		left_delta="0"
@@ -513,7 +513,7 @@
 		name="MeshDetailText"
 		top_pad="5"
 		width="128">
-			Mesh Detail:
+			Mesh detail:
 		</text>
 		<slider
 		control_name="RenderVolumeLODFactor"
@@ -724,7 +724,7 @@
         name="LightingDetailText"
         top_pad="8"
         width="128">
-           Lighting Detail:
+           Lighting detail:
         </text>
         <radio_group
         control_name="RenderLightingDetail"
@@ -762,7 +762,7 @@
         name="TerrainDetailText"
         top="465"
         width="128">
-           Terrain Detail:
+           Terrain detail:
         </text>
         <radio_group
         control_name="RenderTerrainDetail"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index c4dc8834dbd7d14b3b2743773fd67e62e7e618ff..ce7939c00f525ad791500c3ea07e994afe75bb4e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -77,10 +77,19 @@
      name="cookies_enabled"
      top_pad="10"
      width="350" />
+    <check_box
+     control_name="AutoPlayMedia"
+     height="16"
+     label="Allow Media Autoplay"
+     layout="topleft"
+     left="30"
+     name="autoplay_enabled"
+     top_pad="10"
+     width="350" />
     <text
-     type="string"
-     length="1"
-     follows="left|top"
+      type="string"
+    length="1"
+    follows="left|top"
      height="10"
      layout="topleft"
      left="30"
@@ -88,8 +97,9 @@
      top_pad="10"
      width="350">
         Logs:
-    </text>    
+    </text>
     <check_box
+   
 	 enabled="false"
      control_name="LogInstantMessages"
      height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index df347cfb5f64f40256b79b2753c1969397c271e9..9cf0bd26d882897d56ef147c4d791b47f56903cf 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -141,7 +141,7 @@
      height="16"
      increment="1"
      initial_value="80"
-     label="Port Number:"
+     label="Port number:"
      label_width="75"
      layout="topleft"
      left_delta="160"
@@ -294,7 +294,7 @@
      follows="left|top"
      height="16"
      initial_value="false"
-     label="Web Proxy"
+     label="Web proxy"
      left_delta="0"
      mouse_opaque="true"
      name="web_proxy_enabled"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index f5f9850a4e35c103685f91c9b22d761607463966..8a28719d98393a111b8bebd5b608572aa0e6ea25 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -15,7 +15,7 @@
      height="15"
      increment="0.05"
      initial_value="0.5"
-     label="Master Volume"
+     label="Master volume"
      label_width="125"
      layout="topleft"
      left="30"
@@ -314,23 +314,27 @@
         Sound out/in:
     </text>
     <button
-	 enabled_control="EnableVoiceChat"
+     control_name="ShowDeviceSettings"
      follows="left|top"
      height="20"
-     label="Device Settings"
+     is_toggle="true"
+     label="Device settings"
      layout="topleft"
      left_delta="55"
      name="device_settings_btn"
      top_pad="0"
-     width="155">
-		<button.commit_callback
-         function="Floater.Show"
-         parameter="pref_voicedevicesettings" />
-    </button>    
-    <panel.string
-     name="default_text">
-        Default
-    </panel.string>
+     width="155" />
+    <panel
+     visiblity_control="ShowDeviceSettings"
+     border="false"
+	 follows="top|left"
+     height="260"
+     label="DeviceSettings"
+     layout="topleft"
+     left="0"
+     name="Device Settings"
+     top_pad="5"
+     width="485">
     <text
      type="string"
      length="1"
@@ -339,14 +343,14 @@
      layout="topleft"
      left="30"
      name="Input device (microphone):"
-     top_pad="5"
+     top_pad="0"
      width="200">
         Input device (microphone):
     </text>
     <combo_box
      height="18"
      layout="topleft"
-     left_delta="70"
+     left_delta="55"
      max_chars="128"
      name="voice_input_device"
      top_pad="2"
@@ -366,7 +370,7 @@
     <combo_box
      height="18"
      layout="topleft"
-     left_delta="70"
+     left_delta="55"
      max_chars="128"
      name="voice_output_device"
      top_pad="2"
@@ -381,7 +385,7 @@
      name="Input level:"
      top_pad="10"
      width="200">
-        Input Level
+        Input level
     </text>
     <slider_bar
      follows="left|top"
@@ -452,6 +456,6 @@
      word_wrap="true">
         Adjust the slider to control how loud you sound to other Residents. To test the input level, simply speak into your microphone.
     </text>
-
+    </panel>
     
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index a32be90a33c639cabbd631364764fcbddc4d78e8..73a759a8ba5f3aaedea9b7882564f10d18ff6e7c 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -53,7 +53,7 @@
          left="10"
          name="second_life_image_panel"
          top="0"
-         width="290">
+         width="280">
             <texture_picker
              allow_no_texture="true"
              default_image_name="None"
@@ -75,13 +75,14 @@
              text_color="white"
              top_delta="0"
              value="[SECOND_LIFE]:"
-             width="170" />
+             width="165" />
             <expandable_text
              follows="left|top|right"
              height="95"
              layout="topleft"
              left="107"
              name="sl_description_edit"
+             top_pad="-3"
              width="173"
              expanded_bg_visible="true"
              expanded_bg_color="DkGray">
@@ -95,7 +96,7 @@
 	 top_pad="10"
          left="10"
          name="first_life_image_panel"
-         width="290">
+         width="280">
             <texture_picker
              allow_no_texture="true"
              default_image_name="None"
@@ -116,13 +117,14 @@
              text_color="white"
              top_delta="0"
              value="Real World:"
-             width="173" />
+             width="165" />
             <expandable_text
              follows="left|top|right"
              height="95"
              layout="topleft"
              left="107"
              name="fl_description_edit"
+             top_pad="-3"
              width="173"
              expanded_bg_visible="true"
              expanded_bg_color="DkGray">
@@ -151,7 +153,7 @@
          name="homepage_edit"
          top_pad="0"
          value="http://librarianavengers.org"
-         width="290"
+         width="280"
          word_wrap="false"
          use_elipsis="true"
          />
@@ -205,7 +207,7 @@
          name="acc_status_text"
          top_pad="0"
          value="Resident. No payment info on file."
-         width="295"
+         width="280"
          word_wrap="true" />
         <text
          follows="left|top"
@@ -215,7 +217,7 @@
          left="10"
          name="title_partner_text"
          text_color="white"
-         top_pad="10"
+         top_pad="5"
          value="Partner:"
          width="280" />
         <panel
@@ -245,21 +247,21 @@
          left="10"
          name="title_groups_text"
          text_color="white"
-         top_pad="10"
+         top_pad="8"
          value="Groups:"
          width="280" />
-        <text
+                     <expandable_text
          follows="left|top|bottom"
-         height="160"
+         height="60"
          layout="topleft"
          left="10"
-         name="sl_groups"
-         top_pad="0"
-         width="290"
-         word_wrap="true"
-         use_elipsis="true">
+             name="sl_groups"
+       top_pad="0"
+         width="280"
+             expanded_bg_visible="true"
+             expanded_bg_color="DkGray">
             Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
-        </text>
+        </expandable_text>
       </panel>
  </scroll_container>
  <panel
@@ -270,17 +272,17 @@
      top_pad="2"
      bottom="10"
      height="19"
-     width="313">
+     width="303">
         <button
          follows="bottom|left"
          height="19"
-         label="Add"
+         label="Add Friend"
          layout="topleft"
          left="0"
          mouse_opaque="false"
          name="add_friend"
          top="5"
-         width="55" />
+         width="75" />
         <button
          follows="bottom|left"
          height="19"
@@ -289,7 +291,7 @@
          name="im"
          top="5"
          left_pad="5"
-         width="40" />
+         width="45" />
         <button
          enabled="false"
          follows="bottom|left"
@@ -299,7 +301,7 @@
          name="call"
          left_pad="5"
          top="5"
-         width="55" />
+         width="45" />
         <button
          enabled="false"
          follows="bottom|left"
@@ -309,7 +311,7 @@
          name="show_on_map_btn"
          top="5"
          left_pad="5"
-         width="50" />
+         width="45" />
         <button
          follows="bottom|left"
          height="19"
@@ -318,7 +320,7 @@
          name="teleport"
          left_pad="5"
          top="5"
-         width="90" />
+         width="80" />
  </panel>
  <panel
      follows="bottom|left"
@@ -328,7 +330,7 @@
      name="profile_me_buttons_panel"
      visible="false"
      height="19"
-     width="313">
+     width="303">
         <button
          follows="bottom|right"
          font="SansSerifSmall"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
index 8a48574440a1e9fe61e425e8232aac324e01f040..7a5781651d87d3969d9f3ffa2e4d0db78652114f 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -52,8 +52,9 @@
      height="535"
      layout="topleft"
      left="10"
+ min_width="333"
      name="tabs"
-     tab_min_width="95"
+     tab_min_width="80"
      tab_height="30"
      tab_position="top"
      top_pad="10"
@@ -61,21 +62,21 @@
         <panel
          class="panel_profile"
          filename="panel_profile.xml"
-         label="Profile"
+         label="PROFILE"
          layout="topleft"
          help_topic="profile_profile_tab"
          name="panel_profile" />
         <panel
          class="panel_picks"
          filename="panel_picks.xml"
-         label="Picks"
+         label="PICKS"
          layout="topleft"
          help_topic="profile_picks_tab"
          name="panel_picks" />
         <panel
          class="panel_notes"
          filename="panel_notes.xml"
-         label="Notes &amp; Privacy"
+         label="NOTES &amp; PRIVACY"
          layout="topleft"
          help_topic="profile_notes_tab"
          name="panel_notes" />
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index d3d45640cb37b8e67f97fcf61c97940893770263..3f64c9c633f4ff4e714e9337f6a84abd1616698d 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -1,4 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Side tray cannot show background because it is always 
+	partially on screen to hold tab buttons. -->
 <side_tray
   name="sidebar"
   background_visible="false"
@@ -6,21 +8,24 @@
   width="333"
   collapsed="true"
 >
+  <!-- Individual tabs must show background to have seemless
+	appearance up to tray panel header word like "Home".
+	Embedded panels are inset by a pixel and so their 
+	backgrounds will not block the world fully. -->
   <sidetray_tab
     name="sidebar_home"
     help_topic="sidebar_home"
     tab_title="Home"
     description="Home."
     image="TabIcon_Open_Off"
+	image_selected="TabIcon_Close_Off"
     mouse_opaque="false"
-    background_opaque="false"
     background_visible="true"
   >
       <panel
         name="panel_home"
         filename="panel_sidetray_home_tab.xml"
         label="home"
-        border="true"
       />
   </sidetray_tab>
 
@@ -30,8 +35,8 @@
     tab_title="People"
     description="Find your friends, contacts and people nearby."
     image="TabIcon_People_Off"
+    image_selected="TabIcon_People_Selected"
     mouse_opaque="false"
-    background_opaque="false"
     background_visible="true"
   >
     <panel_container
@@ -42,20 +47,17 @@
         class="panel_people"
         name="panel_people"
         filename="panel_people.xml"
-        border="true"
       />
       <panel
         class="panel_profile_view"
         name="panel_profile_view"
         filename="panel_profile_view.xml"
-        border="true"
       />
       <panel
         class="panel_group_info_sidetray"
         name="panel_group_info_sidetray"
         filename="panel_group_info_sidetray.xml"
         label="Group Info"
-        border="true"
         font="SansSerifBold"
       />
       <panel
@@ -63,12 +65,12 @@
         name="panel_block_list_sidetray"
         filename="panel_block_list_sidetray.xml"
         label="Blocked Residents &amp; Objects"
-        border="true"
         font="SansSerifBold"
       />
 
     </panel_container>
   </sidetray_tab>
+  
   <sidetray_tab
     name="sidebar_places"
     help_topic="sidebar_places"
@@ -76,6 +78,7 @@
     label="Places"
     description="Find places to go and places you&apos;ve visited before."
     image="TabIcon_Places_Off"
+	image_selected="TabIcon_Places_Selected"
     mouse_opaque="false"
     background_visible="true"
   >
@@ -84,7 +87,6 @@
         name="panel_places"
         filename="panel_places.xml"
         label="Places"
-        border="true"
         font="SansSerifBold"
       />
   </sidetray_tab>
@@ -95,6 +97,7 @@
     tab_title="Me"
     description="Edit your public profile and Picks."
     image="TabIcon_Me_Off"
+    image_selected="TabIcon_Me_Selected"
     mouse_opaque="false"
     background_visible="true"
   >
@@ -103,7 +106,6 @@
         name="panel_me_profile"
         filename="panel_me_profile.xml"
         label="Me"
-        border="true"
       />
   </sidetray_tab>
 
@@ -113,19 +115,17 @@
     tab_title="Appearance"
     description="Change your appearance and current look."
     image="TabIcon_Appearance_Off"
+    image_selected="TabIcon_Appearance_Selected"
     mouse_opaque="false"
-    background_opaque="false"
     background_visible="true"
   >
       <panel
         class="panel_appearance"
         name="panel_appearance"
         filename="panel_appearance.xml"
-        border="true"
         label="Edit Appearance"
         font="SansSerifBold"
       />
   </sidetray_tab>
 
-
 </side_tray>
diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
index e991861e9428ec34a8c55f9c32c688bd26a42731..247054772e1f1a74dd7c90382ac070ceb69b59eb 100644
--- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Part of side tray, see that XML file for panel config -->
 <panel
- background_visible="true"
- bevel_style="out"
  follows="all"
  height="560"
  label="home_tab"
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index 01fd84e09de9652ef6c4af1bfc97ab629692d528..2e500fc2aa8c30b6134427eeec593245fd5adb89 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -7,7 +7,7 @@
   visible="false"
   layout="topleft"
 	width="350"
-	height="72"
+	height="40"
   left="100"
   top="500"
   follows="right|bottom" 
@@ -24,18 +24,18 @@
    visible="false"
    follows="left|top|right|bottom"
    font="SansSerifBold"
-   height="40"
+   height="28"
    layout="topleft"
    left="60"
    name="toast_text"
    word_wrap="true"
    text_color="white"
-   top="20"
+   top="10"
    width="290">
     Toast text;
   </text>
   <icon
-    top="20" 
+    top="4" 
     left="10" 
     width="32" 
     height="32"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 0ca6c8758576624f565979fddc2abb91541a56f5..4c19b22ac596e9ace0b441119d72a5b6ce5126e9 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -16,7 +16,7 @@
 	<string name="StartupLoading">Loading</string>
 
 	<!-- Legacy strings, almost never used -->
-	<string name="Fullbright">Fullbright (Legacy)</string>	
+	<string name="Fullbright">Fullbright (Legacy)</string>	<!-- used in the Build > materials dropdown-->
 
 	<!-- Login -->
 	<string name="LoginInProgress">Logging in. [APP_NAME] may appear frozen.  Please wait.</string>
@@ -130,7 +130,7 @@
 	<string name="AssetErrorPriceMismatch">Viewer and server do not agree on price</string>
 	<string name="AssetErrorUnknownStatus">Unknown status</string>
 	
-	<!-- Asset Type Human Names -->
+	<!-- Asset Type human readable names:  these will replace variable [TYPE] in notification FailedToFindWearable* -->
 	<string name="texture">texture</string>
 	<string name="sound">sound</string>
 	<string name="calling card">calling card</string>
@@ -138,23 +138,23 @@
 	<string name="legacy script">legacy script</string>
 	<string name="clothing">clothing</string>
 	<string name="object">object</string>
-	<string name="note card">note card</string>
+	<string name="note card">notecard</string>
 	<string name="folder">folder</string>
 	<string name="root">root</string>
-	<string name="lsl2 script">lsl2 script</string>
-	<string name="lsl bytecode">lsl bytecode</string>
+	<string name="lsl2 script">LSL2 script</string>
+	<string name="lsl bytecode">LSL bytecode</string>
 	<string name="tga texture">tga texture</string>
-	<string name="body part">body part</string>												
-	<string name="snapshot">snapshot</string>															
-	<string name="lost and found">lost and found</string>																												
-	<string name="targa image">targa image</string>															
-	<string name="trash">trash</string>															
-	<string name="jpeg image">jpeg image</string>															
-	<string name="animation">animation</string>															
-	<string name="gesture">gesture</string>															
-	<string name="simstate">simstate</string>																
-	<string name="favorite">favorite</string>															
-	<string name="symbolic link">link</string>															
+	<string name="body part">body part</string>
+	<string name="snapshot">snapshot</string>
+	<string name="lost and found">Lost and Found</string>
+	<string name="targa image">targa image</string>
+	<string name="trash">Trash</string>
+	<string name="jpeg image">jpeg image</string>
+	<string name="animation">animation</string>
+	<string name="gesture">gesture</string>
+	<string name="simstate">simstate</string>
+	<string name="favorite">favorite</string>
+	<string name="symbolic link">link</string>
 	
 	<!-- llvoavatar. Displayed in the avatar chat bubble -->
 	<string name="AvatarEditingAppearance">(Editing Appearance)</string>
@@ -1819,6 +1819,7 @@ this texture in your inventory
 	<string name="broken_link" value=" (broken_link)" />
 	<string name="LoadingContents">Loading contents...</string>
 	<string name="NoContents">No contents</string>
+	<string name="WornOnAttachmentPoint"> (worn on [ATTACHMENT_POINT])</string>
 
 	<!-- Gestures labels -->
     <!-- use value="" because they have preceding spaces -->
@@ -2844,13 +2845,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Wide Lips">Wide Lips</string>
 <string name="Wild">Wild</string>
 <string name="Wrinkles">Wrinkles</string>
-
-  <string name="Search">Search</string>
   
   <!-- Favorites Bar -->
   <string name="LocationCtrlAddLandmarkTooltip">Add to My Landmarks</string>
   <string name="LocationCtrlEditLandmarkTooltip">Edit My Landmark</string>
-
+  <string name="LocationCtrlInfoBtnTooltip">See more info about the current location</string>
+  <string name="LocationCtrlComboBtnTooltip">My location history</string>
+  
   <!-- Strings used by the (currently Linux) auto-updater app -->
 	<string name="UpdaterWindowTitle">
 	  [APP_NAME] Update
@@ -2884,6 +2885,22 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 	</string>
 
   <!-- IM system messages -->
+  <string name="ringing-im">
+    Joining Voice Chat...
+  </string>
+  <string name="connected-im">
+    Connected, click End Call to hang up
+  </string>
+  <string name="hang_up-im">
+    Left Voice Chat
+  </string>
+  <string name="answering-im">
+    Connecting...
+  </string>
+  <string name="inventory_item_offered-im">
+    Inventory item offered
+  </string>
+
   <string name="only_user_message">
     You are the only user in this session.
   </string>
diff --git a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
index 3ff0b3062aaf2ec54f0b040e4de05d8c4d95c10f..dabcb1038bf97b539aa5277fbbde91eb09a2a829 100644
--- a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
+++ b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <accordion_tab
-    header_bg_color="0.68 0.68 0.68 1"
-    header_txt_color="0.68 0.68 0.68 1"
+    header_bg_color="DkGray2"
+    header_txt_color="LtGray"
     header_collapse_img="Accordion_ArrowClosed_Off"
     header_collapse_img_pressed="Accordion_ArrowClosed_Press"
     header_expand_img="Accordion_ArrowOpened_Off"
     header_expand_img_pressed="Accordion_ArrowOpened_Press"
-    header_image="Accordion_Off.png"
+    header_image="Accordion_Off"
     header_image_over="Accordion_Over"
     header_image_pressed="Accordion_Press"
     />
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 1377a3c945422888ab4d16953a0b8af56e1c4ec4..f2e48c517d8a9797ab5ffb11328e74faf990da4f 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -21,7 +21,6 @@
                 >
   <info_button name="Place Information"
                           label=""
-                          tool_tip="See more info about the current location"
                           width="16"
                           height="16"
                           follows="left|top"
@@ -43,8 +42,7 @@
 			  left="-3" />
   <combo_button name="Location History"
                           label=""
-                          pad_right="0"
-                          tool_tip="My location history"/>
+                          pad_right="0"/>
   <combo_list bg_writeable_color="MenuDefaultBgColor" page_lines="10"
               scroll_bar_bg_visible="true" />
   <combo_editor name="Combo Text Entry"
diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index 25d85899a1943bb6cbcfd169593f227a803269f5..2fe5f517a2359240686231248ce45d9752b8f735 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -1,10 +1,23 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <tab_container tab_min_width="60"
                tab_max_width="150"
-               tab_height="16"
-               tab_top_image_unselected="TabTop_Middle_Off"
-               tab_top_image_selected="TabTop_Middle_Selected"
+               tab_height="16">
+  <first_tab tab_top_image_unselected="TabTop_Left_Off"
+               tab_top_image_selected="TabTop_Left_Selected"
                tab_bottom_image_unselected="Toolbar_Left_Off"
                tab_bottom_image_selected="Toolbar_Left_Selected"
-               tab_left_image_unselected="TabTop_Left_Off"
-               tab_left_image_selected="TabTop_Left_Selected"/>
\ No newline at end of file
+               tab_left_image_unselected="TabTop_Middle_Off"
+               tab_left_image_selected="TabTop_Middle_Selected"/>
+  <middle_tab tab_top_image_unselected="TabTop_Middle_Off"
+               tab_top_image_selected="TabTop_Middle_Selected"
+               tab_bottom_image_unselected="Toolbar_Middle_Off"
+               tab_bottom_image_selected="Toolbar_Middle_Selected"
+               tab_left_image_unselected="TabTop_Middle_Off"
+               tab_left_image_selected="TabTop_Middle_Selected"/>
+  <last_tab tab_top_image_unselected="TabTop_Right_Off"
+               tab_top_image_selected="TabTop_Right_Selected"
+               tab_bottom_image_unselected="Toolbar_Right_Off"
+               tab_bottom_image_selected="Toolbar_Right_Selected"
+               tab_left_image_unselected="TabTop_Middle_Off"
+               tab_left_image_selected="TabTop_Middle_Selected"/>
+</tab_container>
\ No newline at end of file
diff --git a/indra/newview/tests/llcapabilitylistener_test.cpp b/indra/newview/tests/llcapabilitylistener_test.cpp
index b965379c9c02f19c7d7abbea951ae080795c476b..4759c7dc912189b401ebcf9217eb3ce971de2aef 100644
--- a/indra/newview/tests/llcapabilitylistener_test.cpp
+++ b/indra/newview/tests/llcapabilitylistener_test.cpp
@@ -5,7 +5,30 @@
  * @brief  Test for llcapabilitylistener.cpp.
  * 
  * $LicenseInfo:firstyear=2008&license=viewergpl$
- * Copyright (c) 2008, Linden Research, Inc.
+ * 
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
  */
 
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 06eb1e12654d5348c331c6ba2d4b24f16ed82214..b85d31d1ac6563ce26a12340afd982688fea8a39 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -573,6 +573,24 @@ def construct(self):
                 self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app")
                 self.path("../mac_updater/" + self.args['configuration'] + "/mac-updater.app", "mac-updater.app")
 
+                # our apps dependencies on shared libs
+                if dylibs["llcommon"]:
+                    mac_crash_logger_res_path = self.dst_path_of("mac-crash-logger.app/Contents/Resources")
+                    mac_updater_res_path = self.dst_path_of("mac-updater.app/Contents/Resources")
+                    for libfile in ("libllcommon.dylib",
+                                    "libapr-1.0.3.7.dylib",
+                                    "libaprutil-1.0.3.8.dylib",
+                                    "libexpat.0.5.0.dylib"):
+                        target_lib = os.path.join('../../..', libfile)
+                        self.run_command("ln -sf %(target)r %(link)r" % 
+                                         {'target': target_lib,
+                                          'link' : os.path.join(mac_crash_logger_res_path, libfile)}
+                                         )
+                        self.run_command("ln -sf %(target)r %(link)r" % 
+                                         {'target': target_lib,
+                                          'link' : os.path.join(mac_updater_res_path, libfile)}
+                                         )
+
                 # plugin launcher
                 self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin", "SLPlugin")
 
@@ -597,7 +615,7 @@ def construct(self):
         # This may be desirable for the final release.  Or not.
         if ("package" in self.args['actions'] or 
             "unpacked" in self.args['actions']):
-            self.run_command('strip -S "%(viewer_binary)s"' %
+            self.run_command('strip -S %(viewer_binary)r' %
                              { 'viewer_binary' : self.dst_path_of('Contents/MacOS/Second Life')})
 
 
@@ -626,12 +644,12 @@ def package_finish(self):
         # make sure we don't have stale files laying about
         self.remove(sparsename, finalname)
 
-        self.run_command('hdiutil create "%(sparse)s" -volname "%(vol)s" -fs HFS+ -type SPARSE -megabytes 700 -layout SPUD' % {
+        self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 700 -layout SPUD' % {
                 'sparse':sparsename,
                 'vol':volname})
 
         # mount the image and get the name of the mount point and device node
-        hdi_output = self.run_command('hdiutil attach -private "' + sparsename + '"')
+        hdi_output = self.run_command('hdiutil attach -private %r' % sparsename)
         devfile = re.search("/dev/disk([0-9]+)[^s]", hdi_output).group(0).strip()
         volpath = re.search('HFS\s+(.+)', hdi_output).group(1).strip()
 
@@ -665,24 +683,25 @@ def package_finish(self):
             self.copy_action(self.src_path_of(s), os.path.join(volpath, d))
 
         # Hide the background image, DS_Store file, and volume icon file (set their "visible" bit)
-        self.run_command('SetFile -a V "' + os.path.join(volpath, ".VolumeIcon.icns") + '"')
-        self.run_command('SetFile -a V "' + os.path.join(volpath, "background.jpg") + '"')
-        self.run_command('SetFile -a V "' + os.path.join(volpath, ".DS_Store") + '"')
+        for f in ".VolumeIcon.icns", "background.jpg", ".DS_Store":
+            self.run_command('SetFile -a V %r' % os.path.join(volpath, f))
 
         # Create the alias file (which is a resource file) from the .r
-        self.run_command('rez "' + self.src_path_of("installers/darwin/release-dmg/Applications-alias.r") + '" -o "' + os.path.join(volpath, "Applications") + '"')
+        self.run_command('rez %r -o %r' %
+                         (self.src_path_of("installers/darwin/release-dmg/Applications-alias.r"),
+                          os.path.join(volpath, "Applications")))
 
         # Set the alias file's alias and custom icon bits
-        self.run_command('SetFile -a AC "' + os.path.join(volpath, "Applications") + '"')
+        self.run_command('SetFile -a AC %r' % os.path.join(volpath, "Applications"))
 
         # Set the disk image root's custom icon bit
-        self.run_command('SetFile -a C "' + volpath + '"')
+        self.run_command('SetFile -a C %r' % volpath)
 
         # Unmount the image
-        self.run_command('hdiutil detach -force "' + devfile + '"')
+        self.run_command('hdiutil detach -force %r' % devfile)
 
         print "Converting temp disk image to final disk image"
-        self.run_command('hdiutil convert "%(sparse)s" -format UDZO -imagekey zlib-level=9 -o "%(final)s"' % {'sparse':sparsename, 'final':finalname})
+        self.run_command('hdiutil convert %(sparse)r -format UDZO -imagekey zlib-level=9 -o %(final)r' % {'sparse':sparsename, 'final':finalname})
         # get rid of the temp file
         self.package_file = finalname
         self.remove(sparsename)
diff --git a/indra/test_apps/llplugintest/bookmarks.txt b/indra/test_apps/llplugintest/bookmarks.txt
index 796cc5d1b28feaadda6a154db144f719df7ca461..ef34167b2985fa9cbd89a6a0dcfce036e05ea0b7 100644
--- a/indra/test_apps/llplugintest/bookmarks.txt
+++ b/indra/test_apps/llplugintest/bookmarks.txt
@@ -8,7 +8,15 @@
 (WK) Canvas Paint (DHTML version of MS Paint),http://www.canvaspaint.org
 (WK) DHTML Lemmings!,http://www.elizium.nu/scripts/lemmings/
 (WK) DHTML graphics demos,http://www.dhteumeuleu.com/
-(WK) Neat Javascript 3D,http://gyu.que.jp/jscloth/
+(WK) Shared paint app,http://colorillo.com/ac79?1l0q6cp
+(Flash) YouTube,http://youtube.com
+(Flash) Vimeo,http://www.vimeo.com/1778399
+(Flash) Simple whiteboard,http://www.imaginationcubed.com/
+(Flash) Dabble Board,http://www.dabbleboard.com/draw
+(Flash) Bubble Shooter game,http://www.wiicade.com/playGame.aspx?gameID=72&gameName=Bubble%20Shooter 
+(Flash) Pixlr photo editor,http://pixlr.com/editor/
+(Flash) Scribd,http://www.scribd.com/doc/14427744/Second-Life-Quickstart-Guide
+(Flash) MAME,http://yvern.com/fMAME/fMAME.html
 (QT) Local sample,file:///C|/Program Files/QuickTime/Sample.mov
 (QT) Movie - Watchmen Trailer,http://movies.apple.com/movies/wb/watchmen/watchmen-tlr2_480p.mov
 (QT) Movie - Transformers - Revenge of the Fallen,http://movies.apple.com/movies/paramount/transformers2/transformersrevengeofthefallen-tlr1_h.320.mov
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index 234422b68a785f01b59a7fa55f7b596ae5508910..553d1ab13183b1b495c06600719e794aaf1d0558 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -1190,7 +1190,7 @@ void LLMediaPluginTest::mouseButton( int button, int state, int x, int y )
 			windowPosToTexturePos( x, y, media_x, media_y, id );
 
 			if ( mSelectedPanel )
-				mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_DOWN, media_x, media_y, 0 );
+				mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_DOWN, 0, media_x, media_y, 0 );
 		}
 		else
 		if ( state == GLUT_UP )
@@ -1206,7 +1206,7 @@ void LLMediaPluginTest::mouseButton( int button, int state, int x, int y )
 				selectPanelById( id );
 
 				if ( mSelectedPanel )
-					mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_UP, media_x, media_y, 0 );
+					mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_UP, 0, media_x, media_y, 0 );
 			};
 		};
 	};
@@ -1220,7 +1220,7 @@ void LLMediaPluginTest::mousePassive( int x, int y )
 	windowPosToTexturePos( x, y, media_x, media_y, id );
 
 	if ( mSelectedPanel )
-		mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, media_x, media_y, 0 );
+		mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, 0, media_x, media_y, 0 );
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -1231,7 +1231,7 @@ void LLMediaPluginTest::mouseMove( int x, int y )
 	windowPosToTexturePos( x, y, media_x, media_y, id );
 
 	if ( mSelectedPanel )
-		mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, media_x, media_y, 0 );
+		mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, 0, media_x, media_y, 0 );
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/install.xml b/install.xml
index 2ab458d88b2b855202d951883432bd94abd29195..519f8138f5eed3944238be51f36ce2b2dd8c8fb7 100644
--- a/install.xml
+++ b/install.xml
@@ -948,9 +948,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>1859f5f6335d702cc42aeb602669b55e</string>
+            <string>b40a13847ee773c9ee06f641fe0dd1c2</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-darwin-20090827.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-darwin-20091023.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
@@ -962,9 +962,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>6c6282025d1b8cd9e70c0f858a14fdca</string>
+            <string>6f2f911545e5906edc87f4f3cda423a1</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-20091001.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-20091023.tar.bz2</uri>
           </map>
         </map>
       </map>